libsidplayfp-2.6.0/0000755000175100001770000000000014544470322011212 500000000000000libsidplayfp-2.6.0/configure.ac0000644000175100001770000002334214544470307013427 00000000000000m4_define([lib_major], [2]) m4_define([lib_minor], [6]) m4_define([lib_level], [0]) m4_define([lib_version], [lib_major.lib_minor.lib_level]) AC_PREREQ([2.62]) AC_INIT([libsidplayfp],[lib_version],[],[],[https://github.com/libsidplayfp/libsidplayfp/]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIRS([m4 src/builders/exsid-builder/driver/m4]) AC_CONFIG_SRCDIR([src/sidplayfp/sidplayfp.cpp]) AC_CONFIG_HEADERS([src/config.h]) AM_INIT_AUTOMAKE LIB_MAJOR=lib_major LIB_MINOR=lib_minor LIB_LEVEL=lib_level AC_SUBST([LIB_MAJOR]) AC_SUBST([LIB_MINOR]) AC_SUBST([LIB_LEVEL]) AC_CANONICAL_HOST AS_CASE([$host_os], [mingw*], [MINGW32=yes], [darwin*], [MACOS=yes], [MINGW32=no MACOS=no] ) AM_CONDITIONAL([MINGW32], [test "x$MINGW32" = "xyes"]) AM_CONDITIONAL([MACOS], [test "x$MACOS" = "xyes"]) dnl Initialize libtool. LT_INIT([win32-dll]) dnl Checks for programs. AC_PROG_CXX dnl Use C++ for tests. AC_LANG([C++]) AX_CXX_COMPILE_STDCXX_17([noext], [optional]) AS_IF([test $ax_cv_cxx_compile_cxx17__std_cpp17 != "yes"], [ AX_CXX_COMPILE_STDCXX_14([noext], [optional]) AS_IF([test $ax_cv_cxx_compile_cxx14__std_cpp14 != "yes"], AX_CXX_COMPILE_STDCXX_11([noext], [optional]) ) ]) dnl check for hidden visibility support AX_CHECK_COMPILE_FLAG([-fvisibility=hidden -fvisibility-inlines-hidden], [has_visibility=yes], [has_visibility=no]) AM_CONDITIONAL([HAVE_VISIBILITY], [test "x$has_visibility" = xyes]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_BIGENDIAN AC_CHECK_SIZEOF([short]) AC_CHECK_SIZEOF([int]) AS_IF([test $ac_cv_sizeof_short -ne 2], [AC_MSG_ERROR([size of short must be 16 bit])] ) AS_IF([test $ac_cv_sizeof_int -lt 4], [AC_MSG_ERROR([only 32 bit or better CPUs are supported])] ) AS_IF([test "x${ac_cv_header_stdint_h}" != "xyes"], [AC_MSG_ERROR([Required header stdint.h not found])] ) AC_OPENMP dnl Checks for non-standard functions. AC_CHECK_DECL( [strcasecmp], [AC_CHECK_FUNCS([strcasecmp])] ) AC_CHECK_DECL( [strncasecmp], [AC_CHECK_FUNCS([strncasecmp])] ) AC_CHECK_PROGS([XA], [xa]) # od on macOS doesn't support the -w parameter AC_CACHE_CHECK([for od that supports -w], [ac_cv_path_OD], [AC_PATH_PROGS_FEATURE_CHECK([OD], [od god], [[$ac_path_OD -w > /dev/null 2>&1 && ac_cv_path_OD=$ac_path_OD]])] ) AC_SUBST([OD], [$ac_cv_path_OD]) dnl libtool-style version-info number # # https://autotools.io/libtool/version.html # # Always increase the revision value. # # Increase the current value whenever an interface has been added, removed or changed. # # Increase the age value only if the changes made to the ABI are backward compatible. LIBSIDPLAYCUR=9 LIBSIDPLAYREV=29 LIBSIDPLAYAGE=3 LIBSIDPLAYVERSION=$LIBSIDPLAYCUR:$LIBSIDPLAYREV:$LIBSIDPLAYAGE LIBSTILVIEWCUR=0 LIBSTILVIEWREV=4 LIBSTILVIEWAGE=0 LIBSTILVIEWVERSION=$LIBSTILVIEWCUR:$LIBSTILVIEWREV:$LIBSTILVIEWAGE AC_MSG_CHECKING([for debugging]) AC_ARG_ENABLE(debug, [AS_HELP_STRING([--enable-debug], [compile for debugging @<:@no/yes/full, default=no@:>@])], [], [enable_debug=no]) AS_IF([test "x$enable_debug" = "xno"], [AC_MSG_RESULT([Build without debugging messages]); debug_flags=-DNDEBUG], [AS_IF([test "x$enable_debug" = "xyes"], [AC_MSG_RESULT([Build with debugging messages]); debug_flags=-DDEBUG=1], [AC_MSG_RESULT([Build with all debugging messages]); debug_flags=-DDEBUG=10] )] ) AC_SUBST([debug_flags]) AC_ARG_ENABLE([hardsid], AS_HELP_STRING([--enable-hardsid],[enable hardsid builder [default=no]]) ) AM_CONDITIONAL([HARDSID], [test "x$enable_hardsid" = "xyes"]) AC_ARG_ENABLE([inline], AS_HELP_STRING([--enable-inline],[enable inlining of functions [default=yes]]) ) AS_IF([test x"$enable_inline" != "xno"], [RESID_INLINE=inline; RESID_INLINING=1], [RESID_INLINE=""; RESID_INLINING=0] ) AC_ARG_WITH( [simd], [AS_HELP_STRING([--with-simd], [Build with SIMD optimizations [@<:@sse2/mmx/neon/none, default=none@:>@]])], [], [with_simd=none] ) AS_IF([test x"$with_simd" != xnone], # Testing for intrinsic headers requires compiler # support activated by specific flags. # These are most likely defined in CXXFLAGS # but AC_CHECK_HEADERS uses only CPPFLAGS # so we need a workaround. [saveCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $CXXFLAGS" AS_CASE([$with_simd], [sse2], [AC_CHECK_HEADERS([emmintrin.h])], [mmx], [AC_CHECK_HEADERS([mmintrin.h])], [neon], [AC_CHECK_HEADERS([arm_neon.h])], [AC_MSG_ERROR([Unrecognized SIMD specified])] ) CPPFLAGS=$saveCPPFLAGS] ) AC_CACHE_CHECK([for working bool], ac_cv_cxx_bool, [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM([], [[bool flag;]])], [ac_cv_cxx_bool=yes], [ac_cv_cxx_bool=no])] ) AS_IF([test "x$ac_cv_cxx_bool" = "xno"], [HAVE_BOOL=0], [HAVE_BOOL=1] ) dnl Enable branch prediction hints. AC_ARG_ENABLE([branch-hints], [AS_HELP_STRING([--enable-branch-hints], [enable static branch prediction hints [default=yes]])], [], [enable_branch_hints=yes] ) AS_IF([test "$enable_branch_hints" != no], [RESID_BRANCH_HINTS=1], [RESID_BRANCH_HINTS=0] ) AC_CACHE_CHECK([for log1p], [resid_cv_log1p], [AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [ #include ], [ log1p(1); ] )], [resid_cv_log1p=yes], [resid_cv_log1p=no] )] ) AS_IF([test "$resid_cv_log1p" = no], [HAVE_LOG1P=0], [HAVE_LOG1P=1] ) AC_CACHE_CHECK([for __builtin_expect], [resid_cv_builtin_expect], [AC_COMPILE_IFELSE([AC_LANG_SOURCE([int main() { __builtin_expect(0, 0); }])], [resid_cv_builtin_expect=yes], [resid_cv_builtin_expect=no])] ) AS_IF([test "$resid_cv_builtin_expect" = no], [HAVE_BUILTIN_EXPECT=0], [HAVE_BUILTIN_EXPECT=1] ) AC_CHECK_PROGS([DOXYGEN], [doxygen]) AS_IF([test -z "$DOXYGEN"], [AC_MSG_WARN([Doxygen not found - continuing without Doxygen support])], [AC_CHECK_PROG([DOT], [dot], [YES], [NO])] ) AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([Doxyfile])]) AC_ARG_ENABLE([testsuite], [AS_HELP_STRING([--enable-testsuite=PATH_TO_TESTSUITE], [enable VICE testsuite [default=no]] )], [], [enable_testsuite=no] ) AS_IF([test "x$enable_testsuite" != xno], AC_DEFINE_UNQUOTED([VICE_TESTSUITE], ["$enable_testsuite"], [Path to VICE testsuite.] ) ) AM_CONDITIONAL([TESTSUITE], [test "x$enable_testsuite" != xno]) PKG_PROG_PKG_CONFIG AC_ARG_ENABLE([tests], [AS_HELP_STRING([--enable-tests], [enable unit tests [default=no]] )], [], [enable_tests=no] ) AS_IF([test "x$enable_tests" != "xno"], [[echo Enabling unit tests] PKG_CHECK_MODULES(UNITTEST, [UnitTest++]) ] ) AM_CONDITIONAL([ENABLE_TEST], [test x$enable_tests = xyes]) AC_ARG_WITH([gcrypt], AS_HELP_STRING([--with-gcrypt], [Build with the gcrypt library])) AS_IF([test "x$with_gcrypt" != "xno"], [PKG_CHECK_MODULES(LIBGCRYPT, [libgcrypt >= 1.8], [USE_LIBGCRYPT=yes AC_DEFINE([HAVE_LIBGCRYPT], 1, [Define to 1 if you have libgcrypt (-lgcrypt).])], [AS_IF([test "x$with_gcrypt" = "xyes"], [AC_MSG_ERROR([gcrypt requested but not found])] )] )] ) AM_CONDITIONAL([LIBGCRYPT], [test x$USE_LIBGCRYPT = xyes]) NEW_8580_FILTER=1 AM_CONDITIONAL([NEW_8580_FILTER], [test $NEW_8580_FILTER != 0]) AC_SUBST(HAVE_BOOL) AC_SUBST(HAVE_LOG1P) AC_SUBST(HAVE_BUILTIN_EXPECT) AC_SUBST(RESID_INLINING) AC_SUBST(RESID_INLINE) AC_SUBST(RESID_BRANCH_HINTS) AC_SUBST(NEW_8580_FILTER) AC_SUBST(LIBSIDPLAYVERSION) AC_SUBST(LIBSTILVIEWVERSION) # exSID support AC_ARG_WITH( [exsid], [AS_HELP_STRING([--with-exsid], [Build with exsid support [@<:@yes/no/check, default=check@:>@]])], [], [with_exsid=check] ) # exSID support requires either libexsid or one of libfdti1 or libftd2xx AS_IF( [test "x$with_exsid" != "xno"], [PKG_CHECK_MODULES([EXSID], [libexsid >= 2.0], [AC_DEFINE([HAVE_EXSID], 1, [Define to 1 if you have libexsid (-lexsid).]) build_exsid_builder=yes], [AC_MSG_WARN([$EXSID_PKG_ERRORS] [- using internal driver]) AS_IF([test "x$MINGW32" != "xyes"], AC_SEARCH_LIBS([dlopen], [dl dld], [], [AC_MSG_ERROR([unable to find the dlopen() function])] ) ) AC_CHECK_HEADERS([ftd2xx.h], [AC_DEFINE([HAVE_FTD2XX], 1, [Define to 1 if you have ftd2xx.h]) build_exsid_builder=yes build_exsid_driver=yes], [AC_MSG_WARN([ftd2xx.h not found, support will not be available])] ) AC_MSG_CHECKING([for libftdi1]) PKG_CHECK_EXISTS([libftdi1 >= 1.0], [AC_DEFINE([HAVE_FTDI], 1, [Define to 1 if you have ftdi.h]) build_exsid_builder=yes build_exsid_driver=yes FTDI_CFLAGS=`$PKG_CONFIG --cflags libftdi1` AC_MSG_RESULT([yes])], [AC_MSG_WARN([libftdi1 not found, support will not be available])] )] )] ) AS_IF( [test "x$with_exsid" = "xyes" -a "x$build_exsid_builder" != xyes], [AC_MSG_ERROR([Neither libexsid nor ftd2xx nor libftdi1 found])] ) AC_SUBST([FTDI_CFLAGS]) AM_CONDITIONAL([EXSID_SUPPORT], [ test "x${build_exsid_builder}" = xyes]) AM_CONDITIONAL([EXSID_DRIVER], [ test "x${build_exsid_driver}" = xyes]) # check for thread model if available AS_IF([test "x$build_exsid_driver" = xyes], [AX_PTHREAD( [AC_DEFINE([EXSID_THREADED], 1, [Define for threaded driver])] [AC_DEFINE([HAVE_PTHREAD_H], 1, [Define to 1 if you have pthread.h])] )] ) eval loadable_shrext=$shrext_cmds AC_DEFINE_UNQUOTED([SHLIBEXT], ["${loadable_shrext}"], [Shared library extension]) AC_CONFIG_FILES([ Makefile libsidplayfp.pc libstilview.pc src/sidplayfp/sidversion.h src/builders/residfp-builder/residfp/siddefs-fp.h src/builders/resid-builder/resid/siddefs.h tests/Makefile ]) AC_OUTPUT libsidplayfp-2.6.0/aclocal.m40000644000175100001770000015141114544470315012777 00000000000000# generated automatically by aclocal 1.16.5 -*- Autoconf -*- # Copyright (C) 1996-2021 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_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.71],, [m4_warning([this file was generated for autoconf 2.71. 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'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 12 (pkg-config-0.29.2) dnl Copyright © 2004 Scott James Remnant . dnl Copyright © 2012-2015 Dan Nicholson dnl dnl This program is free software; you can redistribute it and/or modify dnl it under the terms of the GNU General Public License as published by dnl the Free Software Foundation; either version 2 of the License, or dnl (at your option) any later version. dnl dnl This program is distributed in the hope that it will be useful, but dnl WITHOUT ANY WARRANTY; without even the implied warranty of dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU dnl General Public License for more details. dnl dnl You should have received a copy of the GNU General Public License dnl along with this program; if not, write to the Free Software dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA dnl 02111-1307, USA. dnl dnl As a special exception to the GNU General Public License, if you dnl distribute this file as part of a program that contains a dnl configuration script generated by Autoconf, you may include it under dnl the same distribution terms that you use for the rest of that dnl program. dnl PKG_PREREQ(MIN-VERSION) dnl ----------------------- dnl Since: 0.29 dnl dnl Verify that the version of the pkg-config macros are at least dnl MIN-VERSION. Unlike PKG_PROG_PKG_CONFIG, which checks the user's dnl installed version of pkg-config, this checks the developer's version dnl of pkg.m4 when generating configure. dnl dnl To ensure that this macro is defined, also add: dnl m4_ifndef([PKG_PREREQ], dnl [m4_fatal([must install pkg-config 0.29 or later before running autoconf/autogen])]) dnl dnl See the "Since" comment for each macro you use to see what version dnl of the macros you require. m4_defun([PKG_PREREQ], [m4_define([PKG_MACROS_VERSION], [0.29.2]) m4_if(m4_version_compare(PKG_MACROS_VERSION, [$1]), -1, [m4_fatal([pkg.m4 version $1 or higher is required but ]PKG_MACROS_VERSION[ found])]) ])dnl PKG_PREREQ dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) dnl ---------------------------------- dnl Since: 0.16 dnl dnl Search for the pkg-config tool and set the PKG_CONFIG variable to dnl first found in the path. Checks that the version of pkg-config found dnl is at least MIN-VERSION. If MIN-VERSION is not specified, 0.9.0 is dnl used since that's the first version where most current features of dnl pkg-config existed. 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 ])dnl PKG_PROG_PKG_CONFIG dnl PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------------------------------- dnl Since: 0.18 dnl dnl Check to see whether a particular set of modules exists. Similar to dnl PKG_CHECK_MODULES(), but does not set variables or print errors. dnl dnl Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) dnl only at the first occurence in configure.ac, so if the first place dnl it's called might be skipped (such as if it is within an "if", you dnl 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]) dnl _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) dnl --------------------------------------------- dnl Internal wrapper calling pkg-config via PKG_CONFIG and setting dnl pkg_failed based on the result. 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 ])dnl _PKG_CONFIG dnl _PKG_SHORT_ERRORS_SUPPORTED dnl --------------------------- dnl Internal check to see if pkg-config supports short errors. 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 ])dnl _PKG_SHORT_ERRORS_SUPPORTED dnl PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl -------------------------------------------------------------- dnl Since: 0.4.0 dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES might not happen, you should be sure to include an dnl 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 $2]) _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 ])dnl PKG_CHECK_MODULES dnl PKG_CHECK_MODULES_STATIC(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], dnl [ACTION-IF-NOT-FOUND]) dnl --------------------------------------------------------------------- dnl Since: 0.29 dnl dnl Checks for existence of MODULES and gathers its build flags with dnl static libraries enabled. Sets VARIABLE-PREFIX_CFLAGS from --cflags dnl and VARIABLE-PREFIX_LIBS from --libs. dnl dnl Note that if there is a possibility the first call to dnl PKG_CHECK_MODULES_STATIC might not happen, you should be sure to dnl include an explicit call to PKG_PROG_PKG_CONFIG in your dnl configure.ac. AC_DEFUN([PKG_CHECK_MODULES_STATIC], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl _save_PKG_CONFIG=$PKG_CONFIG PKG_CONFIG="$PKG_CONFIG --static" PKG_CHECK_MODULES($@) PKG_CONFIG=$_save_PKG_CONFIG[]dnl ])dnl PKG_CHECK_MODULES_STATIC dnl PKG_INSTALLDIR([DIRECTORY]) dnl ------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable pkgconfigdir as the location where a module dnl should install pkg-config .pc files. By default the directory is dnl $libdir/pkgconfig, but the default can be changed by passing dnl DIRECTORY. The user can override through the --with-pkgconfigdir dnl parameter. AC_DEFUN([PKG_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([pkgconfigdir], [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, [with_pkgconfigdir=]pkg_default) AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_INSTALLDIR dnl PKG_NOARCH_INSTALLDIR([DIRECTORY]) dnl -------------------------------- dnl Since: 0.27 dnl dnl Substitutes the variable noarch_pkgconfigdir as the location where a dnl module should install arch-independent pkg-config .pc files. By dnl default the directory is $datadir/pkgconfig, but the default can be dnl changed by passing DIRECTORY. The user can override through the dnl --with-noarch-pkgconfigdir parameter. AC_DEFUN([PKG_NOARCH_INSTALLDIR], [m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) m4_pushdef([pkg_description], [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) AC_ARG_WITH([noarch-pkgconfigdir], [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, [with_noarch_pkgconfigdir=]pkg_default) AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) m4_popdef([pkg_default]) m4_popdef([pkg_description]) ])dnl PKG_NOARCH_INSTALLDIR dnl PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, dnl [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) dnl ------------------------------------------- dnl Since: 0.28 dnl dnl Retrieves the value of the pkg-config variable for the given module. AC_DEFUN([PKG_CHECK_VAR], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl _PKG_CONFIG([$1], [variable="][$3]["], [$2]) AS_VAR_COPY([$1], [pkg_cv_][$1]) AS_VAR_IF([$1], [""], [$5], [$4])dnl ])dnl PKG_CHECK_VAR # Copyright (C) 2002-2021 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. # 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.16' 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.16.5], [], [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.16.5])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-2021 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. # 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], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_COND_IF -*- Autoconf -*- # Copyright (C) 2008-2021 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. # _AM_COND_IF # _AM_COND_ELSE # _AM_COND_ENDIF # -------------- # These macros are only used for tracing. m4_define([_AM_COND_IF]) m4_define([_AM_COND_ELSE]) m4_define([_AM_COND_ENDIF]) # AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) # --------------------------------------- # If the shell condition COND is true, execute IF-TRUE, otherwise execute # IF-FALSE. Allow automake to learn about conditional instantiating macros # (the AC_CONFIG_FOOS). AC_DEFUN([AM_COND_IF], [m4_ifndef([_AM_COND_VALUE_$1], [m4_fatal([$0: no such condition "$1"])])dnl _AM_COND_IF([$1])dnl if test -z "$$1_TRUE"; then : m4_n([$2])[]dnl m4_ifval([$3], [_AM_COND_ELSE([$1])dnl else $3 ])dnl _AM_COND_ENDIF([$1])dnl fi[]dnl ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2021 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. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$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-2021 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. # 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", "OBJC", "OBJCXX", "UPC", or "GJC". # 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 m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" 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 10 /bin/sh. echo '/* dummy */' > 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], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) 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-2021 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. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. AS_CASE([$CONFIG_FILES], [*\'*], [eval set x "$CONFIG_FILES"], [*], [set x $CONFIG_FILES]) shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`AS_ECHO(["$am_mf"]) | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`AS_DIRNAME(["$am_mf"])` am_filepart=`AS_BASENAME(["$am_mf"])` AM_RUN_LOG([cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles]) || am_rc=$? done if test $am_rc -ne 0; then AC_MSG_FAILURE([Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE="gmake" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking).]) fi AS_UNSET([am_dirpart]) AS_UNSET([am_filepart]) AS_UNSET([am_mf]) AS_UNSET([am_rc]) rm -f conftest-deps.mk } ])# _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. # This creates each '.Po' and '.Plo' makefile fragment that we'll 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" MAKE="${MAKE-make}"])]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2021 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 macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # 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.65])dnl m4_ifdef([_$0_ALREADY_INIT], [m4_fatal([$0 expanded multiple times ]m4_defn([_$0_ALREADY_INIT]))], [m4_define([_$0_ALREADY_INIT], m4_expansion_stack)])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], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) 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_ifset([AC_PACKAGE_NAME], [ok]):m4_ifset([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [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([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). 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])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi AC_SUBST([CTAGS]) if test -z "$ETAGS"; then ETAGS=etags fi AC_SUBST([ETAGS]) if test -z "$CSCOPE"; then CSCOPE=cscope fi AC_SUBST([CSCOPE]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro 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 # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) 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-2021 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. # 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+set}" != 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-2021 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. # 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])]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2021 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. # AM_MAKE_INCLUDE() # ----------------- # Check whether make has an 'include' directive that can support all # the idioms we need for our automatic dependency tracking code. AC_DEFUN([AM_MAKE_INCLUDE], [AC_MSG_CHECKING([whether ${MAKE-make} supports the include directive]) cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do AM_RUN_LOG([${MAKE-make} -f confmf.$s && cat confinc.out]) AS_CASE([$?:`cat confinc.out 2>/dev/null`], ['0:this is the am__doit target'], [AS_CASE([$s], [BSD], [am__include='.include' am__quote='"'], [am__include='include' am__quote=''])]) if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* AC_MSG_RESULT([${_am_result}]) AC_SUBST([am__include])]) AC_SUBST([am__quote])]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2021 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. # 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 is modern enough. # If it is, 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 MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2021 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. # _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])]) # Copyright (C) 1999-2021 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. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2021 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. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2021 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. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 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 if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done 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]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2021 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. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2021 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. # 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-2021 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. # _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-2021 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. # _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}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} 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 m4_include([src/builders/exsid-builder/driver/m4/ax_pthread.m4]) m4_include([m4/ax_check_compile_flag.m4]) m4_include([m4/ax_cxx_compile_stdcxx.m4]) m4_include([m4/ax_cxx_compile_stdcxx_11.m4]) m4_include([m4/ax_cxx_compile_stdcxx_14.m4]) m4_include([m4/ax_cxx_compile_stdcxx_17.m4]) m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) libsidplayfp-2.6.0/libsidplayfp.pc.in0000644000175100001770000000047614544470307014557 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libsidplayfp Description: C64 cycle exact stereo sidplayer library. Version: @PACKAGE_VERSION@ Libs.private: @LIBGCRYPT_LIBS@ @EXSID_LIBS@ Libs: -L${libdir} -lsidplayfp @OPENMP_CXXFLAGS@ Cflags: -I${includedir} @OPENMP_CXXFLAGS@ libsidplayfp-2.6.0/test/0000755000175100001770000000000014544470322012171 500000000000000libsidplayfp-2.6.0/test/testlist0000644000175100001770000007562414544470307013730 00000000000000### general ### general/banking00/banking00 #general/fuxxortest/test-fuxxored general/fuxxortest/ef1-nmi # sprite collision, won't work #general/fuxxortest/ef2-inst2 #general/fuxxortest/ef2-inst3 #general/fuxxortest/ef2-inst4a #general/fuxxortest/ef2-inst4c general/fuxxortest/ef2-inst4b --sid old general/Lorenz-2.15/src/start general/Lorenz-2.15/src/ldab general/Lorenz-2.15/src/ldaz general/Lorenz-2.15/src/ldazx general/Lorenz-2.15/src/ldaa general/Lorenz-2.15/src/ldaax general/Lorenz-2.15/src/ldaay general/Lorenz-2.15/src/ldaix general/Lorenz-2.15/src/ldaiy general/Lorenz-2.15/src/staz general/Lorenz-2.15/src/stazx general/Lorenz-2.15/src/staa general/Lorenz-2.15/src/staax general/Lorenz-2.15/src/staay general/Lorenz-2.15/src/staix general/Lorenz-2.15/src/staiy general/Lorenz-2.15/src/ldxb general/Lorenz-2.15/src/ldxz general/Lorenz-2.15/src/ldxzy general/Lorenz-2.15/src/ldxa general/Lorenz-2.15/src/ldxay general/Lorenz-2.15/src/stxz general/Lorenz-2.15/src/stxzy general/Lorenz-2.15/src/stxa general/Lorenz-2.15/src/ldyb general/Lorenz-2.15/src/ldyz general/Lorenz-2.15/src/ldyzx general/Lorenz-2.15/src/ldya general/Lorenz-2.15/src/ldyax general/Lorenz-2.15/src/styz general/Lorenz-2.15/src/styzx general/Lorenz-2.15/src/stya general/Lorenz-2.15/src/taxn general/Lorenz-2.15/src/tayn general/Lorenz-2.15/src/txan general/Lorenz-2.15/src/tyan general/Lorenz-2.15/src/tsxn general/Lorenz-2.15/src/txsn general/Lorenz-2.15/src/phan general/Lorenz-2.15/src/plan general/Lorenz-2.15/src/phpn general/Lorenz-2.15/src/plpn general/Lorenz-2.15/src/inxn general/Lorenz-2.15/src/inyn general/Lorenz-2.15/src/dexn general/Lorenz-2.15/src/deyn general/Lorenz-2.15/src/incz general/Lorenz-2.15/src/inczx general/Lorenz-2.15/src/inca general/Lorenz-2.15/src/incax general/Lorenz-2.15/src/decz general/Lorenz-2.15/src/deczx general/Lorenz-2.15/src/deca general/Lorenz-2.15/src/decax general/Lorenz-2.15/src/asln general/Lorenz-2.15/src/aslz general/Lorenz-2.15/src/aslzx general/Lorenz-2.15/src/asla general/Lorenz-2.15/src/aslax general/Lorenz-2.15/src/lsrn general/Lorenz-2.15/src/lsrz general/Lorenz-2.15/src/lsrzx general/Lorenz-2.15/src/lsra general/Lorenz-2.15/src/lsrax general/Lorenz-2.15/src/roln general/Lorenz-2.15/src/rolz general/Lorenz-2.15/src/rolzx general/Lorenz-2.15/src/rola general/Lorenz-2.15/src/rolax general/Lorenz-2.15/src/rorn general/Lorenz-2.15/src/rorz general/Lorenz-2.15/src/rorzx general/Lorenz-2.15/src/rora general/Lorenz-2.15/src/rorax general/Lorenz-2.15/src/andb general/Lorenz-2.15/src/andz general/Lorenz-2.15/src/andzx general/Lorenz-2.15/src/anda general/Lorenz-2.15/src/andax general/Lorenz-2.15/src/anday general/Lorenz-2.15/src/andix general/Lorenz-2.15/src/andiy general/Lorenz-2.15/src/orab general/Lorenz-2.15/src/oraz general/Lorenz-2.15/src/orazx general/Lorenz-2.15/src/oraa general/Lorenz-2.15/src/oraax general/Lorenz-2.15/src/oraay general/Lorenz-2.15/src/oraix general/Lorenz-2.15/src/oraiy general/Lorenz-2.15/src/eorb general/Lorenz-2.15/src/eorz general/Lorenz-2.15/src/eorzx general/Lorenz-2.15/src/eora general/Lorenz-2.15/src/eorax general/Lorenz-2.15/src/eoray general/Lorenz-2.15/src/eorix general/Lorenz-2.15/src/eoriy general/Lorenz-2.15/src/clcn general/Lorenz-2.15/src/secn general/Lorenz-2.15/src/cldn general/Lorenz-2.15/src/sedn general/Lorenz-2.15/src/clin general/Lorenz-2.15/src/sein general/Lorenz-2.15/src/clvn general/Lorenz-2.15/src/adcb general/Lorenz-2.15/src/adcz general/Lorenz-2.15/src/adczx general/Lorenz-2.15/src/adca general/Lorenz-2.15/src/adcax general/Lorenz-2.15/src/adcay general/Lorenz-2.15/src/adcix general/Lorenz-2.15/src/adciy general/Lorenz-2.15/src/sbcb general/Lorenz-2.15/src/sbcz general/Lorenz-2.15/src/sbczx general/Lorenz-2.15/src/sbca general/Lorenz-2.15/src/sbcax general/Lorenz-2.15/src/sbcay general/Lorenz-2.15/src/sbcix general/Lorenz-2.15/src/sbciy general/Lorenz-2.15/src/cmpb general/Lorenz-2.15/src/cmpz general/Lorenz-2.15/src/cmpzx general/Lorenz-2.15/src/cmpa general/Lorenz-2.15/src/cmpax general/Lorenz-2.15/src/cmpay general/Lorenz-2.15/src/cmpix general/Lorenz-2.15/src/cmpiy general/Lorenz-2.15/src/cpxb general/Lorenz-2.15/src/cpxz general/Lorenz-2.15/src/cpxa general/Lorenz-2.15/src/cpyb general/Lorenz-2.15/src/cpyz general/Lorenz-2.15/src/cpya general/Lorenz-2.15/src/bitz general/Lorenz-2.15/src/bita general/Lorenz-2.15/src/brkn general/Lorenz-2.15/src/rtin general/Lorenz-2.15/src/jsrw general/Lorenz-2.15/src/rtsn general/Lorenz-2.15/src/jmpw general/Lorenz-2.15/src/jmpi general/Lorenz-2.15/src/beqr general/Lorenz-2.15/src/bner general/Lorenz-2.15/src/bmir general/Lorenz-2.15/src/bplr general/Lorenz-2.15/src/bcsr general/Lorenz-2.15/src/bccr general/Lorenz-2.15/src/bvsr general/Lorenz-2.15/src/bvcr general/Lorenz-2.15/src/nopn general/Lorenz-2.15/src/nopb general/Lorenz-2.15/src/nopz general/Lorenz-2.15/src/nopzx general/Lorenz-2.15/src/nopa general/Lorenz-2.15/src/nopax general/Lorenz-2.15/src/asoz general/Lorenz-2.15/src/asozx general/Lorenz-2.15/src/asoa general/Lorenz-2.15/src/asoax general/Lorenz-2.15/src/asoay general/Lorenz-2.15/src/asoix general/Lorenz-2.15/src/asoiy general/Lorenz-2.15/src/rlaz general/Lorenz-2.15/src/rlazx general/Lorenz-2.15/src/rlaa general/Lorenz-2.15/src/rlaax general/Lorenz-2.15/src/rlaay general/Lorenz-2.15/src/rlaix general/Lorenz-2.15/src/rlaiy general/Lorenz-2.15/src/lsez general/Lorenz-2.15/src/lsezx general/Lorenz-2.15/src/lsea general/Lorenz-2.15/src/lseax general/Lorenz-2.15/src/lseay general/Lorenz-2.15/src/lseix general/Lorenz-2.15/src/lseiy general/Lorenz-2.15/src/rraz general/Lorenz-2.15/src/rrazx general/Lorenz-2.15/src/rraa general/Lorenz-2.15/src/rraax general/Lorenz-2.15/src/rraay general/Lorenz-2.15/src/rraix general/Lorenz-2.15/src/rraiy general/Lorenz-2.15/src/dcmz general/Lorenz-2.15/src/dcmzx general/Lorenz-2.15/src/dcma general/Lorenz-2.15/src/dcmax general/Lorenz-2.15/src/dcmay general/Lorenz-2.15/src/dcmix general/Lorenz-2.15/src/dcmiy general/Lorenz-2.15/src/insz general/Lorenz-2.15/src/inszx general/Lorenz-2.15/src/insa general/Lorenz-2.15/src/insax general/Lorenz-2.15/src/insay general/Lorenz-2.15/src/insix general/Lorenz-2.15/src/insiy general/Lorenz-2.15/src/laxz general/Lorenz-2.15/src/laxzy general/Lorenz-2.15/src/laxa general/Lorenz-2.15/src/laxay general/Lorenz-2.15/src/laxix general/Lorenz-2.15/src/laxiy general/Lorenz-2.15/src/axsz general/Lorenz-2.15/src/axszy general/Lorenz-2.15/src/axsa general/Lorenz-2.15/src/axsix general/Lorenz-2.15/src/alrb general/Lorenz-2.15/src/arrb general/Lorenz-2.15/src/aneb general/Lorenz-2.15/src/lxab general/Lorenz-2.15/src/sbxb general/Lorenz-2.15/src/shaay general/Lorenz-2.15/src/shaiy general/Lorenz-2.15/src/shxay general/Lorenz-2.15/src/shyax general/Lorenz-2.15/src/shsay general/Lorenz-2.15/src/ancb general/Lorenz-2.15/src/lasay general/Lorenz-2.15/src/sbcb-eb general/Lorenz-2.15/src/trap1 general/Lorenz-2.15/src/trap2 general/Lorenz-2.15/src/trap3 general/Lorenz-2.15/src/trap4 general/Lorenz-2.15/src/trap5 general/Lorenz-2.15/src/trap6 general/Lorenz-2.15/src/trap7 general/Lorenz-2.15/src/trap8 general/Lorenz-2.15/src/trap9 general/Lorenz-2.15/src/trap10 general/Lorenz-2.15/src/trap11 general/Lorenz-2.15/src/trap12 general/Lorenz-2.15/src/trap13 general/Lorenz-2.15/src/trap14 general/Lorenz-2.15/src/trap15 general/Lorenz-2.15/src/trap16 general/Lorenz-2.15/src/trap17 general/Lorenz-2.15/src/branchwrap general/Lorenz-2.15/src/mmufetch general/Lorenz-2.15/src/mmu general/Lorenz-2.15/src/cpuport general/Lorenz-2.15/src/cputiming general/Lorenz-2.15/src/irq general/Lorenz-2.15/src/nmi general/Lorenz-2.15/src/cia1tb123 --cia old general/Lorenz-2.15/src/cia2tb123 --cia old general/Lorenz-2.15/src/cia1pb6 --cia old general/Lorenz-2.15/src/cia1pb7 --cia old general/Lorenz-2.15/src/cia2pb6 --cia old general/Lorenz-2.15/src/cia2pb7 --cia old general/Lorenz-2.15/src/cia1tab --cia old general/Lorenz-2.15/src/loadth --cia old general/Lorenz-2.15/src/cnto2 --cia old general/Lorenz-2.15/src/icr01 --cia old general/Lorenz-2.15/src/imr --cia old general/Lorenz-2.15/src/flipos --cia old general/Lorenz-2.15/src/oneshot --cia old general/Lorenz-2.15/src/cntdef --cia old general/Lorenz-2.15/src/cia1ta --cia old general/Lorenz-2.15/src/cia1tb --cia old general/Lorenz-2.15/src/cia2ta --cia old general/Lorenz-2.15/src/cia2tb --cia old general/Lorenz-2.15/src/irqnew --cia new general/Lorenz-2.15/src/nminew --cia new general/Lorenz-2.15/src/cia1tb123 --cia new general/Lorenz-2.15/src/cia2tb123 --cia new general/Lorenz-2.15/src/cia1pb6 --cia new general/Lorenz-2.15/src/cia1pb7 --cia new general/Lorenz-2.15/src/cia2pb6 --cia new general/Lorenz-2.15/src/cia2pb7 --cia new general/Lorenz-2.15/src/cia1tabnew --cia new general/Lorenz-2.15/src/loadth --cia new general/Lorenz-2.15/src/cnto2 --cia new general/Lorenz-2.15/src/icr01new --cia new general/Lorenz-2.15/src/imrnew --cia new general/Lorenz-2.15/src/flipos --cia new general/Lorenz-2.15/src/oneshot --cia new general/Lorenz-2.15/src/cntdef --cia new general/Lorenz-2.15/src/cia1tanew --cia new general/Lorenz-2.15/src/cia1tbnew --cia new # broken tests #general/Lorenz-2.15/src/cia2tanew --cia new #general/Lorenz-2.15/src/cia2tbnew --cia new general/Lorenz-2.15/src/finish # sprite collision, won't work #general/ram0001/test1 ### C64 ### C64/bankio/bankio C64/openio/gauntlet C64/raminitpattern/cyberloadtest C64/raminitpattern/darkstarbbstest C64/raminitpattern/platoontest C64/raminitpattern/typicaltest ### CIA ### CIA/CIA-AcountsB/cia-b-counts-a CIA/CIA-AcountsB/cmp-b-counts-a-old --cia old CIA/CIA-AcountsB/cmp-b-counts-a-new --cia new CIA/CIA-AcountsB/cia-b-counts-a_ntsc --vic ntsc CIA/CIA-AcountsB/cmp-b-counts-a-old_ntsc --cia old --vic ntsc CIA/CIA-AcountsB/cmp-b-counts-a-new_ntsc --cia new --vic ntsc CIA/cia-timer/cia-timer-oldcias --cia old CIA/cia-timer/cia-timer-newcias --cia new CIA/ciavarious/cia1 CIA/ciavarious/cia2 CIA/ciavarious/cia3 --cia old CIA/ciavarious/cia3new --cia new CIA/ciavarious/cia3a --cia old CIA/ciavarious/cia3anew --cia new CIA/ciavarious/cia4 --cia old CIA/ciavarious/cia4new --cia new CIA/ciavarious/cia5 CIA/ciavarious/cia6 CIA/ciavarious/cia7 CIA/ciavarious/cia8 --cia old CIA/ciavarious/cia8new --cia new CIA/ciavarious/cia9 CIA/ciavarious/cia10 CIA/ciavarious/cia11 CIA/ciavarious/cia12 CIA/ciavarious/cia13 CIA/ciavarious/cia14 CIA/ciavarious/cia15 CIA/dd0drw/dd0drw CIA/dd0dtest/dd0dtest --cia old CIA/dd0dtest/dd0dtest --cia new CIA/mirrors/ciamirrors CIA/irqdelay/irqdelay --cia old CIA/irqdelay/irqdelay-new --cia new CIA/irqdelay/irqdelay2 --cia old CIA/irqdelay/irqdelay2-new --cia new CIA/irqdelay/irqdelay-oneshot --cia old CIA/irqdelay/irqdelay-oneshot-new --cia new CIA/irqdelay/irqdelay-cia1 CIA/irqdelay/irqdelay-cia1-4-old --cia old CIA/irqdelay/irqdelay-cia1-4-new --cia new CIA/irqdelay/irqdelay-cia1-oneshot CIA/irqdelay/irqdelay-cia1-oneshot-4-old --cia old CIA/irqdelay/irqdelay-cia1-oneshot-4-new --cia new CIA/irqdelay/irqdelay-cia2 CIA/irqdelay/irqdelay-cia2-4 CIA/irqdelay/irqdelay-cia2-oneshot CIA/irqdelay/irqdelay-cia2-oneshot-4 CIA/pb6pb7/main CIA/reload0/reload0a CIA/reload0/reload0b CIA/shiftregister/cia-icr-test-continues-old --cia old CIA/shiftregister/cia-icr-test-continues-new --cia new CIA/shiftregister/cia-icr-test-oneshot-old --cia old CIA/shiftregister/cia-icr-test-oneshot-new --cia new CIA/shiftregister/cia-icr-test2-continues CIA/shiftregister/cia-icr-test2-oneshot CIA/shiftregister/cia-sdr-load CIA/shiftregister/cia-sdr-delay CIA/shiftregister/cia-sdr-init CIA/shiftregister/cia-sp-test-continues-old --cia old CIA/shiftregister/cia-sp-test-continues-new --cia new CIA/shiftregister/cia-sp-test-oneshot-old --cia old CIA/shiftregister/cia-sp-test-oneshot-new --cia new CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-0 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-0_7f CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-1_7f CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-3 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4_7f CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-19 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-39 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-generic-0 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-generic-0_7f CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-generic-1_7f CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-generic-3 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-generic-4_7f CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-generic-19 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-generic-39 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-0 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-0_7f CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-1_7f CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-3 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4_7f CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-19 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-39 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-generic-0 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-generic-0_7f CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-generic-1_7f CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-generic-3 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-generic-4_7f CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-generic-19 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-generic-39 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4485-0 --cia 4485 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4485-0_7f --cia 4485 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4485-1_7f --cia 4485 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4485-3 --cia 4485 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4485-4_7f --cia 4485 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4485-19 --cia 4485 CIA/shiftregister/cia-sdr-icr/cia1-sdr-icr-4485-39 --cia 4485 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4485-0 --cia 4485 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4485-0_7f --cia 4485 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4485-1_7f --cia 4485 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4485-3 --cia 4485 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4485-4_7f --cia 4485 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4485-19 --cia 4485 CIA/shiftregister/cia-sdr-icr/cia2-sdr-icr-4485-39 --cia 4485 CIA/timerbasics/test --cia old CIA/timerbasics/test_new --cia new CIA/timerbasics/timer --cia old CIA/timerbasics/timer_new --cia new CIA/timerbasics/timer_test1 --cia old CIA/timerbasics/timer_test1_new --cia new CIA/tod/0alarm CIA/tod/1alarm CIA/tod/4tod CIA/tod/4todcia1 CIA/tod/5tod CIA/tod/6tod CIA/tod/alarm CIA/tod/alarm-cond CIA/tod/alarm-cond2 CIA/tod/fix-hour CIA/tod/fix-min CIA/tod/fix-sec CIA/tod/fix-tsec CIA/tod/frogger CIA/tod/hammerfist0 CIA/tod/hammerfist1 CIA/tod/hour-test CIA/tod/hzsync0 CIA/tod/hzsync1 CIA/tod/hzsync2 CIA/tod/hzsync3 CIA/tod/hzsync4 CIA/tod/hzsync5 CIA/tod/hzsync6 CIA/tod/powerup CIA/tod/read-latch CIA/tod/stability CIA/tod/stability-ntsc --vic ntsc CIA/tod/write-stop ### CPU ### CPU/64doc/dadc CPU/64doc/dincsbc CPU/64doc/dincsbc-deccmp CPU/64doc/droradc CPU/64doc/dsbc CPU/64doc/dsbc-cmp-flags CPU/64doc/sbx-c100 # these run VERY long #CPU/64doc/sbx #CPU/64doc/vsbx CPU/Acid800/cpu_bugs CPU/Acid800/cpu_clisei CPU/Acid800/cpu_decimal CPU/Acid800/cpu_flags CPU/Acid800/cpu_illegal CPU/Acid800/cpu_insn CPU/Acid800/cpu_timing CPU/Acid800/cpu_timing_ntsc --vic ntsc CPU/ane/ane CPU/ane/ane-border CPU/ane/ane-none CPU/asap/cpu_ane CPU/asap/cpu_anx CPU/asap/cpu_decimal CPU/asap/cpu_las CPU/asap/cpu_shx CPU/bclark/decimalmode # these would timeout #CPU/cpujam/cpujam02 #CPU/cpujam/cpujam12 #CPU/cpujam/cpujam22 #CPU/cpujam/cpujam32 #CPU/cpujam/cpujam42 #CPU/cpujam/cpujam52 #CPU/cpujam/cpujam62 #CPU/cpujam/cpujam72 #CPU/cpujam/cpujam92 #CPU/cpujam/cpujamb2 #CPU/cpujam/cpujamd2 #CPU/cpujam/cpujamf2 #CPU/cpujam/nojam CPU/cpuport/test1 CPU/decimalmode/adc00 CPU/decimalmode/adc01 CPU/decimalmode/adc02 CPU/decimalmode/adc10 CPU/decimalmode/adc11 CPU/decimalmode/adc12 CPU/decimalmode/sbc00 CPU/decimalmode/sbc01 CPU/decimalmode/sbc02 CPU/decimalmode/sbc10 CPU/decimalmode/sbc11 CPU/decimalmode/sbc12 CPU/decimalmode/arr00 CPU/decimalmode/arr01 CPU/decimalmode/arr02 CPU/decimalmode/arr10 CPU/decimalmode/arr11 CPU/decimalmode/arr12 CPU/decimalmode/sbcEB00 CPU/decimalmode/sbcEB01 CPU/decimalmode/sbcEB02 CPU/decimalmode/sbcEB10 CPU/decimalmode/sbcEB11 CPU/decimalmode/sbcEB12 CPU/decimalmode/isc00 CPU/decimalmode/isc01 CPU/decimalmode/isc02 CPU/decimalmode/isc03 CPU/decimalmode/isc10 CPU/decimalmode/isc11 CPU/decimalmode/isc12 CPU/decimalmode/isc13 CPU/decimalmode/rra00 CPU/decimalmode/rra01 CPU/decimalmode/rra02 CPU/decimalmode/rra03 CPU/decimalmode/rra10 CPU/decimalmode/rra11 CPU/decimalmode/rra12 CPU/decimalmode/rra13 CPU/hmc6502/AllSuiteA CPU/kdormann/6502_functional_test CPU/lax/lax CPU/lax/lax-border CPU/lax/lax-none CPU/sha/shaabsy1 CPU/sha/shaabsy2 CPU/sha/shaabsy3 CPU/sha/shaabsy4 CPU/sha/shaabsy5 CPU/sha/shazpy1 CPU/sha/shazpy2 CPU/sha/shazpy3 CPU/sha/shazpy4 CPU/sha/shazpy5 CPU/shs/shsabsy1 CPU/shs/shsabsy2 CPU/shs/shsabsy3 CPU/shs/shsabsy4 CPU/shs/shsabsy5 CPU/shxy/shx-test CPU/shxy/shxy1 CPU/shxy/shxy2 CPU/shxy/shxy3 CPU/shxy/shxy4 CPU/shxy/shxy5 CPU/shxy/shyx1 CPU/shxy/shyx2 CPU/shxy/shyx3 CPU/shxy/shyx4 CPU/shxy/shyx5 ### interrupts ### interrupts/branchquirk/branchquirk-nmiold --cia old interrupts/branchquirk/branchquirk-old --cia old interrupts/branchquirk/branchquirk-nminew --cia new interrupts/branchquirk/branchquirk-new --cia new interrupts/cia-int/cia-int-irq --cia old interrupts/cia-int/cia-int-irq-new --cia new interrupts/cia-int/cia-int-nmi --cia old interrupts/cia-int/cia-int-nmi-new --cia new interrupts/irq-ackn-bug/cia1 --cia old interrupts/irq-ackn-bug/cia1new --cia new interrupts/irq-ackn-bug/cia2 --cia old interrupts/irq-ackn-bug/cia2new --cia new # sprite collision, won't work #interrupts/irq-ackn-bug/irq-ack-vicii interrupts/irqdma/nmitest6 --cia old interrupts/irqdma/nmitest6 --cia new interrupts/irqdma/nmitest6b --cia old interrupts/irqdma/nmitest6b --cia new interrupts/irqdma/test1 interrupts/irqdma/test1b interrupts/irqdma/test2 interrupts/irqdma/test2b interrupts/irqdma/test3 interrupts/irqdma/test3b interrupts/irqdma/test4 interrupts/irqdma/test4b interrupts/irqdma/test5 interrupts/irqdma/test5b interrupts/irqdma/test6 interrupts/irqdma/test6b --cia old interrupts/irqdma/test6b --cia new interrupts/irqdma/test7 interrupts/irqdma/test7b interrupts/irqdummy/irqdummy interrupts/irqnmi/irqnmi-old --cia old interrupts/irqnmi/irqnmi-new --cia new ### SID SID/busvalue/busvalue --sid old SID/detect/detect-1-old --sid old SID/detect/detect-2-old --sid old SID/detect/detect-1-new --sid new SID/detect/detect-2-new --sid new SID/env_test/env_test_adra_1 --sid old SID/env_test/env_test_adra_2 --sid old SID/env_test/env_test_ar_1 --sid old SID/env_test/env_test_ar_2 --sid old SID/env_test/env_test_ar_3 --sid old SID/env_test/env_test_ra_0000 --sid old SID/env_test/env_test_ra_0100 --sid old SID/env_test/env_test_ra_ff00 --sid old SID/envelope/lft-adsr-test --sid old SID/envelope/testADSRDelayBug --sid old SID/envelope/testFlip00toFF --sid old SID/envelope/testFlipFFto00 --sid old SID/exp_counter_reset/env_test_exr --sid old SID/osc3-wave0/osc3-wave0-new --sid new SID/osc3-wave0/osc3-wave0 --sid old SID/osc_topbit/osc_topbit_test_noise_old --sid old SID/osc_topbit/osc_topbit_test_pulse_old --sid old SID/osc_topbit/osc_topbit_test_triangle_old --sid old SID/osc_topbit/osc_topbit_test_noise_new --sid new SID/osc_topbit/osc_topbit_test_pulse_new --sid new SID/osc_topbit/osc_topbit_test_triangle_new --sid new SID/oscinit/allinit --sid old SID/oscinit/noiseinit --sid old SID/oscinit/oscinit --sid old SID/exp_counter_reset/env_test_exr --sid old SID/resid-test/envdelay --sid old SID/resid-test/envrate --sid old SID/resid-test/envsustain --sid old SID/resid-test/envtime --sid old SID/resid-test/noisetest --sid old SID/resid-test/oscsample0-6581 --sid old SID/resid-test/oscsample1-6581 --sid old SID/resid-test/oscsample0-8580 --sid new SID/resid-test/oscsample1-8580 --sid new SID/ringmod/ringmodtest --sid old SID/waveforms/waveforms-10-6581 --sid old SID/waveforms/waveforms-20-6581 --sid old SID/waveforms/waveforms-40-6581 --sid old SID/waveforms/waveforms-80-6581 --sid old SID/waveforms/waveforms-10-8580 --sid new SID/waveforms/waveforms-20-8580 --sid new SID/waveforms/waveforms-40-8580 --sid new SID/waveforms/waveforms-80-8580 --sid new SID/wb_testsuite/noise_writeback_check_8_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_C_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_D_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_C_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_D_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_9_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_C_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_D_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_A_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_B_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_B_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_B_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_B_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_B_to_D_old --sid old SID/wb_testsuite/noise_writeback_check_B_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_B_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_C_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_D_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_C_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_C_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_D_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_D_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_E_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_E_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_E_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_E_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_E_to_C_old --sid old SID/wb_testsuite/noise_writeback_check_E_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_E_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_8_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_9_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_A_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_B_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_C_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_D_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_E_old --sid old SID/wb_testsuite/noise_writeback_check_F_to_F_old --sid old SID/wb_testsuite/noise_writeback_check_8_to_8_new --sid new SID/wb_testsuite/noise_writeback_check_8_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_8_to_A_new --sid new SID/wb_testsuite/noise_writeback_check_8_to_B_new --sid new SID/wb_testsuite/noise_writeback_check_8_to_D_new --sid new SID/wb_testsuite/noise_writeback_check_8_to_E_new --sid new SID/wb_testsuite/noise_writeback_check_8_to_F_new --sid new SID/wb_testsuite/noise_writeback_check_9_to_8_new --sid new SID/wb_testsuite/noise_writeback_check_9_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_9_to_B_new --sid new SID/wb_testsuite/noise_writeback_check_9_to_D_new --sid new SID/wb_testsuite/noise_writeback_check_9_to_F_new --sid new SID/wb_testsuite/noise_writeback_check_A_to_8_new --sid new SID/wb_testsuite/noise_writeback_check_A_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_A_to_A_new --sid new SID/wb_testsuite/noise_writeback_check_A_to_B_new --sid new SID/wb_testsuite/noise_writeback_check_A_to_D_new --sid new SID/wb_testsuite/noise_writeback_check_A_to_E_new --sid new SID/wb_testsuite/noise_writeback_check_A_to_F_new --sid new SID/wb_testsuite/noise_writeback_check_B_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_B_to_A_new --sid new SID/wb_testsuite/noise_writeback_check_B_to_B_new --sid new SID/wb_testsuite/noise_writeback_check_B_to_D_new --sid new SID/wb_testsuite/noise_writeback_check_B_to_E_new --sid new SID/wb_testsuite/noise_writeback_check_B_to_F_new --sid new SID/wb_testsuite/noise_writeback_check_C_to_8_new --sid new SID/wb_testsuite/noise_writeback_check_C_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_C_to_A_new --sid new SID/wb_testsuite/noise_writeback_check_C_to_E_new --sid new SID/wb_testsuite/noise_writeback_check_C_to_F_new --sid new SID/wb_testsuite/noise_writeback_check_D_to_8_new --sid new SID/wb_testsuite/noise_writeback_check_D_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_D_to_B_new --sid new SID/wb_testsuite/noise_writeback_check_D_to_D_new --sid new SID/wb_testsuite/noise_writeback_check_D_to_F_new --sid new SID/wb_testsuite/noise_writeback_check_E_to_8_new --sid new SID/wb_testsuite/noise_writeback_check_E_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_E_to_A_new --sid new SID/wb_testsuite/noise_writeback_check_E_to_B_new --sid new SID/wb_testsuite/noise_writeback_check_E_to_E_new --sid new SID/wb_testsuite/noise_writeback_check_E_to_F_new --sid new SID/wb_testsuite/noise_writeback_check_F_to_9_new --sid new SID/wb_testsuite/noise_writeback_check_F_to_A_new --sid new SID/wb_testsuite/noise_writeback_check_F_to_B_new --sid new SID/wb_testsuite/noise_writeback_check_F_to_D_new --sid new SID/wb_testsuite/noise_writeback_check_F_to_E_new --sid new SID/wb_testsuite/noise_writeback_check_F_to_F_new --sid new SID/writedelay/writedelay --sid old SID/wf12nsr/wf12nsr --sid old SID/wf12nsr/wf12nsr-8580 --sid new SID/noiselfsrinit/simple --sid old SID/noiselfsrinit/scan --sid old ### VICII ### VICII/colorram/test VICII/split-tests/bascan/bascan VICII/split-tests/lightpen/lightpen --vic pal VICII/split-tests/lightpen/lightpen --vic ntsc VICII/split-tests/lightpen/lightpen --vic drean # are these supposed to work? #VICII/split-tests/spritescan/spritescan --vic pal #VICII/split-tests/spritescan/spritescan_drean --vic drean VICII/vspbug/vsp_bug VICII/spritesteal/spritesteal --vic pal VICII/spritesteal/spritesteal_ntsc --vic ntsc VICII/spritesteal/spritesteal_ntscold --vic oldntsc # sprite collision, won't work #VICII/spritex/demusinterruptus #VICII/spritex/testsuite --vic pal #VICII/spritex/testsuite_ntsc --vic ntsc #VICII/spritex/testsuite_ntscold --vic oldntsc #VICII/spritey/spritey VICII/lplatency/lplatency VICII/lp-trigger/test2 libsidplayfp-2.6.0/test/test.cpp0000644000175100001770000001321214544470307013576 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * * 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. */ #include #include #include #include #include #include #include "sidplayfp/sidplayfp.h" #include "sidplayfp/SidTune.h" #include "sidplayfp/sidbuilder.h" #include "sidplayfp/builders/residfp.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "sidcxx11.h" /* * Adjust these paths to point to existing ROM dumps */ #define KERNAL_PATH "/usr/share/vice/C64/kernal-901227-03.bin" #define BASIC_PATH "/usr/share/vice/C64/basic-901226-01.bin" #define CHARGEN_PATH "/usr/share/vice/C64/chargen-901225-01.bin" void loadRom(const char* path, char* buffer) { std::ifstream is(path, std::ios::binary); if (!is.is_open()) { std::cout << "File " << path << " not found" << std::endl; exit(EXIT_FAILURE); } is.read(buffer, 8192); is.close(); } int main(int argc, char* argv[]) { if (argc == 0) { std::cerr << "Missing test name" << std::endl; return -1; } sidplayfp m_engine; char rom[8192]; loadRom(KERNAL_PATH, rom); m_engine.setKernal((const uint8_t*)rom); loadRom(BASIC_PATH, rom); m_engine.setBasic((const uint8_t*)rom); loadRom(CHARGEN_PATH, rom); m_engine.setChargen((const uint8_t*)rom); SidConfig config = m_engine.config(); config.powerOnDelay = 0x1267; std::string name(VICE_TESTSUITE); int i = 1; while ((i < argc) && (argv[i] != nullptr)) { if ((argv[i][0] == '-') && (argv[i][1] != '\0')) { if (!strcmp(&argv[i][1], "-sid")) { i++; if (!strcmp(&argv[i][0], "old")) { config.sidEmulation = new ReSIDfpBuilder("test"); config.sidEmulation->create(1); config.forceSidModel = true; config.defaultSidModel = SidConfig::MOS6581; } else if (!strcmp(&argv[i][0], "new")) { config.sidEmulation = new ReSIDfpBuilder("test"); config.sidEmulation->create(1); config.forceSidModel = true; config.defaultSidModel = SidConfig::MOS8580; } else { std::cerr << "Error: unrecognized SID model" << std::endl; return -1; } } if (!strcmp(&argv[i][1], "-cia")) { i++; if (!strcmp(&argv[i][0], "old")) { config.ciaModel = SidConfig::MOS6526; } else if (!strcmp(&argv[i][0], "new")) { config.ciaModel = SidConfig::MOS8521; } else if (!strcmp(&argv[i][0], "4485")) { config.ciaModel = SidConfig::MOS6526W4485; } else { std::cerr << "Error: unrecognized CIA model" << std::endl; return -1; } } if (!strcmp(&argv[i][1], "-vic")) { i++; if (!strcmp(&argv[i][0], "pal")) { config.defaultC64Model = SidConfig::PAL; config.forceC64Model = true; } else if (!strcmp(&argv[i][0], "ntsc")) { config.defaultC64Model = SidConfig::NTSC; config.forceC64Model = true; } else if (!strcmp(&argv[i][0], "oldntsc")) { config.defaultC64Model = SidConfig::OLD_NTSC; config.forceC64Model = true; } else if (!strcmp(&argv[i][0], "drean")) { config.defaultC64Model = SidConfig::DREAN; config.forceC64Model = true; } else { std::cerr << "Error: unrecognized VIC II model" << std::endl; return -1; } } } else { name.append(argv[i]).append(".prg"); } i++; } m_engine.config(config); std::unique_ptr tune(new SidTune(name.c_str())); if (!tune->getStatus()) { std::cerr << "Error: " << tune->statusString() << std::endl; return -1; } tune->selectSong(0); if (!m_engine.load(tune.get())) { std::cerr << m_engine.error() << std::endl; return -1; } //m_engine.debug(true, nullptr); for (;;) { m_engine.play(nullptr, 0); std::cerr << "."; } } libsidplayfp-2.6.0/test/testsuite.sh0000755000175100001770000000120114544470307014476 00000000000000#!/bin/sh dir=$(dirname $0) logfile=$dir/testsuite.log : > ${logfile} passed=0 failed=0 while read line; do if [[ $line =~ ^# ]]; then continue; fi name=${line%% *} echo "Running test $name" $dir/test $line if [[ $? -ne 0 ]]; then failed=$((failed+1)) echo "Failed test $name" >> ${logfile} else passed=$((passed+1)) fi done < $dir/testlist total=$((passed+failed)) echo "Passed ${passed}/${total} ($((passed*100/total))%)" echo "Failed ${failed}/${total}" if [[ ${failed} -eq 0 ]]; then echo "Success!" exit 0 else echo "Failed tests logged in ${logfile}" exit 1 fi libsidplayfp-2.6.0/test/demo.cpp0000644000175100001770000001062714544470307013552 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2023 Leandro Nini * * 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. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include /** * Works on UNIX using OSS * * Compile with * g++ `pkg-config --cflags libsidplayfp` `pkg-config --libs libsidplayfp` demo.cpp */ /* * Adjust these paths to point to existing ROM dumps if needed. */ #define KERNAL_PATH "" #define BASIC_PATH "" #define CHARGEN_PATH "" #define SAMPLERATE 48000 #if __cplusplus < 201103L # define unique_ptr auto_ptr #endif /* * Load ROM dump from file. * Allocate the buffer if file exists, otherwise return 0. */ char* loadRom(const char* path, size_t romSize) { char* buffer = 0; std::ifstream is(path, std::ios::binary); if (is.good()) { buffer = new char[romSize]; is.read(buffer, romSize); } is.close(); return buffer; } /* * Sample application that shows how to use libsidplayfp * to play a SID tune from a file. * It uses OSS for audio output. */ int main(int, char* argv[]) { sidplayfp m_engine; { // Load ROM files char *kernal = loadRom(KERNAL_PATH, 8192); char *basic = loadRom(BASIC_PATH, 8192); char *chargen = loadRom(CHARGEN_PATH, 4096); m_engine.setRoms((const uint8_t*)kernal, (const uint8_t*)basic, (const uint8_t*)chargen); delete [] kernal; delete [] basic; delete [] chargen; } // Set up a SID builder std::unique_ptr rs(new ReSIDfpBuilder("Demo")); // Get the number of SIDs supported by the engine unsigned int maxsids = (m_engine.info ()).maxsids(); // Create SID emulators rs->create(maxsids); // Check if builder is ok if (!rs->getStatus()) { std::cerr << rs->error() << std::endl; return -1; } // Load tune from file std::unique_ptr tune(new SidTune(argv[1])); // CHeck if the tune is valid if (!tune->getStatus()) { std::cerr << tune->statusString() << std::endl; return -1; } // Select default song tune->selectSong(0); // Configure the engine SidConfig cfg; cfg.frequency = SAMPLERATE; cfg.samplingMethod = SidConfig::INTERPOLATE; cfg.fastSampling = false; cfg.playback = SidConfig::MONO; cfg.sidEmulation = rs.get(); if (!m_engine.config(cfg)) { std::cerr << m_engine.error() << std::endl; return -1; } // Load tune into engine if (!m_engine.load(tune.get())) { std::cerr << m_engine.error() << std::endl; return -1; } // Setup audio device int handle=::open("/dev/dsp", O_WRONLY, 0); int format=AFMT_S16_LE; ioctl(handle, SNDCTL_DSP_SETFMT, &format); int chn=1; ioctl(handle, SNDCTL_DSP_CHANNELS, &chn); int sampleRate=SAMPLERATE; ioctl(handle, SNDCTL_DSP_SPEED, &sampleRate); int bufferSize; ioctl(handle, SNDCTL_DSP_GETBLKSIZE, &bufferSize); uint_least32_t bufferSamples = static_cast(bufferSize) / sizeof(short); // Play std::vector buffer(bufferSamples); for (int i=0; i<1000; i++) { uint_least32_t res = m_engine.play(&buffer.front(), bufferSamples); if (!m_engine.isPlaying() || (res < bufferSamples)) { std::cerr << m_engine.error() << std::endl; break; } ::write(handle, &buffer.front(), bufferSize); } ::close(handle); } libsidplayfp-2.6.0/Makefile.in0000644000175100001770000055040414544470316013212 00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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@ @HARDSID_TRUE@am__append_1 = src/builders/hardsid-builder/libsidplayfp-hardsid.la @EXSID_SUPPORT_TRUE@am__append_2 = src/builders/exsid-builder/libsidplayfp-exsid.la @HARDSID_TRUE@am__append_3 = src/builders/hardsid-builder/libsidplayfp-hardsid.la @EXSID_SUPPORT_TRUE@am__append_4 = src/builders/exsid-builder/libsidplayfp-exsid.la @TESTSUITE_TRUE@noinst_PROGRAMS = $(am__EXEEXT_1) test/test$(EXEEXT) \ @TESTSUITE_TRUE@ src/builders/residfp-builder/residfp/resample/test$(EXEEXT) subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/src/builders/exsid-builder/driver/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) \ $(am__src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS_DIST) \ $(am__src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS_DIST) \ $(src_builders_resid_builder_libsidplayfp_resid_la_HEADERS) \ $(src_builders_residfp_builder_libsidplayfp_residfp_la_HEADERS) \ $(src_libsidplayfp_la_HEADERS) $(src_libstilview_la_HEADERS) \ $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = Doxyfile libsidplayfp.pc libstilview.pc \ src/sidplayfp/sidversion.h \ src/builders/residfp-builder/residfp/siddefs-fp.h \ src/builders/resid-builder/resid/siddefs.h CONFIG_CLEAN_VPATH_FILES = @MINGW32_FALSE@@TESTSUITE_TRUE@am__EXEEXT_1 = test/demo$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) 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; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" \ "$(DESTDIR)$(src_libsidplayfp_ladir)" \ "$(DESTDIR)$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)" \ "$(DESTDIR)$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)" \ "$(DESTDIR)$(src_builders_resid_builder_libsidplayfp_resid_ladir)" \ "$(DESTDIR)$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)" \ "$(DESTDIR)$(src_libsidplayfp_ladir)" \ "$(DESTDIR)$(src_libstilview_ladir)" LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) am__DEPENDENCIES_1 = @EXSID_SUPPORT_TRUE@src_builders_exsid_builder_libsidplayfp_exsid_la_DEPENDENCIES = \ @EXSID_SUPPORT_TRUE@ $(am__DEPENDENCIES_1) \ @EXSID_SUPPORT_TRUE@ $(am__DEPENDENCIES_1) am__src_builders_exsid_builder_libsidplayfp_exsid_la_SOURCES_DIST = \ src/builders/exsid-builder/exsid-builder.cpp \ src/builders/exsid-builder/exsid-emu.cpp \ src/builders/exsid-builder/exsid-emu.h \ src/builders/exsid-builder/driver/exSID.c \ src/builders/exsid-builder/driver/exSID.h \ src/builders/exsid-builder/driver/exSID_defs.h \ src/builders/exsid-builder/driver/exSID_ftdiwrap.c \ src/builders/exsid-builder/driver/exSID_ftdiwrap.h am__dirstamp = $(am__leading_dot)dirstamp @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@am__objects_1 = src/builders/exsid-builder/driver/exSID.lo \ @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@ src/builders/exsid-builder/driver/exSID_ftdiwrap.lo @EXSID_SUPPORT_TRUE@am_src_builders_exsid_builder_libsidplayfp_exsid_la_OBJECTS = src/builders/exsid-builder/exsid-builder.lo \ @EXSID_SUPPORT_TRUE@ src/builders/exsid-builder/exsid-emu.lo \ @EXSID_SUPPORT_TRUE@ $(am__objects_1) src_builders_exsid_builder_libsidplayfp_exsid_la_OBJECTS = $(am_src_builders_exsid_builder_libsidplayfp_exsid_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = @EXSID_SUPPORT_TRUE@am_src_builders_exsid_builder_libsidplayfp_exsid_la_rpath = src_builders_hardsid_builder_libsidplayfp_hardsid_la_LIBADD = am__src_builders_hardsid_builder_libsidplayfp_hardsid_la_SOURCES_DIST = \ src/builders/hardsid-builder/hardsid-emu-unix.cpp \ src/builders/hardsid-builder/hardsid-emu-win.cpp \ src/builders/hardsid-builder/hardsid-builder.cpp \ src/builders/hardsid-builder/hardsid-emu.h @HARDSID_TRUE@@MINGW32_FALSE@am__objects_2 = src/builders/hardsid-builder/hardsid-emu-unix.lo @HARDSID_TRUE@@MINGW32_TRUE@am__objects_2 = src/builders/hardsid-builder/hardsid-emu-win.lo @HARDSID_TRUE@am_src_builders_hardsid_builder_libsidplayfp_hardsid_la_OBJECTS = \ @HARDSID_TRUE@ $(am__objects_2) \ @HARDSID_TRUE@ src/builders/hardsid-builder/hardsid-builder.lo src_builders_hardsid_builder_libsidplayfp_hardsid_la_OBJECTS = $(am_src_builders_hardsid_builder_libsidplayfp_hardsid_la_OBJECTS) @HARDSID_TRUE@am_src_builders_hardsid_builder_libsidplayfp_hardsid_la_rpath = src_builders_resid_builder_libsidplayfp_resid_la_DEPENDENCIES = \ src/builders/resid-builder/resid/libresid.la am_src_builders_resid_builder_libsidplayfp_resid_la_OBJECTS = \ src/builders/resid-builder/resid-builder.lo \ src/builders/resid-builder/resid-emu.lo src_builders_resid_builder_libsidplayfp_resid_la_OBJECTS = $(am_src_builders_resid_builder_libsidplayfp_resid_la_OBJECTS) src_builders_resid_builder_resid_libresid_la_LIBADD = am__src_builders_resid_builder_resid_libresid_la_SOURCES_DIST = \ src/builders/resid-builder/resid/dac.h \ src/builders/resid-builder/resid/sid.h \ src/builders/resid-builder/resid/voice.h \ src/builders/resid-builder/resid/wave.h \ src/builders/resid-builder/resid/envelope.h \ src/builders/resid-builder/resid/extfilt.h \ src/builders/resid-builder/resid/pot.h \ src/builders/resid-builder/resid/spline.h \ src/builders/resid-builder/resid/dac.cc \ src/builders/resid-builder/resid/sid.cc \ src/builders/resid-builder/resid/voice.cc \ src/builders/resid-builder/resid/wave.cc \ src/builders/resid-builder/resid/envelope.cc \ src/builders/resid-builder/resid/extfilt.cc \ src/builders/resid-builder/resid/pot.cc \ src/builders/resid-builder/resid/resid-config.h \ src/builders/resid-builder/resid/version.cc \ src/builders/resid-builder/resid/filter.h \ src/builders/resid-builder/resid/filter.cc \ src/builders/resid-builder/resid/filter8580new.h \ src/builders/resid-builder/resid/filter8580new.cc \ src/builders/resid-builder/resid/wave6581_PST.h \ src/builders/resid-builder/resid/wave6581_PS_.h \ src/builders/resid-builder/resid/wave6581_P_T.h \ src/builders/resid-builder/resid/wave6581__ST.h \ src/builders/resid-builder/resid/wave8580_PST.h \ src/builders/resid-builder/resid/wave8580_PS_.h \ src/builders/resid-builder/resid/wave8580_P_T.h \ src/builders/resid-builder/resid/wave8580__ST.h @NEW_8580_FILTER_FALSE@am__objects_3 = src/builders/resid-builder/resid/libresid_la-filter.lo @NEW_8580_FILTER_TRUE@am__objects_3 = src/builders/resid-builder/resid/libresid_la-filter8580new.lo am__objects_4 = am_src_builders_resid_builder_resid_libresid_la_OBJECTS = \ src/builders/resid-builder/resid/libresid_la-dac.lo \ src/builders/resid-builder/resid/libresid_la-sid.lo \ src/builders/resid-builder/resid/libresid_la-voice.lo \ src/builders/resid-builder/resid/libresid_la-wave.lo \ src/builders/resid-builder/resid/libresid_la-envelope.lo \ src/builders/resid-builder/resid/libresid_la-extfilt.lo \ src/builders/resid-builder/resid/libresid_la-pot.lo \ src/builders/resid-builder/resid/libresid_la-version.lo \ $(am__objects_3) $(am__objects_4) src_builders_resid_builder_resid_libresid_la_OBJECTS = \ $(am_src_builders_resid_builder_resid_libresid_la_OBJECTS) src_builders_residfp_builder_libsidplayfp_residfp_la_DEPENDENCIES = \ src/builders/residfp-builder/residfp/libresidfp.la am_src_builders_residfp_builder_libsidplayfp_residfp_la_OBJECTS = \ src/builders/residfp-builder/residfp-builder.lo \ src/builders/residfp-builder/residfp-emu.lo src_builders_residfp_builder_libsidplayfp_residfp_la_OBJECTS = $(am_src_builders_residfp_builder_libsidplayfp_residfp_la_OBJECTS) src_builders_residfp_builder_residfp_libresidfp_la_LIBADD = am_src_builders_residfp_builder_residfp_libresidfp_la_OBJECTS = \ src/builders/residfp-builder/residfp/Dac.lo \ src/builders/residfp-builder/residfp/EnvelopeGenerator.lo \ src/builders/residfp-builder/residfp/ExternalFilter.lo \ src/builders/residfp-builder/residfp/Filter.lo \ src/builders/residfp-builder/residfp/Filter6581.lo \ src/builders/residfp-builder/residfp/Filter8580.lo \ src/builders/residfp-builder/residfp/FilterModelConfig.lo \ src/builders/residfp-builder/residfp/FilterModelConfig6581.lo \ src/builders/residfp-builder/residfp/FilterModelConfig8580.lo \ src/builders/residfp-builder/residfp/Integrator6581.lo \ src/builders/residfp-builder/residfp/Integrator8580.lo \ src/builders/residfp-builder/residfp/OpAmp.lo \ src/builders/residfp-builder/residfp/SID.lo \ src/builders/residfp-builder/residfp/Spline.lo \ src/builders/residfp-builder/residfp/WaveformCalculator.lo \ src/builders/residfp-builder/residfp/WaveformGenerator.lo \ src/builders/residfp-builder/residfp/resample/SincResampler.lo \ src/builders/residfp-builder/residfp/version.lo src_builders_residfp_builder_residfp_libresidfp_la_OBJECTS = $(am_src_builders_residfp_builder_residfp_libresidfp_la_OBJECTS) src_libsidplayfp_la_DEPENDENCIES = \ src/builders/residfp-builder/libsidplayfp-residfp.la \ src/builders/resid-builder/libsidplayfp-resid.la \ $(am__DEPENDENCIES_1) $(am__append_3) $(am__append_4) am__src_libsidplayfp_la_SOURCES_DIST = src/Event.h src/EventCallback.h \ src/EventScheduler.cpp src/EventScheduler.h src/player.cpp \ src/player.h src/psiddrv.cpp src/psiddrv.h src/psiddrv.bin \ src/mixer.cpp src/mixer.h src/poweron.bin src/reloc65.cpp \ src/reloc65.h src/sidcxx11.h src/sidmd5.h src/sidmemory.h \ src/SidInfoImpl.h src/romCheck.h src/sidemu.cpp src/sidemu.h \ src/sidendian.h src/sidrandom.h src/stringutils.h \ src/c64/Banks/Bank.h src/c64/c64cpu.h src/c64/c64cia.h \ src/c64/c64env.h src/c64/c64sid.h src/c64/c64vic.h \ src/c64/c64.cpp src/c64/c64.h src/c64/mmu.cpp src/c64/mmu.h \ src/c64/Banks/ColorRAMBank.h \ src/c64/Banks/DisconnectedBusBank.h \ src/c64/Banks/ExtraSidBank.h src/c64/Banks/IOBank.h \ src/c64/Banks/NullSid.h src/c64/Banks/pla.h \ src/c64/Banks/SidBank.h src/c64/Banks/SystemRAMBank.h \ src/c64/Banks/SystemROMBanks.h src/c64/Banks/ZeroRAMBank.h \ src/c64/VIC_II/mos656x.cpp src/c64/VIC_II/mos656x.h \ src/c64/VIC_II/lightpen.h src/c64/VIC_II/sprites.h \ src/c64/CPU/flags.h src/c64/CPU/mos6510.cpp \ src/c64/CPU/mos6510.h src/c64/CPU/mos6510debug.cpp \ src/c64/CPU/mos6510debug.h src/c64/CPU/opcodes.h \ src/c64/CIA/interrupt.cpp src/c64/CIA/interrupt.h \ src/c64/CIA/mos652x.cpp src/c64/CIA/mos652x.h \ src/c64/CIA/SerialPort.h src/c64/CIA/SerialPort.cpp \ src/c64/CIA/timer.cpp src/c64/CIA/timer.h src/c64/CIA/tod.cpp \ src/c64/CIA/tod.h src/sidplayfp/sidplayfp.cpp \ src/sidplayfp/sidbuilder.cpp src/sidplayfp/SidConfig.cpp \ src/sidplayfp/SidInfo.cpp src/sidplayfp/SidTune.cpp \ src/sidplayfp/SidTuneInfo.cpp src/sidtune/MUS.cpp \ src/sidtune/MUS.h src/sidtune/p00.cpp src/sidtune/p00.h \ src/sidtune/prg.cpp src/sidtune/prg.h src/sidtune/PSID.cpp \ src/sidtune/PSID.h src/sidtune/sidplayer1.bin \ src/sidtune/sidplayer2.bin src/sidtune/SidTuneBase.cpp \ src/sidtune/SidTuneBase.h src/sidtune/SidTuneCfg.h \ src/sidtune/SidTuneInfoImpl.h src/sidtune/SidTuneTools.cpp \ src/sidtune/SidTuneTools.h src/sidtune/SmartPtr.h \ src/utils/iMd5.h src/utils/iniParser.cpp src/utils/iniParser.h \ src/utils/md5Factory.cpp src/utils/md5Factory.h \ src/utils/SidDatabase.cpp src/utils/md5Internal.h \ src/utils/MD5/MD5.cpp src/utils/MD5/MD5.h \ src/utils/MD5/MD5_Defs.h src/utils/md5Gcrypt.h @LIBGCRYPT_FALSE@am__objects_5 = src/utils/MD5/libsidplayfp_la-MD5.lo am_src_libsidplayfp_la_OBJECTS = \ src/libsidplayfp_la-EventScheduler.lo \ src/libsidplayfp_la-player.lo src/libsidplayfp_la-psiddrv.lo \ src/libsidplayfp_la-mixer.lo src/libsidplayfp_la-reloc65.lo \ src/libsidplayfp_la-sidemu.lo src/c64/libsidplayfp_la-c64.lo \ src/c64/libsidplayfp_la-mmu.lo \ src/c64/VIC_II/libsidplayfp_la-mos656x.lo \ src/c64/CPU/libsidplayfp_la-mos6510.lo \ src/c64/CPU/libsidplayfp_la-mos6510debug.lo \ src/c64/CIA/libsidplayfp_la-interrupt.lo \ src/c64/CIA/libsidplayfp_la-mos652x.lo \ src/c64/CIA/libsidplayfp_la-SerialPort.lo \ src/c64/CIA/libsidplayfp_la-timer.lo \ src/c64/CIA/libsidplayfp_la-tod.lo \ src/sidplayfp/libsidplayfp_la-sidplayfp.lo \ src/sidplayfp/libsidplayfp_la-sidbuilder.lo \ src/sidplayfp/libsidplayfp_la-SidConfig.lo \ src/sidplayfp/libsidplayfp_la-SidInfo.lo \ src/sidplayfp/libsidplayfp_la-SidTune.lo \ src/sidplayfp/libsidplayfp_la-SidTuneInfo.lo \ src/sidtune/libsidplayfp_la-MUS.lo \ src/sidtune/libsidplayfp_la-p00.lo \ src/sidtune/libsidplayfp_la-prg.lo \ src/sidtune/libsidplayfp_la-PSID.lo \ src/sidtune/libsidplayfp_la-SidTuneBase.lo \ src/sidtune/libsidplayfp_la-SidTuneTools.lo \ src/utils/libsidplayfp_la-iniParser.lo \ src/utils/libsidplayfp_la-md5Factory.lo \ src/utils/libsidplayfp_la-SidDatabase.lo $(am__objects_5) src_libsidplayfp_la_OBJECTS = $(am_src_libsidplayfp_la_OBJECTS) src_libsidplayfp_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(src_libsidplayfp_la_LDFLAGS) \ $(LDFLAGS) -o $@ src_libstilview_la_LIBADD = am_src_libstilview_la_OBJECTS = src/utils/STILview/stil.lo src_libstilview_la_OBJECTS = $(am_src_libstilview_la_OBJECTS) src_libstilview_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CXXLD) \ $(AM_CXXFLAGS) $(CXXFLAGS) $(src_libstilview_la_LDFLAGS) \ $(LDFLAGS) -o $@ am__src_builders_residfp_builder_residfp_resample_test_SOURCES_DIST = \ src/builders/residfp-builder/residfp/resample/test.cpp @TESTSUITE_TRUE@am_src_builders_residfp_builder_residfp_resample_test_OBJECTS = src/builders/residfp-builder/residfp/resample/test.$(OBJEXT) src_builders_residfp_builder_residfp_resample_test_OBJECTS = $(am_src_builders_residfp_builder_residfp_resample_test_OBJECTS) @TESTSUITE_TRUE@src_builders_residfp_builder_residfp_resample_test_DEPENDENCIES = src/builders/residfp-builder/residfp/resample/SincResampler.lo am__test_demo_SOURCES_DIST = test/demo.cpp @TESTSUITE_TRUE@am_test_demo_OBJECTS = test/demo.$(OBJEXT) test_demo_OBJECTS = $(am_test_demo_OBJECTS) @TESTSUITE_TRUE@test_demo_DEPENDENCIES = src/libsidplayfp.la am__test_test_SOURCES_DIST = test/test.cpp @TESTSUITE_TRUE@am_test_test_OBJECTS = test/test.$(OBJEXT) test_test_OBJECTS = $(am_test_test_OBJECTS) @TESTSUITE_TRUE@test_test_DEPENDENCIES = src/libsidplayfp.la SCRIPTS = $(noinst_SCRIPTS) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = \ src/$(DEPDIR)/libsidplayfp_la-EventScheduler.Plo \ src/$(DEPDIR)/libsidplayfp_la-mixer.Plo \ src/$(DEPDIR)/libsidplayfp_la-player.Plo \ src/$(DEPDIR)/libsidplayfp_la-psiddrv.Plo \ src/$(DEPDIR)/libsidplayfp_la-reloc65.Plo \ src/$(DEPDIR)/libsidplayfp_la-sidemu.Plo \ src/builders/exsid-builder/$(DEPDIR)/exsid-builder.Plo \ src/builders/exsid-builder/$(DEPDIR)/exsid-emu.Plo \ src/builders/exsid-builder/driver/$(DEPDIR)/exSID.Plo \ src/builders/exsid-builder/driver/$(DEPDIR)/exSID_ftdiwrap.Plo \ src/builders/hardsid-builder/$(DEPDIR)/hardsid-builder.Plo \ src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-unix.Plo \ src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-win.Plo \ src/builders/resid-builder/$(DEPDIR)/resid-builder.Plo \ src/builders/resid-builder/$(DEPDIR)/resid-emu.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-dac.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-envelope.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-extfilt.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter8580new.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-pot.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-sid.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-version.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-voice.Plo \ src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-wave.Plo \ src/builders/residfp-builder/$(DEPDIR)/residfp-builder.Plo \ src/builders/residfp-builder/$(DEPDIR)/residfp-emu.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/Dac.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/EnvelopeGenerator.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/ExternalFilter.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/Filter.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/Filter6581.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/Filter8580.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig6581.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig8580.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator6581.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator8580.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/OpAmp.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/SID.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/Spline.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformCalculator.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformGenerator.Plo \ src/builders/residfp-builder/residfp/$(DEPDIR)/version.Plo \ src/builders/residfp-builder/residfp/resample/$(DEPDIR)/SincResampler.Plo \ src/builders/residfp-builder/residfp/resample/$(DEPDIR)/test.Po \ src/c64/$(DEPDIR)/libsidplayfp_la-c64.Plo \ src/c64/$(DEPDIR)/libsidplayfp_la-mmu.Plo \ src/c64/CIA/$(DEPDIR)/libsidplayfp_la-SerialPort.Plo \ src/c64/CIA/$(DEPDIR)/libsidplayfp_la-interrupt.Plo \ src/c64/CIA/$(DEPDIR)/libsidplayfp_la-mos652x.Plo \ src/c64/CIA/$(DEPDIR)/libsidplayfp_la-timer.Plo \ src/c64/CIA/$(DEPDIR)/libsidplayfp_la-tod.Plo \ src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510.Plo \ src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510debug.Plo \ src/c64/VIC_II/$(DEPDIR)/libsidplayfp_la-mos656x.Plo \ src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidConfig.Plo \ src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidInfo.Plo \ src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTune.Plo \ src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTuneInfo.Plo \ src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidbuilder.Plo \ src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidplayfp.Plo \ src/sidtune/$(DEPDIR)/libsidplayfp_la-MUS.Plo \ src/sidtune/$(DEPDIR)/libsidplayfp_la-PSID.Plo \ src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneBase.Plo \ src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneTools.Plo \ src/sidtune/$(DEPDIR)/libsidplayfp_la-p00.Plo \ src/sidtune/$(DEPDIR)/libsidplayfp_la-prg.Plo \ src/utils/$(DEPDIR)/libsidplayfp_la-SidDatabase.Plo \ src/utils/$(DEPDIR)/libsidplayfp_la-iniParser.Plo \ src/utils/$(DEPDIR)/libsidplayfp_la-md5Factory.Plo \ src/utils/MD5/$(DEPDIR)/libsidplayfp_la-MD5.Plo \ src/utils/STILview/$(DEPDIR)/stil.Plo test/$(DEPDIR)/demo.Po \ test/$(DEPDIR)/test.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(src_builders_exsid_builder_libsidplayfp_exsid_la_SOURCES) \ $(src_builders_hardsid_builder_libsidplayfp_hardsid_la_SOURCES) \ $(src_builders_resid_builder_libsidplayfp_resid_la_SOURCES) \ $(src_builders_resid_builder_resid_libresid_la_SOURCES) \ $(src_builders_residfp_builder_libsidplayfp_residfp_la_SOURCES) \ $(src_builders_residfp_builder_residfp_libresidfp_la_SOURCES) \ $(src_libsidplayfp_la_SOURCES) $(src_libstilview_la_SOURCES) \ $(src_builders_residfp_builder_residfp_resample_test_SOURCES) \ $(test_demo_SOURCES) $(test_test_SOURCES) DIST_SOURCES = $(am__src_builders_exsid_builder_libsidplayfp_exsid_la_SOURCES_DIST) \ $(am__src_builders_hardsid_builder_libsidplayfp_hardsid_la_SOURCES_DIST) \ $(src_builders_resid_builder_libsidplayfp_resid_la_SOURCES) \ $(am__src_builders_resid_builder_resid_libresid_la_SOURCES_DIST) \ $(src_builders_residfp_builder_libsidplayfp_residfp_la_SOURCES) \ $(src_builders_residfp_builder_residfp_libresidfp_la_SOURCES) \ $(am__src_libsidplayfp_la_SOURCES_DIST) \ $(src_libstilview_la_SOURCES) \ $(am__src_builders_residfp_builder_residfp_resample_test_SOURCES_DIST) \ $(am__test_demo_SOURCES_DIST) $(am__test_test_SOURCES_DIST) RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-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 \ tags-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 DATA = $(noinst_DATA) $(pkgconfig_DATA) am__src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS_DIST = \ src/builders/exsid-builder/exsid.h am__src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS_DIST = \ src/builders/hardsid-builder/hardsid.h HEADERS = $(nodist_src_libsidplayfp_la_HEADERS) \ $(src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS) \ $(src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS) \ $(src_builders_resid_builder_libsidplayfp_resid_la_HEADERS) \ $(src_builders_residfp_builder_libsidplayfp_residfp_la_HEADERS) \ $(src_libsidplayfp_la_HEADERS) $(src_libstilview_la_HEADERS) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir distdir-am dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Doxyfile.in $(srcdir)/Makefile.in \ $(srcdir)/libsidplayfp.pc.in $(srcdir)/libstilview.pc.in \ $(top_srcdir)/build-aux/compile \ $(top_srcdir)/build-aux/config.guess \ $(top_srcdir)/build-aux/config.sub \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/ltmain.sh \ $(top_srcdir)/build-aux/missing \ $(top_srcdir)/src/builders/resid-builder/resid/siddefs.h.in \ $(top_srcdir)/src/builders/residfp-builder/residfp/siddefs-fp.h.in \ $(top_srcdir)/src/config.h.in \ $(top_srcdir)/src/sidplayfp/sidversion.h.in AUTHORS COPYING \ NEWS README TODO build-aux/compile build-aux/config.guess \ build-aux/config.sub build-aux/depcomp build-aux/install-sh \ build-aux/ltmain.sh build-aux/missing 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__post_remove_distdir = $(am__remove_distdir) 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 DIST_TARGETS = dist-gzip # Exists only to be overridden by the user if desired. AM_DISTCHECK_DVI_TARGET = dvi 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@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOT = @DOT@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ EXSID_CFLAGS = @EXSID_CFLAGS@ EXSID_LIBS = @EXSID_LIBS@ FGREP = @FGREP@ FTDI_CFLAGS = @FTDI_CFLAGS@ GREP = @GREP@ HAVE_BOOL = @HAVE_BOOL@ HAVE_BUILTIN_EXPECT = @HAVE_BUILTIN_EXPECT@ HAVE_CXX11 = @HAVE_CXX11@ HAVE_CXX14 = @HAVE_CXX14@ HAVE_CXX17 = @HAVE_CXX17@ HAVE_LOG1P = @HAVE_LOG1P@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIDPLAYVERSION = @LIBSIDPLAYVERSION@ LIBSTILVIEWVERSION = @LIBSTILVIEWVERSION@ LIBTOOL = @LIBTOOL@ LIB_LEVEL = @LIB_LEVEL@ LIB_MAJOR = @LIB_MAJOR@ LIB_MINOR = @LIB_MINOR@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEW_8580_FILTER = @NEW_8580_FILTER@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OD = @OD@ OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ RESID_BRANCH_HINTS = @RESID_BRANCH_HINTS@ RESID_INLINE = @RESID_INLINE@ RESID_INLINING = @RESID_INLINING@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UNITTEST_CFLAGS = @UNITTEST_CFLAGS@ UNITTEST_LIBS = @UNITTEST_LIBS@ VERSION = @VERSION@ XA = @XA@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ 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@ debug_flags = @debug_flags@ 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@ 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@ runstatedir = @runstatedir@ 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@ ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = foreign subdir-objects SUBDIRS = tests DISTCHECK_CONFIGURE_FLAGS = --enable-tests @MINGW32_TRUE@W32_CPPFLAGS = -DWIN32_LEAN_AND_MEAN @MINGW32_TRUE@W32_LDFLAGS = -no-undefined @HAVE_VISIBILITY_TRUE@VISIBILITY_CXXFLAGS = -fvisibility=hidden -fvisibility-inlines-hidden AM_CPPFLAGS = -I $(top_builddir)/src/builders/residfp-builder \ -I $(top_builddir)/src/builders/residfp-builder/residfp \ -I $(top_builddir)/src/builders/resid-builder \ -I $(top_builddir)/src/builders/resid-builder/resid \ -I $(top_builddir)/src \ -I $(top_builddir)/src/sidtune \ -I $(top_srcdir)/src \ ${W32_CPPFLAGS} \ $(EXSID_CFLAGS) \ $(PTHREAD_CFLAGS) \ $(FTDI_CFLAGS) \ @debug_flags@ AM_CXXFLAGS = $(VISIBILITY_CXXFLAGS) $(OPENMP_CXXFLAGS) #========================================================= EXTRA_DIST = \ docs/mainpage.dox \ src/psiddrv.a65 \ src/sidtune/sidplayer1.a65 \ src/sidtune/sidplayer2.a65 \ src/builders/residfp-builder/residfp/AUTHORS \ src/builders/residfp-builder/residfp/COPYING \ src/builders/residfp-builder/residfp/README \ src/builders/resid-builder/resid/AUTHORS \ src/builders/resid-builder/resid/ChangeLog \ src/builders/resid-builder/resid/configure.in \ src/builders/resid-builder/resid/Makefile.am \ src/builders/resid-builder/resid/NEWS \ src/builders/resid-builder/resid/README \ src/builders/resid-builder/resid/README.VICE \ src/builders/resid-builder/resid/THANKS \ src/builders/resid-builder/resid/TODO \ src/builders/resid-builder/resid/filter8580new.cc \ src/builders/resid-builder/resid/filter8580new.h \ $(noinst_DATA) \ $(noinst_SCRIPTS) \ test/testsuite.sh \ test/testlist #========================================================= # Libraries lib_LTLIBRARIES = \ src/libsidplayfp.la \ src/libstilview.la noinst_LTLIBRARIES = \ src/builders/residfp-builder/residfp/libresidfp.la \ src/builders/resid-builder/resid/libresid.la \ src/builders/residfp-builder/libsidplayfp-residfp.la \ src/builders/resid-builder/libsidplayfp-resid.la \ $(am__append_1) $(am__append_2) @LIBGCRYPT_FALSE@MD5SRC = \ @LIBGCRYPT_FALSE@src/utils/md5Internal.h \ @LIBGCRYPT_FALSE@src/utils/MD5/MD5.cpp \ @LIBGCRYPT_FALSE@src/utils/MD5/MD5.h \ @LIBGCRYPT_FALSE@src/utils/MD5/MD5_Defs.h #========================================================= # libsidplayfp @LIBGCRYPT_TRUE@MD5SRC = \ @LIBGCRYPT_TRUE@src/utils/md5Gcrypt.h src_libsidplayfp_la_SOURCES = \ src/Event.h \ src/EventCallback.h \ src/EventScheduler.cpp \ src/EventScheduler.h \ src/player.cpp \ src/player.h \ src/psiddrv.cpp \ src/psiddrv.h \ src/psiddrv.bin \ src/mixer.cpp \ src/mixer.h \ src/poweron.bin \ src/reloc65.cpp \ src/reloc65.h \ src/sidcxx11.h \ src/sidmd5.h \ src/sidmemory.h \ src/SidInfoImpl.h \ src/romCheck.h \ src/sidemu.cpp \ src/sidemu.h \ src/sidendian.h \ src/sidrandom.h \ src/stringutils.h \ src/c64/Banks/Bank.h \ src/c64/c64cpu.h \ src/c64/c64cia.h \ src/c64/c64env.h \ src/c64/c64sid.h \ src/c64/c64vic.h \ src/c64/c64.cpp \ src/c64/c64.h \ src/c64/mmu.cpp \ src/c64/mmu.h \ src/c64/Banks/ColorRAMBank.h \ src/c64/Banks/DisconnectedBusBank.h \ src/c64/Banks/ExtraSidBank.h \ src/c64/Banks/IOBank.h \ src/c64/Banks/NullSid.h \ src/c64/Banks/pla.h \ src/c64/Banks/SidBank.h \ src/c64/Banks/SystemRAMBank.h \ src/c64/Banks/SystemROMBanks.h \ src/c64/Banks/ZeroRAMBank.h \ src/c64/VIC_II/mos656x.cpp \ src/c64/VIC_II/mos656x.h \ src/c64/VIC_II/lightpen.h \ src/c64/VIC_II/sprites.h \ src/c64/CPU/flags.h \ src/c64/CPU/mos6510.cpp \ src/c64/CPU/mos6510.h \ src/c64/CPU/mos6510debug.cpp \ src/c64/CPU/mos6510debug.h \ src/c64/CPU/opcodes.h \ src/c64/CIA/interrupt.cpp \ src/c64/CIA/interrupt.h \ src/c64/CIA/mos652x.cpp \ src/c64/CIA/mos652x.h \ src/c64/CIA/SerialPort.h \ src/c64/CIA/SerialPort.cpp \ src/c64/CIA/timer.cpp \ src/c64/CIA/timer.h \ src/c64/CIA/tod.cpp \ src/c64/CIA/tod.h \ src/sidplayfp/sidplayfp.cpp \ src/sidplayfp/sidbuilder.cpp \ src/sidplayfp/SidConfig.cpp \ src/sidplayfp/SidInfo.cpp \ src/sidplayfp/SidTune.cpp \ src/sidplayfp/SidTuneInfo.cpp \ src/sidtune/MUS.cpp \ src/sidtune/MUS.h \ src/sidtune/p00.cpp \ src/sidtune/p00.h \ src/sidtune/prg.cpp \ src/sidtune/prg.h \ src/sidtune/PSID.cpp \ src/sidtune/PSID.h \ src/sidtune/sidplayer1.bin \ src/sidtune/sidplayer2.bin \ src/sidtune/SidTuneBase.cpp \ src/sidtune/SidTuneBase.h \ src/sidtune/SidTuneCfg.h \ src/sidtune/SidTuneInfoImpl.h \ src/sidtune/SidTuneTools.cpp \ src/sidtune/SidTuneTools.h \ src/sidtune/SmartPtr.h \ src/utils/iMd5.h \ src/utils/iniParser.cpp \ src/utils/iniParser.h \ src/utils/md5Factory.cpp \ src/utils/md5Factory.h \ src/utils/SidDatabase.cpp \ $(MD5SRC) src_libsidplayfp_la_LDFLAGS = -version-info $(LIBSIDPLAYVERSION) $(W32_LDFLAGS) src_libsidplayfp_ladir = $(includedir)/sidplayfp src_libsidplayfp_la_HEADERS = \ src/sidplayfp/siddefs.h \ src/sidplayfp/SidConfig.h \ src/sidplayfp/SidInfo.h \ src/sidplayfp/SidTuneInfo.h \ src/sidplayfp/sidbuilder.h \ src/sidplayfp/sidplayfp.h \ src/sidplayfp/SidTune.h \ src/utils/SidDatabase.h nodist_src_libsidplayfp_la_HEADERS = \ src/sidplayfp/sidversion.h src_libsidplayfp_la_LIBADD = \ src/builders/residfp-builder/libsidplayfp-residfp.la \ src/builders/resid-builder/libsidplayfp-resid.la \ $(LIBGCRYPT_LIBS) $(am__append_3) $(am__append_4) src_libsidplayfp_la_CPPFLAGS = $(LIBGCRYPT_CFLAGS) $(AM_CPPFLAGS) #========================================================= # residfp src_builders_residfp_builder_residfp_libresidfp_la_SOURCES = \ src/builders/residfp-builder/residfp/array.h \ src/builders/residfp-builder/residfp/Dac.cpp \ src/builders/residfp-builder/residfp/Dac.h \ src/builders/residfp-builder/residfp/EnvelopeGenerator.cpp \ src/builders/residfp-builder/residfp/EnvelopeGenerator.h \ src/builders/residfp-builder/residfp/ExternalFilter.cpp \ src/builders/residfp-builder/residfp/ExternalFilter.h \ src/builders/residfp-builder/residfp/Filter.cpp \ src/builders/residfp-builder/residfp/Filter.h \ src/builders/residfp-builder/residfp/Filter6581.cpp \ src/builders/residfp-builder/residfp/Filter6581.h \ src/builders/residfp-builder/residfp/Filter8580.cpp \ src/builders/residfp-builder/residfp/Filter8580.h \ src/builders/residfp-builder/residfp/FilterModelConfig.cpp \ src/builders/residfp-builder/residfp/FilterModelConfig.h \ src/builders/residfp-builder/residfp/FilterModelConfig6581.cpp \ src/builders/residfp-builder/residfp/FilterModelConfig6581.h \ src/builders/residfp-builder/residfp/FilterModelConfig8580.cpp \ src/builders/residfp-builder/residfp/FilterModelConfig8580.h \ src/builders/residfp-builder/residfp/Integrator6581.cpp \ src/builders/residfp-builder/residfp/Integrator6581.h \ src/builders/residfp-builder/residfp/Integrator8580.cpp \ src/builders/residfp-builder/residfp/Integrator8580.h \ src/builders/residfp-builder/residfp/OpAmp.cpp \ src/builders/residfp-builder/residfp/OpAmp.h \ src/builders/residfp-builder/residfp/Potentiometer.h \ src/builders/residfp-builder/residfp/SID.cpp \ src/builders/residfp-builder/residfp/SID.h \ src/builders/residfp-builder/residfp/Spline.cpp \ src/builders/residfp-builder/residfp/Spline.h \ src/builders/residfp-builder/residfp/Voice.h \ src/builders/residfp-builder/residfp/WaveformCalculator.cpp \ src/builders/residfp-builder/residfp/WaveformCalculator.h \ src/builders/residfp-builder/residfp/WaveformGenerator.cpp \ src/builders/residfp-builder/residfp/WaveformGenerator.h \ src/builders/residfp-builder/residfp/resample/Resampler.h \ src/builders/residfp-builder/residfp/resample/ZeroOrderResampler.h \ src/builders/residfp-builder/residfp/resample/SincResampler.cpp \ src/builders/residfp-builder/residfp/resample/SincResampler.h \ src/builders/residfp-builder/residfp/resample/TwoPassSincResampler.h \ src/builders/residfp-builder/residfp/version.cc #========================================================= # resid src_builders_resid_builder_resid_libresid_la_CPPFLAGS = \ $(AM_CPPFLAGS) \ -DVERSION=\"1.0-pre2\" @NEW_8580_FILTER_FALSE@FILTER8580SRC = \ @NEW_8580_FILTER_FALSE@src/builders/resid-builder/resid/filter.h \ @NEW_8580_FILTER_FALSE@src/builders/resid-builder/resid/filter.cc @NEW_8580_FILTER_TRUE@FILTER8580SRC = \ @NEW_8580_FILTER_TRUE@src/builders/resid-builder/resid/filter8580new.h \ @NEW_8580_FILTER_TRUE@src/builders/resid-builder/resid/filter8580new.cc src_builders_resid_builder_resid_libresid_la_SOURCES = \ src/builders/resid-builder/resid/dac.h \ src/builders/resid-builder/resid/sid.h \ src/builders/resid-builder/resid/voice.h \ src/builders/resid-builder/resid/wave.h \ src/builders/resid-builder/resid/envelope.h \ src/builders/resid-builder/resid/extfilt.h \ src/builders/resid-builder/resid/pot.h \ src/builders/resid-builder/resid/spline.h \ src/builders/resid-builder/resid/dac.cc \ src/builders/resid-builder/resid/sid.cc \ src/builders/resid-builder/resid/voice.cc \ src/builders/resid-builder/resid/wave.cc \ src/builders/resid-builder/resid/envelope.cc \ src/builders/resid-builder/resid/extfilt.cc \ src/builders/resid-builder/resid/pot.cc \ src/builders/resid-builder/resid/resid-config.h \ src/builders/resid-builder/resid/version.cc \ $(FILTER8580SRC) \ $(noinst_DATA:.dat=.h) noinst_DATA = \ src/builders/resid-builder/resid/wave6581_PST.dat \ src/builders/resid-builder/resid/wave6581_PS_.dat \ src/builders/resid-builder/resid/wave6581_P_T.dat \ src/builders/resid-builder/resid/wave6581__ST.dat \ src/builders/resid-builder/resid/wave8580_PST.dat \ src/builders/resid-builder/resid/wave8580_PS_.dat \ src/builders/resid-builder/resid/wave8580_P_T.dat \ src/builders/resid-builder/resid/wave8580__ST.dat noinst_SCRIPTS = src/builders/resid-builder/resid/samp2src.pl #========================================================= # builders src_builders_residfp_builder_libsidplayfp_residfp_ladir = $(includedir)/sidplayfp/builders src_builders_residfp_builder_libsidplayfp_residfp_la_HEADERS = \ src/builders/residfp-builder/residfp.h src_builders_residfp_builder_libsidplayfp_residfp_la_SOURCES = \ src/builders/residfp-builder/residfp-builder.cpp \ src/builders/residfp-builder/residfp-emu.cpp \ src/builders/residfp-builder/residfp-emu.h src_builders_residfp_builder_libsidplayfp_residfp_la_LIBADD = \ src/builders/residfp-builder/residfp/libresidfp.la src_builders_resid_builder_libsidplayfp_resid_ladir = $(includedir)/sidplayfp/builders src_builders_resid_builder_libsidplayfp_resid_la_HEADERS = \ src/builders/resid-builder/resid.h src_builders_resid_builder_libsidplayfp_resid_la_SOURCES = \ src/builders/resid-builder/resid-builder.cpp \ src/builders/resid-builder/resid-emu.cpp \ src/builders/resid-builder/resid-emu.h src_builders_resid_builder_libsidplayfp_resid_la_LIBADD = \ src/builders/resid-builder/resid/libresid.la @HARDSID_TRUE@src_builders_hardsid_builder_libsidplayfp_hardsid_ladir = $(includedir)/sidplayfp/builders @HARDSID_TRUE@src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS = \ @HARDSID_TRUE@src/builders/hardsid-builder/hardsid.h @HARDSID_TRUE@@MINGW32_FALSE@hardsid_src = src/builders/hardsid-builder/hardsid-emu-unix.cpp @HARDSID_TRUE@@MINGW32_TRUE@hardsid_src = src/builders/hardsid-builder/hardsid-emu-win.cpp @HARDSID_TRUE@src_builders_hardsid_builder_libsidplayfp_hardsid_la_SOURCES = \ @HARDSID_TRUE@$(hardsid_src) \ @HARDSID_TRUE@src/builders/hardsid-builder/hardsid-builder.cpp \ @HARDSID_TRUE@src/builders/hardsid-builder/hardsid-emu.h @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@exsid_src = \ @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@src/builders/exsid-builder/driver/exSID.c \ @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@src/builders/exsid-builder/driver/exSID.h \ @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@src/builders/exsid-builder/driver/exSID_defs.h \ @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@src/builders/exsid-builder/driver/exSID_ftdiwrap.c \ @EXSID_DRIVER_TRUE@@EXSID_SUPPORT_TRUE@src/builders/exsid-builder/driver/exSID_ftdiwrap.h @EXSID_SUPPORT_TRUE@src_builders_exsid_builder_libsidplayfp_exsid_ladir = $(includedir)/sidplayfp/builders @EXSID_SUPPORT_TRUE@src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS = \ @EXSID_SUPPORT_TRUE@src/builders/exsid-builder/exsid.h @EXSID_SUPPORT_TRUE@src_builders_exsid_builder_libsidplayfp_exsid_la_SOURCES = \ @EXSID_SUPPORT_TRUE@src/builders/exsid-builder/exsid-builder.cpp \ @EXSID_SUPPORT_TRUE@src/builders/exsid-builder/exsid-emu.cpp \ @EXSID_SUPPORT_TRUE@src/builders/exsid-builder/exsid-emu.h \ @EXSID_SUPPORT_TRUE@$(exsid_src) @EXSID_SUPPORT_TRUE@src_builders_exsid_builder_libsidplayfp_exsid_la_LIBADD = \ @EXSID_SUPPORT_TRUE@ $(EXSID_LIBS) \ @EXSID_SUPPORT_TRUE@ $(PTHREAD_LIBS) #========================================================= # libstilview src_libstilview_la_SOURCES = \ src/utils/STILview/stil.cpp src_libstilview_la_LDFLAGS = -version-info $(LIBSTILVIEWVERSION) $(W32_LDFLAGS) src_libstilview_ladir = $(includedir)/stilview src_libstilview_la_HEADERS = \ src/utils/STILview/stil.h \ src/utils/STILview/stildefs.h @MINGW32_FALSE@@TESTSUITE_TRUE@DEMO_SRC = test/demo #========================================================= # test @MINGW32_TRUE@@TESTSUITE_TRUE@DEMO_SRC = @TESTSUITE_TRUE@test_demo_SOURCES = test/demo.cpp @TESTSUITE_TRUE@test_demo_LDADD = src/libsidplayfp.la @TESTSUITE_TRUE@test_test_SOURCES = test/test.cpp @TESTSUITE_TRUE@test_test_LDADD = src/libsidplayfp.la @TESTSUITE_TRUE@src_builders_residfp_builder_residfp_resample_test_SOURCES = src/builders/residfp-builder/residfp/resample/test.cpp @TESTSUITE_TRUE@src_builders_residfp_builder_residfp_resample_test_LDADD = src/builders/residfp-builder/residfp/resample/SincResampler.lo #========================================================= pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libsidplayfp.pc libstilview.pc #========================================================= BUILT_SOURCES = \ $(noinst_DATA:.dat=.h) \ src/psiddrv.bin \ src/sidtune/sidplayer1.bin \ src/sidtune/sidplayer2.bin #========================================================= # Recreate psiddrv.bin, needs xa65 MAINTAINERCLEANFILES = $(BUILT_SOURCES) all: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: .SUFFIXES: .a65 .bin .c .cc .cpp .dat .h .lo .o .obj am--refresh: Makefile @: $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign 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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): src/config.h: src/stamp-h1 @test -f $@ || rm -f src/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/stamp-h1 src/stamp-h1: $(top_srcdir)/src/config.h.in $(top_builddir)/config.status @rm -f src/stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status src/config.h $(top_srcdir)/src/config.h.in: $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f src/stamp-h1 touch $@ distclean-hdr: -rm -f src/config.h src/stamp-h1 @HAVE_DOXYGEN_TRUE@Doxyfile: $(top_builddir)/config.status $(srcdir)/Doxyfile.in @HAVE_DOXYGEN_TRUE@ cd $(top_builddir) && $(SHELL) ./config.status $@ libsidplayfp.pc: $(top_builddir)/config.status $(srcdir)/libsidplayfp.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ libstilview.pc: $(top_builddir)/config.status $(srcdir)/libstilview.pc.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/sidplayfp/sidversion.h: $(top_builddir)/config.status $(top_srcdir)/src/sidplayfp/sidversion.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/builders/residfp-builder/residfp/siddefs-fp.h: $(top_builddir)/config.status $(top_srcdir)/src/builders/residfp-builder/residfp/siddefs-fp.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ src/builders/resid-builder/resid/siddefs.h: $(top_builddir)/config.status $(top_srcdir)/src/builders/resid-builder/resid/siddefs.h.in cd $(top_builddir) && $(SHELL) ./config.status $@ clean-noinstPROGRAMS: @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } clean-noinstLTLIBRARIES: -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) @list='$(noinst_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } src/builders/exsid-builder/$(am__dirstamp): @$(MKDIR_P) src/builders/exsid-builder @: > src/builders/exsid-builder/$(am__dirstamp) src/builders/exsid-builder/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/exsid-builder/$(DEPDIR) @: > src/builders/exsid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/exsid-builder/exsid-builder.lo: \ src/builders/exsid-builder/$(am__dirstamp) \ src/builders/exsid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/exsid-builder/exsid-emu.lo: \ src/builders/exsid-builder/$(am__dirstamp) \ src/builders/exsid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/exsid-builder/driver/$(am__dirstamp): @$(MKDIR_P) src/builders/exsid-builder/driver @: > src/builders/exsid-builder/driver/$(am__dirstamp) src/builders/exsid-builder/driver/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/exsid-builder/driver/$(DEPDIR) @: > src/builders/exsid-builder/driver/$(DEPDIR)/$(am__dirstamp) src/builders/exsid-builder/driver/exSID.lo: \ src/builders/exsid-builder/driver/$(am__dirstamp) \ src/builders/exsid-builder/driver/$(DEPDIR)/$(am__dirstamp) src/builders/exsid-builder/driver/exSID_ftdiwrap.lo: \ src/builders/exsid-builder/driver/$(am__dirstamp) \ src/builders/exsid-builder/driver/$(DEPDIR)/$(am__dirstamp) src/builders/exsid-builder/libsidplayfp-exsid.la: $(src_builders_exsid_builder_libsidplayfp_exsid_la_OBJECTS) $(src_builders_exsid_builder_libsidplayfp_exsid_la_DEPENDENCIES) $(EXTRA_src_builders_exsid_builder_libsidplayfp_exsid_la_DEPENDENCIES) src/builders/exsid-builder/$(am__dirstamp) $(AM_V_CXXLD)$(CXXLINK) $(am_src_builders_exsid_builder_libsidplayfp_exsid_la_rpath) $(src_builders_exsid_builder_libsidplayfp_exsid_la_OBJECTS) $(src_builders_exsid_builder_libsidplayfp_exsid_la_LIBADD) $(LIBS) src/builders/hardsid-builder/$(am__dirstamp): @$(MKDIR_P) src/builders/hardsid-builder @: > src/builders/hardsid-builder/$(am__dirstamp) src/builders/hardsid-builder/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/hardsid-builder/$(DEPDIR) @: > src/builders/hardsid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/hardsid-builder/hardsid-emu-unix.lo: \ src/builders/hardsid-builder/$(am__dirstamp) \ src/builders/hardsid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/hardsid-builder/hardsid-emu-win.lo: \ src/builders/hardsid-builder/$(am__dirstamp) \ src/builders/hardsid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/hardsid-builder/hardsid-builder.lo: \ src/builders/hardsid-builder/$(am__dirstamp) \ src/builders/hardsid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/hardsid-builder/libsidplayfp-hardsid.la: $(src_builders_hardsid_builder_libsidplayfp_hardsid_la_OBJECTS) $(src_builders_hardsid_builder_libsidplayfp_hardsid_la_DEPENDENCIES) $(EXTRA_src_builders_hardsid_builder_libsidplayfp_hardsid_la_DEPENDENCIES) src/builders/hardsid-builder/$(am__dirstamp) $(AM_V_CXXLD)$(CXXLINK) $(am_src_builders_hardsid_builder_libsidplayfp_hardsid_la_rpath) $(src_builders_hardsid_builder_libsidplayfp_hardsid_la_OBJECTS) $(src_builders_hardsid_builder_libsidplayfp_hardsid_la_LIBADD) $(LIBS) src/builders/resid-builder/$(am__dirstamp): @$(MKDIR_P) src/builders/resid-builder @: > src/builders/resid-builder/$(am__dirstamp) src/builders/resid-builder/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/resid-builder/$(DEPDIR) @: > src/builders/resid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid-builder.lo: \ src/builders/resid-builder/$(am__dirstamp) \ src/builders/resid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid-emu.lo: \ src/builders/resid-builder/$(am__dirstamp) \ src/builders/resid-builder/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/libsidplayfp-resid.la: $(src_builders_resid_builder_libsidplayfp_resid_la_OBJECTS) $(src_builders_resid_builder_libsidplayfp_resid_la_DEPENDENCIES) $(EXTRA_src_builders_resid_builder_libsidplayfp_resid_la_DEPENDENCIES) src/builders/resid-builder/$(am__dirstamp) $(AM_V_CXXLD)$(CXXLINK) $(src_builders_resid_builder_libsidplayfp_resid_la_OBJECTS) $(src_builders_resid_builder_libsidplayfp_resid_la_LIBADD) $(LIBS) src/builders/resid-builder/resid/$(am__dirstamp): @$(MKDIR_P) src/builders/resid-builder/resid @: > src/builders/resid-builder/resid/$(am__dirstamp) src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/resid-builder/resid/$(DEPDIR) @: > src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-dac.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-sid.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-voice.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-wave.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-envelope.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-extfilt.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-pot.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-version.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-filter.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid_la-filter8580new.lo: \ src/builders/resid-builder/resid/$(am__dirstamp) \ src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) src/builders/resid-builder/resid/libresid.la: $(src_builders_resid_builder_resid_libresid_la_OBJECTS) $(src_builders_resid_builder_resid_libresid_la_DEPENDENCIES) $(EXTRA_src_builders_resid_builder_resid_libresid_la_DEPENDENCIES) src/builders/resid-builder/resid/$(am__dirstamp) $(AM_V_CXXLD)$(CXXLINK) $(src_builders_resid_builder_resid_libresid_la_OBJECTS) $(src_builders_resid_builder_resid_libresid_la_LIBADD) $(LIBS) src/builders/residfp-builder/$(am__dirstamp): @$(MKDIR_P) src/builders/residfp-builder @: > src/builders/residfp-builder/$(am__dirstamp) src/builders/residfp-builder/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/residfp-builder/$(DEPDIR) @: > src/builders/residfp-builder/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp-builder.lo: \ src/builders/residfp-builder/$(am__dirstamp) \ src/builders/residfp-builder/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp-emu.lo: \ src/builders/residfp-builder/$(am__dirstamp) \ src/builders/residfp-builder/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/libsidplayfp-residfp.la: $(src_builders_residfp_builder_libsidplayfp_residfp_la_OBJECTS) $(src_builders_residfp_builder_libsidplayfp_residfp_la_DEPENDENCIES) $(EXTRA_src_builders_residfp_builder_libsidplayfp_residfp_la_DEPENDENCIES) src/builders/residfp-builder/$(am__dirstamp) $(AM_V_CXXLD)$(CXXLINK) $(src_builders_residfp_builder_libsidplayfp_residfp_la_OBJECTS) $(src_builders_residfp_builder_libsidplayfp_residfp_la_LIBADD) $(LIBS) src/builders/residfp-builder/residfp/$(am__dirstamp): @$(MKDIR_P) src/builders/residfp-builder/residfp @: > src/builders/residfp-builder/residfp/$(am__dirstamp) src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/residfp-builder/residfp/$(DEPDIR) @: > src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/Dac.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/EnvelopeGenerator.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/ExternalFilter.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/Filter.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/Filter6581.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/Filter8580.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/FilterModelConfig.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/FilterModelConfig6581.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/FilterModelConfig8580.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/Integrator6581.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/Integrator8580.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/OpAmp.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/SID.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/Spline.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/WaveformCalculator.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/WaveformGenerator.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/resample/$(am__dirstamp): @$(MKDIR_P) src/builders/residfp-builder/residfp/resample @: > src/builders/residfp-builder/residfp/resample/$(am__dirstamp) src/builders/residfp-builder/residfp/resample/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/builders/residfp-builder/residfp/resample/$(DEPDIR) @: > src/builders/residfp-builder/residfp/resample/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/resample/SincResampler.lo: \ src/builders/residfp-builder/residfp/resample/$(am__dirstamp) \ src/builders/residfp-builder/residfp/resample/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/version.lo: \ src/builders/residfp-builder/residfp/$(am__dirstamp) \ src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/libresidfp.la: $(src_builders_residfp_builder_residfp_libresidfp_la_OBJECTS) $(src_builders_residfp_builder_residfp_libresidfp_la_DEPENDENCIES) $(EXTRA_src_builders_residfp_builder_residfp_libresidfp_la_DEPENDENCIES) src/builders/residfp-builder/residfp/$(am__dirstamp) $(AM_V_CXXLD)$(CXXLINK) $(src_builders_residfp_builder_residfp_libresidfp_la_OBJECTS) $(src_builders_residfp_builder_residfp_libresidfp_la_LIBADD) $(LIBS) src/$(am__dirstamp): @$(MKDIR_P) src @: > src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/$(DEPDIR) @: > src/$(DEPDIR)/$(am__dirstamp) src/libsidplayfp_la-EventScheduler.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/libsidplayfp_la-player.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/libsidplayfp_la-psiddrv.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/libsidplayfp_la-mixer.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/libsidplayfp_la-reloc65.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/libsidplayfp_la-sidemu.lo: src/$(am__dirstamp) \ src/$(DEPDIR)/$(am__dirstamp) src/c64/$(am__dirstamp): @$(MKDIR_P) src/c64 @: > src/c64/$(am__dirstamp) src/c64/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/c64/$(DEPDIR) @: > src/c64/$(DEPDIR)/$(am__dirstamp) src/c64/libsidplayfp_la-c64.lo: src/c64/$(am__dirstamp) \ src/c64/$(DEPDIR)/$(am__dirstamp) src/c64/libsidplayfp_la-mmu.lo: src/c64/$(am__dirstamp) \ src/c64/$(DEPDIR)/$(am__dirstamp) src/c64/VIC_II/$(am__dirstamp): @$(MKDIR_P) src/c64/VIC_II @: > src/c64/VIC_II/$(am__dirstamp) src/c64/VIC_II/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/c64/VIC_II/$(DEPDIR) @: > src/c64/VIC_II/$(DEPDIR)/$(am__dirstamp) src/c64/VIC_II/libsidplayfp_la-mos656x.lo: \ src/c64/VIC_II/$(am__dirstamp) \ src/c64/VIC_II/$(DEPDIR)/$(am__dirstamp) src/c64/CPU/$(am__dirstamp): @$(MKDIR_P) src/c64/CPU @: > src/c64/CPU/$(am__dirstamp) src/c64/CPU/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/c64/CPU/$(DEPDIR) @: > src/c64/CPU/$(DEPDIR)/$(am__dirstamp) src/c64/CPU/libsidplayfp_la-mos6510.lo: src/c64/CPU/$(am__dirstamp) \ src/c64/CPU/$(DEPDIR)/$(am__dirstamp) src/c64/CPU/libsidplayfp_la-mos6510debug.lo: \ src/c64/CPU/$(am__dirstamp) \ src/c64/CPU/$(DEPDIR)/$(am__dirstamp) src/c64/CIA/$(am__dirstamp): @$(MKDIR_P) src/c64/CIA @: > src/c64/CIA/$(am__dirstamp) src/c64/CIA/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/c64/CIA/$(DEPDIR) @: > src/c64/CIA/$(DEPDIR)/$(am__dirstamp) src/c64/CIA/libsidplayfp_la-interrupt.lo: src/c64/CIA/$(am__dirstamp) \ src/c64/CIA/$(DEPDIR)/$(am__dirstamp) src/c64/CIA/libsidplayfp_la-mos652x.lo: src/c64/CIA/$(am__dirstamp) \ src/c64/CIA/$(DEPDIR)/$(am__dirstamp) src/c64/CIA/libsidplayfp_la-SerialPort.lo: \ src/c64/CIA/$(am__dirstamp) \ src/c64/CIA/$(DEPDIR)/$(am__dirstamp) src/c64/CIA/libsidplayfp_la-timer.lo: src/c64/CIA/$(am__dirstamp) \ src/c64/CIA/$(DEPDIR)/$(am__dirstamp) src/c64/CIA/libsidplayfp_la-tod.lo: src/c64/CIA/$(am__dirstamp) \ src/c64/CIA/$(DEPDIR)/$(am__dirstamp) src/sidplayfp/$(am__dirstamp): @$(MKDIR_P) src/sidplayfp @: > src/sidplayfp/$(am__dirstamp) src/sidplayfp/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/sidplayfp/$(DEPDIR) @: > src/sidplayfp/$(DEPDIR)/$(am__dirstamp) src/sidplayfp/libsidplayfp_la-sidplayfp.lo: \ src/sidplayfp/$(am__dirstamp) \ src/sidplayfp/$(DEPDIR)/$(am__dirstamp) src/sidplayfp/libsidplayfp_la-sidbuilder.lo: \ src/sidplayfp/$(am__dirstamp) \ src/sidplayfp/$(DEPDIR)/$(am__dirstamp) src/sidplayfp/libsidplayfp_la-SidConfig.lo: \ src/sidplayfp/$(am__dirstamp) \ src/sidplayfp/$(DEPDIR)/$(am__dirstamp) src/sidplayfp/libsidplayfp_la-SidInfo.lo: \ src/sidplayfp/$(am__dirstamp) \ src/sidplayfp/$(DEPDIR)/$(am__dirstamp) src/sidplayfp/libsidplayfp_la-SidTune.lo: \ src/sidplayfp/$(am__dirstamp) \ src/sidplayfp/$(DEPDIR)/$(am__dirstamp) src/sidplayfp/libsidplayfp_la-SidTuneInfo.lo: \ src/sidplayfp/$(am__dirstamp) \ src/sidplayfp/$(DEPDIR)/$(am__dirstamp) src/sidtune/$(am__dirstamp): @$(MKDIR_P) src/sidtune @: > src/sidtune/$(am__dirstamp) src/sidtune/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/sidtune/$(DEPDIR) @: > src/sidtune/$(DEPDIR)/$(am__dirstamp) src/sidtune/libsidplayfp_la-MUS.lo: src/sidtune/$(am__dirstamp) \ src/sidtune/$(DEPDIR)/$(am__dirstamp) src/sidtune/libsidplayfp_la-p00.lo: src/sidtune/$(am__dirstamp) \ src/sidtune/$(DEPDIR)/$(am__dirstamp) src/sidtune/libsidplayfp_la-prg.lo: src/sidtune/$(am__dirstamp) \ src/sidtune/$(DEPDIR)/$(am__dirstamp) src/sidtune/libsidplayfp_la-PSID.lo: src/sidtune/$(am__dirstamp) \ src/sidtune/$(DEPDIR)/$(am__dirstamp) src/sidtune/libsidplayfp_la-SidTuneBase.lo: \ src/sidtune/$(am__dirstamp) \ src/sidtune/$(DEPDIR)/$(am__dirstamp) src/sidtune/libsidplayfp_la-SidTuneTools.lo: \ src/sidtune/$(am__dirstamp) \ src/sidtune/$(DEPDIR)/$(am__dirstamp) src/utils/$(am__dirstamp): @$(MKDIR_P) src/utils @: > src/utils/$(am__dirstamp) src/utils/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/utils/$(DEPDIR) @: > src/utils/$(DEPDIR)/$(am__dirstamp) src/utils/libsidplayfp_la-iniParser.lo: src/utils/$(am__dirstamp) \ src/utils/$(DEPDIR)/$(am__dirstamp) src/utils/libsidplayfp_la-md5Factory.lo: src/utils/$(am__dirstamp) \ src/utils/$(DEPDIR)/$(am__dirstamp) src/utils/libsidplayfp_la-SidDatabase.lo: src/utils/$(am__dirstamp) \ src/utils/$(DEPDIR)/$(am__dirstamp) src/utils/MD5/$(am__dirstamp): @$(MKDIR_P) src/utils/MD5 @: > src/utils/MD5/$(am__dirstamp) src/utils/MD5/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/utils/MD5/$(DEPDIR) @: > src/utils/MD5/$(DEPDIR)/$(am__dirstamp) src/utils/MD5/libsidplayfp_la-MD5.lo: src/utils/MD5/$(am__dirstamp) \ src/utils/MD5/$(DEPDIR)/$(am__dirstamp) src/libsidplayfp.la: $(src_libsidplayfp_la_OBJECTS) $(src_libsidplayfp_la_DEPENDENCIES) $(EXTRA_src_libsidplayfp_la_DEPENDENCIES) src/$(am__dirstamp) $(AM_V_CXXLD)$(src_libsidplayfp_la_LINK) -rpath $(libdir) $(src_libsidplayfp_la_OBJECTS) $(src_libsidplayfp_la_LIBADD) $(LIBS) src/utils/STILview/$(am__dirstamp): @$(MKDIR_P) src/utils/STILview @: > src/utils/STILview/$(am__dirstamp) src/utils/STILview/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) src/utils/STILview/$(DEPDIR) @: > src/utils/STILview/$(DEPDIR)/$(am__dirstamp) src/utils/STILview/stil.lo: src/utils/STILview/$(am__dirstamp) \ src/utils/STILview/$(DEPDIR)/$(am__dirstamp) src/libstilview.la: $(src_libstilview_la_OBJECTS) $(src_libstilview_la_DEPENDENCIES) $(EXTRA_src_libstilview_la_DEPENDENCIES) src/$(am__dirstamp) $(AM_V_CXXLD)$(src_libstilview_la_LINK) -rpath $(libdir) $(src_libstilview_la_OBJECTS) $(src_libstilview_la_LIBADD) $(LIBS) src/builders/residfp-builder/residfp/resample/test.$(OBJEXT): \ src/builders/residfp-builder/residfp/resample/$(am__dirstamp) \ src/builders/residfp-builder/residfp/resample/$(DEPDIR)/$(am__dirstamp) src/builders/residfp-builder/residfp/resample/test$(EXEEXT): $(src_builders_residfp_builder_residfp_resample_test_OBJECTS) $(src_builders_residfp_builder_residfp_resample_test_DEPENDENCIES) $(EXTRA_src_builders_residfp_builder_residfp_resample_test_DEPENDENCIES) src/builders/residfp-builder/residfp/resample/$(am__dirstamp) @rm -f src/builders/residfp-builder/residfp/resample/test$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(src_builders_residfp_builder_residfp_resample_test_OBJECTS) $(src_builders_residfp_builder_residfp_resample_test_LDADD) $(LIBS) test/$(am__dirstamp): @$(MKDIR_P) test @: > test/$(am__dirstamp) test/$(DEPDIR)/$(am__dirstamp): @$(MKDIR_P) test/$(DEPDIR) @: > test/$(DEPDIR)/$(am__dirstamp) test/demo.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) test/demo$(EXEEXT): $(test_demo_OBJECTS) $(test_demo_DEPENDENCIES) $(EXTRA_test_demo_DEPENDENCIES) test/$(am__dirstamp) @rm -f test/demo$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(test_demo_OBJECTS) $(test_demo_LDADD) $(LIBS) test/test.$(OBJEXT): test/$(am__dirstamp) \ test/$(DEPDIR)/$(am__dirstamp) test/test$(EXEEXT): $(test_test_OBJECTS) $(test_test_DEPENDENCIES) $(EXTRA_test_test_DEPENDENCIES) test/$(am__dirstamp) @rm -f test/test$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(test_test_OBJECTS) $(test_test_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) -rm -f src/*.$(OBJEXT) -rm -f src/*.lo -rm -f src/builders/exsid-builder/*.$(OBJEXT) -rm -f src/builders/exsid-builder/*.lo -rm -f src/builders/exsid-builder/driver/*.$(OBJEXT) -rm -f src/builders/exsid-builder/driver/*.lo -rm -f src/builders/hardsid-builder/*.$(OBJEXT) -rm -f src/builders/hardsid-builder/*.lo -rm -f src/builders/resid-builder/*.$(OBJEXT) -rm -f src/builders/resid-builder/*.lo -rm -f src/builders/resid-builder/resid/*.$(OBJEXT) -rm -f src/builders/resid-builder/resid/*.lo -rm -f src/builders/residfp-builder/*.$(OBJEXT) -rm -f src/builders/residfp-builder/*.lo -rm -f src/builders/residfp-builder/residfp/*.$(OBJEXT) -rm -f src/builders/residfp-builder/residfp/*.lo -rm -f src/builders/residfp-builder/residfp/resample/*.$(OBJEXT) -rm -f src/builders/residfp-builder/residfp/resample/*.lo -rm -f src/c64/*.$(OBJEXT) -rm -f src/c64/*.lo -rm -f src/c64/CIA/*.$(OBJEXT) -rm -f src/c64/CIA/*.lo -rm -f src/c64/CPU/*.$(OBJEXT) -rm -f src/c64/CPU/*.lo -rm -f src/c64/VIC_II/*.$(OBJEXT) -rm -f src/c64/VIC_II/*.lo -rm -f src/sidplayfp/*.$(OBJEXT) -rm -f src/sidplayfp/*.lo -rm -f src/sidtune/*.$(OBJEXT) -rm -f src/sidtune/*.lo -rm -f src/utils/*.$(OBJEXT) -rm -f src/utils/*.lo -rm -f src/utils/MD5/*.$(OBJEXT) -rm -f src/utils/MD5/*.lo -rm -f src/utils/STILview/*.$(OBJEXT) -rm -f src/utils/STILview/*.lo -rm -f test/*.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsidplayfp_la-EventScheduler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsidplayfp_la-mixer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsidplayfp_la-player.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsidplayfp_la-psiddrv.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsidplayfp_la-reloc65.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/libsidplayfp_la-sidemu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/exsid-builder/$(DEPDIR)/exsid-builder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/exsid-builder/$(DEPDIR)/exsid-emu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/exsid-builder/driver/$(DEPDIR)/exSID.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/exsid-builder/driver/$(DEPDIR)/exSID_ftdiwrap.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/hardsid-builder/$(DEPDIR)/hardsid-builder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-unix.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-win.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/$(DEPDIR)/resid-builder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/$(DEPDIR)/resid-emu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-dac.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-envelope.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-extfilt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter8580new.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-pot.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-sid.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-version.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-voice.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-wave.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/$(DEPDIR)/residfp-builder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/$(DEPDIR)/residfp-emu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/Dac.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/EnvelopeGenerator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/ExternalFilter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/Filter.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/Filter6581.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/Filter8580.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig6581.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig8580.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator6581.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator8580.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/OpAmp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/SID.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/Spline.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformCalculator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformGenerator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/$(DEPDIR)/version.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/resample/$(DEPDIR)/SincResampler.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/builders/residfp-builder/residfp/resample/$(DEPDIR)/test.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/$(DEPDIR)/libsidplayfp_la-c64.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/$(DEPDIR)/libsidplayfp_la-mmu.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/CIA/$(DEPDIR)/libsidplayfp_la-SerialPort.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/CIA/$(DEPDIR)/libsidplayfp_la-interrupt.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/CIA/$(DEPDIR)/libsidplayfp_la-mos652x.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/CIA/$(DEPDIR)/libsidplayfp_la-timer.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/CIA/$(DEPDIR)/libsidplayfp_la-tod.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510debug.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/c64/VIC_II/$(DEPDIR)/libsidplayfp_la-mos656x.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidConfig.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidInfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTune.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTuneInfo.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidbuilder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidplayfp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidtune/$(DEPDIR)/libsidplayfp_la-MUS.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidtune/$(DEPDIR)/libsidplayfp_la-PSID.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneBase.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneTools.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidtune/$(DEPDIR)/libsidplayfp_la-p00.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/sidtune/$(DEPDIR)/libsidplayfp_la-prg.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/utils/$(DEPDIR)/libsidplayfp_la-SidDatabase.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/utils/$(DEPDIR)/libsidplayfp_la-iniParser.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/utils/$(DEPDIR)/libsidplayfp_la-md5Factory.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/utils/MD5/$(DEPDIR)/libsidplayfp_la-MD5.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@src/utils/STILview/$(DEPDIR)/stil.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/demo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@test/$(DEPDIR)/test.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< src/builders/resid-builder/resid/libresid_la-dac.lo: src/builders/resid-builder/resid/dac.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-dac.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-dac.Tpo -c -o src/builders/resid-builder/resid/libresid_la-dac.lo `test -f 'src/builders/resid-builder/resid/dac.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/dac.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-dac.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-dac.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/dac.cc' object='src/builders/resid-builder/resid/libresid_la-dac.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-dac.lo `test -f 'src/builders/resid-builder/resid/dac.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/dac.cc src/builders/resid-builder/resid/libresid_la-sid.lo: src/builders/resid-builder/resid/sid.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-sid.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-sid.Tpo -c -o src/builders/resid-builder/resid/libresid_la-sid.lo `test -f 'src/builders/resid-builder/resid/sid.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/sid.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-sid.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-sid.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/sid.cc' object='src/builders/resid-builder/resid/libresid_la-sid.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-sid.lo `test -f 'src/builders/resid-builder/resid/sid.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/sid.cc src/builders/resid-builder/resid/libresid_la-voice.lo: src/builders/resid-builder/resid/voice.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-voice.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-voice.Tpo -c -o src/builders/resid-builder/resid/libresid_la-voice.lo `test -f 'src/builders/resid-builder/resid/voice.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/voice.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-voice.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-voice.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/voice.cc' object='src/builders/resid-builder/resid/libresid_la-voice.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-voice.lo `test -f 'src/builders/resid-builder/resid/voice.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/voice.cc src/builders/resid-builder/resid/libresid_la-wave.lo: src/builders/resid-builder/resid/wave.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-wave.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-wave.Tpo -c -o src/builders/resid-builder/resid/libresid_la-wave.lo `test -f 'src/builders/resid-builder/resid/wave.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/wave.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-wave.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-wave.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/wave.cc' object='src/builders/resid-builder/resid/libresid_la-wave.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-wave.lo `test -f 'src/builders/resid-builder/resid/wave.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/wave.cc src/builders/resid-builder/resid/libresid_la-envelope.lo: src/builders/resid-builder/resid/envelope.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-envelope.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-envelope.Tpo -c -o src/builders/resid-builder/resid/libresid_la-envelope.lo `test -f 'src/builders/resid-builder/resid/envelope.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/envelope.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-envelope.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-envelope.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/envelope.cc' object='src/builders/resid-builder/resid/libresid_la-envelope.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-envelope.lo `test -f 'src/builders/resid-builder/resid/envelope.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/envelope.cc src/builders/resid-builder/resid/libresid_la-extfilt.lo: src/builders/resid-builder/resid/extfilt.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-extfilt.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-extfilt.Tpo -c -o src/builders/resid-builder/resid/libresid_la-extfilt.lo `test -f 'src/builders/resid-builder/resid/extfilt.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/extfilt.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-extfilt.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-extfilt.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/extfilt.cc' object='src/builders/resid-builder/resid/libresid_la-extfilt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-extfilt.lo `test -f 'src/builders/resid-builder/resid/extfilt.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/extfilt.cc src/builders/resid-builder/resid/libresid_la-pot.lo: src/builders/resid-builder/resid/pot.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-pot.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-pot.Tpo -c -o src/builders/resid-builder/resid/libresid_la-pot.lo `test -f 'src/builders/resid-builder/resid/pot.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/pot.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-pot.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-pot.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/pot.cc' object='src/builders/resid-builder/resid/libresid_la-pot.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-pot.lo `test -f 'src/builders/resid-builder/resid/pot.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/pot.cc src/builders/resid-builder/resid/libresid_la-version.lo: src/builders/resid-builder/resid/version.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-version.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-version.Tpo -c -o src/builders/resid-builder/resid/libresid_la-version.lo `test -f 'src/builders/resid-builder/resid/version.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/version.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-version.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-version.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/version.cc' object='src/builders/resid-builder/resid/libresid_la-version.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-version.lo `test -f 'src/builders/resid-builder/resid/version.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/version.cc src/builders/resid-builder/resid/libresid_la-filter.lo: src/builders/resid-builder/resid/filter.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-filter.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter.Tpo -c -o src/builders/resid-builder/resid/libresid_la-filter.lo `test -f 'src/builders/resid-builder/resid/filter.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/filter.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/filter.cc' object='src/builders/resid-builder/resid/libresid_la-filter.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-filter.lo `test -f 'src/builders/resid-builder/resid/filter.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/filter.cc src/builders/resid-builder/resid/libresid_la-filter8580new.lo: src/builders/resid-builder/resid/filter8580new.cc @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/builders/resid-builder/resid/libresid_la-filter8580new.lo -MD -MP -MF src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter8580new.Tpo -c -o src/builders/resid-builder/resid/libresid_la-filter8580new.lo `test -f 'src/builders/resid-builder/resid/filter8580new.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/filter8580new.cc @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter8580new.Tpo src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter8580new.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/builders/resid-builder/resid/filter8580new.cc' object='src/builders/resid-builder/resid/libresid_la-filter8580new.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_builders_resid_builder_resid_libresid_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/builders/resid-builder/resid/libresid_la-filter8580new.lo `test -f 'src/builders/resid-builder/resid/filter8580new.cc' || echo '$(srcdir)/'`src/builders/resid-builder/resid/filter8580new.cc src/libsidplayfp_la-EventScheduler.lo: src/EventScheduler.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libsidplayfp_la-EventScheduler.lo -MD -MP -MF src/$(DEPDIR)/libsidplayfp_la-EventScheduler.Tpo -c -o src/libsidplayfp_la-EventScheduler.lo `test -f 'src/EventScheduler.cpp' || echo '$(srcdir)/'`src/EventScheduler.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsidplayfp_la-EventScheduler.Tpo src/$(DEPDIR)/libsidplayfp_la-EventScheduler.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/EventScheduler.cpp' object='src/libsidplayfp_la-EventScheduler.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libsidplayfp_la-EventScheduler.lo `test -f 'src/EventScheduler.cpp' || echo '$(srcdir)/'`src/EventScheduler.cpp src/libsidplayfp_la-player.lo: src/player.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libsidplayfp_la-player.lo -MD -MP -MF src/$(DEPDIR)/libsidplayfp_la-player.Tpo -c -o src/libsidplayfp_la-player.lo `test -f 'src/player.cpp' || echo '$(srcdir)/'`src/player.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsidplayfp_la-player.Tpo src/$(DEPDIR)/libsidplayfp_la-player.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/player.cpp' object='src/libsidplayfp_la-player.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libsidplayfp_la-player.lo `test -f 'src/player.cpp' || echo '$(srcdir)/'`src/player.cpp src/libsidplayfp_la-psiddrv.lo: src/psiddrv.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libsidplayfp_la-psiddrv.lo -MD -MP -MF src/$(DEPDIR)/libsidplayfp_la-psiddrv.Tpo -c -o src/libsidplayfp_la-psiddrv.lo `test -f 'src/psiddrv.cpp' || echo '$(srcdir)/'`src/psiddrv.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsidplayfp_la-psiddrv.Tpo src/$(DEPDIR)/libsidplayfp_la-psiddrv.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/psiddrv.cpp' object='src/libsidplayfp_la-psiddrv.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libsidplayfp_la-psiddrv.lo `test -f 'src/psiddrv.cpp' || echo '$(srcdir)/'`src/psiddrv.cpp src/libsidplayfp_la-mixer.lo: src/mixer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libsidplayfp_la-mixer.lo -MD -MP -MF src/$(DEPDIR)/libsidplayfp_la-mixer.Tpo -c -o src/libsidplayfp_la-mixer.lo `test -f 'src/mixer.cpp' || echo '$(srcdir)/'`src/mixer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsidplayfp_la-mixer.Tpo src/$(DEPDIR)/libsidplayfp_la-mixer.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/mixer.cpp' object='src/libsidplayfp_la-mixer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libsidplayfp_la-mixer.lo `test -f 'src/mixer.cpp' || echo '$(srcdir)/'`src/mixer.cpp src/libsidplayfp_la-reloc65.lo: src/reloc65.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libsidplayfp_la-reloc65.lo -MD -MP -MF src/$(DEPDIR)/libsidplayfp_la-reloc65.Tpo -c -o src/libsidplayfp_la-reloc65.lo `test -f 'src/reloc65.cpp' || echo '$(srcdir)/'`src/reloc65.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsidplayfp_la-reloc65.Tpo src/$(DEPDIR)/libsidplayfp_la-reloc65.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/reloc65.cpp' object='src/libsidplayfp_la-reloc65.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libsidplayfp_la-reloc65.lo `test -f 'src/reloc65.cpp' || echo '$(srcdir)/'`src/reloc65.cpp src/libsidplayfp_la-sidemu.lo: src/sidemu.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/libsidplayfp_la-sidemu.lo -MD -MP -MF src/$(DEPDIR)/libsidplayfp_la-sidemu.Tpo -c -o src/libsidplayfp_la-sidemu.lo `test -f 'src/sidemu.cpp' || echo '$(srcdir)/'`src/sidemu.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/$(DEPDIR)/libsidplayfp_la-sidemu.Tpo src/$(DEPDIR)/libsidplayfp_la-sidemu.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidemu.cpp' object='src/libsidplayfp_la-sidemu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/libsidplayfp_la-sidemu.lo `test -f 'src/sidemu.cpp' || echo '$(srcdir)/'`src/sidemu.cpp src/c64/libsidplayfp_la-c64.lo: src/c64/c64.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/libsidplayfp_la-c64.lo -MD -MP -MF src/c64/$(DEPDIR)/libsidplayfp_la-c64.Tpo -c -o src/c64/libsidplayfp_la-c64.lo `test -f 'src/c64/c64.cpp' || echo '$(srcdir)/'`src/c64/c64.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/$(DEPDIR)/libsidplayfp_la-c64.Tpo src/c64/$(DEPDIR)/libsidplayfp_la-c64.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/c64.cpp' object='src/c64/libsidplayfp_la-c64.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/libsidplayfp_la-c64.lo `test -f 'src/c64/c64.cpp' || echo '$(srcdir)/'`src/c64/c64.cpp src/c64/libsidplayfp_la-mmu.lo: src/c64/mmu.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/libsidplayfp_la-mmu.lo -MD -MP -MF src/c64/$(DEPDIR)/libsidplayfp_la-mmu.Tpo -c -o src/c64/libsidplayfp_la-mmu.lo `test -f 'src/c64/mmu.cpp' || echo '$(srcdir)/'`src/c64/mmu.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/$(DEPDIR)/libsidplayfp_la-mmu.Tpo src/c64/$(DEPDIR)/libsidplayfp_la-mmu.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/mmu.cpp' object='src/c64/libsidplayfp_la-mmu.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/libsidplayfp_la-mmu.lo `test -f 'src/c64/mmu.cpp' || echo '$(srcdir)/'`src/c64/mmu.cpp src/c64/VIC_II/libsidplayfp_la-mos656x.lo: src/c64/VIC_II/mos656x.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/VIC_II/libsidplayfp_la-mos656x.lo -MD -MP -MF src/c64/VIC_II/$(DEPDIR)/libsidplayfp_la-mos656x.Tpo -c -o src/c64/VIC_II/libsidplayfp_la-mos656x.lo `test -f 'src/c64/VIC_II/mos656x.cpp' || echo '$(srcdir)/'`src/c64/VIC_II/mos656x.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/VIC_II/$(DEPDIR)/libsidplayfp_la-mos656x.Tpo src/c64/VIC_II/$(DEPDIR)/libsidplayfp_la-mos656x.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/VIC_II/mos656x.cpp' object='src/c64/VIC_II/libsidplayfp_la-mos656x.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/VIC_II/libsidplayfp_la-mos656x.lo `test -f 'src/c64/VIC_II/mos656x.cpp' || echo '$(srcdir)/'`src/c64/VIC_II/mos656x.cpp src/c64/CPU/libsidplayfp_la-mos6510.lo: src/c64/CPU/mos6510.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/CPU/libsidplayfp_la-mos6510.lo -MD -MP -MF src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510.Tpo -c -o src/c64/CPU/libsidplayfp_la-mos6510.lo `test -f 'src/c64/CPU/mos6510.cpp' || echo '$(srcdir)/'`src/c64/CPU/mos6510.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510.Tpo src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/CPU/mos6510.cpp' object='src/c64/CPU/libsidplayfp_la-mos6510.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/CPU/libsidplayfp_la-mos6510.lo `test -f 'src/c64/CPU/mos6510.cpp' || echo '$(srcdir)/'`src/c64/CPU/mos6510.cpp src/c64/CPU/libsidplayfp_la-mos6510debug.lo: src/c64/CPU/mos6510debug.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/CPU/libsidplayfp_la-mos6510debug.lo -MD -MP -MF src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510debug.Tpo -c -o src/c64/CPU/libsidplayfp_la-mos6510debug.lo `test -f 'src/c64/CPU/mos6510debug.cpp' || echo '$(srcdir)/'`src/c64/CPU/mos6510debug.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510debug.Tpo src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510debug.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/CPU/mos6510debug.cpp' object='src/c64/CPU/libsidplayfp_la-mos6510debug.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/CPU/libsidplayfp_la-mos6510debug.lo `test -f 'src/c64/CPU/mos6510debug.cpp' || echo '$(srcdir)/'`src/c64/CPU/mos6510debug.cpp src/c64/CIA/libsidplayfp_la-interrupt.lo: src/c64/CIA/interrupt.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/CIA/libsidplayfp_la-interrupt.lo -MD -MP -MF src/c64/CIA/$(DEPDIR)/libsidplayfp_la-interrupt.Tpo -c -o src/c64/CIA/libsidplayfp_la-interrupt.lo `test -f 'src/c64/CIA/interrupt.cpp' || echo '$(srcdir)/'`src/c64/CIA/interrupt.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/CIA/$(DEPDIR)/libsidplayfp_la-interrupt.Tpo src/c64/CIA/$(DEPDIR)/libsidplayfp_la-interrupt.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/CIA/interrupt.cpp' object='src/c64/CIA/libsidplayfp_la-interrupt.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/CIA/libsidplayfp_la-interrupt.lo `test -f 'src/c64/CIA/interrupt.cpp' || echo '$(srcdir)/'`src/c64/CIA/interrupt.cpp src/c64/CIA/libsidplayfp_la-mos652x.lo: src/c64/CIA/mos652x.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/CIA/libsidplayfp_la-mos652x.lo -MD -MP -MF src/c64/CIA/$(DEPDIR)/libsidplayfp_la-mos652x.Tpo -c -o src/c64/CIA/libsidplayfp_la-mos652x.lo `test -f 'src/c64/CIA/mos652x.cpp' || echo '$(srcdir)/'`src/c64/CIA/mos652x.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/CIA/$(DEPDIR)/libsidplayfp_la-mos652x.Tpo src/c64/CIA/$(DEPDIR)/libsidplayfp_la-mos652x.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/CIA/mos652x.cpp' object='src/c64/CIA/libsidplayfp_la-mos652x.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/CIA/libsidplayfp_la-mos652x.lo `test -f 'src/c64/CIA/mos652x.cpp' || echo '$(srcdir)/'`src/c64/CIA/mos652x.cpp src/c64/CIA/libsidplayfp_la-SerialPort.lo: src/c64/CIA/SerialPort.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/CIA/libsidplayfp_la-SerialPort.lo -MD -MP -MF src/c64/CIA/$(DEPDIR)/libsidplayfp_la-SerialPort.Tpo -c -o src/c64/CIA/libsidplayfp_la-SerialPort.lo `test -f 'src/c64/CIA/SerialPort.cpp' || echo '$(srcdir)/'`src/c64/CIA/SerialPort.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/CIA/$(DEPDIR)/libsidplayfp_la-SerialPort.Tpo src/c64/CIA/$(DEPDIR)/libsidplayfp_la-SerialPort.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/CIA/SerialPort.cpp' object='src/c64/CIA/libsidplayfp_la-SerialPort.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/CIA/libsidplayfp_la-SerialPort.lo `test -f 'src/c64/CIA/SerialPort.cpp' || echo '$(srcdir)/'`src/c64/CIA/SerialPort.cpp src/c64/CIA/libsidplayfp_la-timer.lo: src/c64/CIA/timer.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/CIA/libsidplayfp_la-timer.lo -MD -MP -MF src/c64/CIA/$(DEPDIR)/libsidplayfp_la-timer.Tpo -c -o src/c64/CIA/libsidplayfp_la-timer.lo `test -f 'src/c64/CIA/timer.cpp' || echo '$(srcdir)/'`src/c64/CIA/timer.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/CIA/$(DEPDIR)/libsidplayfp_la-timer.Tpo src/c64/CIA/$(DEPDIR)/libsidplayfp_la-timer.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/CIA/timer.cpp' object='src/c64/CIA/libsidplayfp_la-timer.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/CIA/libsidplayfp_la-timer.lo `test -f 'src/c64/CIA/timer.cpp' || echo '$(srcdir)/'`src/c64/CIA/timer.cpp src/c64/CIA/libsidplayfp_la-tod.lo: src/c64/CIA/tod.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/c64/CIA/libsidplayfp_la-tod.lo -MD -MP -MF src/c64/CIA/$(DEPDIR)/libsidplayfp_la-tod.Tpo -c -o src/c64/CIA/libsidplayfp_la-tod.lo `test -f 'src/c64/CIA/tod.cpp' || echo '$(srcdir)/'`src/c64/CIA/tod.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/c64/CIA/$(DEPDIR)/libsidplayfp_la-tod.Tpo src/c64/CIA/$(DEPDIR)/libsidplayfp_la-tod.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/c64/CIA/tod.cpp' object='src/c64/CIA/libsidplayfp_la-tod.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/c64/CIA/libsidplayfp_la-tod.lo `test -f 'src/c64/CIA/tod.cpp' || echo '$(srcdir)/'`src/c64/CIA/tod.cpp src/sidplayfp/libsidplayfp_la-sidplayfp.lo: src/sidplayfp/sidplayfp.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidplayfp/libsidplayfp_la-sidplayfp.lo -MD -MP -MF src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidplayfp.Tpo -c -o src/sidplayfp/libsidplayfp_la-sidplayfp.lo `test -f 'src/sidplayfp/sidplayfp.cpp' || echo '$(srcdir)/'`src/sidplayfp/sidplayfp.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidplayfp.Tpo src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidplayfp.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidplayfp/sidplayfp.cpp' object='src/sidplayfp/libsidplayfp_la-sidplayfp.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidplayfp/libsidplayfp_la-sidplayfp.lo `test -f 'src/sidplayfp/sidplayfp.cpp' || echo '$(srcdir)/'`src/sidplayfp/sidplayfp.cpp src/sidplayfp/libsidplayfp_la-sidbuilder.lo: src/sidplayfp/sidbuilder.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidplayfp/libsidplayfp_la-sidbuilder.lo -MD -MP -MF src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidbuilder.Tpo -c -o src/sidplayfp/libsidplayfp_la-sidbuilder.lo `test -f 'src/sidplayfp/sidbuilder.cpp' || echo '$(srcdir)/'`src/sidplayfp/sidbuilder.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidbuilder.Tpo src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidbuilder.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidplayfp/sidbuilder.cpp' object='src/sidplayfp/libsidplayfp_la-sidbuilder.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidplayfp/libsidplayfp_la-sidbuilder.lo `test -f 'src/sidplayfp/sidbuilder.cpp' || echo '$(srcdir)/'`src/sidplayfp/sidbuilder.cpp src/sidplayfp/libsidplayfp_la-SidConfig.lo: src/sidplayfp/SidConfig.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidplayfp/libsidplayfp_la-SidConfig.lo -MD -MP -MF src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidConfig.Tpo -c -o src/sidplayfp/libsidplayfp_la-SidConfig.lo `test -f 'src/sidplayfp/SidConfig.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidConfig.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidConfig.Tpo src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidConfig.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidplayfp/SidConfig.cpp' object='src/sidplayfp/libsidplayfp_la-SidConfig.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidplayfp/libsidplayfp_la-SidConfig.lo `test -f 'src/sidplayfp/SidConfig.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidConfig.cpp src/sidplayfp/libsidplayfp_la-SidInfo.lo: src/sidplayfp/SidInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidplayfp/libsidplayfp_la-SidInfo.lo -MD -MP -MF src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidInfo.Tpo -c -o src/sidplayfp/libsidplayfp_la-SidInfo.lo `test -f 'src/sidplayfp/SidInfo.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidInfo.Tpo src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidInfo.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidplayfp/SidInfo.cpp' object='src/sidplayfp/libsidplayfp_la-SidInfo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidplayfp/libsidplayfp_la-SidInfo.lo `test -f 'src/sidplayfp/SidInfo.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidInfo.cpp src/sidplayfp/libsidplayfp_la-SidTune.lo: src/sidplayfp/SidTune.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidplayfp/libsidplayfp_la-SidTune.lo -MD -MP -MF src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTune.Tpo -c -o src/sidplayfp/libsidplayfp_la-SidTune.lo `test -f 'src/sidplayfp/SidTune.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidTune.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTune.Tpo src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTune.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidplayfp/SidTune.cpp' object='src/sidplayfp/libsidplayfp_la-SidTune.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidplayfp/libsidplayfp_la-SidTune.lo `test -f 'src/sidplayfp/SidTune.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidTune.cpp src/sidplayfp/libsidplayfp_la-SidTuneInfo.lo: src/sidplayfp/SidTuneInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidplayfp/libsidplayfp_la-SidTuneInfo.lo -MD -MP -MF src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTuneInfo.Tpo -c -o src/sidplayfp/libsidplayfp_la-SidTuneInfo.lo `test -f 'src/sidplayfp/SidTuneInfo.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidTuneInfo.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTuneInfo.Tpo src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTuneInfo.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidplayfp/SidTuneInfo.cpp' object='src/sidplayfp/libsidplayfp_la-SidTuneInfo.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidplayfp/libsidplayfp_la-SidTuneInfo.lo `test -f 'src/sidplayfp/SidTuneInfo.cpp' || echo '$(srcdir)/'`src/sidplayfp/SidTuneInfo.cpp src/sidtune/libsidplayfp_la-MUS.lo: src/sidtune/MUS.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidtune/libsidplayfp_la-MUS.lo -MD -MP -MF src/sidtune/$(DEPDIR)/libsidplayfp_la-MUS.Tpo -c -o src/sidtune/libsidplayfp_la-MUS.lo `test -f 'src/sidtune/MUS.cpp' || echo '$(srcdir)/'`src/sidtune/MUS.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidtune/$(DEPDIR)/libsidplayfp_la-MUS.Tpo src/sidtune/$(DEPDIR)/libsidplayfp_la-MUS.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidtune/MUS.cpp' object='src/sidtune/libsidplayfp_la-MUS.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidtune/libsidplayfp_la-MUS.lo `test -f 'src/sidtune/MUS.cpp' || echo '$(srcdir)/'`src/sidtune/MUS.cpp src/sidtune/libsidplayfp_la-p00.lo: src/sidtune/p00.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidtune/libsidplayfp_la-p00.lo -MD -MP -MF src/sidtune/$(DEPDIR)/libsidplayfp_la-p00.Tpo -c -o src/sidtune/libsidplayfp_la-p00.lo `test -f 'src/sidtune/p00.cpp' || echo '$(srcdir)/'`src/sidtune/p00.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidtune/$(DEPDIR)/libsidplayfp_la-p00.Tpo src/sidtune/$(DEPDIR)/libsidplayfp_la-p00.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidtune/p00.cpp' object='src/sidtune/libsidplayfp_la-p00.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidtune/libsidplayfp_la-p00.lo `test -f 'src/sidtune/p00.cpp' || echo '$(srcdir)/'`src/sidtune/p00.cpp src/sidtune/libsidplayfp_la-prg.lo: src/sidtune/prg.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidtune/libsidplayfp_la-prg.lo -MD -MP -MF src/sidtune/$(DEPDIR)/libsidplayfp_la-prg.Tpo -c -o src/sidtune/libsidplayfp_la-prg.lo `test -f 'src/sidtune/prg.cpp' || echo '$(srcdir)/'`src/sidtune/prg.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidtune/$(DEPDIR)/libsidplayfp_la-prg.Tpo src/sidtune/$(DEPDIR)/libsidplayfp_la-prg.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidtune/prg.cpp' object='src/sidtune/libsidplayfp_la-prg.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidtune/libsidplayfp_la-prg.lo `test -f 'src/sidtune/prg.cpp' || echo '$(srcdir)/'`src/sidtune/prg.cpp src/sidtune/libsidplayfp_la-PSID.lo: src/sidtune/PSID.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidtune/libsidplayfp_la-PSID.lo -MD -MP -MF src/sidtune/$(DEPDIR)/libsidplayfp_la-PSID.Tpo -c -o src/sidtune/libsidplayfp_la-PSID.lo `test -f 'src/sidtune/PSID.cpp' || echo '$(srcdir)/'`src/sidtune/PSID.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidtune/$(DEPDIR)/libsidplayfp_la-PSID.Tpo src/sidtune/$(DEPDIR)/libsidplayfp_la-PSID.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidtune/PSID.cpp' object='src/sidtune/libsidplayfp_la-PSID.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidtune/libsidplayfp_la-PSID.lo `test -f 'src/sidtune/PSID.cpp' || echo '$(srcdir)/'`src/sidtune/PSID.cpp src/sidtune/libsidplayfp_la-SidTuneBase.lo: src/sidtune/SidTuneBase.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidtune/libsidplayfp_la-SidTuneBase.lo -MD -MP -MF src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneBase.Tpo -c -o src/sidtune/libsidplayfp_la-SidTuneBase.lo `test -f 'src/sidtune/SidTuneBase.cpp' || echo '$(srcdir)/'`src/sidtune/SidTuneBase.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneBase.Tpo src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneBase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidtune/SidTuneBase.cpp' object='src/sidtune/libsidplayfp_la-SidTuneBase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidtune/libsidplayfp_la-SidTuneBase.lo `test -f 'src/sidtune/SidTuneBase.cpp' || echo '$(srcdir)/'`src/sidtune/SidTuneBase.cpp src/sidtune/libsidplayfp_la-SidTuneTools.lo: src/sidtune/SidTuneTools.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/sidtune/libsidplayfp_la-SidTuneTools.lo -MD -MP -MF src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneTools.Tpo -c -o src/sidtune/libsidplayfp_la-SidTuneTools.lo `test -f 'src/sidtune/SidTuneTools.cpp' || echo '$(srcdir)/'`src/sidtune/SidTuneTools.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneTools.Tpo src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneTools.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/sidtune/SidTuneTools.cpp' object='src/sidtune/libsidplayfp_la-SidTuneTools.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/sidtune/libsidplayfp_la-SidTuneTools.lo `test -f 'src/sidtune/SidTuneTools.cpp' || echo '$(srcdir)/'`src/sidtune/SidTuneTools.cpp src/utils/libsidplayfp_la-iniParser.lo: src/utils/iniParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/utils/libsidplayfp_la-iniParser.lo -MD -MP -MF src/utils/$(DEPDIR)/libsidplayfp_la-iniParser.Tpo -c -o src/utils/libsidplayfp_la-iniParser.lo `test -f 'src/utils/iniParser.cpp' || echo '$(srcdir)/'`src/utils/iniParser.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/utils/$(DEPDIR)/libsidplayfp_la-iniParser.Tpo src/utils/$(DEPDIR)/libsidplayfp_la-iniParser.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/utils/iniParser.cpp' object='src/utils/libsidplayfp_la-iniParser.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/utils/libsidplayfp_la-iniParser.lo `test -f 'src/utils/iniParser.cpp' || echo '$(srcdir)/'`src/utils/iniParser.cpp src/utils/libsidplayfp_la-md5Factory.lo: src/utils/md5Factory.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/utils/libsidplayfp_la-md5Factory.lo -MD -MP -MF src/utils/$(DEPDIR)/libsidplayfp_la-md5Factory.Tpo -c -o src/utils/libsidplayfp_la-md5Factory.lo `test -f 'src/utils/md5Factory.cpp' || echo '$(srcdir)/'`src/utils/md5Factory.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/utils/$(DEPDIR)/libsidplayfp_la-md5Factory.Tpo src/utils/$(DEPDIR)/libsidplayfp_la-md5Factory.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/utils/md5Factory.cpp' object='src/utils/libsidplayfp_la-md5Factory.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/utils/libsidplayfp_la-md5Factory.lo `test -f 'src/utils/md5Factory.cpp' || echo '$(srcdir)/'`src/utils/md5Factory.cpp src/utils/libsidplayfp_la-SidDatabase.lo: src/utils/SidDatabase.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/utils/libsidplayfp_la-SidDatabase.lo -MD -MP -MF src/utils/$(DEPDIR)/libsidplayfp_la-SidDatabase.Tpo -c -o src/utils/libsidplayfp_la-SidDatabase.lo `test -f 'src/utils/SidDatabase.cpp' || echo '$(srcdir)/'`src/utils/SidDatabase.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/utils/$(DEPDIR)/libsidplayfp_la-SidDatabase.Tpo src/utils/$(DEPDIR)/libsidplayfp_la-SidDatabase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/utils/SidDatabase.cpp' object='src/utils/libsidplayfp_la-SidDatabase.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/utils/libsidplayfp_la-SidDatabase.lo `test -f 'src/utils/SidDatabase.cpp' || echo '$(srcdir)/'`src/utils/SidDatabase.cpp src/utils/MD5/libsidplayfp_la-MD5.lo: src/utils/MD5/MD5.cpp @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/utils/MD5/libsidplayfp_la-MD5.lo -MD -MP -MF src/utils/MD5/$(DEPDIR)/libsidplayfp_la-MD5.Tpo -c -o src/utils/MD5/libsidplayfp_la-MD5.lo `test -f 'src/utils/MD5/MD5.cpp' || echo '$(srcdir)/'`src/utils/MD5/MD5.cpp @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) src/utils/MD5/$(DEPDIR)/libsidplayfp_la-MD5.Tpo src/utils/MD5/$(DEPDIR)/libsidplayfp_la-MD5.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='src/utils/MD5/MD5.cpp' object='src/utils/MD5/libsidplayfp_la-MD5.lo' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libsidplayfp_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/utils/MD5/libsidplayfp_la-MD5.lo `test -f 'src/utils/MD5/MD5.cpp' || echo '$(srcdir)/'`src/utils/MD5/MD5.cpp .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs -rm -rf src/.libs src/_libs -rm -rf src/builders/exsid-builder/.libs src/builders/exsid-builder/_libs -rm -rf src/builders/exsid-builder/driver/.libs src/builders/exsid-builder/driver/_libs -rm -rf src/builders/hardsid-builder/.libs src/builders/hardsid-builder/_libs -rm -rf src/builders/resid-builder/.libs src/builders/resid-builder/_libs -rm -rf src/builders/resid-builder/resid/.libs src/builders/resid-builder/resid/_libs -rm -rf src/builders/residfp-builder/.libs src/builders/residfp-builder/_libs -rm -rf src/builders/residfp-builder/residfp/.libs src/builders/residfp-builder/residfp/_libs -rm -rf src/builders/residfp-builder/residfp/resample/.libs src/builders/residfp-builder/residfp/resample/_libs -rm -rf src/c64/.libs src/c64/_libs -rm -rf src/c64/CIA/.libs src/c64/CIA/_libs -rm -rf src/c64/CPU/.libs src/c64/CPU/_libs -rm -rf src/c64/VIC_II/.libs src/c64/VIC_II/_libs -rm -rf src/sidplayfp/.libs src/sidplayfp/_libs -rm -rf src/sidtune/.libs src/sidtune/_libs -rm -rf src/utils/.libs src/utils/_libs -rm -rf src/utils/MD5/.libs src/utils/MD5/_libs -rm -rf src/utils/STILview/.libs src/utils/STILview/_libs -rm -rf test/.libs test/_libs distclean-libtool: -rm -f libtool config.lt install-pkgconfigDATA: $(pkgconfig_DATA) @$(NORMAL_INSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || 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)$(pkgconfigdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigdir)" || exit $$?; \ done uninstall-pkgconfigDATA: @$(NORMAL_UNINSTALL) @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) install-nodist_src_libsidplayfp_laHEADERS: $(nodist_src_libsidplayfp_la_HEADERS) @$(NORMAL_INSTALL) @list='$(nodist_src_libsidplayfp_la_HEADERS)'; test -n "$(src_libsidplayfp_ladir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(src_libsidplayfp_ladir)'"; \ $(MKDIR_P) "$(DESTDIR)$(src_libsidplayfp_ladir)" || 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_HEADER) $$files '$(DESTDIR)$(src_libsidplayfp_ladir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(src_libsidplayfp_ladir)" || exit $$?; \ done uninstall-nodist_src_libsidplayfp_laHEADERS: @$(NORMAL_UNINSTALL) @list='$(nodist_src_libsidplayfp_la_HEADERS)'; test -n "$(src_libsidplayfp_ladir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(src_libsidplayfp_ladir)'; $(am__uninstall_files_from_dir) install-src_builders_exsid_builder_libsidplayfp_exsid_laHEADERS: $(src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS) @$(NORMAL_INSTALL) @list='$(src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS)'; test -n "$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)'"; \ $(MKDIR_P) "$(DESTDIR)$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)" || 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_HEADER) $$files '$(DESTDIR)$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)" || exit $$?; \ done uninstall-src_builders_exsid_builder_libsidplayfp_exsid_laHEADERS: @$(NORMAL_UNINSTALL) @list='$(src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS)'; test -n "$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)'; $(am__uninstall_files_from_dir) install-src_builders_hardsid_builder_libsidplayfp_hardsid_laHEADERS: $(src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS) @$(NORMAL_INSTALL) @list='$(src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS)'; test -n "$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)'"; \ $(MKDIR_P) "$(DESTDIR)$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)" || 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_HEADER) $$files '$(DESTDIR)$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)" || exit $$?; \ done uninstall-src_builders_hardsid_builder_libsidplayfp_hardsid_laHEADERS: @$(NORMAL_UNINSTALL) @list='$(src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS)'; test -n "$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)'; $(am__uninstall_files_from_dir) install-src_builders_resid_builder_libsidplayfp_resid_laHEADERS: $(src_builders_resid_builder_libsidplayfp_resid_la_HEADERS) @$(NORMAL_INSTALL) @list='$(src_builders_resid_builder_libsidplayfp_resid_la_HEADERS)'; test -n "$(src_builders_resid_builder_libsidplayfp_resid_ladir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(src_builders_resid_builder_libsidplayfp_resid_ladir)'"; \ $(MKDIR_P) "$(DESTDIR)$(src_builders_resid_builder_libsidplayfp_resid_ladir)" || 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_HEADER) $$files '$(DESTDIR)$(src_builders_resid_builder_libsidplayfp_resid_ladir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(src_builders_resid_builder_libsidplayfp_resid_ladir)" || exit $$?; \ done uninstall-src_builders_resid_builder_libsidplayfp_resid_laHEADERS: @$(NORMAL_UNINSTALL) @list='$(src_builders_resid_builder_libsidplayfp_resid_la_HEADERS)'; test -n "$(src_builders_resid_builder_libsidplayfp_resid_ladir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(src_builders_resid_builder_libsidplayfp_resid_ladir)'; $(am__uninstall_files_from_dir) install-src_builders_residfp_builder_libsidplayfp_residfp_laHEADERS: $(src_builders_residfp_builder_libsidplayfp_residfp_la_HEADERS) @$(NORMAL_INSTALL) @list='$(src_builders_residfp_builder_libsidplayfp_residfp_la_HEADERS)'; test -n "$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)'"; \ $(MKDIR_P) "$(DESTDIR)$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)" || 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_HEADER) $$files '$(DESTDIR)$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)" || exit $$?; \ done uninstall-src_builders_residfp_builder_libsidplayfp_residfp_laHEADERS: @$(NORMAL_UNINSTALL) @list='$(src_builders_residfp_builder_libsidplayfp_residfp_la_HEADERS)'; test -n "$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)'; $(am__uninstall_files_from_dir) install-src_libsidplayfp_laHEADERS: $(src_libsidplayfp_la_HEADERS) @$(NORMAL_INSTALL) @list='$(src_libsidplayfp_la_HEADERS)'; test -n "$(src_libsidplayfp_ladir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(src_libsidplayfp_ladir)'"; \ $(MKDIR_P) "$(DESTDIR)$(src_libsidplayfp_ladir)" || 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_HEADER) $$files '$(DESTDIR)$(src_libsidplayfp_ladir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(src_libsidplayfp_ladir)" || exit $$?; \ done uninstall-src_libsidplayfp_laHEADERS: @$(NORMAL_UNINSTALL) @list='$(src_libsidplayfp_la_HEADERS)'; test -n "$(src_libsidplayfp_ladir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(src_libsidplayfp_ladir)'; $(am__uninstall_files_from_dir) install-src_libstilview_laHEADERS: $(src_libstilview_la_HEADERS) @$(NORMAL_INSTALL) @list='$(src_libstilview_la_HEADERS)'; test -n "$(src_libstilview_ladir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(src_libstilview_ladir)'"; \ $(MKDIR_P) "$(DESTDIR)$(src_libstilview_ladir)" || 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_HEADER) $$files '$(DESTDIR)$(src_libstilview_ladir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(src_libstilview_ladir)" || exit $$?; \ done uninstall-src_libstilview_laHEADERS: @$(NORMAL_UNINSTALL) @list='$(src_libstilview_la_HEADERS)'; test -n "$(src_libstilview_ladir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(src_libstilview_ladir)'; $(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. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ 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" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) 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; \ $(am__define_uniq_tagged_files); \ 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-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-zstd: distdir tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_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*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(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*) \ eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ *.tar.zst*) \ zstd -dc $(distdir).tar.zst | $(am__untar) ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) $(AM_DISTCHECK_DVI_TARGET) \ && $(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__post_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: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) check-recursive all-am: Makefile $(PROGRAMS) $(LTLIBRARIES) $(SCRIPTS) $(DATA) \ $(HEADERS) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(src_libsidplayfp_ladir)" "$(DESTDIR)$(src_builders_exsid_builder_libsidplayfp_exsid_ladir)" "$(DESTDIR)$(src_builders_hardsid_builder_libsidplayfp_hardsid_ladir)" "$(DESTDIR)$(src_builders_resid_builder_libsidplayfp_resid_ladir)" "$(DESTDIR)$(src_builders_residfp_builder_libsidplayfp_residfp_ladir)" "$(DESTDIR)$(src_libsidplayfp_ladir)" "$(DESTDIR)$(src_libstilview_ladir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) install-recursive install-exec: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) 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) -rm -f src/$(DEPDIR)/$(am__dirstamp) -rm -f src/$(am__dirstamp) -rm -f src/builders/exsid-builder/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/exsid-builder/$(am__dirstamp) -rm -f src/builders/exsid-builder/driver/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/exsid-builder/driver/$(am__dirstamp) -rm -f src/builders/hardsid-builder/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/hardsid-builder/$(am__dirstamp) -rm -f src/builders/resid-builder/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/resid-builder/$(am__dirstamp) -rm -f src/builders/resid-builder/resid/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/resid-builder/resid/$(am__dirstamp) -rm -f src/builders/residfp-builder/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/residfp-builder/$(am__dirstamp) -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/residfp-builder/residfp/$(am__dirstamp) -rm -f src/builders/residfp-builder/residfp/resample/$(DEPDIR)/$(am__dirstamp) -rm -f src/builders/residfp-builder/residfp/resample/$(am__dirstamp) -rm -f src/c64/$(DEPDIR)/$(am__dirstamp) -rm -f src/c64/$(am__dirstamp) -rm -f src/c64/CIA/$(DEPDIR)/$(am__dirstamp) -rm -f src/c64/CIA/$(am__dirstamp) -rm -f src/c64/CPU/$(DEPDIR)/$(am__dirstamp) -rm -f src/c64/CPU/$(am__dirstamp) -rm -f src/c64/VIC_II/$(DEPDIR)/$(am__dirstamp) -rm -f src/c64/VIC_II/$(am__dirstamp) -rm -f src/sidplayfp/$(DEPDIR)/$(am__dirstamp) -rm -f src/sidplayfp/$(am__dirstamp) -rm -f src/sidtune/$(DEPDIR)/$(am__dirstamp) -rm -f src/sidtune/$(am__dirstamp) -rm -f src/utils/$(DEPDIR)/$(am__dirstamp) -rm -f src/utils/$(am__dirstamp) -rm -f src/utils/MD5/$(DEPDIR)/$(am__dirstamp) -rm -f src/utils/MD5/$(am__dirstamp) -rm -f src/utils/STILview/$(DEPDIR)/$(am__dirstamp) -rm -f src/utils/STILview/$(am__dirstamp) -rm -f test/$(DEPDIR)/$(am__dirstamp) -rm -f test/$(am__dirstamp) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) @HAVE_DOXYGEN_FALSE@clean-local: clean: clean-recursive clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f src/$(DEPDIR)/libsidplayfp_la-EventScheduler.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-mixer.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-player.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-psiddrv.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-reloc65.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-sidemu.Plo -rm -f src/builders/exsid-builder/$(DEPDIR)/exsid-builder.Plo -rm -f src/builders/exsid-builder/$(DEPDIR)/exsid-emu.Plo -rm -f src/builders/exsid-builder/driver/$(DEPDIR)/exSID.Plo -rm -f src/builders/exsid-builder/driver/$(DEPDIR)/exSID_ftdiwrap.Plo -rm -f src/builders/hardsid-builder/$(DEPDIR)/hardsid-builder.Plo -rm -f src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-unix.Plo -rm -f src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-win.Plo -rm -f src/builders/resid-builder/$(DEPDIR)/resid-builder.Plo -rm -f src/builders/resid-builder/$(DEPDIR)/resid-emu.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-dac.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-envelope.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-extfilt.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter8580new.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-pot.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-sid.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-version.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-voice.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-wave.Plo -rm -f src/builders/residfp-builder/$(DEPDIR)/residfp-builder.Plo -rm -f src/builders/residfp-builder/$(DEPDIR)/residfp-emu.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Dac.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/EnvelopeGenerator.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/ExternalFilter.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Filter.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Filter6581.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Filter8580.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig6581.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig8580.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator6581.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator8580.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/OpAmp.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/SID.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Spline.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformCalculator.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformGenerator.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/version.Plo -rm -f src/builders/residfp-builder/residfp/resample/$(DEPDIR)/SincResampler.Plo -rm -f src/builders/residfp-builder/residfp/resample/$(DEPDIR)/test.Po -rm -f src/c64/$(DEPDIR)/libsidplayfp_la-c64.Plo -rm -f src/c64/$(DEPDIR)/libsidplayfp_la-mmu.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-SerialPort.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-interrupt.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-mos652x.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-timer.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-tod.Plo -rm -f src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510.Plo -rm -f src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510debug.Plo -rm -f src/c64/VIC_II/$(DEPDIR)/libsidplayfp_la-mos656x.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidConfig.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidInfo.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTune.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTuneInfo.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidbuilder.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidplayfp.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-MUS.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-PSID.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneBase.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneTools.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-p00.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-prg.Plo -rm -f src/utils/$(DEPDIR)/libsidplayfp_la-SidDatabase.Plo -rm -f src/utils/$(DEPDIR)/libsidplayfp_la-iniParser.Plo -rm -f src/utils/$(DEPDIR)/libsidplayfp_la-md5Factory.Plo -rm -f src/utils/MD5/$(DEPDIR)/libsidplayfp_la-MD5.Plo -rm -f src/utils/STILview/$(DEPDIR)/stil.Plo -rm -f test/$(DEPDIR)/demo.Po -rm -f test/$(DEPDIR)/test.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-hdr distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-nodist_src_libsidplayfp_laHEADERS \ install-pkgconfigDATA \ install-src_builders_exsid_builder_libsidplayfp_exsid_laHEADERS \ install-src_builders_hardsid_builder_libsidplayfp_hardsid_laHEADERS \ install-src_builders_resid_builder_libsidplayfp_resid_laHEADERS \ install-src_builders_residfp_builder_libsidplayfp_residfp_laHEADERS \ install-src_libsidplayfp_laHEADERS \ install-src_libstilview_laHEADERS install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-libLTLIBRARIES 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 src/$(DEPDIR)/libsidplayfp_la-EventScheduler.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-mixer.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-player.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-psiddrv.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-reloc65.Plo -rm -f src/$(DEPDIR)/libsidplayfp_la-sidemu.Plo -rm -f src/builders/exsid-builder/$(DEPDIR)/exsid-builder.Plo -rm -f src/builders/exsid-builder/$(DEPDIR)/exsid-emu.Plo -rm -f src/builders/exsid-builder/driver/$(DEPDIR)/exSID.Plo -rm -f src/builders/exsid-builder/driver/$(DEPDIR)/exSID_ftdiwrap.Plo -rm -f src/builders/hardsid-builder/$(DEPDIR)/hardsid-builder.Plo -rm -f src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-unix.Plo -rm -f src/builders/hardsid-builder/$(DEPDIR)/hardsid-emu-win.Plo -rm -f src/builders/resid-builder/$(DEPDIR)/resid-builder.Plo -rm -f src/builders/resid-builder/$(DEPDIR)/resid-emu.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-dac.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-envelope.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-extfilt.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-filter8580new.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-pot.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-sid.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-version.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-voice.Plo -rm -f src/builders/resid-builder/resid/$(DEPDIR)/libresid_la-wave.Plo -rm -f src/builders/residfp-builder/$(DEPDIR)/residfp-builder.Plo -rm -f src/builders/residfp-builder/$(DEPDIR)/residfp-emu.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Dac.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/EnvelopeGenerator.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/ExternalFilter.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Filter.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Filter6581.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Filter8580.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig6581.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/FilterModelConfig8580.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator6581.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Integrator8580.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/OpAmp.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/SID.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/Spline.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformCalculator.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/WaveformGenerator.Plo -rm -f src/builders/residfp-builder/residfp/$(DEPDIR)/version.Plo -rm -f src/builders/residfp-builder/residfp/resample/$(DEPDIR)/SincResampler.Plo -rm -f src/builders/residfp-builder/residfp/resample/$(DEPDIR)/test.Po -rm -f src/c64/$(DEPDIR)/libsidplayfp_la-c64.Plo -rm -f src/c64/$(DEPDIR)/libsidplayfp_la-mmu.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-SerialPort.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-interrupt.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-mos652x.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-timer.Plo -rm -f src/c64/CIA/$(DEPDIR)/libsidplayfp_la-tod.Plo -rm -f src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510.Plo -rm -f src/c64/CPU/$(DEPDIR)/libsidplayfp_la-mos6510debug.Plo -rm -f src/c64/VIC_II/$(DEPDIR)/libsidplayfp_la-mos656x.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidConfig.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidInfo.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTune.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-SidTuneInfo.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidbuilder.Plo -rm -f src/sidplayfp/$(DEPDIR)/libsidplayfp_la-sidplayfp.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-MUS.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-PSID.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneBase.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-SidTuneTools.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-p00.Plo -rm -f src/sidtune/$(DEPDIR)/libsidplayfp_la-prg.Plo -rm -f src/utils/$(DEPDIR)/libsidplayfp_la-SidDatabase.Plo -rm -f src/utils/$(DEPDIR)/libsidplayfp_la-iniParser.Plo -rm -f src/utils/$(DEPDIR)/libsidplayfp_la-md5Factory.Plo -rm -f src/utils/MD5/$(DEPDIR)/libsidplayfp_la-MD5.Plo -rm -f src/utils/STILview/$(DEPDIR)/stil.Plo -rm -f test/$(DEPDIR)/demo.Po -rm -f test/$(DEPDIR)/test.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-libLTLIBRARIES \ uninstall-nodist_src_libsidplayfp_laHEADERS \ uninstall-pkgconfigDATA \ uninstall-src_builders_exsid_builder_libsidplayfp_exsid_laHEADERS \ uninstall-src_builders_hardsid_builder_libsidplayfp_hardsid_laHEADERS \ uninstall-src_builders_resid_builder_libsidplayfp_resid_laHEADERS \ uninstall-src_builders_residfp_builder_libsidplayfp_residfp_laHEADERS \ uninstall-src_libsidplayfp_laHEADERS \ uninstall-src_libstilview_laHEADERS .MAKE: $(am__recursive_targets) all check install install-am \ install-exec install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--depfiles am--refresh check check-am clean clean-cscope \ clean-generic clean-libLTLIBRARIES clean-libtool clean-local \ clean-noinstLTLIBRARIES clean-noinstPROGRAMS cscope \ cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ dist-zstd distcheck distclean distclean-compile \ distclean-generic distclean-hdr distclean-libtool \ 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-libLTLIBRARIES \ install-man install-nodist_src_libsidplayfp_laHEADERS \ install-pdf install-pdf-am install-pkgconfigDATA install-ps \ install-ps-am \ install-src_builders_exsid_builder_libsidplayfp_exsid_laHEADERS \ install-src_builders_hardsid_builder_libsidplayfp_hardsid_laHEADERS \ install-src_builders_resid_builder_libsidplayfp_resid_laHEADERS \ install-src_builders_residfp_builder_libsidplayfp_residfp_laHEADERS \ install-src_libsidplayfp_laHEADERS \ install-src_libstilview_laHEADERS install-strip installcheck \ installcheck-am installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-libLTLIBRARIES \ uninstall-nodist_src_libsidplayfp_laHEADERS \ uninstall-pkgconfigDATA \ uninstall-src_builders_exsid_builder_libsidplayfp_exsid_laHEADERS \ uninstall-src_builders_hardsid_builder_libsidplayfp_hardsid_laHEADERS \ uninstall-src_builders_resid_builder_libsidplayfp_resid_laHEADERS \ uninstall-src_builders_residfp_builder_libsidplayfp_residfp_laHEADERS \ uninstall-src_libsidplayfp_laHEADERS \ uninstall-src_libstilview_laHEADERS .PRECIOUS: Makefile .dat.h: $(PERL) $(srcdir)/src/builders/resid-builder/resid/samp2src.pl $* $< $@ #========================================================= # docs @HAVE_DOXYGEN_TRUE@doc: @HAVE_DOXYGEN_TRUE@ $(DOXYGEN) Doxyfile @HAVE_DOXYGEN_TRUE@clean-local: @HAVE_DOXYGEN_TRUE@ rm -fr $(builddir)/docs/html .a65.bin: o65file=`echo $@ | sed 's/bin/o65/'`;\ [ -n "$(OD)" ] || { echo "od not found"; false; } &&\ [ -n "$(XA)" ] || { echo "xa not found"; false; } &&\ ${XA} -R -G $< -o $$o65file &&\ ${OD} -v -An -w8 -tx1 $$o65file | sed -re 's/[[:alnum:]]+/0x&,/g' > $@ &&\ ${RM} $$o65file # 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: libsidplayfp-2.6.0/libstilview.pc.in0000644000175100001770000000032414544470307014422 00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: libstilview Description: STILview library. Version: @PACKAGE_VERSION@ Libs: -L${libdir} -lstilview Cflags: -I${includedir} libsidplayfp-2.6.0/configure0000755000175100001770000262035014544470315013053 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for libsidplayfp 2.6.0. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 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 as_nop=: if test ${ZSH_VERSION+y} && (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 $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; 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 # 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # 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'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 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="as_nop=: if test \${ZSH_VERSION+y} && (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 \$as_nop 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 \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || 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 -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi 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'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$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_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # 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=`printf "%s\n" "$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 || printf "%s\n" 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_nop 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_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # 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 printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$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 || printf "%s\n" 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" || { printf "%s\n" "$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 } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. 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 # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' 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'" SHELL=${CONFIG_SHELL-/bin/sh} 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='libsidplayfp' PACKAGE_TARNAME='libsidplayfp' PACKAGE_VERSION='2.6.0' PACKAGE_STRING='libsidplayfp 2.6.0' PACKAGE_BUGREPORT='' PACKAGE_URL='https://github.com/libsidplayfp/libsidplayfp/' ac_unique_file="src/sidplayfp/sidplayfp.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS PTHREAD_CFLAGS PTHREAD_LIBS PTHREAD_CC ax_pthread_config CPP EXSID_DRIVER_FALSE EXSID_DRIVER_TRUE EXSID_SUPPORT_FALSE EXSID_SUPPORT_TRUE FTDI_CFLAGS EXSID_LIBS EXSID_CFLAGS LIBSTILVIEWVERSION LIBSIDPLAYVERSION NEW_8580_FILTER RESID_BRANCH_HINTS RESID_INLINE RESID_INLINING HAVE_BUILTIN_EXPECT HAVE_LOG1P HAVE_BOOL NEW_8580_FILTER_FALSE NEW_8580_FILTER_TRUE LIBGCRYPT_FALSE LIBGCRYPT_TRUE LIBGCRYPT_LIBS LIBGCRYPT_CFLAGS ENABLE_TEST_FALSE ENABLE_TEST_TRUE UNITTEST_LIBS UNITTEST_CFLAGS PKG_CONFIG_LIBDIR PKG_CONFIG_PATH PKG_CONFIG TESTSUITE_FALSE TESTSUITE_TRUE HAVE_DOXYGEN_FALSE HAVE_DOXYGEN_TRUE DOT DOXYGEN HARDSID_FALSE HARDSID_TRUE debug_flags OD XA OPENMP_CXXFLAGS HAVE_VISIBILITY_FALSE HAVE_VISIBILITY_TRUE HAVE_CXX11 HAVE_CXX14 HAVE_CXX17 CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC LIBTOOL OBJDUMP DLLTOOL AS MACOS_FALSE MACOS_TRUE MINGW32_FALSE MINGW32_TRUE host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIB_LEVEL LIB_MINOR LIB_MAJOR AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V CSCOPE ETAGS CTAGS 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 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 runstatedir 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 am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_shared enable_static with_pic enable_fast_install with_aix_soname enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock enable_openmp enable_debug enable_hardsid enable_inline with_simd enable_branch_hints enable_testsuite enable_tests with_gcrypt with_exsid ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS LT_SYS_LIBRARY_PATH CXX CXXFLAGS CCC CXXCPP PKG_CONFIG PKG_CONFIG_PATH PKG_CONFIG_LIBDIR UNITTEST_CFLAGS UNITTEST_LIBS LIBGCRYPT_CFLAGS LIBGCRYPT_LIBS EXSID_CFLAGS EXSID_LIBS CPP' # 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' runstatedir='${localstatedir}/run' 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 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=`printf "%s\n" "$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=`printf "%s\n" "$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 ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -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=`printf "%s\n" "$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=`printf "%s\n" "$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. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$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" ;; *) printf "%s\n" "$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 runstatedir 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 || printf "%s\n" 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 libsidplayfp 2.6.0 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] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --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/libsidplayfp] --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 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 libsidplayfp 2.6.0:";; 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] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-shared[=PKGS] build shared libraries [default=yes] --enable-static[=PKGS] build static libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --disable-openmp do not use OpenMP --enable-debug compile for debugging [no/yes/full, default=no] --enable-hardsid enable hardsid builder [default=no] --enable-inline enable inlining of functions [default=yes] --enable-branch-hints enable static branch prediction hints [default=yes] --enable-testsuite=PATH_TO_TESTSUITE enable VICE testsuite [default=no] --enable-tests enable unit tests [default=no] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-simd Build with SIMD optimizations [[sse2/mmx/neon/none, default=none]] --with-gcrypt Build with the gcrypt library --with-exsid Build with exsid support [[yes/no/check, default=check]] Some influential environment variables: CC C compiler command CFLAGS 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 LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP 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 UNITTEST_CFLAGS C compiler flags for UNITTEST, overriding pkg-config UNITTEST_LIBS linker flags for UNITTEST, overriding pkg-config LIBGCRYPT_CFLAGS C compiler flags for LIBGCRYPT, overriding pkg-config LIBGCRYPT_LIBS linker flags for LIBGCRYPT, overriding pkg-config EXSID_CFLAGS C compiler flags for EXSID, overriding pkg-config EXSID_LIBS linker flags for EXSID, overriding pkg-config CPP C preprocessor 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. libsidplayfp home page: . _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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$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 configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. 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 printf "%s\n" "$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 libsidplayfp configure 2.6.0 generated by GNU Autoconf 2.71 Copyright (C) 2021 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_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 conftest.beam 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\"" printf "%s\n" "$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 printf "%s\n" "$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_nop printf "%s\n" "$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_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.beam 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\"" printf "%s\n" "$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 printf "%s\n" "$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_nop printf "%s\n" "$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_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop 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 $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ #include #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 (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # 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 conftest.beam 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\"" printf "%s\n" "$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 printf "%s\n" "$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_nop printf "%s\n" "$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_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_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\"" printf "%s\n" "$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 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else $as_nop printf "%s\n" "$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_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam 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\"" printf "%s\n" "$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 printf "%s\n" "$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_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else $as_nop printf "%s\n" "$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_cxx_try_link # ac_fn_cxx_try_run LINENO # ------------------------ # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_cxx_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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else $as_nop printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$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_cxx_try_run # ac_fn_cxx_compute_int LINENO EXPR VAR INCLUDES # ---------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_cxx_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_hi=$ac_mid; break else $as_nop as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_lo=$ac_mid; break else $as_nop as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else $as_nop ac_lo= ac_hi= fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_hi=$ac_mid else $as_nop as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval (void) { return $2; } static unsigned long int ulongval (void) { return $2; } #include #include int main (void) { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_cxx_try_run "$LINENO" then : echo >>conftest.val; read $3 &5 printf %s "checking whether $as_decl_name is declared... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` eval ac_save_FLAGS=\$$6 as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main (void) { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_check_decl # ac_fn_cxx_check_func LINENO FUNC VAR # ------------------------------------ # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_cxx_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop 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. */ #include #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 (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_func # ac_fn_cxx_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_cxx_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval "$3=yes" else $as_nop eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # 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\"" printf "%s\n" "$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 printf "%s\n" "$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_nop printf "%s\n" "$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_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac 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 libsidplayfp $as_me 2.6.0, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "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=`printf "%s\n" "$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=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## 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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$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 printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$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 printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*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 do not provoke an error unfortunately, instead are silently treated as an "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 is necessary to write \x00 == 0 to get something that is 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 **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' // Does the compiler advertise C99 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // See if C++-style comments work. // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' // Does the compiler advertise C11 conformance? #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " # Auxiliary files required by this configure script. ac_aux_files="compile ltmain.sh config.guess config.sub missing install-sh" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}/build-aux" # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$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. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" 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,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$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=`printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-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_config_headers="$ac_config_headers src/config.h" am__api_version='1.16' # 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. 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+y}; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$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' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # 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 ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file 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 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 if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file 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=`printf "%s\n" "$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 MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 ('*'coreutils) '* | \ 'BusyBox '* | \ '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+y}; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else $as_nop if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' 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='libsidplayfp' VERSION='2.6.0' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h printf "%s\n" "#define VERSION \"$VERSION\"" >>confdefs.h # 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"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). 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}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi LIB_MAJOR=2 LIB_MINOR=6 LIB_LEVEL=0 # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$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_os in #( mingw*) : MINGW32=yes ;; #( darwin*) : MACOS=yes ;; #( *) : MINGW32=no MACOS=no ;; esac if test "x$MINGW32" = "xyes"; then MINGW32_TRUE= MINGW32_FALSE='#' else MINGW32_TRUE='#' MINGW32_FALSE= fi if test "x$MACOS" = "xyes"; then MACOS_TRUE= MACOS_FALSE='#' else MACOS_TRUE='#' MACOS_FALSE= fi case `pwd` in *\ * | *\ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 printf "%s\n" "printf" >&6; } ;; print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 printf "%s\n" "print -r" >&6; } ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 printf "%s\n" "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} 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 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}clang", so it can be a program name with args. set dummy ${ac_tool_prefix}clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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}clang" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "clang", so it can be a program name with args. set dummy clang; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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="clang" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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. printf "%s\n" "$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 -version; 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\"" printf "%s\n" "$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 printf "%s\n" "$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 (void) { ; 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$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+y} && 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 $as_nop ac_file='' fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$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_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$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 (void) { 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. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$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 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$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_nop printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else $as_nop CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else $as_nop ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; 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 ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _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 conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 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 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" 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= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop 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 10 /bin/sh. echo '/* dummy */' > 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else $as_nop ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_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 do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "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_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_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_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 else $as_nop if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in fgrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "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_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_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_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DUMPBIN="$ac_tool_prefix$ac_prog" printf "%s\n" "$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 DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 printf "%s\n" "$DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DUMPBIN="$ac_prog" printf "%s\n" "$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_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 else $as_nop i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 printf %s "checking how to convert $build file names to toolchain format... " >&6; } if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 else $as_nop #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_reload_flag='-r' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OBJDUMP="${ac_tool_prefix}objdump" printf "%s\n" "$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 OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OBJDUMP="objdump" printf "%s\n" "$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_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DLLTOOL="${ac_tool_prefix}dlltool" printf "%s\n" "$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 DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DLLTOOL="dlltool" printf "%s\n" "$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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$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 AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_AR="$ac_prog" printf "%s\n" "$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_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cr} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 test -z "$STRIP" && STRIP=: 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 printf %s "checking command to parse $NM output from $compiler object... " >&6; } if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 else $as_nop # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 printf "%s\n" "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test ${with_sysroot+y} then : withval=$with_sysroot; else $as_nop with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 printf "%s\n" "${lt_sysroot:-no}" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_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 do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in dd do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 else $as_nop printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test ${enable_libtool_lock+y} then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 else $as_nop 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 cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes else $as_nop lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext 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 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_MANIFEST_TOOL="${ac_tool_prefix}mt" printf "%s\n" "$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 MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 printf "%s\n" "$MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_MANIFEST_TOOL="mt" printf "%s\n" "$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_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_mainfest_tool+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 printf "%s\n" "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DSYMUTIL="${ac_tool_prefix}dsymutil" printf "%s\n" "$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 DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 printf "%s\n" "$DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DSYMUTIL="dsymutil" printf "%s\n" "$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_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_NMEDIT="${ac_tool_prefix}nmedit" printf "%s\n" "$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 NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 printf "%s\n" "$NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_NMEDIT="nmedit" printf "%s\n" "$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_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 printf "%s\n" "$ac_ct_NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_LIPO="${ac_tool_prefix}lipo" printf "%s\n" "$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 LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 printf "%s\n" "$LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_LIPO="lipo" printf "%s\n" "$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_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 printf "%s\n" "$ac_ct_LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OTOOL="${ac_tool_prefix}otool" printf "%s\n" "$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 OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 printf "%s\n" "$OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OTOOL="otool" printf "%s\n" "$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_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 printf "%s\n" "$ac_ct_OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OTOOL64="${ac_tool_prefix}otool64" printf "%s\n" "$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 OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 printf "%s\n" "$OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OTOOL64="otool64" printf "%s\n" "$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_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 printf "%s\n" "$ac_ct_OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes else $as_nop lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cr libconftest.a conftest.o" >&5 $AR cr libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[912]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes then : printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi # Set options enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AS+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_AS="${ac_tool_prefix}as" printf "%s\n" "$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 AS=$ac_cv_prog_AS if test -n "$AS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 printf "%s\n" "$AS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AS+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_AS="as" printf "%s\n" "$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_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 printf "%s\n" "$ac_ct_AS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DLLTOOL="${ac_tool_prefix}dlltool" printf "%s\n" "$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 DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DLLTOOL="dlltool" printf "%s\n" "$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_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OBJDUMP="${ac_tool_prefix}objdump" printf "%s\n" "$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 OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_OBJDUMP="objdump" printf "%s\n" "$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_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test ${enable_shared+y} then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_shared=yes fi # Check whether --enable-static was given. if test ${enable_static+y} then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_static=yes fi # Check whether --with-pic was given. if test ${with_pic+y} then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop pic_mode=default fi # Check whether --enable-fast-install was given. if test ${enable_fast_install+y} then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else $as_nop enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test ${with_aix_soname+y} then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else $as_nop if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 else $as_nop rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else $as_nop case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC 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 # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 else $as_nop save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes else $as_nop lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi link_all_deplibs=no else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else $as_nop lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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. */ char shl_load (); int main (void) { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes else $as_nop ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else $as_nop ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $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. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else $as_nop ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $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. */ char dlopen (); int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes else $as_nop ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 else $as_nop ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $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. */ char dld_link (); int main (void) { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes else $as_nop ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 printf %s "checking whether a statically linked program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 else $as_nop if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 printf %s "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi # Report what library types will actually be built { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 printf %s "checking if libtool supports shared libraries... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 printf "%s\n" "$can_build_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 printf "%s\n" "$enable_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 printf "%s\n" "$enable_static" >&6; } 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 CC=$lt_save_CC ac_config_commands="$ac_config_commands libtool" # Only expand once: 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 clang++ 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 clang++ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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. printf "%s\n" "$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\"" printf "%s\n" "$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 printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else $as_nop ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else $as_nop 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 (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else $as_nop CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else $as_nop ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; 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.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; 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_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_11+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_98+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else $as_nop if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 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 depcc="$CXX" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CXX_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else $as_nop 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 10 /bin/sh. echo '/* dummy */' > 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 printf "%s\n" "$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 func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test ${ac_cv_prog_CXXCPP+y} then : printf %s "(cached) " >&6 else $as_nop # Double quotes because $CXX needs to be expanded for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # 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. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else $as_nop # 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_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # 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_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # 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. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else $as_nop # 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_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else $as_nop # 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_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" 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 else _lt_caught_CXX_error=yes fi 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 archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else $as_nop with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else $as_nop # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__CXX+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__CXX+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_CXX+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc_CXX+y} then : printf %s "(cached) " >&6 else $as_nop $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else $as_nop lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 printf "%s\n" "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" 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_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 ax_cxx_compile_alternatives="17 1z" ax_cxx_compile_cxx17_required=false 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 ac_success=no if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do if test x"$switch" = xMSVC; then switch=-std:c++${alternative} cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_${switch}_MSVC" | $as_tr_sh` else cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx17_$switch" | $as_tr_sh` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++17 features with $switch" >&5 printf %s "checking whether $CXX supports C++17 features with $switch... " >&6; } if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201703L && !defined _MSC_VER #error "This is not a C++17 compiler" #else #include #include #include namespace cxx17 { namespace test_constexpr_lambdas { constexpr int foo = [](){return 42;}(); } namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } namespace test_template_argument_deduction_for_class_templates { template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } namespace test_structured_bindings { int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } namespace test_exception_spec_type_system { struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus < 201703L && !defined _MSC_VER _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval $cachevar=yes else $as_nop eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXX="$ac_save_CXX" fi eval ac_res=\$$cachevar { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi 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 x$ax_cxx_compile_cxx17_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++17 language features is required." "$LINENO" 5 fi fi if test x$ac_success = xno; then HAVE_CXX17=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++17 support was found" >&5 printf "%s\n" "$as_me: No compiler with C++17 support was found" >&6;} else HAVE_CXX17=1 printf "%s\n" "#define HAVE_CXX17 1" >>confdefs.h fi if test $ax_cv_cxx_compile_cxx17__std_cpp17 != "yes" then : ax_cxx_compile_alternatives="14 1y" ax_cxx_compile_cxx14_required=false 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 ac_success=no if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do if test x"$switch" = xMSVC; then switch=-std:c++${alternative} cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx14_${switch}_MSVC" | $as_tr_sh` else cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx14_$switch" | $as_tr_sh` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++14 features with $switch" >&5 printf %s "checking whether $CXX supports C++14 features with $switch... " >&6; } if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval $cachevar=yes else $as_nop eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXX="$ac_save_CXX" fi eval ac_res=\$$cachevar { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi 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 x$ax_cxx_compile_cxx14_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++14 language features is required." "$LINENO" 5 fi fi if test x$ac_success = xno; then HAVE_CXX14=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++14 support was found" >&5 printf "%s\n" "$as_me: No compiler with C++14 support was found" >&6;} else HAVE_CXX14=1 printf "%s\n" "#define HAVE_CXX14 1" >>confdefs.h fi if test $ax_cv_cxx_compile_cxx14__std_cpp14 != "yes" then : ax_cxx_compile_alternatives="11 0x" ax_cxx_compile_cxx11_required=false 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 ac_success=no if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do if test x"$switch" = xMSVC; then switch=-std:c++${alternative} cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx11_${switch}_MSVC" | $as_tr_sh` else cachevar=`printf "%s\n" "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh` fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5 printf %s "checking whether $CXX supports C++11 features with $switch... " >&6; } if eval test \${$cachevar+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CXX="$CXX" CXX="$CXX $switch" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = (){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = (int i, int j){ return i + j; }(1, 2); auto b = () -> int { return '0'; }(); auto c = =(){ return a + b; }(); auto d = &(){ return c; }(); auto e = a, &b(int x) mutable { const auto identity = (int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = (){ return 0; }; const auto unary = (int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = (nullary_t f){ return f(); }; const auto higher2nd = unary(nullary_t f1){ return unary, f1(unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval $cachevar=yes else $as_nop eval $cachevar=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXX="$ac_save_CXX" fi eval ac_res=\$$cachevar { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi 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 x$ax_cxx_compile_cxx11_required = xtrue; then if test x$ac_success = xno; then as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5 fi fi if test x$ac_success = xno; then HAVE_CXX11=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5 printf "%s\n" "$as_me: No compiler with C++11 support was found" >&6;} else HAVE_CXX11=1 printf "%s\n" "#define HAVE_CXX11 1" >>confdefs.h fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C++ compiler accepts -fvisibility=hidden -fvisibility-inlines-hidden" >&5 printf %s "checking whether C++ compiler accepts -fvisibility=hidden -fvisibility-inlines-hidden... " >&6; } if test ${ax_cv_check_cxxflags___fvisibility_hidden__fvisibility_inlines_hidden+y} then : printf %s "(cached) " >&6 else $as_nop ax_check_save_flags=$CXXFLAGS CXXFLAGS="$CXXFLAGS -fvisibility=hidden -fvisibility-inlines-hidden" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ax_cv_check_cxxflags___fvisibility_hidden__fvisibility_inlines_hidden=yes else $as_nop ax_cv_check_cxxflags___fvisibility_hidden__fvisibility_inlines_hidden=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXXFLAGS=$ax_check_save_flags fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cxxflags___fvisibility_hidden__fvisibility_inlines_hidden" >&5 printf "%s\n" "$ax_cv_check_cxxflags___fvisibility_hidden__fvisibility_inlines_hidden" >&6; } if test "x$ax_cv_check_cxxflags___fvisibility_hidden__fvisibility_inlines_hidden" = xyes then : has_visibility=yes else $as_nop has_visibility=no fi if test "x$has_visibility" = xyes; then HAVE_VISIBILITY_TRUE= HAVE_VISIBILITY_FALSE='#' else HAVE_VISIBILITY_TRUE='#' HAVE_VISIBILITY_FALSE= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 printf %s "checking whether byte ordering is bigendian... " >&6; } if test ${ac_cv_c_bigendian+y} then : printf %s "(cached) " >&6 else $as_nop 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_cxx_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.beam 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 (void) { #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_cxx_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 (void) { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam 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 (void) { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_cxx_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 (void) { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_c_bigendian=yes else $as_nop ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam 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. */ unsigned short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; unsigned short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } unsigned short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; unsigned 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 (void) { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_cxx_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.beam conftest.$ac_ext else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main (void) { /* 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_cxx_try_run "$LINENO" then : ac_cv_c_bigendian=no else $as_nop 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 printf "%s\n" "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) printf "%s\n" "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) printf "%s\n" "#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 # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 printf %s "checking size of short... " >&6; } if test ${ac_cv_sizeof_short+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_short" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (short) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_short=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 printf "%s\n" "$ac_cv_sizeof_short" >&6; } printf "%s\n" "#define SIZEOF_SHORT $ac_cv_sizeof_short" >>confdefs.h # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 printf %s "checking size of int... " >&6; } if test ${ac_cv_sizeof_int+y} then : printf %s "(cached) " >&6 else $as_nop if ac_fn_cxx_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" "$ac_includes_default" then : else $as_nop if test "$ac_cv_type_int" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int) See \`config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int=0 fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 printf "%s\n" "$ac_cv_sizeof_int" >&6; } printf "%s\n" "#define SIZEOF_INT $ac_cv_sizeof_int" >>confdefs.h if test $ac_cv_sizeof_short -ne 2 then : as_fn_error $? "size of short must be 16 bit" "$LINENO" 5 fi if test $ac_cv_sizeof_int -lt 4 then : as_fn_error $? "only 32 bit or better CPUs are supported" "$LINENO" 5 fi if test "x${ac_cv_header_stdint_h}" != "xyes" then : as_fn_error $? "Required header stdint.h not found" "$LINENO" 5 fi if test -e penmp || test -e mp; then as_fn_error $? "AC_OPENMP clobbers files named 'mp' and 'penmp'. Aborting configure because one of these files already exists." "$LINENO" 5 fi # Check whether --enable-openmp was given. if test ${enable_openmp+y} then : enableval=$enable_openmp; fi OPENMP_CXXFLAGS= if test "$enable_openmp" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to support OpenMP" >&5 printf %s "checking for $CXX option to support OpenMP... " >&6; } if test ${ac_cv_prog_cxx_openmp+y} then : printf %s "(cached) " >&6 else $as_nop ac_cv_prog_cxx_openmp='not found' for ac_option in '' -fopenmp -xopenmp -openmp -mp -omp -qsmp=omp -homp \ -Popenmp --openmp; do ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="$CXXFLAGS $ac_option" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP #error "OpenMP not supported" #endif #include int main (void) { return omp_get_num_threads (); } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef _OPENMP #error "OpenMP not supported" #endif #include int main (void) { return omp_get_num_threads (); } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : ac_cv_prog_cxx_openmp=$ac_option else $as_nop ac_cv_prog_cxx_openmp='unsupported' fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CXXFLAGS=$ac_save_CXXFLAGS if test "$ac_cv_prog_cxx_openmp" != 'not found'; then break fi done if test "$ac_cv_prog_cxx_openmp" = 'not found'; then ac_cv_prog_cxx_openmp='unsupported' elif test "$ac_cv_prog_cxx_openmp" = ''; then ac_cv_prog_cxx_openmp='none needed' fi rm -f penmp mp fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_openmp" >&5 printf "%s\n" "$ac_cv_prog_cxx_openmp" >&6; } if test "$ac_cv_prog_cxx_openmp" != 'unsupported' && \ test "$ac_cv_prog_cxx_openmp" != 'none needed'; then OPENMP_CXXFLAGS="$ac_cv_prog_cxx_openmp" fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX options needed to detect all undeclared functions" >&5 printf %s "checking for $CXX options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_cxx_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else $as_nop ac_save_CFLAGS=$CFLAGS ac_cv_cxx_undeclared_builtin_options='cannot detect' for ac_arg in '' -fno-builtin; do CFLAGS="$ac_save_CFLAGS $ac_arg" # This test program should *not* compile successfully. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else $as_nop # This test program should compile successfully. # No library function is consistently available on # freestanding implementations, so test against a dummy # declaration. Include always-available headers on the # off chance that they somehow elicit warnings. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include extern void ac_decl (int, char *); int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_cxx_undeclared_builtin_options='none needed' else $as_nop ac_cv_cxx_undeclared_builtin_options=$ac_arg fi break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_cxx_undeclared_builtin_options" >&6; } case $ac_cv_cxx_undeclared_builtin_options in #( 'cannot detect') : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot make $CXX report undeclared builtins See \`config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_cxx_undeclared_builtin_options='' ;; #( *) : ac_cxx_undeclared_builtin_options=$ac_cv_cxx_undeclared_builtin_options ;; esac ac_fn_check_decl "$LINENO" "strcasecmp" "ac_cv_have_decl_strcasecmp" "$ac_includes_default" "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if test "x$ac_cv_have_decl_strcasecmp" = xyes then : ac_fn_cxx_check_func "$LINENO" "strcasecmp" "ac_cv_func_strcasecmp" if test "x$ac_cv_func_strcasecmp" = xyes then : printf "%s\n" "#define HAVE_STRCASECMP 1" >>confdefs.h fi fi ac_fn_check_decl "$LINENO" "strncasecmp" "ac_cv_have_decl_strncasecmp" "$ac_includes_default" "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if test "x$ac_cv_have_decl_strncasecmp" = xyes then : ac_fn_cxx_check_func "$LINENO" "strncasecmp" "ac_cv_func_strncasecmp" if test "x$ac_cv_func_strncasecmp" = xyes then : printf "%s\n" "#define HAVE_STRNCASECMP 1" >>confdefs.h fi fi for ac_prog in xa do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_XA+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$XA"; then ac_cv_prog_XA="$XA" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_XA="$ac_prog" printf "%s\n" "$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 XA=$ac_cv_prog_XA if test -n "$XA"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $XA" >&5 printf "%s\n" "$XA" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$XA" && break done # od on macOS doesn't support the -w parameter { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for od that supports -w" >&5 printf %s "checking for od that supports -w... " >&6; } if test ${ac_cv_path_OD+y} then : printf %s "(cached) " >&6 else $as_nop if test -z "$OD"; then ac_path_OD_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 do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in od god do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_OD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_OD" || continue $ac_path_OD -w > /dev/null 2>&1 && ac_cv_path_OD=$ac_path_OD $ac_path_OD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_OD"; then : fi else ac_cv_path_OD=$OD fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_OD" >&5 printf "%s\n" "$ac_cv_path_OD" >&6; } OD=$ac_cv_path_OD # # https://autotools.io/libtool/version.html # # Always increase the revision value. # # Increase the current value whenever an interface has been added, removed or changed. # # Increase the age value only if the changes made to the ABI are backward compatible. LIBSIDPLAYCUR=9 LIBSIDPLAYREV=29 LIBSIDPLAYAGE=3 LIBSIDPLAYVERSION=$LIBSIDPLAYCUR:$LIBSIDPLAYREV:$LIBSIDPLAYAGE LIBSTILVIEWCUR=0 LIBSTILVIEWREV=4 LIBSTILVIEWAGE=0 LIBSTILVIEWVERSION=$LIBSTILVIEWCUR:$LIBSTILVIEWREV:$LIBSTILVIEWAGE { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for debugging" >&5 printf %s "checking for debugging... " >&6; } # Check whether --enable-debug was given. if test ${enable_debug+y} then : enableval=$enable_debug; else $as_nop enable_debug=no fi if test "x$enable_debug" = "xno" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Build without debugging messages" >&5 printf "%s\n" "Build without debugging messages" >&6; }; debug_flags=-DNDEBUG else $as_nop if test "x$enable_debug" = "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Build with debugging messages" >&5 printf "%s\n" "Build with debugging messages" >&6; }; debug_flags=-DDEBUG=1 else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: Build with all debugging messages" >&5 printf "%s\n" "Build with all debugging messages" >&6; }; debug_flags=-DDEBUG=10 fi fi # Check whether --enable-hardsid was given. if test ${enable_hardsid+y} then : enableval=$enable_hardsid; fi if test "x$enable_hardsid" = "xyes"; then HARDSID_TRUE= HARDSID_FALSE='#' else HARDSID_TRUE='#' HARDSID_FALSE= fi # Check whether --enable-inline was given. if test ${enable_inline+y} then : enableval=$enable_inline; fi if test x"$enable_inline" != "xno" then : RESID_INLINE=inline; RESID_INLINING=1 else $as_nop RESID_INLINE=""; RESID_INLINING=0 fi # Check whether --with-simd was given. if test ${with_simd+y} then : withval=$with_simd; else $as_nop with_simd=none fi if test x"$with_simd" != xnone then : # Testing for intrinsic headers requires compiler # support activated by specific flags. # These are most likely defined in CXXFLAGS # but AC_CHECK_HEADERS uses only CPPFLAGS # so we need a workaround. saveCPPFLAGS=$CPPFLAGS CPPFLAGS="$CPPFLAGS $CXXFLAGS" case $with_simd in #( sse2) : ac_fn_cxx_check_header_compile "$LINENO" "emmintrin.h" "ac_cv_header_emmintrin_h" "$ac_includes_default" if test "x$ac_cv_header_emmintrin_h" = xyes then : printf "%s\n" "#define HAVE_EMMINTRIN_H 1" >>confdefs.h fi ;; #( mmx) : ac_fn_cxx_check_header_compile "$LINENO" "mmintrin.h" "ac_cv_header_mmintrin_h" "$ac_includes_default" if test "x$ac_cv_header_mmintrin_h" = xyes then : printf "%s\n" "#define HAVE_MMINTRIN_H 1" >>confdefs.h fi ;; #( neon) : ac_fn_cxx_check_header_compile "$LINENO" "arm_neon.h" "ac_cv_header_arm_neon_h" "$ac_includes_default" if test "x$ac_cv_header_arm_neon_h" = xyes then : printf "%s\n" "#define HAVE_ARM_NEON_H 1" >>confdefs.h fi ;; #( *) : as_fn_error $? "Unrecognized SIMD specified" "$LINENO" 5 ;; esac CPPFLAGS=$saveCPPFLAGS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for working bool" >&5 printf %s "checking for working bool... " >&6; } if test ${ac_cv_cxx_bool+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { bool flag; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_cxx_bool=yes else $as_nop ac_cv_cxx_bool=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_bool" >&5 printf "%s\n" "$ac_cv_cxx_bool" >&6; } if test "x$ac_cv_cxx_bool" = "xno" then : HAVE_BOOL=0 else $as_nop HAVE_BOOL=1 fi # Check whether --enable-branch-hints was given. if test ${enable_branch_hints+y} then : enableval=$enable_branch_hints; else $as_nop enable_branch_hints=yes fi if test "$enable_branch_hints" != no then : RESID_BRANCH_HINTS=1 else $as_nop RESID_BRANCH_HINTS=0 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for log1p" >&5 printf %s "checking for log1p... " >&6; } if test ${resid_cv_log1p+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { log1p(1); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : resid_cv_log1p=yes else $as_nop resid_cv_log1p=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $resid_cv_log1p" >&5 printf "%s\n" "$resid_cv_log1p" >&6; } if test "$resid_cv_log1p" = no then : HAVE_LOG1P=0 else $as_nop HAVE_LOG1P=1 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for __builtin_expect" >&5 printf %s "checking for __builtin_expect... " >&6; } if test ${resid_cv_builtin_expect+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main() { __builtin_expect(0, 0); } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : resid_cv_builtin_expect=yes else $as_nop resid_cv_builtin_expect=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $resid_cv_builtin_expect" >&5 printf "%s\n" "$resid_cv_builtin_expect" >&6; } if test "$resid_cv_builtin_expect" = no then : HAVE_BUILTIN_EXPECT=0 else $as_nop HAVE_BUILTIN_EXPECT=1 fi for ac_prog in doxygen do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DOXYGEN+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DOXYGEN"; then ac_cv_prog_DOXYGEN="$DOXYGEN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DOXYGEN="$ac_prog" printf "%s\n" "$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 DOXYGEN=$ac_cv_prog_DOXYGEN if test -n "$DOXYGEN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DOXYGEN" >&5 printf "%s\n" "$DOXYGEN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$DOXYGEN" && break done if test -z "$DOXYGEN" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Doxygen not found - continuing without Doxygen support" >&5 printf "%s\n" "$as_me: WARNING: Doxygen not found - continuing without Doxygen support" >&2;} else $as_nop # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DOT+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$DOT"; then ac_cv_prog_DOT="$DOT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_DOT="YES" printf "%s\n" "$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_prog_DOT" && ac_cv_prog_DOT="NO" fi fi DOT=$ac_cv_prog_DOT if test -n "$DOT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DOT" >&5 printf "%s\n" "$DOT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -n "$DOXYGEN"; then HAVE_DOXYGEN_TRUE= HAVE_DOXYGEN_FALSE='#' else HAVE_DOXYGEN_TRUE='#' HAVE_DOXYGEN_FALSE= fi if test -z "$HAVE_DOXYGEN_TRUE"; then : ac_config_files="$ac_config_files Doxyfile" fi # Check whether --enable-testsuite was given. if test ${enable_testsuite+y} then : enableval=$enable_testsuite; else $as_nop enable_testsuite=no fi if test "x$enable_testsuite" != xno then : printf "%s\n" "#define VICE_TESTSUITE \"$enable_testsuite\"" >>confdefs.h fi if test "x$enable_testsuite" != xno; then TESTSUITE_TRUE= TESTSUITE_FALSE='#' else TESTSUITE_TRUE='#' TESTSUITE_FALSE= fi 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 printf "%s\n" "$PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_ac_pt_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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" printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 printf "%s\n" "$ac_pt_PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 printf %s "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi # Check whether --enable-tests was given. if test ${enable_tests+y} then : enableval=$enable_tests; else $as_nop enable_tests=no fi if test "x$enable_tests" != "xno" then : echo Enabling unit tests pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for UnitTest++" >&5 printf %s "checking for UnitTest++... " >&6; } if test -n "$UNITTEST_CFLAGS"; then pkg_cv_UNITTEST_CFLAGS="$UNITTEST_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"UnitTest++\""; } >&5 ($PKG_CONFIG --exists --print-errors "UnitTest++") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UNITTEST_CFLAGS=`$PKG_CONFIG --cflags "UnitTest++" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$UNITTEST_LIBS"; then pkg_cv_UNITTEST_LIBS="$UNITTEST_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"UnitTest++\""; } >&5 ($PKG_CONFIG --exists --print-errors "UnitTest++") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_UNITTEST_LIBS=`$PKG_CONFIG --libs "UnitTest++" 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 UNITTEST_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "UnitTest++" 2>&1` else UNITTEST_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "UnitTest++" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$UNITTEST_PKG_ERRORS" >&5 as_fn_error $? "Package requirements (UnitTest++) were not met: $UNITTEST_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 UNITTEST_CFLAGS and UNITTEST_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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 UNITTEST_CFLAGS and UNITTEST_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 UNITTEST_CFLAGS=$pkg_cv_UNITTEST_CFLAGS UNITTEST_LIBS=$pkg_cv_UNITTEST_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } fi fi if test x$enable_tests = xyes; then ENABLE_TEST_TRUE= ENABLE_TEST_FALSE='#' else ENABLE_TEST_TRUE='#' ENABLE_TEST_FALSE= fi # Check whether --with-gcrypt was given. if test ${with_gcrypt+y} then : withval=$with_gcrypt; fi if test "x$with_gcrypt" != "xno" then : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libgcrypt >= 1.8" >&5 printf %s "checking for libgcrypt >= 1.8... " >&6; } if test -n "$LIBGCRYPT_CFLAGS"; then pkg_cv_LIBGCRYPT_CFLAGS="$LIBGCRYPT_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgcrypt >= 1.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgcrypt >= 1.8") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGCRYPT_CFLAGS=`$PKG_CONFIG --cflags "libgcrypt >= 1.8" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$LIBGCRYPT_LIBS"; then pkg_cv_LIBGCRYPT_LIBS="$LIBGCRYPT_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libgcrypt >= 1.8\""; } >&5 ($PKG_CONFIG --exists --print-errors "libgcrypt >= 1.8") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_LIBGCRYPT_LIBS=`$PKG_CONFIG --libs "libgcrypt >= 1.8" 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 LIBGCRYPT_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libgcrypt >= 1.8" 2>&1` else LIBGCRYPT_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libgcrypt >= 1.8" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$LIBGCRYPT_PKG_ERRORS" >&5 if test "x$with_gcrypt" = "xyes" then : as_fn_error $? "gcrypt requested but not found" "$LINENO" 5 fi elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } if test "x$with_gcrypt" = "xyes" then : as_fn_error $? "gcrypt requested but not found" "$LINENO" 5 fi else LIBGCRYPT_CFLAGS=$pkg_cv_LIBGCRYPT_CFLAGS LIBGCRYPT_LIBS=$pkg_cv_LIBGCRYPT_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } USE_LIBGCRYPT=yes printf "%s\n" "#define HAVE_LIBGCRYPT 1" >>confdefs.h fi fi if test x$USE_LIBGCRYPT = xyes; then LIBGCRYPT_TRUE= LIBGCRYPT_FALSE='#' else LIBGCRYPT_TRUE='#' LIBGCRYPT_FALSE= fi NEW_8580_FILTER=1 if test $NEW_8580_FILTER != 0; then NEW_8580_FILTER_TRUE= NEW_8580_FILTER_FALSE='#' else NEW_8580_FILTER_TRUE='#' NEW_8580_FILTER_FALSE= fi # exSID support # Check whether --with-exsid was given. if test ${with_exsid+y} then : withval=$with_exsid; else $as_nop with_exsid=check fi # exSID support requires either libexsid or one of libfdti1 or libftd2xx if test "x$with_exsid" != "xno" then : pkg_failed=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libexsid >= 2.0" >&5 printf %s "checking for libexsid >= 2.0... " >&6; } if test -n "$EXSID_CFLAGS"; then pkg_cv_EXSID_CFLAGS="$EXSID_CFLAGS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libexsid >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libexsid >= 2.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_EXSID_CFLAGS=`$PKG_CONFIG --cflags "libexsid >= 2.0" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes else pkg_failed=yes fi else pkg_failed=untried fi if test -n "$EXSID_LIBS"; then pkg_cv_EXSID_LIBS="$EXSID_LIBS" elif test -n "$PKG_CONFIG"; then if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libexsid >= 2.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libexsid >= 2.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then pkg_cv_EXSID_LIBS=`$PKG_CONFIG --libs "libexsid >= 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "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 EXSID_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libexsid >= 2.0" 2>&1` else EXSID_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libexsid >= 2.0" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$EXSID_PKG_ERRORS" >&5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $EXSID_PKG_ERRORS - using internal driver" >&5 printf "%s\n" "$as_me: WARNING: $EXSID_PKG_ERRORS - using internal driver" >&2;} if test "x$MINGW32" != "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 printf %s "checking for library containing dlopen... " >&6; } if test ${ac_cv_search_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ namespace conftest { extern "C" int dlopen (); } int main (void) { return conftest::dlopen (); ; return 0; } _ACEOF for ac_lib in '' dl dld do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO" then : ac_cv_search_dlopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_dlopen+y} then : break fi done if test ${ac_cv_search_dlopen+y} then : else $as_nop ac_cv_search_dlopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 printf "%s\n" "$ac_cv_search_dlopen" >&6; } ac_res=$ac_cv_search_dlopen if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else $as_nop as_fn_error $? "unable to find the dlopen() function" "$LINENO" 5 fi fi for ac_header in ftd2xx.h do : ac_fn_cxx_check_header_compile "$LINENO" "ftd2xx.h" "ac_cv_header_ftd2xx_h" "$ac_includes_default" if test "x$ac_cv_header_ftd2xx_h" = xyes then : printf "%s\n" "#define HAVE_FTD2XX_H 1" >>confdefs.h printf "%s\n" "#define HAVE_FTD2XX 1" >>confdefs.h build_exsid_builder=yes build_exsid_driver=yes else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ftd2xx.h not found, support will not be available" >&5 printf "%s\n" "$as_me: WARNING: ftd2xx.h not found, support will not be available" >&2;} fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libftdi1" >&5 printf %s "checking for libftdi1... " >&6; } if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libftdi1 >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libftdi1 >= 1.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then printf "%s\n" "#define HAVE_FTDI 1" >>confdefs.h build_exsid_builder=yes build_exsid_driver=yes FTDI_CFLAGS=`$PKG_CONFIG --cflags libftdi1` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: libftdi1 not found, support will not be available" >&5 printf "%s\n" "$as_me: WARNING: libftdi1 not found, support will not be available" >&2;} fi elif test $pkg_failed = untried; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $EXSID_PKG_ERRORS - using internal driver" >&5 printf "%s\n" "$as_me: WARNING: $EXSID_PKG_ERRORS - using internal driver" >&2;} if test "x$MINGW32" != "xyes" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 printf %s "checking for library containing dlopen... " >&6; } if test ${ac_cv_search_dlopen+y} then : printf %s "(cached) " >&6 else $as_nop ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ namespace conftest { extern "C" int dlopen (); } int main (void) { return conftest::dlopen (); ; return 0; } _ACEOF for ac_lib in '' dl dld do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_cxx_try_link "$LINENO" then : ac_cv_search_dlopen=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_dlopen+y} then : break fi done if test ${ac_cv_search_dlopen+y} then : else $as_nop ac_cv_search_dlopen=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5 printf "%s\n" "$ac_cv_search_dlopen" >&6; } ac_res=$ac_cv_search_dlopen if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" else $as_nop as_fn_error $? "unable to find the dlopen() function" "$LINENO" 5 fi fi for ac_header in ftd2xx.h do : ac_fn_cxx_check_header_compile "$LINENO" "ftd2xx.h" "ac_cv_header_ftd2xx_h" "$ac_includes_default" if test "x$ac_cv_header_ftd2xx_h" = xyes then : printf "%s\n" "#define HAVE_FTD2XX_H 1" >>confdefs.h printf "%s\n" "#define HAVE_FTD2XX 1" >>confdefs.h build_exsid_builder=yes build_exsid_driver=yes else $as_nop { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ftd2xx.h not found, support will not be available" >&5 printf "%s\n" "$as_me: WARNING: ftd2xx.h not found, support will not be available" >&2;} fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for libftdi1" >&5 printf %s "checking for libftdi1... " >&6; } if test -n "$PKG_CONFIG" && \ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libftdi1 >= 1.0\""; } >&5 ($PKG_CONFIG --exists --print-errors "libftdi1 >= 1.0") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then printf "%s\n" "#define HAVE_FTDI 1" >>confdefs.h build_exsid_builder=yes build_exsid_driver=yes FTDI_CFLAGS=`$PKG_CONFIG --cflags libftdi1` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: libftdi1 not found, support will not be available" >&5 printf "%s\n" "$as_me: WARNING: libftdi1 not found, support will not be available" >&2;} fi else EXSID_CFLAGS=$pkg_cv_EXSID_CFLAGS EXSID_LIBS=$pkg_cv_EXSID_LIBS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } printf "%s\n" "#define HAVE_EXSID 1" >>confdefs.h build_exsid_builder=yes fi fi if test "x$with_exsid" = "xyes" -a "x$build_exsid_builder" != xyes then : as_fn_error $? "Neither libexsid nor ftd2xx nor libftdi1 found" "$LINENO" 5 fi if test "x${build_exsid_builder}" = xyes; then EXSID_SUPPORT_TRUE= EXSID_SUPPORT_FALSE='#' else EXSID_SUPPORT_TRUE='#' EXSID_SUPPORT_FALSE= fi if test "x${build_exsid_driver}" = xyes; then EXSID_DRIVER_TRUE= EXSID_DRIVER_FALSE='#' else EXSID_DRIVER_TRUE='#' EXSID_DRIVER_FALSE= fi # check for thread model if available 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 printf %s "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 test ${ac_cv_prog_CPP+y} then : printf %s "(cached) " >&6 else $as_nop # Double quotes because $CC needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" 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. # 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. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # 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 $as_nop # 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 printf "%s\n" "$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. # 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. */ #include Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO" then : else $as_nop # 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 $as_nop # 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_nop { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$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 if test "x$build_exsid_driver" = xyes then : 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 ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" if test "x$PTHREAD_CC" != "x" then : CC="$PTHREAD_CC" fi CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS" >&5 printf %s "checking for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS... " >&6; } 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. */ char pthread_join (); int main (void) { return pthread_join (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items with a "," contain both # C compiler flags (before ",") and linker flags (after ","). Other items # starting with a "-" are C compiler flags, and remaining items are # library names, except for "none" which indicates that we try without # any flags at all, and "pthread-config" which is a program returning # the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "AX_PTHREAD_ZOS_MISSING" >/dev/null 2>&1 then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&5 printf "%s\n" "$as_me: WARNING: IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support." >&2;} fi rm -rf conftest* ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac # Are we compiling with Clang? { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC is Clang" >&5 printf %s "checking whether $CC is Clang... " >&6; } if test ${ax_cv_PTHREAD_CLANG+y} then : printf %s "(cached) " >&6 else $as_nop ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "AX_PTHREAD_CC_IS_CLANG" >/dev/null 2>&1 then : ax_cv_PTHREAD_CLANG=yes fi rm -rf conftest* fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG" >&6; } ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) # Note that for GCC and Clang -pthread generally implies -lpthread, # except when -nostdlib is passed. # This is problematic using libtool to build C++ shared libraries with pthread: # [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 # [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC if test "x$GCC" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" fi # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first if test "x$ax_pthread_clang" = "xyes" then : ax_pthread_flags="-pthread,-lpthread -pthread" fi # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac if test "x$ax_pthread_check_macro" = "x--" then : ax_pthread_check_cond=0 else $as_nop ax_pthread_check_cond="!defined($ax_pthread_check_macro)" fi if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5 printf %s "checking whether pthreads work without any flags... " >&6; } ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 printf %s "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } ;; -*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $ax_pthread_try_flag" >&5 printf %s "checking whether pthreads work with $ax_pthread_try_flag... " >&6; } PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) # Extract the first word of "pthread-config", so it can be a program name with args. set dummy pthread-config; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ax_pthread_config+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$ax_pthread_config"; then ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_ax_pthread_config="yes" printf "%s\n" "$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_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no" fi fi ax_pthread_config=$ac_cv_prog_ax_pthread_config if test -n "$ax_pthread_config"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5 printf "%s\n" "$ax_pthread_config" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ax_pthread_config" = "xno" then : continue fi PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$ax_pthread_try_flag" >&5 printf %s "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void *some_global = NULL; static void routine(void *a) { /* To avoid any unused-parameter or unused-but-set-parameter warning. */ some_global = a; } static void *start_routine(void *a) { return a; } int main (void) { pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_pthread_ok=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5 printf "%s\n" "$ax_pthread_ok" >&6; } if test "x$ax_pthread_ok" = "xyes" then : break fi PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 printf %s "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } if test ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+y} then : printf %s "(cached) " >&6 else $as_nop ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do if test "x$ax_pthread_try" = "xunknown" then : break fi CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_link="$ax_pthread_2step_ac_link" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main(void){return 0;} _ACEOF if ac_fn_c_try_link "$LINENO" then : break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" if test "x$ax_pthread_try" = "x" then : ax_pthread_try=no fi ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 printf "%s\n" "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5 printf %s "checking for joinable pthread attribute... " >&6; } if test ${ax_cv_PTHREAD_JOINABLE_ATTR+y} then : printf %s "(cached) " >&6 else $as_nop ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int attr = $ax_pthread_attr; return attr /* ; */ ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_JOINABLE_ATTR" >&5 printf "%s\n" "$ax_cv_PTHREAD_JOINABLE_ATTR" >&6; } if test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes" then : printf "%s\n" "#define PTHREAD_CREATE_JOINABLE $ax_cv_PTHREAD_JOINABLE_ATTR" >>confdefs.h ax_pthread_joinable_attr_defined=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether more special flags are required for pthreads" >&5 printf %s "checking whether more special flags are required for pthreads... " >&6; } if test ${ax_cv_PTHREAD_SPECIAL_FLAGS+y} then : printf %s "(cached) " >&6 else $as_nop ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_SPECIAL_FLAGS" >&5 printf "%s\n" "$ax_cv_PTHREAD_SPECIAL_FLAGS" >&6; } if test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes" then : PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5 printf %s "checking for PTHREAD_PRIO_INHERIT... " >&6; } if test ${ax_cv_PTHREAD_PRIO_INHERIT+y} then : printf %s "(cached) " >&6 else $as_nop cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { int i = PTHREAD_PRIO_INHERIT; return i; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ax_cv_PTHREAD_PRIO_INHERIT=yes else $as_nop ax_cv_PTHREAD_PRIO_INHERIT=no fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5 printf "%s\n" "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; } if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes" then : printf "%s\n" "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h ax_pthread_prio_inherit_defined=yes fi CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) case "x/$CC" in #( x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) : #handle absolute path differently from PATH based program lookup case "x$CC" in #( x/*) : if as_fn_executable_p ${CC}_r then : PTHREAD_CC="${CC}_r" fi ;; #( *) : for ac_prog in ${CC}_r do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PTHREAD_CC+y} then : printf %s "(cached) " >&6 else $as_nop if test -n "$PTHREAD_CC"; then ac_cv_prog_PTHREAD_CC="$PTHREAD_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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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_PTHREAD_CC="$ac_prog" printf "%s\n" "$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 PTHREAD_CC=$ac_cv_prog_PTHREAD_CC if test -n "$PTHREAD_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5 printf "%s\n" "$PTHREAD_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PTHREAD_CC" && break done test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" ;; esac ;; #( *) : ;; esac ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then printf "%s\n" "#define EXSID_THREADED 1" >>confdefs.h printf "%s\n" "#define HAVE_PTHREAD_H 1" >>confdefs.h : else ax_pthread_ok=no fi 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 fi eval loadable_shrext=$shrext_cmds printf "%s\n" "#define SHLIBEXT \"${loadable_shrext}\"" >>confdefs.h ac_config_files="$ac_config_files Makefile libsidplayfp.pc libstilview.pc src/sidplayfp/sidversion.h src/builders/residfp-builder/residfp/siddefs-fp.h src/builders/resid-builder/resid/siddefs.h tests/Makefile" 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_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$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+y} || &/ 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$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}' DEFS=-DHAVE_CONFIG_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=`printf "%s\n" "$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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${MINGW32_TRUE}" && test -z "${MINGW32_FALSE}"; then as_fn_error $? "conditional \"MINGW32\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MACOS_TRUE}" && test -z "${MACOS_FALSE}"; then as_fn_error $? "conditional \"MACOS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 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__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 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 "${HAVE_VISIBILITY_TRUE}" && test -z "${HAVE_VISIBILITY_FALSE}"; then as_fn_error $? "conditional \"HAVE_VISIBILITY\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HARDSID_TRUE}" && test -z "${HARDSID_FALSE}"; then as_fn_error $? "conditional \"HARDSID\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_DOXYGEN_TRUE}" && test -z "${HAVE_DOXYGEN_FALSE}"; then as_fn_error $? "conditional \"HAVE_DOXYGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${TESTSUITE_TRUE}" && test -z "${TESTSUITE_FALSE}"; then as_fn_error $? "conditional \"TESTSUITE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${ENABLE_TEST_TRUE}" && test -z "${ENABLE_TEST_FALSE}"; then as_fn_error $? "conditional \"ENABLE_TEST\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${LIBGCRYPT_TRUE}" && test -z "${LIBGCRYPT_FALSE}"; then as_fn_error $? "conditional \"LIBGCRYPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NEW_8580_FILTER_TRUE}" && test -z "${NEW_8580_FILTER_FALSE}"; then as_fn_error $? "conditional \"NEW_8580_FILTER\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXSID_SUPPORT_TRUE}" && test -z "${EXSID_SUPPORT_FALSE}"; then as_fn_error $? "conditional \"EXSID_SUPPORT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${EXSID_DRIVER_TRUE}" && test -z "${EXSID_DRIVER_FALSE}"; then as_fn_error $? "conditional \"EXSID_DRIVER\" 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" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$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 as_nop=: if test ${ZSH_VERSION+y} && (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 $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; 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 # 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 case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac 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 printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # 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 printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$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_nop 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_nop 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 || printf "%s\n" 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 # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. 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 # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' 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=`printf "%s\n" "$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 || printf "%s\n" 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 libsidplayfp $as_me 2.6.0, which was generated by GNU Autoconf 2.71. 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 case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" 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 --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider. libsidplayfp home page: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ libsidplayfp config.status 2.6.0 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 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 ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$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 \printf "%s\n" "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 printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _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 "src/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Doxyfile") CONFIG_FILES="$CONFIG_FILES Doxyfile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "libsidplayfp.pc") CONFIG_FILES="$CONFIG_FILES libsidplayfp.pc" ;; "libstilview.pc") CONFIG_FILES="$CONFIG_FILES libstilview.pc" ;; "src/sidplayfp/sidversion.h") CONFIG_FILES="$CONFIG_FILES src/sidplayfp/sidversion.h" ;; "src/builders/residfp-builder/residfp/siddefs-fp.h") CONFIG_FILES="$CONFIG_FILES src/builders/residfp-builder/residfp/siddefs-fp.h" ;; "src/builders/resid-builder/resid/siddefs.h") CONFIG_FILES="$CONFIG_FILES src/builders/resid-builder/resid/siddefs.h" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; *) 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+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_COMMANDS+y} || 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" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :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=`printf "%s\n" "$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 '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$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 || printf "%s\n" 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=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$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@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$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"; } && { printf "%s\n" "$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 printf "%s\n" "$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 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _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" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf 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. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See \`config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 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. # GNU Libtool is free software; 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be 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 . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; 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 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi libsidplayfp-2.6.0/m4/0000755000175100001770000000000014544470322011532 500000000000000libsidplayfp-2.6.0/m4/ltversion.m40000755000175100001770000000127314544470314013750 00000000000000# ltversion.m4 -- version numbers -*- Autoconf -*- # # Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. # Written by Scott James Remnant, 2004 # # 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. # @configure_input@ # serial 4179 ltversion.m4 # This file is part of GNU Libtool m4_define([LT_PACKAGE_VERSION], [2.4.6]) m4_define([LT_PACKAGE_REVISION], [2.4.6]) AC_DEFUN([LTVERSION_VERSION], [macro_version='2.4.6' macro_revision='2.4.6' _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) _LT_DECL(, macro_revision, 0) ]) libsidplayfp-2.6.0/m4/libtool.m40000755000175100001770000112677114544470313013402 00000000000000# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- # # Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. # Written by Gordon Matzigkeit, 1996 # # 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. m4_define([_LT_COPYING], [dnl # Copyright (C) 2014 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. # GNU Libtool is free software; 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be 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 . ]) # serial 58 LT_INIT # LT_PREREQ(VERSION) # ------------------ # Complain and exit if this libtool version is less that VERSION. m4_defun([LT_PREREQ], [m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, [m4_default([$3], [m4_fatal([Libtool version $1 or higher is required], 63)])], [$2])]) # _LT_CHECK_BUILDDIR # ------------------ # Complain if the absolute build directory name contains unusual characters m4_defun([_LT_CHECK_BUILDDIR], [case `pwd` in *\ * | *\ *) AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; esac ]) # LT_INIT([OPTIONS]) # ------------------ AC_DEFUN([LT_INIT], [AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl AC_BEFORE([$0], [LT_LANG])dnl AC_BEFORE([$0], [LT_OUTPUT])dnl AC_BEFORE([$0], [LTDL_INIT])dnl m4_require([_LT_CHECK_BUILDDIR])dnl dnl Autoconf doesn't catch unexpanded LT_ macros by default: m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 dnl unless we require an AC_DEFUNed macro: AC_REQUIRE([LTOPTIONS_VERSION])dnl AC_REQUIRE([LTSUGAR_VERSION])dnl AC_REQUIRE([LTVERSION_VERSION])dnl AC_REQUIRE([LTOBSOLETE_VERSION])dnl m4_require([_LT_PROG_LTMAIN])dnl _LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) dnl Parse OPTIONS _LT_SET_OPTIONS([$0], [$1]) # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl _LT_SETUP # Only expand once: m4_define([LT_INIT]) ])# LT_INIT # Old names: AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PROG_LIBTOOL], []) dnl AC_DEFUN([AM_PROG_LIBTOOL], []) # _LT_PREPARE_CC_BASENAME # ----------------------- m4_defun([_LT_PREPARE_CC_BASENAME], [ # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in @S|@*""; do case $cc_temp in compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } ])# _LT_PREPARE_CC_BASENAME # _LT_CC_BASENAME(CC) # ------------------- # It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, # but that macro is also expanded into generated libtool script, which # arranges for $SED and $ECHO to be set by different means. m4_defun([_LT_CC_BASENAME], [m4_require([_LT_PREPARE_CC_BASENAME])dnl AC_REQUIRE([_LT_DECL_SED])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl func_cc_basename $1 cc_basename=$func_cc_basename_result ]) # _LT_FILEUTILS_DEFAULTS # ---------------------- # It is okay to use these file commands and assume they have been set # sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. m4_defun([_LT_FILEUTILS_DEFAULTS], [: ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} ])# _LT_FILEUTILS_DEFAULTS # _LT_SETUP # --------- m4_defun([_LT_SETUP], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl _LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl dnl _LT_DECL([], [host_alias], [0], [The host system])dnl _LT_DECL([], [host], [0])dnl _LT_DECL([], [host_os], [0])dnl dnl _LT_DECL([], [build_alias], [0], [The build system])dnl _LT_DECL([], [build], [0])dnl _LT_DECL([], [build_os], [0])dnl dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl dnl AC_REQUIRE([AC_PROG_LN_S])dnl test -z "$LN_S" && LN_S="ln -s" _LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl dnl AC_REQUIRE([LT_CMD_MAX_LEN])dnl _LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl _LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl m4_require([_LT_CMD_RELOAD])dnl m4_require([_LT_CHECK_MAGIC_METHOD])dnl m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl m4_require([_LT_CMD_OLD_ARCHIVE])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_WITH_SYSROOT])dnl m4_require([_LT_CMD_TRUNCATE])dnl _LT_CONFIG_LIBTOOL_INIT([ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi ]) if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi _LT_CHECK_OBJDIR m4_require([_LT_TAG_COMPILER])dnl case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o _LT_CC_BASENAME([$compiler]) # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then _LT_PATH_MAGIC fi ;; esac # Use C for the default configuration in the libtool script LT_SUPPORTED_TAG([CC]) _LT_LANG_C_CONFIG _LT_LANG_DEFAULT_CONFIG _LT_CONFIG_COMMANDS ])# _LT_SETUP # _LT_PREPARE_SED_QUOTE_VARS # -------------------------- # Define a few sed substitution that help us do robust quoting. m4_defun([_LT_PREPARE_SED_QUOTE_VARS], [# Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\([["`\\]]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ]) # _LT_PROG_LTMAIN # --------------- # Note that this code is called both from 'configure', and 'config.status' # now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, # 'config.status' has no value for ac_aux_dir unless we are using Automake, # so we pass a copy along to make sure it has a sensible value anyway. m4_defun([_LT_PROG_LTMAIN], [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) ltmain=$ac_aux_dir/ltmain.sh ])# _LT_PROG_LTMAIN ## ------------------------------------- ## ## Accumulate code for creating libtool. ## ## ------------------------------------- ## # So that we can recreate a full libtool script including additional # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS # in macros and then make a single call at the end using the 'libtool' # label. # _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) # ---------------------------------------- # Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL_INIT], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_INIT], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_INIT]) # _LT_CONFIG_LIBTOOL([COMMANDS]) # ------------------------------ # Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. m4_define([_LT_CONFIG_LIBTOOL], [m4_ifval([$1], [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], [$1 ])])]) # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) # _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) # ----------------------------------------------------- m4_defun([_LT_CONFIG_SAVE_COMMANDS], [_LT_CONFIG_LIBTOOL([$1]) _LT_CONFIG_LIBTOOL_INIT([$2]) ]) # _LT_FORMAT_COMMENT([COMMENT]) # ----------------------------- # Add leading comment marks to the start of each line, and a trailing # full-stop to the whole comment if one is not present already. m4_define([_LT_FORMAT_COMMENT], [m4_ifval([$1], [ m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) )]) ## ------------------------ ## ## FIXME: Eliminate VARNAME ## ## ------------------------ ## # _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) # ------------------------------------------------------------------- # CONFIGNAME is the name given to the value in the libtool script. # VARNAME is the (base) name used in the configure script. # VALUE may be 0, 1 or 2 for a computed quote escaped value based on # VARNAME. Any other value will be used directly. m4_define([_LT_DECL], [lt_if_append_uniq([lt_decl_varnames], [$2], [, ], [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], [m4_ifval([$1], [$1], [$2])]) lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) m4_ifval([$4], [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) lt_dict_add_subkey([lt_decl_dict], [$2], [tagged?], [m4_ifval([$5], [yes], [no])])]) ]) # _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) # -------------------------------------------------------- m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) # lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_tag_varnames], [_lt_decl_filter([tagged?], [yes], $@)]) # _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) # --------------------------------------------------------- m4_define([_lt_decl_filter], [m4_case([$#], [0], [m4_fatal([$0: too few arguments: $#])], [1], [m4_fatal([$0: too few arguments: $#: $1])], [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], [lt_dict_filter([lt_decl_dict], $@)])[]dnl ]) # lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) # -------------------------------------------------- m4_define([lt_decl_quote_varnames], [_lt_decl_filter([value], [1], $@)]) # lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_dquote_varnames], [_lt_decl_filter([value], [2], $@)]) # lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) # --------------------------------------------------- m4_define([lt_decl_varnames_tagged], [m4_assert([$# <= 2])dnl _$0(m4_quote(m4_default([$1], [[, ]])), m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) m4_define([_lt_decl_varnames_tagged], [m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) # lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) # ------------------------------------------------ m4_define([lt_decl_all_varnames], [_$0(m4_quote(m4_default([$1], [[, ]])), m4_if([$2], [], m4_quote(lt_decl_varnames), m4_quote(m4_shift($@))))[]dnl ]) m4_define([_lt_decl_all_varnames], [lt_join($@, lt_decl_varnames_tagged([$1], lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl ]) # _LT_CONFIG_STATUS_DECLARE([VARNAME]) # ------------------------------------ # Quote a variable value, and forward it to 'config.status' so that its # declaration there will have the same value as in 'configure'. VARNAME # must have a single quote delimited value for this to work. m4_define([_LT_CONFIG_STATUS_DECLARE], [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) # _LT_CONFIG_STATUS_DECLARATIONS # ------------------------------ # We delimit libtool config variables with single quotes, so when # we write them to config.status, we have to be sure to quote all # embedded single quotes properly. In configure, this macro expands # each variable declared with _LT_DECL (and _LT_TAGDECL) into: # # ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], [m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAGS # ---------------- # Output comment and list of tags supported by the script m4_defun([_LT_LIBTOOL_TAGS], [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl available_tags='_LT_TAGS'dnl ]) # _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) # ----------------------------------- # Extract the dictionary values for VARNAME (optionally with TAG) and # expand to a commented shell variable setting: # # # Some comment about what VAR is for. # visible_name=$lt_internal_name m4_define([_LT_LIBTOOL_DECLARE], [_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [description])))[]dnl m4_pushdef([_libtool_name], m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), [0], [_libtool_name=[$]$1], [1], [_libtool_name=$lt_[]$1], [2], [_libtool_name=$lt_[]$1], [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl ]) # _LT_LIBTOOL_CONFIG_VARS # ----------------------- # Produce commented declarations of non-tagged libtool config variables # suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' # script. Tagged libtool config variables (even for the LIBTOOL CONFIG # section) are produced by _LT_LIBTOOL_TAG_VARS. m4_defun([_LT_LIBTOOL_CONFIG_VARS], [m4_foreach([_lt_var], m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) # _LT_LIBTOOL_TAG_VARS(TAG) # ------------------------- m4_define([_LT_LIBTOOL_TAG_VARS], [m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) # _LT_TAGVAR(VARNAME, [TAGNAME]) # ------------------------------ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) # _LT_CONFIG_COMMANDS # ------------------- # Send accumulated output to $CONFIG_STATUS. Thanks to the lists of # variables for single and double quote escaping we saved from calls # to _LT_DECL, we can put quote escaped variables declarations # into 'config.status', and then the shell code to quote escape them in # for loops in 'config.status'. Finally, any additional code accumulated # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. m4_defun([_LT_CONFIG_COMMANDS], [AC_PROVIDE_IFELSE([LT_OUTPUT], dnl If the libtool generation code has been placed in $CONFIG_LT, dnl instead of duplicating it all over again into config.status, dnl then we will have config.status run $CONFIG_LT later, so it dnl needs to know what name is stored there: [AC_CONFIG_COMMANDS([libtool], [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], dnl If the libtool generation code is destined for config.status, dnl expand the accumulated commands and init code now: [AC_CONFIG_COMMANDS([libtool], [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) ])#_LT_CONFIG_COMMANDS # Initialize. m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], [ # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' _LT_CONFIG_STATUS_DECLARATIONS LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$[]1 _LTECHO_EOF' } # Quote evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_quote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in lt_decl_all_varnames([[ \ ]], lt_decl_dquote_varnames); do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[[\\\\\\\`\\"\\\$]]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done _LT_OUTPUT_LIBTOOL_INIT ]) # _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) # ------------------------------------ # Generate a child script FILE with all initialization necessary to # reuse the environment learned by the parent script, and make the # file executable. If COMMENT is supplied, it is inserted after the # '#!' sequence but before initialization text begins. After this # macro, additional text can be appended to FILE to form the body of # the child script. The macro ends with non-zero status if the # file could not be fully written (such as if the disk is full). m4_ifdef([AS_INIT_GENERATED], [m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], [m4_defun([_LT_GENERATED_FILE_INIT], [m4_require([AS_PREPARE])]dnl [m4_pushdef([AS_MESSAGE_LOG_FD])]dnl [lt_write_fail=0 cat >$1 <<_ASEOF || lt_write_fail=1 #! $SHELL # Generated by $as_me. $2 SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$1 <<\_ASEOF || lt_write_fail=1 AS_SHELL_SANITIZE _AS_PREPARE exec AS_MESSAGE_FD>&1 _ASEOF test 0 = "$lt_write_fail" && chmod +x $1[]dnl m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT # LT_OUTPUT # --------- # This macro allows early generation of the libtool script (before # AC_OUTPUT is called), incase it is used in configure for compilation # tests. AC_DEFUN([LT_OUTPUT], [: ${CONFIG_LT=./config.lt} AC_MSG_NOTICE([creating $CONFIG_LT]) _LT_GENERATED_FILE_INIT(["$CONFIG_LT"], [# Run this file to recreate a libtool stub with the current configuration.]) cat >>"$CONFIG_LT" <<\_LTEOF lt_cl_silent=false exec AS_MESSAGE_LOG_FD>>config.log { echo AS_BOX([Running $as_me.]) } >&AS_MESSAGE_LOG_FD lt_cl_help="\ '$as_me' creates a local libtool stub from the current configuration, for use in further configure time tests before the real libtool is generated. Usage: $[0] [[OPTIONS]] -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files Report bugs to ." lt_cl_version="\ m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) configured by $[0], generated by m4_PACKAGE_STRING. Copyright (C) 2011 Free Software Foundation, Inc. This config.lt script is free software; the Free Software Foundation gives unlimited permision to copy, distribute and modify it." while test 0 != $[#] do case $[1] in --version | --v* | -V ) echo "$lt_cl_version"; exit 0 ;; --help | --h* | -h ) echo "$lt_cl_help"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --quiet | --q* | --silent | --s* | -q ) lt_cl_silent=: ;; -*) AC_MSG_ERROR([unrecognized option: $[1] Try '$[0] --help' for more information.]) ;; *) AC_MSG_ERROR([unrecognized argument: $[1] Try '$[0] --help' for more information.]) ;; esac shift done if $lt_cl_silent; then exec AS_MESSAGE_FD>/dev/null fi _LTEOF cat >>"$CONFIG_LT" <<_LTEOF _LT_OUTPUT_LIBTOOL_COMMANDS_INIT _LTEOF cat >>"$CONFIG_LT" <<\_LTEOF AC_MSG_NOTICE([creating $ofile]) _LT_OUTPUT_LIBTOOL_COMMANDS AS_EXIT(0) _LTEOF chmod +x "$CONFIG_LT" # configure is writing to config.log, but config.lt does its own redirection, # appending to config.log, which fails on DOS, as config.log is still kept # open by configure. Here we exec the FD to /dev/null, effectively closing # config.log, so it can be properly (re)opened and appended to by config.lt. lt_cl_success=: test yes = "$silent" && lt_config_lt_args="$lt_config_lt_args --quiet" exec AS_MESSAGE_LOG_FD>/dev/null $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false exec AS_MESSAGE_LOG_FD>>config.log $lt_cl_success || AS_EXIT(1) ])# LT_OUTPUT # _LT_CONFIG(TAG) # --------------- # If TAG is the built-in tag, create an initial libtool script with a # default configuration from the untagged config vars. Otherwise add code # to config.status for appending the configuration named by TAG from the # matching tagged config vars. m4_defun([_LT_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_CONFIG_SAVE_COMMANDS([ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl m4_if(_LT_TAG, [C], [ # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 _LT_COPYING _LT_LIBTOOL_TAGS # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG _LT_LIBTOOL_CONFIG_VARS _LT_LIBTOOL_TAG_VARS # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE _LT_PREPARE_MUNGE_PATH_LIST _LT_PREPARE_CC_BASENAME # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac _LT_PROG_LTMAIN # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" ], [cat <<_LT_EOF >> "$ofile" dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded dnl in a comment (ie after a #). # ### BEGIN LIBTOOL TAG CONFIG: $1 _LT_LIBTOOL_TAG_VARS(_LT_TAG) # ### END LIBTOOL TAG CONFIG: $1 _LT_EOF ])dnl /m4_if ], [m4_if([$1], [], [ PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile'], []) ])dnl /_LT_CONFIG_SAVE_COMMANDS ])# _LT_CONFIG # LT_SUPPORTED_TAG(TAG) # --------------------- # Trace this macro to discover what tags are supported by the libtool # --tag option, using: # autoconf --trace 'LT_SUPPORTED_TAG:$1' AC_DEFUN([LT_SUPPORTED_TAG], []) # C support is built-in for now m4_define([_LT_LANG_C_enabled], []) m4_define([_LT_TAGS], []) # LT_LANG(LANG) # ------------- # Enable libtool support for the given language if not already enabled. AC_DEFUN([LT_LANG], [AC_BEFORE([$0], [LT_OUTPUT])dnl m4_case([$1], [C], [_LT_LANG(C)], [C++], [_LT_LANG(CXX)], [Go], [_LT_LANG(GO)], [Java], [_LT_LANG(GCJ)], [Fortran 77], [_LT_LANG(F77)], [Fortran], [_LT_LANG(FC)], [Windows Resource], [_LT_LANG(RC)], [m4_ifdef([_LT_LANG_]$1[_CONFIG], [_LT_LANG($1)], [m4_fatal([$0: unsupported language: "$1"])])])dnl ])# LT_LANG # _LT_LANG(LANGNAME) # ------------------ m4_defun([_LT_LANG], [m4_ifdef([_LT_LANG_]$1[_enabled], [], [LT_SUPPORTED_TAG([$1])dnl m4_append([_LT_TAGS], [$1 ])dnl m4_define([_LT_LANG_]$1[_enabled], [])dnl _LT_LANG_$1_CONFIG($1)])dnl ])# _LT_LANG m4_ifndef([AC_PROG_GO], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_GO. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_GO], [AC_LANG_PUSH(Go)dnl AC_ARG_VAR([GOC], [Go compiler command])dnl AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl _AC_ARG_VAR_LDFLAGS()dnl AC_CHECK_TOOL(GOC, gccgo) if test -z "$GOC"; then if test -n "$ac_tool_prefix"; then AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) fi fi if test -z "$GOC"; then AC_CHECK_PROG(GOC, gccgo, gccgo, false) fi ])#m4_defun ])#m4_ifndef # _LT_LANG_DEFAULT_CONFIG # ----------------------- m4_defun([_LT_LANG_DEFAULT_CONFIG], [AC_PROVIDE_IFELSE([AC_PROG_CXX], [LT_LANG(CXX)], [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) AC_PROVIDE_IFELSE([AC_PROG_F77], [LT_LANG(F77)], [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) AC_PROVIDE_IFELSE([AC_PROG_FC], [LT_LANG(FC)], [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal dnl pulling things in needlessly. AC_PROVIDE_IFELSE([AC_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], [LT_LANG(GCJ)], [AC_PROVIDE_IFELSE([LT_PROG_GCJ], [LT_LANG(GCJ)], [m4_ifdef([AC_PROG_GCJ], [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([A][M_PROG_GCJ], [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) m4_ifdef([LT_PROG_GCJ], [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) AC_PROVIDE_IFELSE([AC_PROG_GO], [LT_LANG(GO)], [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) AC_PROVIDE_IFELSE([LT_PROG_RC], [LT_LANG(RC)], [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) ])# _LT_LANG_DEFAULT_CONFIG # Obsolete macros: AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_CXX], []) dnl AC_DEFUN([AC_LIBTOOL_F77], []) dnl AC_DEFUN([AC_LIBTOOL_FC], []) dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) dnl AC_DEFUN([AC_LIBTOOL_RC], []) # _LT_TAG_COMPILER # ---------------- m4_defun([_LT_TAG_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl _LT_DECL([LTCC], [CC], [1], [A C compiler])dnl _LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl _LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl _LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC ])# _LT_TAG_COMPILER # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. m4_defun([_LT_COMPILER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ])# _LT_COMPILER_BOILERPLATE # _LT_LINKER_BOILERPLATE # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. m4_defun([_LT_LINKER_BOILERPLATE], [m4_require([_LT_DECL_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS # ------------------------- m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) AC_CHECK_TOOL([LIPO], [lipo], [:]) AC_CHECK_TOOL([OTOOL], [otool], [:]) AC_CHECK_TOOL([OTOOL64], [otool64], [:]) _LT_DECL([], [DSYMUTIL], [1], [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) _LT_DECL([], [NMEDIT], [1], [Tool to change global to local symbols on Mac OS X]) _LT_DECL([], [LIPO], [1], [Tool to manipulate fat objects and archives on Mac OS X]) _LT_DECL([], [OTOOL], [1], [ldd/readelf like tool for Mach-O binaries on Mac OS X]) _LT_DECL([], [OTOOL64], [1], [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -rf libconftest.dylib* rm -f conftest.* fi]) AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [lt_cv_ld_exported_symbols_list=yes], [lt_cv_ld_exported_symbols_list=no]) LDFLAGS=$save_LDFLAGS ]) AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], [lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD echo "$AR cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD $AR cr libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&AS_MESSAGE_LOG_FD elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&AS_MESSAGE_LOG_FD fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ]) case $host_os in rhapsody* | darwin1.[[012]]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[[912]]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[[012]][[,.]]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*|11.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac ]) # _LT_DARWIN_LINKER_FEATURES([TAG]) # --------------------------------- # Checks for linker and compiler features on darwin m4_defun([_LT_DARWIN_LINKER_FEATURES], [ m4_require([_LT_REQUIRED_DARWIN_CHECKS]) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported if test yes = "$lt_cv_ld_force_load"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) else _LT_TAGVAR(whole_archive_flag_spec, $1)='' fi _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" m4_if([$1], [CXX], [ if test yes != "$lt_cv_apple_cc_single_mod"; then _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi ],[]) else _LT_TAGVAR(ld_shlibs, $1)=no fi ]) # _LT_SYS_MODULE_PATH_AIX([TAGNAME]) # ---------------------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. # Store the results from the different compilers for each TAGNAME. # Allow to override them for all tags through lt_cv_aix_libpath. m4_defun([_LT_SYS_MODULE_PATH_AIX], [m4_require([_LT_DECL_SED])dnl if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ lt_aix_libpath_sed='[ /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }]' _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi],[]) if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib fi ]) aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi ])# _LT_SYS_MODULE_PATH_AIX # _LT_SHELL_INIT(ARG) # ------------------- m4_define([_LT_SHELL_INIT], [m4_divert_text([M4SH-INIT], [$1 ])])# _LT_SHELL_INIT # _LT_PROG_ECHO_BACKSLASH # ----------------------- # Find how we can fake an echo command that does not interpret backslash. # In particular, with Autoconf 2.60 or later we add some code to the start # of the generated configure script that will find a shell with a builtin # printf (that we can use as an echo command). m4_defun([_LT_PROG_ECHO_BACKSLASH], [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO AC_MSG_CHECKING([how to print strings]) # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $[]1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } case $ECHO in printf*) AC_MSG_RESULT([printf]) ;; print*) AC_MSG_RESULT([print -r]) ;; *) AC_MSG_RESULT([cat]) ;; esac m4_ifdef([_AS_DETECT_SUGGESTED], [_AS_DETECT_SUGGESTED([ test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test "X`printf %s $ECHO`" = "X$ECHO" \ || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) _LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) ])# _LT_PROG_ECHO_BACKSLASH # _LT_WITH_SYSROOT # ---------------- AC_DEFUN([_LT_WITH_SYSROOT], [AC_MSG_CHECKING([for sysroot]) AC_ARG_WITH([sysroot], [AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], [Search for dependent libraries within DIR (or the compiler's sysroot if not specified).])], [], [with_sysroot=no]) dnl lt_sysroot will always be passed unquoted. We quote it here dnl in case the user passed a directory name. lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) AC_MSG_RESULT([$with_sysroot]) AC_MSG_ERROR([The sysroot must be an absolute path.]) ;; esac AC_MSG_RESULT([${lt_sysroot:-no}]) _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl [dependent libraries, and where our libraries should be installed.])]) # _LT_ENABLE_LOCK # --------------- m4_defun([_LT_ENABLE_LOCK], [AC_ARG_ENABLE([libtool-lock], [AS_HELP_STRING([--disable-libtool-lock], [avoid locking (might break parallel builds)])]) test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock ])# _LT_ENABLE_LOCK # _LT_PROG_AR # ----------- m4_defun([_LT_PROG_AR], [AC_CHECK_TOOLS(AR, [ar], false) : ${AR=ar} : ${AR_FLAGS=cr} _LT_DECL([], [AR], [1], [The archiver]) _LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], [lt_cv_ar_at_file=no AC_COMPILE_IFELSE([AC_LANG_PROGRAM], [echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' AC_TRY_EVAL([lt_ar_try]) if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a AC_TRY_EVAL([lt_ar_try]) if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a ]) ]) if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi _LT_DECL([], [archiver_list_spec], [1], [How to feed a file listing to the archiver]) ])# _LT_PROG_AR # _LT_CMD_OLD_ARCHIVE # ------------------- m4_defun([_LT_CMD_OLD_ARCHIVE], [_LT_PROG_AR AC_CHECK_TOOL(STRIP, strip, :) test -z "$STRIP" && STRIP=: _LT_DECL([], [STRIP], [1], [A symbol stripping program]) AC_CHECK_TOOL(RANLIB, ranlib, :) test -z "$RANLIB" && RANLIB=: _LT_DECL([], [RANLIB], [1], [Commands used to install an old-style archive]) # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac _LT_DECL([], [old_postinstall_cmds], [2]) _LT_DECL([], [old_postuninstall_cmds], [2]) _LT_TAGDECL([], [old_archive_cmds], [2], [Commands used to build an old-style archive]) _LT_DECL([], [lock_old_archive_extraction], [0], [Whether to use a lock for old archive extraction]) ])# _LT_CMD_OLD_ARCHIVE # _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works AC_DEFUN([_LT_COMPILER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi $RM conftest* ]) if test yes = "[$]$2"; then m4_if([$5], , :, [$5]) else m4_if([$6], , :, [$6]) fi ])# _LT_COMPILER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) # _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------- # Check whether the given linker option works AC_DEFUN([_LT_LINKER_OPTION], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $3" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi else $2=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ]) if test yes = "[$]$2"; then m4_if([$4], , :, [$4]) else m4_if([$5], , :, [$5]) fi ])# _LT_LINKER_OPTION # Old name: AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) # LT_CMD_MAX_LEN #--------------- AC_DEFUN([LT_CMD_MAX_LEN], [AC_REQUIRE([AC_CANONICAL_HOST])dnl # find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ]) if test -n "$lt_cv_sys_max_cmd_len"; then AC_MSG_RESULT($lt_cv_sys_max_cmd_len) else AC_MSG_RESULT(none) fi max_cmd_len=$lt_cv_sys_max_cmd_len _LT_DECL([], [max_cmd_len], [0], [What is the maximum length of a command?]) ])# LT_CMD_MAX_LEN # Old name: AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) # _LT_HEADER_DLFCN # ---------------- m4_defun([_LT_HEADER_DLFCN], [AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl ])# _LT_HEADER_DLFCN # _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, # ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) # ---------------------------------------------------------------- m4_defun([_LT_TRY_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes = "$cross_compiling"; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF [#line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; }] _LT_EOF if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) $1 ;; x$lt_dlneed_uscore) $2 ;; x$lt_dlunknown|x*) $3 ;; esac else : # compilation failed $3 fi fi rm -fr conftest* ])# _LT_TRY_DLOPEN_SELF # LT_SYS_DLOPEN_SELF # ------------------ AC_DEFUN([LT_SYS_DLOPEN_SELF], [m4_require([_LT_HEADER_DLFCN])dnl if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) AC_CHECK_FUNC([shl_load], [lt_cv_dlopen=shl_load], [AC_CHECK_LIB([dld], [shl_load], [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], [AC_CHECK_FUNC([dlopen], [lt_cv_dlopen=dlopen], [AC_CHECK_LIB([dl], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], [AC_CHECK_LIB([svld], [dlopen], [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], [AC_CHECK_LIB([dld], [dld_link], [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) ]) ]) ]) ]) ]) ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], lt_cv_dlopen_self_static, [dnl _LT_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi _LT_DECL([dlopen_support], [enable_dlopen], [0], [Whether dlopen is supported]) _LT_DECL([dlopen_self], [enable_dlopen_self], [0], [Whether dlopen of programs is supported]) _LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], [Whether dlopen of statically linked programs is supported]) ])# LT_SYS_DLOPEN_SELF # Old name: AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) # _LT_COMPILER_C_O([TAGNAME]) # --------------------------- # Check to see if options -c and -o are simultaneously supported by compiler. # This macro does not hard code the compiler like AC_PROG_CC_C_O. m4_defun([_LT_COMPILER_C_O], [m4_require([_LT_DECL_SED])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ]) _LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], [Does compiler simultaneously support -c and -o options?]) ])# _LT_COMPILER_C_O # _LT_COMPILER_FILE_LOCKS([TAGNAME]) # ---------------------------------- # Check to see if we can do hard links to lock some files if needed m4_defun([_LT_COMPILER_FILE_LOCKS], [m4_require([_LT_ENABLE_LOCK])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl _LT_COMPILER_C_O([$1]) hard_links=nottested if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no AC_MSG_RESULT([$hard_links]) if test no = "$hard_links"; then AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) need_locks=warn fi else need_locks=no fi _LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) ])# _LT_COMPILER_FILE_LOCKS # _LT_CHECK_OBJDIR # ---------------- m4_defun([_LT_CHECK_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir _LT_DECL([], [objdir], [0], [The name of the directory that contains temporary libtool files])dnl m4_pattern_allow([LT_OBJDIR])dnl AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", [Define to the sub-directory where libtool stores uninstalled libraries.]) ])# _LT_CHECK_OBJDIR # _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) # -------------------------------------- # Check hardcoding attributes. m4_defun([_LT_LINKER_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) _LT_TAGVAR(hardcode_action, $1)= if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || test -n "$_LT_TAGVAR(runpath_var, $1)" || test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then # We can hardcode non-existent directories. if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then # Linking always hardcodes the temporary library directory. _LT_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. _LT_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. _LT_TAGVAR(hardcode_action, $1)=unsupported fi AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi _LT_TAGDECL([], [hardcode_action], [0], [How to hardcode a shared library path into an executable]) ])# _LT_LINKER_HARDCODE_LIBPATH # _LT_CMD_STRIPLIB # ---------------- m4_defun([_LT_CMD_STRIPLIB], [m4_require([_LT_DECL_EGREP]) striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ;; *) AC_MSG_RESULT([no]) ;; esac fi _LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) _LT_DECL([], [striplib], [1]) ])# _LT_CMD_STRIPLIB # _LT_PREPARE_MUNGE_PATH_LIST # --------------------------- # Make sure func_munge_path_list() is defined correctly. m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], [[# func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x@S|@2 in x) ;; *:) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" ;; x:*) eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; *::*) eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" ;; *) eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" ;; esac } ]])# _LT_PREPARE_PATH_LIST # _LT_SYS_DYNAMIC_LINKER([TAG]) # ----------------------------- # PORTME Fill in your ld.so characteristics m4_defun([_LT_SYS_DYNAMIC_LINKER], [AC_REQUIRE([AC_CANONICAL_HOST])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_OBJDUMP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CHECK_SHELL_FEATURES])dnl m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl AC_MSG_CHECKING([dynamic linker characteristics]) m4_if([$1], [], [ if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown AC_ARG_VAR([LT_SYS_LIBRARY_PATH], [User-defined run-time library search path.]) case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[[4-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a[(]lib.so.V[)]' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[[45]]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' m4_if([$1], [],[ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[[23]].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[[3-9]]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], [lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], [lt_cv_shlibpath_overrides_runpath=yes])]) LDFLAGS=$save_LDFLAGS libdir=$save_libdir ]) shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac AC_MSG_RESULT([$dynamic_linker]) test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH _LT_DECL([], [variables_saved_for_relink], [1], [Variables whose values should be saved in libtool wrapper scripts and restored at link time]) _LT_DECL([], [need_lib_prefix], [0], [Do we need the "lib" prefix for modules?]) _LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) _LT_DECL([], [version_type], [0], [Library versioning type]) _LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) _LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) _LT_DECL([], [shlibpath_overrides_runpath], [0], [Is shlibpath searched before the hard-coded library search path?]) _LT_DECL([], [libname_spec], [1], [Format of library name prefix]) _LT_DECL([], [library_names_spec], [1], [[List of archive names. First name is the real one, the rest are links. The last name is the one that the linker finds with -lNAME]]) _LT_DECL([], [soname_spec], [1], [[The coded name of the library, if different from the real name]]) _LT_DECL([], [install_override_mode], [1], [Permission mode override for installation of shared libraries]) _LT_DECL([], [postinstall_cmds], [2], [Command to use after installation of a shared archive]) _LT_DECL([], [postuninstall_cmds], [2], [Command to use after uninstallation of a shared archive]) _LT_DECL([], [finish_cmds], [2], [Commands used to finish a libtool library installation in a directory]) _LT_DECL([], [finish_eval], [1], [[As "finish_cmds", except a single script fragment to be evaled but not shown]]) _LT_DECL([], [hardcode_into_libs], [0], [Whether we should hardcode library paths into libraries]) _LT_DECL([], [sys_lib_search_path_spec], [2], [Compile-time system search path for libraries]) _LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], [Detected run-time system search path for libraries]) _LT_DECL([], [configure_time_lt_sys_library_path], [2], [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) ])# _LT_SYS_DYNAMIC_LINKER # _LT_PATH_TOOL_PREFIX(TOOL) # -------------------------- # find a file program that can recognize shared library AC_DEFUN([_LT_PATH_TOOL_PREFIX], [m4_require([_LT_DECL_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in [[\\/*] | ?:[\\/]*]) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. ac_dummy="m4_if([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$1"; then lt_cv_path_MAGIC_CMD=$ac_dir/"$1" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac]) MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then AC_MSG_RESULT($MAGIC_CMD) else AC_MSG_RESULT(no) fi _LT_DECL([], [MAGIC_CMD], [0], [Used to examine libraries when file_magic_cmd begins with "file"])dnl ])# _LT_PATH_TOOL_PREFIX # Old name: AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) # _LT_PATH_MAGIC # -------------- # find a file program that can recognize a shared library m4_defun([_LT_PATH_MAGIC], [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi ])# _LT_PATH_MAGIC # LT_PATH_LD # ---------- # find the pathname to the GNU or non-GNU linker AC_DEFUN([LT_PATH_LD], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PROG_ECHO_BACKSLASH])dnl AC_ARG_WITH([gnu-ld], [AS_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test no = "$withval" || with_gnu_ld=yes], [with_gnu_ld=no])dnl ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. AC_MSG_CHECKING([for ld used by $CC]) case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then AC_MSG_CHECKING([for GNU ld]) else AC_MSG_CHECKING([for non-GNU ld]) fi AC_CACHE_VAL(lt_cv_path_LD, [if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], [if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi]) rm -f conftest.i conftest2.i conftest.out]) ])# _LT_PATH_DD # _LT_CMD_TRUNCATE # ---------------- # find command to truncate a binary pipe m4_defun([_LT_CMD_TRUNCATE], [m4_require([_LT_PATH_DD]) AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], [printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) _LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], [Command to truncate a binary pipe]) ])# _LT_CMD_TRUNCATE # _LT_CHECK_MAGIC_METHOD # ---------------------- # how to check for library dependencies # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_MAGIC_METHOD], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) AC_CACHE_CHECK([how to recognize dependent libraries], lt_cv_deplibs_check_method, [lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[[4-9]]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[[45]]*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[[3-9]]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown _LT_DECL([], [deplibs_check_method], [1], [Method to check whether dependent libraries are shared objects]) _LT_DECL([], [file_magic_cmd], [1], [Command to use when deplibs_check_method = "file_magic"]) _LT_DECL([], [file_magic_glob], [1], [How to find potential files when deplibs_check_method = "file_magic"]) _LT_DECL([], [want_nocaseglob], [1], [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) ])# _LT_CHECK_MAGIC_METHOD # LT_PATH_NM # ---------- # find the pathname to a BSD- or MS-compatible name lister AC_DEFUN([LT_PATH_NM], [AC_REQUIRE([AC_PROG_CC])dnl AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi]) if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi AC_SUBST([DUMPBIN]) if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm AC_SUBST([NM]) _LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], [lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&AS_MESSAGE_LOG_FD (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) cat conftest.out >&AS_MESSAGE_LOG_FD if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest*]) ])# LT_PATH_NM # Old names: AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_PROG_NM], []) dnl AC_DEFUN([AC_PROG_NM], []) # _LT_CHECK_SHAREDLIB_FROM_LINKLIB # -------------------------------- # how to determine the name of the shared library # associated with a specific link library. # -- PORTME fill in with the dynamic library characteristics m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], [m4_require([_LT_DECL_EGREP]) m4_require([_LT_DECL_OBJDUMP]) m4_require([_LT_DECL_DLLTOOL]) AC_CACHE_CHECK([how to associate runtime and link libraries], lt_cv_sharedlib_from_linklib_cmd, [lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ]) sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO _LT_DECL([], [sharedlib_from_linklib_cmd], [1], [Command to associate shared and link libraries]) ])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB # _LT_PATH_MANIFEST_TOOL # ---------------------- # locate the manifest tool m4_defun([_LT_PATH_MANIFEST_TOOL], [AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], [lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&AS_MESSAGE_LOG_FD if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest*]) if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl ])# _LT_PATH_MANIFEST_TOOL # _LT_DLL_DEF_P([FILE]) # --------------------- # True iff FILE is a Windows DLL '.def' file. # Keep in sync with func_dll_def_p in the libtool script AC_DEFUN([_LT_DLL_DEF_P], [dnl test DEF = "`$SED -n dnl -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl -e q dnl Only consider the first "real" line $1`" dnl ])# _LT_DLL_DEF_P # LT_LIB_M # -------- # check for math library AC_DEFUN([LT_LIB_M], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in *-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") ;; *) AC_CHECK_LIB(m, cos, LIBM=-lm) ;; esac AC_SUBST([LIBM]) ])# LT_LIB_M # Old name: AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_CHECK_LIBM], []) # _LT_COMPILER_NO_RTTI([TAGNAME]) # ------------------------------- m4_defun([_LT_COMPILER_NO_RTTI], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= if test yes = "$GCC"; then case $cc_basename in nvcc*) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; *) _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; esac _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi _LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], [Compiler flag to turn off builtin functions]) ])# _LT_COMPILER_NO_RTTI # _LT_CMD_GLOBAL_SYMBOLS # ---------------------- m4_defun([_LT_CMD_GLOBAL_SYMBOLS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([LT_PATH_NM])dnl AC_REQUIRE([LT_PATH_LD])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_TAG_COMPILER])dnl # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [ # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[[ABCDGISTW]]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[[ABCDEGRST]]' fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' ;; osf*) symcode='[[BCDEGQRST]]' ;; solaris*) symcode='[[BDRT]]' ;; sco3.2v5*) symcode='[[DT]]' ;; sysv4.2uw2*) symcode='[[DT]]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[[ABDT]]' ;; sysv4) symcode='[[DFNSTU]]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK ['"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx]" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if AC_TRY_EVAL(ac_compile); then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT@&t@_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT@&t@_DLSYM_CONST #else # define LT@&t@_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT@&t@_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[[]] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD fi else echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ]) if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then AC_MSG_RESULT(failed) else AC_MSG_RESULT(ok) fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then nm_file_list_spec='@' fi _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], [Take the output of nm and produce a listing of raw symbols and C names]) _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], [Transform the output of nm in a proper C declaration]) _LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], [Transform the output of nm into a list of symbols to manually relocate]) _LT_DECL([global_symbol_to_c_name_address], [lt_cv_sys_global_symbol_to_c_name_address], [1], [Transform the output of nm in a C name address pair]) _LT_DECL([global_symbol_to_c_name_address_lib_prefix], [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], [Transform the output of nm in a C name address pair when lib prefix is needed]) _LT_DECL([nm_interface], [lt_cv_nm_interface], [1], [The name lister interface]) _LT_DECL([], [nm_file_list_spec], [1], [Specify filename containing input files for $NM]) ]) # _LT_CMD_GLOBAL_SYMBOLS # _LT_COMPILER_PIC([TAGNAME]) # --------------------------- m4_defun([_LT_COMPILER_PIC], [m4_require([_LT_TAG_COMPILER])dnl _LT_TAGVAR(lt_prog_compiler_wl, $1)= _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)= m4_if([$1], [CXX], [ # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else case $host_os in aix[[4-9]]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; dgux*) case $cc_basename in ec++*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL 8.0, 9.0 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. _LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test yes = "$GCC"; then _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. _LT_TAGVAR(lt_prog_compiler_static, $1)= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). m4_if([$1], [GCJ], [], [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) case $host_os in os2*) _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # flang / f18. f95 an alias for gfortran or flang on Debian flang* | f18* | f95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; # Lahey Fortran 8.1. lf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' ;; nagfor*) # NAG Fortran compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='' ;; *Sun\ F* | *Sun*Fortran*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; *Intel*\ [[CF]]*Compiler*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; *Portland\ Group*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; esac ;; newsos6) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' ;; osf3* | osf4* | osf5*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) _LT_TAGVAR(lt_prog_compiler_pic, $1)= ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" ;; esac AC_CACHE_CHECK([for $compiler option to produce PIC], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) _LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) # # Check to make sure the PIC flag actually works. # if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], [_LT_TAGVAR(lt_prog_compiler_pic, $1)= _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi _LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], [Additional compiler flags for building library objects]) _LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" _LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) _LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], [Compiler flag to prevent dynamic linking]) ])# _LT_COMPILER_PIC # _LT_LINKER_SHLIBS([TAGNAME]) # ---------------------------- # See if the linker supports building shared libraries. m4_defun([_LT_LINKER_SHLIBS], [AC_REQUIRE([LT_PATH_LD])dnl AC_REQUIRE([LT_PATH_NM])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_DECL_SED])dnl m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl m4_require([_LT_TAG_COMPILER])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) m4_if([$1], [CXX], [ _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] ;; esac ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; *) _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac ], [ runpath_var= _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_cmds, $1)= _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(old_archive_from_new_cmds, $1)= _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= _LT_TAGVAR(thread_safe_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list _LT_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) _LT_TAGVAR(link_all_deplibs, $1)=no ;; esac _LT_TAGVAR(ld_shlibs, $1)=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 _LT_TAGVAR(whole_archive_flag_spec, $1)= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) _LT_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then runpath_var= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. _LT_TAGVAR(hardcode_minus_L, $1)=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. _LT_TAGVAR(hardcode_direct, $1)=unsupported fi ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. _LT_TAGVAR(allow_undefined_flag, $1)='-berok' # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='' ;; m68k) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac ;; bsdi[[45]]*) _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' # FIXME: Should let the user specify the lib program. _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; dgux*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) m4_if($1, [], [ # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) _LT_LINKER_OPTION([if $CC understands -b], _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) ;; esac fi if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. _LT_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], [lt_cv_irix_exported_symbol], [save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" AC_LINK_IFELSE( [AC_LANG_SOURCE( [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], [C++], [[int foo (void) { return 0; }]], [Fortran 77], [[ subroutine foo end]], [Fortran], [[ subroutine foo end]])])], [lt_cv_irix_exported_symbol=yes], [lt_cv_irix_exported_symbol=no]) LDFLAGS=$save_LDFLAGS]) if test yes = "$lt_cv_irix_exported_symbol"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi _LT_TAGVAR(link_all_deplibs, $1)=no else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes _LT_TAGVAR(link_all_deplibs, $1)=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler _LT_TAGVAR(ld_shlibs, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' fi else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; osf3*) if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' else _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi _LT_TAGVAR(archive_cmds_need_lc, $1)='no' _LT_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' if test yes = "$GCC"; then wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' _LT_TAGVAR(hardcode_direct, $1)=no ;; motorola) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes _LT_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(ld_shlibs, $1)=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' ;; esac fi fi ]) AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld _LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl _LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl _LT_DECL([], [extract_expsyms_cmds], [2], [The commands to extract the exported symbol list from a shared archive]) # # Do we need to explicitly link libc? # case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added _LT_TAGVAR(archive_cmds_need_lc, $1)=yes if test yes,yes = "$GCC,$enable_shared"; then case $_LT_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. AC_CACHE_CHECK([whether -lc should be explicitly linked in], [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), [$RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if AC_TRY_EVAL(ac_compile) 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) _LT_TAGVAR(allow_undefined_flag, $1)= if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) then lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no else lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes fi _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ]) _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) ;; esac fi ;; esac _LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], [Whether or not to add -lc for building shared libraries]) _LT_TAGDECL([allow_libtool_libs_with_static_runtimes], [enable_shared_with_static_runtimes], [0], [Whether or not to disallow shared libs when runtime libs are static]) _LT_TAGDECL([], [export_dynamic_flag_spec], [1], [Compiler flag to allow reflexive dlopens]) _LT_TAGDECL([], [whole_archive_flag_spec], [1], [Compiler flag to generate shared objects directly from archives]) _LT_TAGDECL([], [compiler_needs_object], [1], [Whether the compiler copes with passing no objects directly]) _LT_TAGDECL([], [old_archive_from_new_cmds], [2], [Create an old-style archive from a shared archive]) _LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], [Create a temporary old-style archive to link instead of a shared archive]) _LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) _LT_TAGDECL([], [archive_expsym_cmds], [2]) _LT_TAGDECL([], [module_cmds], [2], [Commands used to build a loadable module if different from building a shared archive.]) _LT_TAGDECL([], [module_expsym_cmds], [2]) _LT_TAGDECL([], [with_gnu_ld], [1], [Whether we are building with GNU ld or not]) _LT_TAGDECL([], [allow_undefined_flag], [1], [Flag that allows shared libraries with undefined symbols to be built]) _LT_TAGDECL([], [no_undefined_flag], [1], [Flag that enforces no undefined symbols]) _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], [Flag to hardcode $libdir into a binary during linking. This must work even if $libdir does not exist]) _LT_TAGDECL([], [hardcode_libdir_separator], [1], [Whether we need a single "-rpath" flag with a separated argument]) _LT_TAGDECL([], [hardcode_direct], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_direct_absolute], [0], [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes DIR into the resulting binary and the resulting library dependency is "absolute", i.e impossible to change by setting $shlibpath_var if the library is relocated]) _LT_TAGDECL([], [hardcode_minus_L], [0], [Set to "yes" if using the -LDIR flag during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_shlibpath_var], [0], [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into the resulting binary]) _LT_TAGDECL([], [hardcode_automatic], [0], [Set to "yes" if building a shared library automatically hardcodes DIR into the library and all subsequent libraries and executables linked against it]) _LT_TAGDECL([], [inherit_rpath], [0], [Set to yes if linker adds runtime paths of dependent libraries to runtime path list]) _LT_TAGDECL([], [link_all_deplibs], [0], [Whether libtool must link a program against all its dependency libraries]) _LT_TAGDECL([], [always_export_symbols], [0], [Set to "yes" if exported symbols are required]) _LT_TAGDECL([], [export_symbols_cmds], [2], [The commands to list exported symbols]) _LT_TAGDECL([], [exclude_expsyms], [1], [Symbols that should not be listed in the preloaded symbols]) _LT_TAGDECL([], [include_expsyms], [1], [Symbols that must always be exported]) _LT_TAGDECL([], [prelink_cmds], [2], [Commands necessary for linking programs (against libraries) with templates]) _LT_TAGDECL([], [postlink_cmds], [2], [Commands necessary for finishing linking programs]) _LT_TAGDECL([], [file_list_spec], [1], [Specify filename containing input files]) dnl FIXME: Not yet implemented dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], dnl [Compiler flag to generate thread safe objects]) ])# _LT_LINKER_SHLIBS # _LT_LANG_C_CONFIG([TAG]) # ------------------------ # Ensure that the configuration variables for a C compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_C_CONFIG], [m4_require([_LT_DECL_EGREP])dnl lt_save_CC=$CC AC_LANG_PUSH(C) # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' _LT_TAG_COMPILER # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) LT_SYS_DLOPEN_SELF _LT_CMD_STRIPLIB # Report what library types will actually be built AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_CONFIG($1) fi AC_LANG_POP CC=$lt_save_CC ])# _LT_LANG_C_CONFIG # _LT_LANG_CXX_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a C++ compiler are suitably # defined. These variables are subsequently used by _LT_CONFIG to write # the compiler configuration to 'libtool'. m4_defun([_LT_LANG_CXX_CONFIG], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl m4_require([_LT_DECL_EGREP])dnl m4_require([_LT_PATH_MANIFEST_TOOL])dnl if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then AC_PROG_CXXCPP else _lt_caught_CXX_error=yes fi AC_LANG_PUSH(C++) _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(compiler_needs_object, $1)=no _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' else _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration LT_PATH_LD # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else _LT_TAGVAR(whole_archive_flag_spec, $1)= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) _LT_TAGVAR(ld_shlibs, $1)=yes case $host_os in aix3*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aix[[4-9]]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. _LT_TAGVAR(archive_cmds, $1)='' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(file_list_spec, $1)='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 _LT_TAGVAR(hardcode_direct, $1)=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. _LT_TAGVAR(always_export_symbols, $1)=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. _LT_SYS_MODULE_PATH_AIX([$1]) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' fi _LT_TAGVAR(archive_cmds_need_lc, $1)=yes _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then _LT_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=yes _LT_TAGVAR(file_list_spec, $1)='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes # Don't use ranlib _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' _LT_TAGVAR(allow_undefined_flag, $1)=unsupported _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; darwin* | rhapsody*) _LT_DARWIN_LINKER_FEATURES($1) ;; os2*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' _LT_TAGVAR(hardcode_minus_L, $1)=yes _LT_TAGVAR(allow_undefined_flag, $1)=unsupported shrext_cmds=.dll _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF _LT_TAGVAR(ld_shlibs, $1)=no ;; freebsd-elf*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions _LT_TAGVAR(ld_shlibs, $1)=yes ;; haiku*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(link_all_deplibs, $1)=yes ;; hpux9*) _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) ;; *) _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; aCC*) case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; interix[[3-9]]*) _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi _LT_TAGVAR(link_all_deplibs, $1)=yes ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: _LT_TAGVAR(inherit_rpath, $1)=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' _LT_TAGVAR(compiler_needs_object, $1)=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; m88k*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) _LT_TAGVAR(ld_shlibs, $1)=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then _LT_TAGVAR(hardcode_direct, $1)=yes _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=yes _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else _LT_TAGVAR(ld_shlibs, $1)=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; cxx*) case $host in osf3*) _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' ;; *) _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' ;; esac _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' case $host in osf3*) _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ _LT_TAGVAR(archive_cmds_need_lc,$1)=yes _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' _LT_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;; esac _LT_TAGVAR(link_all_deplibs, $1)=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"' fi _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(hardcode_shlibpath_var, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' _LT_TAGVAR(hardcode_libdir_separator, $1)=':' _LT_TAGVAR(link_all_deplibs, $1)=yes _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ '"$_LT_TAGVAR(old_archive_cmds, $1)" _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ '"$_LT_TAGVAR(reload_cmds, $1)" ;; *) _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no ;; esac AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no _LT_TAGVAR(GCC, $1)=$GXX _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" AC_LANG_POP ])# _LT_LANG_CXX_CONFIG # _LT_FUNC_STRIPNAME_CNF # ---------------------- # func_stripname_cnf prefix suffix name # strip PREFIX and SUFFIX off of NAME. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). # # This function is identical to the (non-XSI) version of func_stripname, # except this one can be used by m4 code that may be executed by configure, # rather than the libtool script. m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl AC_REQUIRE([_LT_DECL_SED]) AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) func_stripname_cnf () { case @S|@2 in .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; esac } # func_stripname_cnf ])# _LT_FUNC_STRIPNAME_CNF # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) # --------------------------------- # Figure out "hidden" library dependencies from verbose # compiler output when linking a shared library. # Parse the compiler output and extract the necessary # objects, libraries and library flags. m4_defun([_LT_SYS_HIDDEN_LIBDEPS], [m4_require([_LT_FILEUTILS_DEFAULTS])dnl AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl # Dependencies to place before and after the object being linked: _LT_TAGVAR(predep_objects, $1)= _LT_TAGVAR(postdep_objects, $1)= _LT_TAGVAR(predeps, $1)= _LT_TAGVAR(postdeps, $1)= _LT_TAGVAR(compiler_lib_search_path, $1)= dnl we can't use the lt_simple_compile_test_code here, dnl because it contains code intended for an executable, dnl not a library. It's possible we should let each dnl tag define a new lt_????_link_test_code variable, dnl but it's only used here... m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF int a; void foo (void) { a = 0; } _LT_EOF ], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF ], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer*4 a a=0 return end _LT_EOF ], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF subroutine foo implicit none integer a a=0 return end _LT_EOF ], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF public class foo { private int a; public void bar (void) { a = 0; } }; _LT_EOF ], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF package foo func foo() { } _LT_EOF ]) _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac dnl Parse the compiler output and extract the necessary dnl objects, libraries and library flags. if AC_TRY_EVAL(ac_compile); then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p else _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$_LT_TAGVAR(postdeps, $1)"; then _LT_TAGVAR(postdeps, $1)=$prev$p else _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$_LT_TAGVAR(predep_objects, $1)"; then _LT_TAGVAR(predep_objects, $1)=$p else _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" fi else if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then _LT_TAGVAR(postdep_objects, $1)=$p else _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling $1 test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken m4_if([$1], [CXX], [case $host_os in interix[[3-9]]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. _LT_TAGVAR(predep_objects,$1)= _LT_TAGVAR(postdep_objects,$1)= _LT_TAGVAR(postdeps,$1)= ;; esac ]) case " $_LT_TAGVAR(postdeps, $1) " in *" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; esac _LT_TAGVAR(compiler_lib_search_dirs, $1)= if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi _LT_TAGDECL([], [compiler_lib_search_dirs], [1], [The directories searched by this compiler when creating a shared library]) _LT_TAGDECL([], [predep_objects], [1], [Dependencies to place before and after the objects being linked to create a shared library]) _LT_TAGDECL([], [postdep_objects], [1]) _LT_TAGDECL([], [predeps], [1]) _LT_TAGDECL([], [postdeps], [1]) _LT_TAGDECL([], [compiler_lib_search_path], [1], [The library search path used internally by the compiler when linking a shared library]) ])# _LT_SYS_HIDDEN_LIBDEPS # _LT_LANG_F77_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for a Fortran 77 compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_F77_CONFIG], [AC_LANG_PUSH(Fortran 77) if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) GCC=$G77 if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$G77 _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" AC_LANG_POP ])# _LT_LANG_F77_CONFIG # _LT_LANG_FC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for a Fortran compiler are # suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_FC_CONFIG], [AC_LANG_PUSH(Fortran) if test -z "$FC" || test no = "$FC"; then _lt_disable_FC=yes fi _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(allow_undefined_flag, $1)= _LT_TAGVAR(always_export_symbols, $1)=no _LT_TAGVAR(archive_expsym_cmds, $1)= _LT_TAGVAR(export_dynamic_flag_spec, $1)= _LT_TAGVAR(hardcode_direct, $1)=no _LT_TAGVAR(hardcode_direct_absolute, $1)=no _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= _LT_TAGVAR(hardcode_libdir_separator, $1)= _LT_TAGVAR(hardcode_minus_L, $1)=no _LT_TAGVAR(hardcode_automatic, $1)=no _LT_TAGVAR(inherit_rpath, $1)=no _LT_TAGVAR(module_cmds, $1)= _LT_TAGVAR(module_expsym_cmds, $1)= _LT_TAGVAR(link_all_deplibs, $1)=unknown _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds _LT_TAGVAR(no_undefined_flag, $1)= _LT_TAGVAR(whole_archive_flag_spec, $1)= _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no # Source file extension for fc test sources. ac_ext=${ac_fc_srcext-f} # Object file extension for compiled fc test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # No sense in running all these tests if we already determined that # the FC compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_FC"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${FC-"f95"} CFLAGS=$FCFLAGS compiler=$CC GCC=$ac_cv_fc_compiler_gnu _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) if test -n "$compiler"; then AC_MSG_CHECKING([if libtool supports shared libraries]) AC_MSG_RESULT([$can_build_shared]) AC_MSG_CHECKING([whether to build shared libraries]) test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[[4-9]]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac AC_MSG_RESULT([$enable_shared]) AC_MSG_CHECKING([whether to build static libraries]) # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes AC_MSG_RESULT([$enable_static]) _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu _LT_TAGVAR(LD, $1)=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... _LT_SYS_HIDDEN_LIBDEPS($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_SYS_DYNAMIC_LINKER($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_FC" AC_LANG_POP ])# _LT_LANG_FC_CONFIG # _LT_LANG_GCJ_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Java Compiler compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GCJ_CONFIG], [AC_REQUIRE([LT_PROG_GCJ])dnl AC_LANG_SAVE # Source file extension for Java test sources. ac_ext=java # Object file extension for compiled Java test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="class foo {}" # Code to be used in simple link tests lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GCJ-"gcj"} CFLAGS=$GCJFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # GCJ did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GCJ_CONFIG # _LT_LANG_GO_CONFIG([TAG]) # -------------------------- # Ensure that the configuration variables for the GNU Go compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_GO_CONFIG], [AC_REQUIRE([LT_PROG_GO])dnl AC_LANG_SAVE # Source file extension for Go test sources. ac_ext=go # Object file extension for compiled Go test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="package main; func main() { }" # Code to be used in simple link tests lt_simple_link_test_code='package main; func main() { }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC=yes CC=${GOC-"gccgo"} CFLAGS=$GOFLAGS compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_TAGVAR(LD, $1)=$LD _LT_CC_BASENAME([$compiler]) # Go did not exist at the time GCC didn't implicitly link libc in. _LT_TAGVAR(archive_cmds_need_lc, $1)=no _LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds _LT_TAGVAR(reload_flag, $1)=$reload_flag _LT_TAGVAR(reload_cmds, $1)=$reload_cmds ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then _LT_COMPILER_NO_RTTI($1) _LT_COMPILER_PIC($1) _LT_COMPILER_C_O($1) _LT_COMPILER_FILE_LOCKS($1) _LT_LINKER_SHLIBS($1) _LT_LINKER_HARDCODE_LIBPATH($1) _LT_CONFIG($1) fi AC_LANG_RESTORE GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_GO_CONFIG # _LT_LANG_RC_CONFIG([TAG]) # ------------------------- # Ensure that the configuration variables for the Windows resource compiler # are suitably defined. These variables are subsequently used by _LT_CONFIG # to write the compiler configuration to 'libtool'. m4_defun([_LT_LANG_RC_CONFIG], [AC_REQUIRE([LT_PROG_RC])dnl AC_LANG_SAVE # Source file extension for RC test sources. ac_ext=rc # Object file extension for compiled RC test sources. objext=o _LT_TAGVAR(objext, $1)=$objext # Code to be used in simple compile tests lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' # Code to be used in simple link tests lt_simple_link_test_code=$lt_simple_compile_test_code # ltmain only uses $CC for tagged configurations so make sure $CC is set. _LT_TAG_COMPILER # save warnings/boilerplate of simple test code _LT_COMPILER_BOILERPLATE _LT_LINKER_BOILERPLATE # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_GCC=$GCC GCC= CC=${RC-"windres"} CFLAGS= compiler=$CC _LT_TAGVAR(compiler, $1)=$CC _LT_CC_BASENAME([$compiler]) _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes if test -n "$compiler"; then : _LT_CONFIG($1) fi GCC=$lt_save_GCC AC_LANG_RESTORE CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS ])# _LT_LANG_RC_CONFIG # LT_PROG_GCJ # ----------- AC_DEFUN([LT_PROG_GCJ], [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], [AC_CHECK_TOOL(GCJ, gcj,) test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" AC_SUBST(GCJFLAGS)])])[]dnl ]) # Old name: AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_GCJ], []) # LT_PROG_GO # ---------- AC_DEFUN([LT_PROG_GO], [AC_CHECK_TOOL(GOC, gccgo,) ]) # LT_PROG_RC # ---------- AC_DEFUN([LT_PROG_RC], [AC_CHECK_TOOL(RC, windres,) ]) # Old name: AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_RC], []) # _LT_DECL_EGREP # -------------- # If we don't have a new enough Autoconf to choose the best grep # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_EGREP], [AC_REQUIRE([AC_PROG_EGREP])dnl AC_REQUIRE([AC_PROG_FGREP])dnl test -z "$GREP" && GREP=grep _LT_DECL([], [GREP], [1], [A grep program that handles long lines]) _LT_DECL([], [EGREP], [1], [An ERE matcher]) _LT_DECL([], [FGREP], [1], [A literal string matcher]) dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too AC_SUBST([GREP]) ]) # _LT_DECL_OBJDUMP # -------------- # If we don't have a new enough Autoconf to choose the best objdump # available, choose the one first in the user's PATH. m4_defun([_LT_DECL_OBJDUMP], [AC_CHECK_TOOL(OBJDUMP, objdump, false) test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) AC_SUBST([OBJDUMP]) ]) # _LT_DECL_DLLTOOL # ---------------- # Ensure DLLTOOL variable is set. m4_defun([_LT_DECL_DLLTOOL], [AC_CHECK_TOOL(DLLTOOL, dlltool, false) test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program]) AC_SUBST([DLLTOOL]) ]) # _LT_DECL_SED # ------------ # Check for a fully-functional sed program, that truncates # as few characters as possible. Prefer GNU sed if found. m4_defun([_LT_DECL_SED], [AC_PROG_SED test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" _LT_DECL([], [SED], [1], [A sed program that does not truncate output]) _LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], [Sed that helps us avoid accidentally triggering echo(1) options like -n]) ])# _LT_DECL_SED m4_ifndef([AC_PROG_SED], [ ############################################################ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # ############################################################ m4_defun([AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. # Then use that list of sed's as ones to test for truncation. as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done done done IFS=$as_save_IFS lt_ac_max=0 lt_ac_count=0 # Add /usr/xpg4/bin/sed as it is typically found on Solaris # along with /bin/sed that truncates output. for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do test ! -f "$lt_ac_sed" && continue cat /dev/null > conftest.in lt_ac_count=0 echo $ECHO_N "0123456789$ECHO_C" >conftest.in # Check for GNU sed and select it if it is found. if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then lt_cv_path_SED=$lt_ac_sed break fi while true; do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo >>conftest.nl $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break cmp -s conftest.out conftest.nl || break # 10000 chars as input seems more than enough test 10 -lt "$lt_ac_count" && break lt_ac_count=`expr $lt_ac_count + 1` if test "$lt_ac_count" -gt "$lt_ac_max"; then lt_ac_max=$lt_ac_count lt_cv_path_SED=$lt_ac_sed fi done done ]) SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) ])#AC_PROG_SED ])#m4_ifndef # Old name: AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([LT_AC_PROG_SED], []) # _LT_CHECK_SHELL_FEATURES # ------------------------ # Find out whether the shell is Bourne or XSI compatible, # or has some other useful features. m4_defun([_LT_CHECK_SHELL_FEATURES], [if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi _LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac _LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl ])# _LT_CHECK_SHELL_FEATURES # _LT_PATH_CONVERSION_FUNCTIONS # ----------------------------- # Determine what file name conversion functions should be used by # func_to_host_file (and, implicitly, by func_to_host_path). These are needed # for certain cross-compile configurations and native mingw. m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], [AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl AC_MSG_CHECKING([how to convert $build file names to $host format]) AC_CACHE_VAL(lt_cv_to_host_file_cmd, [case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ]) to_host_file_cmd=$lt_cv_to_host_file_cmd AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) _LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], [0], [convert $build file names to $host format])dnl AC_MSG_CHECKING([how to convert $build file names to toolchain format]) AC_CACHE_VAL(lt_cv_to_tool_file_cmd, [#assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ]) to_tool_file_cmd=$lt_cv_to_tool_file_cmd AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) _LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], [0], [convert $build files to toolchain format])dnl ])# _LT_PATH_CONVERSION_FUNCTIONS libsidplayfp-2.6.0/m4/ax_cxx_compile_stdcxx.m40000644000175100001770000005207314544470307016325 00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html # =========================================================================== # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the specified # version of the C++ standard. If necessary, add switches to CXX and # CXXCPP to enable support. VERSION may be '11', '14', '17', or '20' for # the respective C++ standard version. # # The second argument, if specified, indicates whether you insist on an # extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. # -std=c++11). If neither is specified, you get whatever works, with # preference for no added switch, and then for an extended mode. # # The third argument, if specified 'mandatory' or if left unspecified, # indicates that baseline support for the specified C++ standard is # required and that the macro should error out if no mode with that # support is found. If specified 'optional', then configuration proceeds # regardless, after defining HAVE_CXX${VERSION} if and only if a # supporting mode is found. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov # Copyright (c) 2015 Paul Norman # Copyright (c) 2015 Moritz Klammler # Copyright (c) 2016, 2018 Krzesimir Nowak # Copyright (c) 2019 Enji Cooper # Copyright (c) 2020 Jason Merrill # Copyright (c) 2021 Jörn Heusipp # # 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 any # warranty. #serial 18 dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro dnl (serial version number 13). AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], [$1], [14], [ax_cxx_compile_alternatives="14 1y"], [$1], [17], [ax_cxx_compile_alternatives="17 1z"], [$1], [20], [ax_cxx_compile_alternatives="20"], [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$2], [], [], [$2], [ext], [], [$2], [noext], [], [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], [$3], [optional], [ax_cxx_compile_cxx$1_required=false], [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) AC_LANG_PUSH([C++])dnl ac_success=no m4_if([$2], [], [dnl AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, ax_cv_cxx_compile_cxx$1, [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [ax_cv_cxx_compile_cxx$1=yes], [ax_cv_cxx_compile_cxx$1=no])]) if test x$ax_cv_cxx_compile_cxx$1 = xyes; then ac_success=yes fi]) m4_if([$2], [noext], [], [dnl if test x$ac_success = xno; then for alternative in ${ax_cxx_compile_alternatives}; do switch="-std=gnu++${alternative}" cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done fi]) m4_if([$2], [ext], [], [dnl if test x$ac_success = xno; then dnl HP's aCC needs +std=c++11 according to: dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf dnl Cray's crayCC needs "-h std=c++11" dnl MSVC needs -std:c++NN for C++17 and later (default is C++14) for alternative in ${ax_cxx_compile_alternatives}; do for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}" MSVC; do if test x"$switch" = xMSVC; then dnl AS_TR_SH maps both `:` and `=` to `_` so -std:c++17 would collide dnl with -std=c++17. We suffix the cache variable name with _MSVC to dnl avoid this. switch=-std:c++${alternative} cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_${switch}_MSVC]) else cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) fi AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, $cachevar, [ac_save_CXX="$CXX" CXX="$CXX $switch" AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], [eval $cachevar=yes], [eval $cachevar=no]) CXX="$ac_save_CXX"]) if eval test x\$$cachevar = xyes; then CXX="$CXX $switch" if test -n "$CXXCPP" ; then CXXCPP="$CXXCPP $switch" fi ac_success=yes break fi done if test x$ac_success = xyes; then break fi done fi]) AC_LANG_POP([C++]) if test x$ax_cxx_compile_cxx$1_required = xtrue; then if test x$ac_success = xno; then AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) fi fi if test x$ac_success = xno; then HAVE_CXX$1=0 AC_MSG_NOTICE([No compiler with C++$1 support was found]) else HAVE_CXX$1=1 AC_DEFINE(HAVE_CXX$1,1, [define if the compiler supports basic C++$1 syntax]) fi AC_SUBST(HAVE_CXX$1) ]) dnl Test body for checking C++11 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 ) dnl Test body for checking C++14 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 ) dnl Test body for checking C++17 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 ) dnl Test body for checking C++20 support m4_define([_AX_CXX_COMPILE_STDCXX_testbody_20], _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 _AX_CXX_COMPILE_STDCXX_testbody_new_in_20 ) dnl Tests for new features in C++11 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ // If the compiler admits that it is not ready for C++11, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" // MSVC always sets __cplusplus to 199711L in older versions; newer versions // only set it correctly if /Zc:__cplusplus is specified as well as a // /std:c++NN switch: // https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/ #elif __cplusplus < 201103L && !defined _MSC_VER #error "This is not a C++11 compiler" #else namespace cxx11 { namespace test_static_assert { template struct check { static_assert(sizeof(int) <= sizeof(T), "not big enough"); }; } namespace test_final_override { struct Base { virtual ~Base() {} virtual void f() {} }; struct Derived : public Base { virtual ~Derived() override {} virtual void f() override {} }; } namespace test_double_right_angle_brackets { template < typename T > struct check {}; typedef check single_type; typedef check> double_type; typedef check>> triple_type; typedef check>>> quadruple_type; } namespace test_decltype { int f() { int a = 1; decltype(a) b = 2; return a + b; } } namespace test_type_deduction { template < typename T1, typename T2 > struct is_same { static const bool value = false; }; template < typename T > struct is_same { static const bool value = true; }; template < typename T1, typename T2 > auto add(T1 a1, T2 a2) -> decltype(a1 + a2) { return a1 + a2; } int test(const int c, volatile int v) { static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == false, ""); auto ac = c; auto av = v; auto sumi = ac + av + 'x'; auto sumf = ac + av + 1.0; static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == true, ""); static_assert(is_same::value == false, ""); static_assert(is_same::value == true, ""); return (sumf > 0.0) ? sumi : add(c, v); } } namespace test_noexcept { int f() { return 0; } int g() noexcept { return 0; } static_assert(noexcept(f()) == false, ""); static_assert(noexcept(g()) == true, ""); } namespace test_constexpr { template < typename CharT > unsigned long constexpr strlen_c_r(const CharT *const s, const unsigned long acc) noexcept { return *s ? strlen_c_r(s + 1, acc + 1) : acc; } template < typename CharT > unsigned long constexpr strlen_c(const CharT *const s) noexcept { return strlen_c_r(s, 0UL); } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("1") == 1UL, ""); static_assert(strlen_c("example") == 7UL, ""); static_assert(strlen_c("another\0example") == 7UL, ""); } namespace test_rvalue_references { template < int N > struct answer { static constexpr int value = N; }; answer<1> f(int&) { return answer<1>(); } answer<2> f(const int&) { return answer<2>(); } answer<3> f(int&&) { return answer<3>(); } void test() { int i = 0; const int c = 0; static_assert(decltype(f(i))::value == 1, ""); static_assert(decltype(f(c))::value == 2, ""); static_assert(decltype(f(0))::value == 3, ""); } } namespace test_uniform_initialization { struct test { static const int zero {}; static const int one {1}; }; static_assert(test::zero == 0, ""); static_assert(test::one == 1, ""); } namespace test_lambdas { void test1() { auto lambda1 = [](){}; auto lambda2 = lambda1; lambda1(); lambda2(); } int test2() { auto a = [](int i, int j){ return i + j; }(1, 2); auto b = []() -> int { return '0'; }(); auto c = [=](){ return a + b; }(); auto d = [&](){ return c; }(); auto e = [a, &b](int x) mutable { const auto identity = [](int y){ return y; }; for (auto i = 0; i < a; ++i) a += b--; return x + identity(a + b); }(0); return a + b + c + d + e; } int test3() { const auto nullary = [](){ return 0; }; const auto unary = [](int x){ return x; }; using nullary_t = decltype(nullary); using unary_t = decltype(unary); const auto higher1st = [](nullary_t f){ return f(); }; const auto higher2nd = [unary](nullary_t f1){ return [unary, f1](unary_t f2){ return f2(unary(f1())); }; }; return higher1st(nullary) + higher2nd(nullary)(unary); } } namespace test_variadic_templates { template struct sum; template struct sum { static constexpr auto value = N0 + sum::value; }; template <> struct sum<> { static constexpr auto value = 0; }; static_assert(sum<>::value == 0, ""); static_assert(sum<1>::value == 1, ""); static_assert(sum<23>::value == 23, ""); static_assert(sum<1, 2>::value == 3, ""); static_assert(sum<5, 5, 11>::value == 21, ""); static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); } // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function // because of this. namespace test_template_alias_sfinae { struct foo {}; template using member = typename T::member_type; template void func(...) {} template void func(member*) {} void test(); void test() { func(0); } } } // namespace cxx11 #endif // __cplusplus >= 201103L ]]) dnl Tests for new features in C++14 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ // If the compiler admits that it is not ready for C++14, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201402L && !defined _MSC_VER #error "This is not a C++14 compiler" #else namespace cxx14 { namespace test_polymorphic_lambdas { int test() { const auto lambda = [](auto&&... args){ const auto istiny = [](auto x){ return (sizeof(x) == 1UL) ? 1 : 0; }; const int aretiny[] = { istiny(args)... }; return aretiny[0]; }; return lambda(1, 1L, 1.0f, '1'); } } namespace test_binary_literals { constexpr auto ivii = 0b0000000000101010; static_assert(ivii == 42, "wrong value"); } namespace test_generalized_constexpr { template < typename CharT > constexpr unsigned long strlen_c(const CharT *const s) noexcept { auto length = 0UL; for (auto p = s; *p; ++p) ++length; return length; } static_assert(strlen_c("") == 0UL, ""); static_assert(strlen_c("x") == 1UL, ""); static_assert(strlen_c("test") == 4UL, ""); static_assert(strlen_c("another\0test") == 7UL, ""); } namespace test_lambda_init_capture { int test() { auto x = 0; const auto lambda1 = [a = x](int b){ return a + b; }; const auto lambda2 = [a = lambda1(x)](){ return a; }; return lambda2(); } } namespace test_digit_separators { constexpr auto ten_million = 100'000'000; static_assert(ten_million == 100000000, ""); } namespace test_return_type_deduction { auto f(int& x) { return x; } decltype(auto) g(int& x) { return x; } template < typename T1, typename T2 > struct is_same { static constexpr auto value = false; }; template < typename T > struct is_same { static constexpr auto value = true; }; int test() { auto x = 0; static_assert(is_same::value, ""); static_assert(is_same::value, ""); return x; } } } // namespace cxx14 #endif // __cplusplus >= 201402L ]]) dnl Tests for new features in C++17 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ // If the compiler admits that it is not ready for C++17, why torture it? // Hopefully, this will speed up the test. #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 201703L && !defined _MSC_VER #error "This is not a C++17 compiler" #else #include #include #include namespace cxx17 { namespace test_constexpr_lambdas { constexpr int foo = [](){return 42;}(); } namespace test::nested_namespace::definitions { } namespace test_fold_expression { template int multiply(Args... args) { return (args * ... * 1); } template bool all(Args... args) { return (args && ...); } } namespace test_extended_static_assert { static_assert (true); } namespace test_auto_brace_init_list { auto foo = {5}; auto bar {5}; static_assert(std::is_same, decltype(foo)>::value); static_assert(std::is_same::value); } namespace test_typename_in_template_template_parameter { template typename X> struct D; } namespace test_fallthrough_nodiscard_maybe_unused_attributes { int f1() { return 42; } [[nodiscard]] int f2() { [[maybe_unused]] auto unused = f1(); switch (f1()) { case 17: f1(); [[fallthrough]]; case 42: f1(); } return f1(); } } namespace test_extended_aggregate_initialization { struct base1 { int b1, b2 = 42; }; struct base2 { base2() { b3 = 42; } int b3; }; struct derived : base1, base2 { int d; }; derived d1 {{1, 2}, {}, 4}; // full initialization derived d2 {{}, {}, 4}; // value-initialized bases } namespace test_general_range_based_for_loop { struct iter { int i; int& operator* () { return i; } const int& operator* () const { return i; } iter& operator++() { ++i; return *this; } }; struct sentinel { int i; }; bool operator== (const iter& i, const sentinel& s) { return i.i == s.i; } bool operator!= (const iter& i, const sentinel& s) { return !(i == s); } struct range { iter begin() const { return {0}; } sentinel end() const { return {5}; } }; void f() { range r {}; for (auto i : r) { [[maybe_unused]] auto v = i; } } } namespace test_lambda_capture_asterisk_this_by_value { struct t { int i; int foo() { return [*this]() { return i; }(); } }; } namespace test_enum_class_construction { enum class byte : unsigned char {}; byte foo {42}; } namespace test_constexpr_if { template int f () { if constexpr(cond) { return 13; } else { return 42; } } } namespace test_selection_statement_with_initializer { int f() { return 13; } int f2() { if (auto i = f(); i > 0) { return 3; } switch (auto i = f(); i + 4) { case 17: return 2; default: return 1; } } } namespace test_template_argument_deduction_for_class_templates { template struct pair { pair (T1 p1, T2 p2) : m1 {p1}, m2 {p2} {} T1 m1; T2 m2; }; void f() { [[maybe_unused]] auto p = pair{13, 42u}; } } namespace test_non_type_auto_template_parameters { template struct B {}; B<5> b1; B<'a'> b2; } namespace test_structured_bindings { int arr[2] = { 1, 2 }; std::pair pr = { 1, 2 }; auto f1() -> int(&)[2] { return arr; } auto f2() -> std::pair& { return pr; } struct S { int x1 : 2; volatile double y1; }; S f3() { return {}; } auto [ x1, y1 ] = f1(); auto& [ xr1, yr1 ] = f1(); auto [ x2, y2 ] = f2(); auto& [ xr2, yr2 ] = f2(); const auto [ x3, y3 ] = f3(); } namespace test_exception_spec_type_system { struct Good {}; struct Bad {}; void g1() noexcept; void g2(); template Bad f(T*, T*); template Good f(T1*, T2*); static_assert (std::is_same_v); } namespace test_inline_variables { template void f(T) {} template inline T g(T) { return T{}; } template<> inline void f<>(int) {} template<> int g<>(int) { return 5; } } } // namespace cxx17 #endif // __cplusplus < 201703L && !defined _MSC_VER ]]) dnl Tests for new features in C++20 m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_20], [[ #ifndef __cplusplus #error "This is not a C++ compiler" #elif __cplusplus < 202002L && !defined _MSC_VER #error "This is not a C++20 compiler" #else #include namespace cxx20 { // As C++20 supports feature test macros in the standard, there is no // immediate need to actually test for feature availability on the // Autoconf side. } // namespace cxx20 #endif // __cplusplus < 202002L && !defined _MSC_VER ]]) libsidplayfp-2.6.0/m4/ax_cxx_compile_stdcxx_11.m40000644000175100001770000000321514544470307016620 00000000000000# ============================================================================= # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html # ============================================================================= # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++11 # standard; if necessary, add switches to CXX and CXXCPP to enable # support. # # This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX # macro with the version set to C++11. The two optional arguments are # forwarded literally as the second and third argument respectively. # Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for # more information. If you want to use this macro, you also need to # download the ax_cxx_compile_stdcxx.m4 file. # # LICENSE # # Copyright (c) 2008 Benjamin Kosnik # Copyright (c) 2012 Zack Weinberg # Copyright (c) 2013 Roy Stogner # Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov # Copyright (c) 2015 Paul Norman # Copyright (c) 2015 Moritz Klammler # # 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 any # warranty. #serial 18 AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])]) libsidplayfp-2.6.0/m4/ax_check_compile_flag.m40000644000175100001770000000407014544470307016166 00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html # =========================================================================== # # SYNOPSIS # # AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # # Check whether the given FLAG works with the current language's compiler # or gives an error. (Warnings, however, are ignored) # # ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on # success/failure. # # If EXTRA-FLAGS is defined, it is added to the current language's default # flags (e.g. CFLAGS) when the check is done. The check is thus made with # the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to # force the compiler to issue an error when a bad flag is given. # # INPUT gives an alternative input source to AC_COMPILE_IFELSE. # # NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this # macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # # LICENSE # # Copyright (c) 2008 Guido U. Draheim # Copyright (c) 2011 Maarten Bosmans # # 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 any # warranty. #serial 6 AC_DEFUN([AX_CHECK_COMPILE_FLAG], [AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], [AS_VAR_SET(CACHEVAR,[yes])], [AS_VAR_SET(CACHEVAR,[no])]) _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl ])dnl AX_CHECK_COMPILE_FLAGS libsidplayfp-2.6.0/m4/ax_cxx_compile_stdcxx_14.m40000644000175100001770000000251314544470307016623 00000000000000# ============================================================================= # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_14.html # ============================================================================= # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_14([ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++14 # standard; if necessary, add switches to CXX and CXXCPP to enable # support. # # This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX # macro with the version set to C++14. The two optional arguments are # forwarded literally as the second and third argument respectively. # Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for # more information. If you want to use this macro, you also need to # download the ax_cxx_compile_stdcxx.m4 file. # # LICENSE # # Copyright (c) 2015 Moritz Klammler # # 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 any # warranty. #serial 5 AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_14], [AX_CXX_COMPILE_STDCXX([14], [$1], [$2])]) libsidplayfp-2.6.0/m4/lt~obsolete.m40000755000175100001770000001377414544470314014306 00000000000000# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software # Foundation, Inc. # Written by Scott James Remnant, 2004. # # 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 lt~obsolete.m4 # These exist entirely to fool aclocal when bootstrapping libtool. # # In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), # which have later been changed to m4_define as they aren't part of the # exported API, or moved to Autoconf or Automake where they belong. # # The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN # in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us # using a macro with the same name in our local m4/libtool.m4 it'll # pull the old libtool.m4 in (it doesn't see our shiny new m4_define # and doesn't know about Autoconf macros at all.) # # So we provide this file, which has a silly filename so it's always # included after everything else. This provides aclocal with the # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything # because those macros already exist, or will be overwritten later. # We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. # # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. # Yes, that means every name once taken will need to remain here until # we give up compatibility with versions before 1.7, at which point # we need to keep only those names which we still refer to. # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) libsidplayfp-2.6.0/m4/ltoptions.m40000755000175100001770000003426214544470313013761 00000000000000# Helper functions for option handling. -*- Autoconf -*- # # Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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 8 ltoptions.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) # _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) # ------------------------------------------ m4_define([_LT_MANGLE_OPTION], [[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) # _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) # --------------------------------------- # Set option OPTION-NAME for macro MACRO-NAME, and if there is a # matching handler defined, dispatch to it. Other OPTION-NAMEs are # saved as a flag. m4_define([_LT_SET_OPTION], [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), _LT_MANGLE_DEFUN([$1], [$2]), [m4_warning([Unknown $1 option '$2'])])[]dnl ]) # _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) # ------------------------------------------------------------ # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. m4_define([_LT_IF_OPTION], [m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) # _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) # ------------------------------------------------------- # Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME # are set. m4_define([_LT_UNLESS_OPTIONS], [m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), [m4_define([$0_found])])])[]dnl m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 ])[]dnl ]) # _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) # ---------------------------------------- # OPTION-LIST is a space-separated list of Libtool options associated # with MACRO-NAME. If any OPTION has a matching handler declared with # LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about # the unknown option and exit. m4_defun([_LT_SET_OPTIONS], [# Set options m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), [_LT_SET_OPTION([$1], _LT_Option)]) m4_if([$1],[LT_INIT],[ dnl dnl Simply set some default values (i.e off) if boolean options were not dnl specified: _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no ]) _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no ]) dnl dnl If no reference was made to various pairs of opposing options, then dnl we run the default mode handler for the pair. For example, if neither dnl 'shared' nor 'disable-shared' was passed, we enable building of shared dnl archives by default: _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], [_LT_ENABLE_FAST_INSTALL]) _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], [_LT_WITH_AIX_SONAME([aix])]) ]) ])# _LT_SET_OPTIONS ## --------------------------------- ## ## Macros to handle LT_INIT options. ## ## --------------------------------- ## # _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) # ----------------------------------------- m4_define([_LT_MANGLE_DEFUN], [[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) # LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) # ----------------------------------------------- m4_define([LT_OPTION_DEFINE], [m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl ])# LT_OPTION_DEFINE # dlopen # ------ LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes ]) AU_DEFUN([AC_LIBTOOL_DLOPEN], [_LT_SET_OPTION([LT_INIT], [dlopen]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'dlopen' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) # win32-dll # --------- # Declare package support for building win32 dll's. LT_OPTION_DEFINE([LT_INIT], [win32-dll], [enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) AC_CHECK_TOOL(AS, as, false) AC_CHECK_TOOL(DLLTOOL, dlltool, false) AC_CHECK_TOOL(OBJDUMP, objdump, false) ;; esac test -z "$AS" && AS=as _LT_DECL([], [AS], [1], [Assembler program])dnl test -z "$DLLTOOL" && DLLTOOL=dlltool _LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl test -z "$OBJDUMP" && OBJDUMP=objdump _LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl ])# win32-dll AU_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_REQUIRE([AC_CANONICAL_HOST])dnl _LT_SET_OPTION([LT_INIT], [win32-dll]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'win32-dll' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) # _LT_ENABLE_SHARED([DEFAULT]) # ---------------------------- # implement the --enable-shared flag, and supports the 'shared' and # 'disable-shared' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_SHARED], [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([shared], [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac], [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) _LT_DECL([build_libtool_libs], [enable_shared], [0], [Whether or not to build shared libraries]) ])# _LT_ENABLE_SHARED LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) # Old names: AC_DEFUN([AC_ENABLE_SHARED], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) ]) AC_DEFUN([AC_DISABLE_SHARED], [_LT_SET_OPTION([LT_INIT], [disable-shared]) ]) AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_SHARED], []) dnl AC_DEFUN([AM_DISABLE_SHARED], []) # _LT_ENABLE_STATIC([DEFAULT]) # ---------------------------- # implement the --enable-static flag, and support the 'static' and # 'disable-static' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_STATIC], [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([static], [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac], [enable_static=]_LT_ENABLE_STATIC_DEFAULT) _LT_DECL([build_old_libs], [enable_static], [0], [Whether or not to build static libraries]) ])# _LT_ENABLE_STATIC LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) # Old names: AC_DEFUN([AC_ENABLE_STATIC], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) ]) AC_DEFUN([AC_DISABLE_STATIC], [_LT_SET_OPTION([LT_INIT], [disable-static]) ]) AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AM_ENABLE_STATIC], []) dnl AC_DEFUN([AM_DISABLE_STATIC], []) # _LT_ENABLE_FAST_INSTALL([DEFAULT]) # ---------------------------------- # implement the --enable-fast-install flag, and support the 'fast-install' # and 'disable-fast-install' LT_INIT options. # DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. m4_define([_LT_ENABLE_FAST_INSTALL], [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl AC_ARG_ENABLE([fast-install], [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], [p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac], [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) _LT_DECL([fast_install], [enable_fast_install], [0], [Whether or not to optimize for fast installation])dnl ])# _LT_ENABLE_FAST_INSTALL LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) # Old names: AU_DEFUN([AC_ENABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'fast-install' option into LT_INIT's first parameter.]) ]) AU_DEFUN([AC_DISABLE_FAST_INSTALL], [_LT_SET_OPTION([LT_INIT], [disable-fast-install]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'disable-fast-install' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) # _LT_WITH_AIX_SONAME([DEFAULT]) # ---------------------------------- # implement the --with-aix-soname flag, and support the `aix-soname=aix' # and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT # is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. m4_define([_LT_WITH_AIX_SONAME], [m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[[5-9]]*,yes) AC_MSG_CHECKING([which variant of shared library versioning to provide]) AC_ARG_WITH([aix-soname], [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], [case $withval in aix|svr4|both) ;; *) AC_MSG_ERROR([Unknown argument to --with-aix-soname]) ;; esac lt_cv_with_aix_soname=$with_aix_soname], [AC_CACHE_VAL([lt_cv_with_aix_soname], [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) with_aix_soname=$lt_cv_with_aix_soname]) AC_MSG_RESULT([$with_aix_soname]) if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac _LT_DECL([], [shared_archive_member_spec], [0], [Shared archive member basename, for filename based shared library versioning on AIX])dnl ])# _LT_WITH_AIX_SONAME LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) # _LT_WITH_PIC([MODE]) # -------------------- # implement the --with-pic flag, and support the 'pic-only' and 'no-pic' # LT_INIT options. # MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. m4_define([_LT_WITH_PIC], [AC_ARG_WITH([pic], [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], [lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac], [pic_mode=m4_default([$1], [default])]) _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl ])# _LT_WITH_PIC LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) # Old name: AU_DEFUN([AC_LIBTOOL_PICMODE], [_LT_SET_OPTION([LT_INIT], [pic-only]) AC_DIAGNOSE([obsolete], [$0: Remove this warning and the call to _LT_SET_OPTION when you put the 'pic-only' option into LT_INIT's first parameter.]) ]) dnl aclocal-1.4 backwards compatibility: dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) ## ----------------- ## ## LTDL_INIT Options ## ## ----------------- ## m4_define([_LTDL_MODE], []) LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], [m4_define([_LTDL_MODE], [nonrecursive])]) LT_OPTION_DEFINE([LTDL_INIT], [recursive], [m4_define([_LTDL_MODE], [recursive])]) LT_OPTION_DEFINE([LTDL_INIT], [subproject], [m4_define([_LTDL_MODE], [subproject])]) m4_define([_LTDL_TYPE], []) LT_OPTION_DEFINE([LTDL_INIT], [installable], [m4_define([_LTDL_TYPE], [installable])]) LT_OPTION_DEFINE([LTDL_INIT], [convenience], [m4_define([_LTDL_TYPE], [convenience])]) libsidplayfp-2.6.0/m4/ax_cxx_compile_stdcxx_17.m40000644000175100001770000000260514544470307016630 00000000000000# ============================================================================= # https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_17.html # ============================================================================= # # SYNOPSIS # # AX_CXX_COMPILE_STDCXX_17([ext|noext], [mandatory|optional]) # # DESCRIPTION # # Check for baseline language coverage in the compiler for the C++17 # standard; if necessary, add switches to CXX and CXXCPP to enable # support. # # This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX # macro with the version set to C++17. The two optional arguments are # forwarded literally as the second and third argument respectively. # Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for # more information. If you want to use this macro, you also need to # download the ax_cxx_compile_stdcxx.m4 file. # # LICENSE # # Copyright (c) 2015 Moritz Klammler # Copyright (c) 2016 Krzesimir Nowak # # 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 any # warranty. #serial 2 AX_REQUIRE_DEFINED([AX_CXX_COMPILE_STDCXX]) AC_DEFUN([AX_CXX_COMPILE_STDCXX_17], [AX_CXX_COMPILE_STDCXX([17], [$1], [$2])]) libsidplayfp-2.6.0/m4/ltsugar.m40000755000175100001770000001044014544470313013377 00000000000000# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- # # Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software # Foundation, Inc. # Written by Gary V. Vaughan, 2004 # # 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 ltsugar.m4 # This is to help aclocal find these macros, as it can't see m4_define. AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) # lt_join(SEP, ARG1, [ARG2...]) # ----------------------------- # Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their # associated separator. # Needed until we can rely on m4_join from Autoconf 2.62, since all earlier # versions in m4sugar had bugs. m4_define([lt_join], [m4_if([$#], [1], [], [$#], [2], [[$2]], [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) m4_define([_lt_join], [m4_if([$#$2], [2], [], [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) # lt_car(LIST) # lt_cdr(LIST) # ------------ # Manipulate m4 lists. # These macros are necessary as long as will still need to support # Autoconf-2.59, which quotes differently. m4_define([lt_car], [[$1]]) m4_define([lt_cdr], [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], [$#], 1, [], [m4_dquote(m4_shift($@))])]) m4_define([lt_unquote], $1) # lt_append(MACRO-NAME, STRING, [SEPARATOR]) # ------------------------------------------ # Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. # Note that neither SEPARATOR nor STRING are expanded; they are appended # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). # No SEPARATOR is output if MACRO-NAME was previously undefined (different # than defined and empty). # # This macro is needed until we can rely on Autoconf 2.62, since earlier # versions of m4sugar mistakenly expanded SEPARATOR but not STRING. m4_define([lt_append], [m4_define([$1], m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) # lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) # ---------------------------------------------------------- # Produce a SEP delimited list of all paired combinations of elements of # PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list # has the form PREFIXmINFIXSUFFIXn. # Needed until we can rely on m4_combine added in Autoconf 2.62. m4_define([lt_combine], [m4_if(m4_eval([$# > 3]), [1], [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl [[m4_foreach([_Lt_prefix], [$2], [m4_foreach([_Lt_suffix], ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) # ----------------------------------------------------------------------- # Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited # by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. m4_define([lt_if_append_uniq], [m4_ifdef([$1], [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], [lt_append([$1], [$2], [$3])$4], [$5])], [lt_append([$1], [$2], [$3])$4])]) # lt_dict_add(DICT, KEY, VALUE) # ----------------------------- m4_define([lt_dict_add], [m4_define([$1($2)], [$3])]) # lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) # -------------------------------------------- m4_define([lt_dict_add_subkey], [m4_define([$1($2:$3)], [$4])]) # lt_dict_fetch(DICT, KEY, [SUBKEY]) # ---------------------------------- m4_define([lt_dict_fetch], [m4_ifval([$3], m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) # lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) # ----------------------------------------------------------------- m4_define([lt_if_dict_fetch], [m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], [$5], [$6])]) # lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) # -------------------------------------------------------------- m4_define([lt_dict_filter], [m4_if([$5], [], [], [lt_join(m4_quote(m4_default([$4], [[, ]])), lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl ]) libsidplayfp-2.6.0/src/0000755000175100001770000000000014544470322012001 500000000000000libsidplayfp-2.6.0/src/sidplayfp/0000755000175100001770000000000014544470322013774 500000000000000libsidplayfp-2.6.0/src/sidplayfp/sidbuilder.h0000644000175100001770000000743314544470307016225 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #ifndef SIDBUILDER_H #define SIDBUILDER_H #include #include #include "sidplayfp/SidConfig.h" namespace libsidplayfp { class sidemu; class EventScheduler; } /** * Base class for sid builders. */ class sidbuilder { protected: typedef std::set emuset_t; private: const char * const m_name; protected: std::string m_errorBuffer; emuset_t sidobjs; bool m_status; protected: /** * Utility class for setting emu parameters in builders. */ template class applyParameter { protected: Tparam m_param; void (Temu::*m_method)(Tparam); public: applyParameter(void (Temu::*method)(Tparam), Tparam param) : m_param(param), m_method(method) {} void operator() (libsidplayfp::sidemu *e) { (static_cast(e)->*m_method)(m_param); } }; public: sidbuilder(const char * const name) : m_name(name), m_errorBuffer("N/A"), m_status(true) {} virtual ~sidbuilder() {} /** * The number of used devices. * * @return number of used sids, 0 if none. */ unsigned int usedDevices() const { return sidobjs.size(); } /** * Available devices. * * @return the number of available sids, 0 = endless. */ virtual unsigned int availDevices() const = 0; /** * Create the sid emu. * * @param sids the number of required sid emu * @return the number of actually created sid emus */ virtual unsigned int create(unsigned int sids) = 0; /** * Find a free SID of the required specs * * @param env the event context * @param model the required sid model * @param digiboost whether to enable digiboost for 8580 * @return pointer to the locked sid emu */ libsidplayfp::sidemu *lock(libsidplayfp::EventScheduler *scheduler, SidConfig::sid_model_t model, bool digiboost); /** * Release this SID. * * @param device the sid emu to unlock */ void unlock(libsidplayfp::sidemu *device); /** * Remove all SID emulations. */ void remove(); /** * Get the builder's name. * * @return the name */ const char *name() const { return m_name; } /** * Error message. * * @return string error message. */ const char *error() const { return m_errorBuffer.c_str(); } /** * Determine current state of object. * * @return true = okay, false = error */ bool getStatus() const { return m_status; } /** * Get the builder's credits. * * @return credits */ virtual const char *credits() const = 0; /** * Toggle sid filter emulation. * * @param enable true = enable, false = disable */ virtual void filter(bool enable) = 0; }; #endif // SIDBUILDER_H libsidplayfp-2.6.0/src/sidplayfp/SidTuneInfo.h0000644000175100001770000001372414544470307016266 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2017 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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 */ #ifndef SIDTUNEINFO_H #define SIDTUNEINFO_H #include #include "sidplayfp/siddefs.h" /** * This interface is used to get values from SidTune objects. * * You must read (i.e. activate) sub-song specific information * via: * const SidTuneInfo* tuneInfo = SidTune.getInfo(); * const SidTuneInfo* tuneInfo = SidTune.getInfo(songNumber); */ class SID_EXTERN SidTuneInfo { public: typedef enum { CLOCK_UNKNOWN, CLOCK_PAL, CLOCK_NTSC, CLOCK_ANY } clock_t; typedef enum { SIDMODEL_UNKNOWN, SIDMODEL_6581, SIDMODEL_8580, SIDMODEL_ANY } model_t; typedef enum { COMPATIBILITY_C64, ///< File is C64 compatible COMPATIBILITY_PSID, ///< File is PSID specific COMPATIBILITY_R64, ///< File is Real C64 only COMPATIBILITY_BASIC ///< File requires C64 Basic } compatibility_t; public: /// Vertical-Blanking-Interrupt static const int SPEED_VBI = 0; /// CIA 1 Timer A static const int SPEED_CIA_1A = 60; public: /** * Load Address. */ uint_least16_t loadAddr() const; /** * Init Address. */ uint_least16_t initAddr() const; /** * Play Address. */ uint_least16_t playAddr() const; /** * The number of songs. */ unsigned int songs() const; /** * The default starting song. */ unsigned int startSong() const; /** * The tune that has been initialized. */ unsigned int currentSong() const; /** * @name Base addresses * The SID chip base address(es) used by the sidtune. * - 0xD400 for the 1st SID * - 0 if the nth SID is not required */ uint_least16_t sidChipBase(unsigned int i) const; /** * The number of SID chips required by the tune. */ int sidChips() const; /** * Intended speed. */ int songSpeed() const; /** * First available page for relocation. */ uint_least8_t relocStartPage() const; /** * Number of pages available for relocation. */ uint_least8_t relocPages() const; /** * @name SID model * The SID chip model(s) requested by the sidtune. */ model_t sidModel(unsigned int i) const; /** * Compatibility requirements. */ compatibility_t compatibility() const; /** * @name Tune infos * Song title, credits, ... * - 0 = Title * - 1 = Author * - 2 = Released */ //@{ unsigned int numberOfInfoStrings() const; ///< The number of available text info lines const char* infoString(unsigned int i) const; ///< Text info from the format headers etc. //@} /** * @name Tune comments * MUS comments. */ //@{ unsigned int numberOfCommentStrings() const; ///< Number of comments const char* commentString(unsigned int i) const; ///< Used to stash the MUS comment somewhere //@} /** * Length of single-file sidtune file. */ uint_least32_t dataFileLen() const; /** * Length of raw C64 data without load address. */ uint_least32_t c64dataLen() const; /** * The tune clock speed. */ clock_t clockSpeed() const; /** * The name of the identified file format. */ const char* formatString() const; /** * Whether load address might be duplicate. */ bool fixLoad() const; /** * Path to sidtune files. */ const char* path() const; /** * A first file: e.g. "foo.sid" or "foo.mus". */ const char* dataFileName() const; /** * A second file: e.g. "foo.str". * Returns 0 if none. */ const char* infoFileName() const; private: virtual uint_least16_t getLoadAddr() const =0; virtual uint_least16_t getInitAddr() const =0; virtual uint_least16_t getPlayAddr() const =0; virtual unsigned int getSongs() const =0; virtual unsigned int getStartSong() const =0; virtual unsigned int getCurrentSong() const =0; virtual uint_least16_t getSidChipBase(unsigned int i) const =0; virtual int getSidChips() const =0; virtual int getSongSpeed() const =0; virtual uint_least8_t getRelocStartPage() const =0; virtual uint_least8_t getRelocPages() const =0; virtual model_t getSidModel(unsigned int i) const =0; virtual compatibility_t getCompatibility() const =0; virtual unsigned int getNumberOfInfoStrings() const =0; virtual const char* getInfoString(unsigned int i) const =0; virtual unsigned int getNumberOfCommentStrings() const =0; virtual const char* getCommentString(unsigned int i) const =0; virtual uint_least32_t getDataFileLen() const =0; virtual uint_least32_t getC64dataLen() const =0; virtual clock_t getClockSpeed() const =0; virtual const char* getFormatString() const =0; virtual bool getFixLoad() const =0; virtual const char* getPath() const =0; virtual const char* getDataFileName() const =0; virtual const char* getInfoFileName() const =0; protected: ~SidTuneInfo() {} }; #endif /* SIDTUNEINFO_H */ libsidplayfp-2.6.0/src/sidplayfp/SidTuneInfo.cpp0000644000175100001770000000550214544470307016614 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2017 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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 */ #include "SidTuneInfo.h" uint_least16_t SidTuneInfo::loadAddr() const { return getLoadAddr(); } uint_least16_t SidTuneInfo::initAddr() const { return getInitAddr(); } uint_least16_t SidTuneInfo::playAddr() const { return getPlayAddr(); } unsigned int SidTuneInfo::songs() const { return getSongs(); } unsigned int SidTuneInfo::startSong() const { return getStartSong(); } unsigned int SidTuneInfo::currentSong() const { return getCurrentSong(); } uint_least16_t SidTuneInfo::sidChipBase(unsigned int i) const { return getSidChipBase(i); } int SidTuneInfo::sidChips() const { return getSidChips(); } int SidTuneInfo::songSpeed() const { return getSongSpeed(); } uint_least8_t SidTuneInfo::relocStartPage() const { return getRelocStartPage(); } uint_least8_t SidTuneInfo::relocPages() const { return getRelocPages(); } SidTuneInfo::model_t SidTuneInfo::sidModel(unsigned int i) const { return getSidModel(i); } SidTuneInfo::compatibility_t SidTuneInfo::compatibility() const { return getCompatibility(); } unsigned int SidTuneInfo::numberOfInfoStrings() const { return getNumberOfInfoStrings(); } const char* SidTuneInfo::infoString(unsigned int i) const { return getInfoString(i); } unsigned int SidTuneInfo::numberOfCommentStrings() const{ return getNumberOfCommentStrings(); } const char* SidTuneInfo::commentString(unsigned int i) const{ return getCommentString(i); } uint_least32_t SidTuneInfo::dataFileLen() const { return getDataFileLen(); } uint_least32_t SidTuneInfo::c64dataLen() const { return getC64dataLen(); } SidTuneInfo::clock_t SidTuneInfo::clockSpeed() const { return getClockSpeed(); } const char* SidTuneInfo::formatString() const { return getFormatString(); } bool SidTuneInfo::fixLoad() const { return getFixLoad(); } const char* SidTuneInfo::path() const { return getPath(); } const char* SidTuneInfo::dataFileName() const { return getDataFileName(); } const char* SidTuneInfo::infoFileName() const { return getInfoFileName(); } libsidplayfp-2.6.0/src/sidplayfp/SidTune.h0000644000175100001770000001450214544470307015445 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef SIDTUNE_H #define SIDTUNE_H #include #include #include "sidplayfp/siddefs.h" class SidTuneInfo; namespace libsidplayfp { class SidTuneBase; class sidmemory; } /** * SidTune */ class SID_EXTERN SidTune { public: static const int MD5_LENGTH = 32; private: /// Filename extensions to append for various file types. static const char** fileNameExtensions; private: // ------------------------------------------------------------- libsidplayfp::SidTuneBase* tune; const char* m_statusString; bool m_status; public: // ---------------------------------------------------------------- typedef void (*LoaderFunc)(const char* fileName, std::vector& bufferRef); /** * Load a sidtune from a file. * * To retrieve data from standard input pass in filename "-". * If you want to override the default filename extensions use this * contructor. Please note, that if the specified "fileName" * does exist and the loader is able to determine its file format, * this function does not try to append any file name extension. * See "SidTune.cpp" for the default list of file name extensions. * You can specify "fileName = 0", if you do not want to * load a sidtune. You can later load one with open(). * * @param fileName * @param fileNameExt * @param separatorIsSlash */ SidTune(const char* fileName, const char **fileNameExt = 0, bool separatorIsSlash = false); /** * Load a sidtune from a file, using a file access callback. * * This function does the same as the above, except that it * accepts a callback function, which will be used to read * all files it accesses. * * @param loader * @param fileName * @param fileNameExt * @param separatorIsSlash */ SidTune(LoaderFunc loader, const char* fileName, const char **fileNameExt = 0, bool separatorIsSlash = false); /** * Load a single-file sidtune from a memory buffer. * Currently supported: PSID and MUS formats. * * @param oneFileFormatSidtune the buffer that contains song data * @param sidtuneLength length of the buffer */ SidTune(const uint_least8_t* oneFileFormatSidtune, uint_least32_t sidtuneLength); ~SidTune(); /** * The SidTune class does not copy the list of file name extensions, * so make sure you keep it. If the provided pointer is 0, the * default list will be activated. This is a static list which * is used by all SidTune objects. * * @param fileNameExt */ void setFileNameExtensions(const char **fileNameExt); /** * Load a sidtune into an existing object from a file. * * @param fileName * @param separatorIsSlash */ void load(const char* fileName, bool separatorIsSlash = false); /** * Load a sidtune into an existing object from a file, * using a file access callback. * * @param loader * @param fileName * @param separatorIsSlash */ void load(LoaderFunc loader, const char* fileName, bool separatorIsSlash = false); /** * Load a sidtune into an existing object from a buffer. * * @param sourceBuffer the buffer that contains song data * @param bufferLen length of the buffer */ void read(const uint_least8_t* sourceBuffer, uint_least32_t bufferLen); /** * Select sub-song. * * @param songNum the selected song (0 = default starting song) * @return active song number, 0 if no tune is loaded. */ unsigned int selectSong(unsigned int songNum); /** * Retrieve current active sub-song specific information. * * @return a pointer to #SidTuneInfo, 0 if no tune is loaded. The pointer must not be deleted. */ const SidTuneInfo* getInfo() const; /** * Select sub-song and retrieve information. * * @param songNum the selected song (0 = default starting song) * @return a pointer to #SidTuneInfo, 0 if no tune is loaded. The pointer must not be deleted. */ const SidTuneInfo* getInfo(unsigned int songNum); /** * Determine current state of object. * Upon error condition use #statusString to get a descriptive * text string. * * @return current state (true = okay, false = error) */ bool getStatus() const; /** * Error/status message of last operation. */ const char* statusString() const; /** * Copy sidtune into C64 memory (64 KB). */ bool placeSidTuneInC64mem(libsidplayfp::sidmemory& mem); /** * Calculates the MD5 hash of the tune, old method. * Not providing an md5 buffer will cause the internal one to be used. * If provided, buffer must be MD5_LENGTH + 1 * * @return a pointer to the buffer containing the md5 string, 0 if no tune is loaded. */ const char *createMD5(char *md5 = 0); /** * Calculates the MD5 hash of the tune, new method, introduced in HVSC#68. * Not providing an md5 buffer will cause the internal one to be used. * If provided, buffer must be MD5_LENGTH + 1 * * @return a pointer to the buffer containing the md5 string, 0 if no tune is loaded. */ const char *createMD5New(char *md5 = 0); const uint_least8_t* c64Data() const; private: // prevent copying SidTune(const SidTune&); SidTune& operator=(SidTune&); }; #endif /* SIDTUNE_H */ libsidplayfp-2.6.0/src/sidplayfp/SidConfig.cpp0000644000175100001770000000443214544470307016273 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "SidConfig.h" #include "mixer.h" #include "sidcxx11.h" SidConfig::SidConfig() : defaultC64Model(PAL), forceC64Model(false), defaultSidModel(MOS6581), forceSidModel(false), digiBoost(false), ciaModel(MOS6526), playback(MONO), frequency(DEFAULT_SAMPLING_FREQ), secondSidAddress(0), thirdSidAddress(0), sidEmulation(nullptr), leftVolume(libsidplayfp::Mixer::VOLUME_MAX), rightVolume(libsidplayfp::Mixer::VOLUME_MAX), powerOnDelay(DEFAULT_POWER_ON_DELAY), samplingMethod(RESAMPLE_INTERPOLATE), fastSampling(false) {} bool SidConfig::compare(const SidConfig &config) { return defaultC64Model != config.defaultC64Model || forceC64Model != config.forceC64Model || defaultSidModel != config.defaultSidModel || forceSidModel != config.forceSidModel || digiBoost != config.digiBoost || ciaModel != config.ciaModel || playback != config.playback || frequency != config.frequency || secondSidAddress != config.secondSidAddress || thirdSidAddress != config.thirdSidAddress || sidEmulation != config.sidEmulation || leftVolume != config.leftVolume || rightVolume != config.rightVolume || powerOnDelay != config.powerOnDelay || samplingMethod != config.samplingMethod || fastSampling != config.fastSampling; } libsidplayfp-2.6.0/src/sidplayfp/sidplayfp.cpp0000644000175100001770000000653314544470307016425 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ //--------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------- // Redirection to private version of sidplayer (This method is called Cheshire Cat) // [ms: which is J. Carolan's name for a degenerate 'bridge'] // This interface can be directly replaced with a libsidplay1 or C interface wrapper. //--------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------- #include "sidplayfp.h" #include "player.h" sidplayfp::sidplayfp() : sidplayer(*(new libsidplayfp::Player)) {} sidplayfp::~sidplayfp() { delete &sidplayer; } bool sidplayfp::config(const SidConfig &cfg) { return sidplayer.config(cfg); } const SidConfig &sidplayfp::config() const { return sidplayer.config(); } void sidplayfp::stop() { sidplayer.stop(); } uint_least32_t sidplayfp::play(short *buffer, uint_least32_t count) { return sidplayer.play(buffer, count); } bool sidplayfp::load(SidTune *tune) { return sidplayer.load(tune); } const SidInfo &sidplayfp::info() const { return sidplayer.info(); } uint_least32_t sidplayfp::time() const { return sidplayer.timeMs() / 1000; } uint_least32_t sidplayfp::timeMs() const { return sidplayer.timeMs(); } const char *sidplayfp::error() const { return sidplayer.error(); } bool sidplayfp::fastForward(unsigned int percent) { return sidplayer.fastForward(percent); } void sidplayfp::mute(unsigned int sidNum, unsigned int voice, bool enable) { sidplayer.mute(sidNum, voice, enable); } void sidplayfp::debug(bool enable, FILE *out) { sidplayer.debug(enable, out); } bool sidplayfp::isPlaying() const { return sidplayer.isPlaying(); } void sidplayfp::setKernal(const uint8_t* rom) { sidplayer.setKernal(rom); } void sidplayfp::setBasic(const uint8_t* rom) { sidplayer.setBasic(rom); } void sidplayfp::setChargen(const uint8_t* rom) { sidplayer.setChargen(rom); } void sidplayfp::setRoms(const uint8_t* kernal, const uint8_t* basic, const uint8_t* character) { setKernal(kernal); setBasic(basic); setChargen(character); } uint_least16_t sidplayfp::getCia1TimerA() const { return sidplayer.getCia1TimerA(); } bool sidplayfp::getSidStatus(unsigned int sidNum, uint8_t regs[32]) { return sidplayer.getSidStatus(sidNum, regs); } libsidplayfp-2.6.0/src/sidplayfp/SidConfig.h0000644000175100001770000001047614544470307015745 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #ifndef SIDCONFIG_H #define SIDCONFIG_H #include #include "sidplayfp/siddefs.h" class sidbuilder; /** * SidConfig * * An instance of this class is used to transport emulator settings * to and from the interface class. */ class SID_EXTERN SidConfig { public: /// Playback mode typedef enum { MONO = 1, ///< One channel mono playback STEREO ///< Two channels stereo playback } playback_t; /// SID chip model typedef enum { MOS6581, ///< Old SID (MOS 6581) MOS8580 ///< New SID (CSG 8580/MOS 6582) } sid_model_t; /// CIA chip model typedef enum { MOS6526, ///< Old CIA with interrupts delayed by one cycle (MOS 6526/6526A) MOS8521, ///< New CIA (CSG 8521/MOS 6526 216A) MOS6526W4485 ///< Old CIA, peculiar batch with different serial port behavior (MOS 6526 4485) @since 2.2 } cia_model_t; /// C64 model typedef enum { PAL, ///< European PAL model (MOS 6569) NTSC, ///< American/Japanese NTSC model (MOS 6567 R8) OLD_NTSC, ///< Older NTSC model with different video chip revision (MOS 6567 R56A) DREAN, ///< Argentinian PAL-N model (MOS 6572) PAL_M ///< Brasilian PAL-M model (MOS 6573) } c64_model_t; /// Sampling method typedef enum { INTERPOLATE, ///< Interpolation RESAMPLE_INTERPOLATE ///< Resampling } sampling_method_t; public: /** * Maximum power on delay. * - Delays <= MAX produce constant results * - Delays > MAX produce random results */ static const uint_least16_t MAX_POWER_ON_DELAY = 0x1FFF; static const uint_least16_t DEFAULT_POWER_ON_DELAY = MAX_POWER_ON_DELAY + 1; static const uint_least32_t DEFAULT_SAMPLING_FREQ = 44100; public: /** * Intended c64 model when unknown or forced. */ c64_model_t defaultC64Model; /** * Force the model to #defaultC64Model ignoring tune's clock setting. */ bool forceC64Model; /** * Intended sid model when unknown or forced. */ sid_model_t defaultSidModel; /** * Force the sid model to #defaultSidModel. */ bool forceSidModel; /** * Enable digiboost when 8580 SID model is used. */ bool digiBoost; /** * Intended cia model. */ cia_model_t ciaModel; /** * Playbak mode. */ playback_t playback; /** * Sampling frequency. */ uint_least32_t frequency; /** * Extra SID chips addresses. */ //@{ uint_least16_t secondSidAddress; uint_least16_t thirdSidAddress; //@} /** * Pointer to selected emulation, * reSIDfp, reSID, hardSID or exSID. */ sidbuilder *sidEmulation; /** * Left channel volume. */ uint_least32_t leftVolume; /** * Right channel volume. */ uint_least32_t rightVolume; /** * Power on delay cycles. */ uint_least16_t powerOnDelay; /** * Sampling method. */ sampling_method_t samplingMethod; /** * Faster low-quality emulation, * available only for reSID. */ bool fastSampling; /** * Compare two config objects. * * @return true if different */ bool compare(const SidConfig &config); public: SidConfig(); }; #endif // SIDCONFIG_H libsidplayfp-2.6.0/src/sidplayfp/sidbuilder.cpp0000644000175100001770000000361014544470307016551 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "sidbuilder.h" #include #include "sidemu.h" #include "sidcxx11.h" libsidplayfp::sidemu *sidbuilder::lock(libsidplayfp::EventScheduler *env, SidConfig::sid_model_t model, bool digiboost) { m_status = true; for (emuset_t::iterator it=sidobjs.begin(); it != sidobjs.end(); ++it) { libsidplayfp::sidemu *sid = (*it); if (sid->lock(env)) { sid->model(model, digiboost); return sid; } } // Unable to locate free SID m_status = false; m_errorBuffer.assign(name()).append(" ERROR: No available SIDs to lock"); return nullptr; } void sidbuilder::unlock(libsidplayfp::sidemu *device) { emuset_t::iterator it = sidobjs.find(device); if (it != sidobjs.end()) { (*it)->unlock(); } } template void Delete(T s) { delete s; } void sidbuilder::remove() { std::for_each(sidobjs.begin(), sidobjs.end(), Delete); sidobjs.clear(); } libsidplayfp-2.6.0/src/sidplayfp/SidInfo.h0000644000175100001770000000526114544470307015427 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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 */ #ifndef SIDINFO_H #define SIDINFO_H #include #include "sidplayfp/siddefs.h" /** * This interface is used to get sid engine informations. */ class SID_EXTERN SidInfo { public: /// Library name const char *name() const; /// Library version const char *version() const; /// Library credits //@{ unsigned int numberOfCredits() const; const char *credits(unsigned int i) const; //@} /// Number of SIDs supported by this library unsigned int maxsids() const; /// Number of output channels (1-mono, 2-stereo) unsigned int channels() const; /// Address of the driver uint_least16_t driverAddr() const; /// Size of the driver in bytes uint_least16_t driverLength() const; /// Power on delay uint_least16_t powerOnDelay() const; /// Describes the speed current song is running at const char *speedString() const; /// Description of the laoded ROM images //@{ const char *kernalDesc() const; const char *basicDesc() const; const char *chargenDesc() const; //@} private: virtual const char *getName() const =0; virtual const char *getVersion() const =0; virtual unsigned int getNumberOfCredits() const =0; virtual const char *getCredits(unsigned int i) const =0; virtual unsigned int getMaxsids() const =0; virtual unsigned int getChannels() const =0; virtual uint_least16_t getDriverAddr() const =0; virtual uint_least16_t getDriverLength() const =0; virtual uint_least16_t getPowerOnDelay() const =0; virtual const char *getSpeedString() const =0; virtual const char *getKernalDesc() const =0; virtual const char *getBasicDesc() const =0; virtual const char *getChargenDesc() const =0; protected: ~SidInfo() {} }; #endif /* SIDINFO_H */ libsidplayfp-2.6.0/src/sidplayfp/SidTune.cpp0000644000175100001770000001062014544470307015775 00000000000000 /* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2021 Leandro Nini * * 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. */ #include "SidTune.h" #include "sidtune/SidTuneBase.h" #include "sidcxx11.h" using namespace libsidplayfp; const char MSG_NO_ERRORS[] = "No errors"; // Default sidtune file name extensions. This selection can be overriden // by specifying a custom list in the constructor. const char* defaultFileNameExt[] = { // Preferred default file extension for single-file sidtunes // or sidtune description files in SIDPLAY INFOFILE format. ".sid", ".SID", // File extensions used (and created) by various C64 emulators and // related utilities. These extensions are recommended to be used as // a replacement for ".dat" in conjunction with two-file sidtunes. ".c64", ".prg", ".p00", ".C64", ".PRG", ".P00", // Stereo Sidplayer (.mus/.MUS ought not be included because // these must be loaded first; it sometimes contains the first // credit lines of a MUS/STR pair). ".str", ".STR", ".mus", ".MUS", // End. 0 }; const char** SidTune::fileNameExtensions = defaultFileNameExt; SidTune::SidTune(const char* fileName, const char **fileNameExt, bool separatorIsSlash) : SidTune(nullptr, fileName, fileNameExt, separatorIsSlash) { } SidTune::SidTune(LoaderFunc loader, const char* fileName, const char **fileNameExt, bool separatorIsSlash) : tune(nullptr) { setFileNameExtensions(fileNameExt); load(loader, fileName, separatorIsSlash); } SidTune::SidTune(const uint_least8_t* oneFileFormatSidtune, uint_least32_t sidtuneLength) : tune(nullptr) { read(oneFileFormatSidtune, sidtuneLength); } SidTune::~SidTune() { delete tune; } void SidTune::setFileNameExtensions(const char **fileNameExt) { fileNameExtensions = ((fileNameExt != nullptr) ? fileNameExt : defaultFileNameExt); } void SidTune::load(const char* fileName, bool separatorIsSlash) { load(nullptr, fileName, separatorIsSlash); } void SidTune::load(LoaderFunc loader, const char* fileName, bool separatorIsSlash) { try { delete tune; tune = SidTuneBase::load(loader, fileName, fileNameExtensions, separatorIsSlash); m_status = true; m_statusString = MSG_NO_ERRORS; } catch (loadError const &e) { tune = nullptr; m_status = false; m_statusString = e.message(); } } void SidTune::read(const uint_least8_t* sourceBuffer, uint_least32_t bufferLen) { try { delete tune; tune = SidTuneBase::read(sourceBuffer, bufferLen); m_status = true; m_statusString = MSG_NO_ERRORS; } catch (loadError const &e) { tune = nullptr; m_status = false; m_statusString = e.message(); } } unsigned int SidTune::selectSong(unsigned int songNum) { return tune != nullptr ? tune->selectSong(songNum) : 0; } const SidTuneInfo* SidTune::getInfo() const { return tune != nullptr ? tune->getInfo() : nullptr; } const SidTuneInfo* SidTune::getInfo(unsigned int songNum) { return tune != nullptr ? tune->getInfo(songNum) : nullptr; } bool SidTune::getStatus() const { return m_status; } const char* SidTune::statusString() const { return m_statusString; } bool SidTune::placeSidTuneInC64mem(sidmemory& mem) { if (tune == nullptr) return false; tune->placeSidTuneInC64mem(mem); return true; } const char* SidTune::createMD5(char *md5) { return tune != nullptr ? tune->createMD5(md5) : nullptr; } const char* SidTune::createMD5New(char *md5) { return tune != nullptr ? tune->createMD5New(md5) : nullptr; } const uint_least8_t* SidTune::c64Data() const { return tune != nullptr ? tune->c64Data() : nullptr; } libsidplayfp-2.6.0/src/sidplayfp/SidInfo.cpp0000644000175100001770000000345514544470307015765 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2017 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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 */ #include "SidInfo.h" const char *SidInfo::name() const { return getName(); } const char *SidInfo::version() const { return getVersion(); } unsigned int SidInfo::numberOfCredits() const { return getNumberOfCredits(); } const char *SidInfo::credits(unsigned int i) const { return getCredits(i); } unsigned int SidInfo::maxsids() const { return getMaxsids(); } unsigned int SidInfo::channels() const { return getChannels(); } uint_least16_t SidInfo::driverAddr() const { return getDriverAddr(); } uint_least16_t SidInfo::driverLength() const { return getDriverLength(); } uint_least16_t SidInfo::powerOnDelay() const { return getPowerOnDelay(); } const char *SidInfo::speedString() const { return getSpeedString(); } const char *SidInfo::kernalDesc() const { return getKernalDesc(); } const char *SidInfo::basicDesc() const { return getBasicDesc(); } const char *SidInfo::chargenDesc() const { return getChargenDesc(); } libsidplayfp-2.6.0/src/sidplayfp/sidplayfp.h0000644000175100001770000001212614544470307016065 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef SIDPLAYFP_H #define SIDPLAYFP_H #include #include #include "sidplayfp/siddefs.h" #include "sidplayfp/sidversion.h" class SidConfig; class SidTune; class SidInfo; class EventContext; // Private Sidplayer namespace libsidplayfp { class Player; } /** * sidplayfp */ class SID_EXTERN sidplayfp { private: libsidplayfp::Player &sidplayer; public: sidplayfp(); ~sidplayfp(); /** * Get the current engine configuration. * * @return a const reference to the current configuration. */ const SidConfig &config() const; /** * Get the current player informations. * * @return a const reference to the current info. */ const SidInfo &info() const; /** * Configure the engine. * Check #error for detailed message if something goes wrong. * * @param cfg the new configuration * @return true on success, false otherwise. */ bool config(const SidConfig &cfg); /** * Error message. * * @return string error message. */ const char *error() const; /** * Set the fast-forward factor. * * @param percent */ bool fastForward(unsigned int percent); /** * Load a tune. * Check #error for detailed message if something goes wrong. * * @param tune the SidTune to load, 0 unloads current tune. * @return true on sucess, false otherwise. */ bool load(SidTune *tune); /** * Run the emulation and produce samples to play if a buffer is given. * * @param buffer pointer to the buffer to fill with samples. * @param count the size of the buffer measured in 16 bit samples * or 0 if no output is needed (e.g. Hardsid) * @return the number of produced samples. If less than requested * or #isPlaying() is false an error occurred, use #error() * to get a detailed message. */ uint_least32_t play(short *buffer, uint_least32_t count); /** * Check if the engine is playing or stopped. * * @return true if playing, false otherwise. */ bool isPlaying() const; /** * Stop the engine. */ void stop(); /** * Control debugging. * Only has effect if library have been compiled * with the --enable-debug option. * * @param enable enable/disable debugging. * @param out the file where to redirect the debug info. */ void debug(bool enable, FILE *out); /** * Mute/unmute a SID channel. * * @param sidNum the SID chip, 0 for the first one, 1 for the second. * @param voice the channel to mute/unmute. * @param enable true unmutes the channel, false mutes it. */ void mute(unsigned int sidNum, unsigned int voice, bool enable); /** * Get the current playing time. * * @return the current playing time measured in seconds. */ uint_least32_t time() const; /** * Get the current playing time. * * @return the current playing time measured in milliseconds. * @since 2.0 */ uint_least32_t timeMs() const; /** * Set ROM images. * * @param kernal pointer to Kernal ROM. * @param basic pointer to Basic ROM, generally needed only for BASIC tunes. * @param character pointer to character generator ROM. */ void setRoms(const uint8_t* kernal, const uint8_t* basic=0, const uint8_t* character=0); /** * Set the ROM banks. * * @param rom pointer to the ROM data. * @since 2.2 */ //@{ void setKernal(const uint8_t* rom); void setBasic(const uint8_t* rom); void setChargen(const uint8_t* rom); //@} /** * Get the CIA 1 Timer A programmed value. */ uint_least16_t getCia1TimerA() const; /** * Get the SID registers programmed value. * * @param sidNum the SID chip, 0 for the first one, 1 for the second and 2 for the third. * @param regs an array that will be filled with the last values written to the chip. * @return false if the requested chip doesn't exist. * @since 2.2 */ bool getSidStatus(unsigned int sidNum, uint8_t regs[32]); }; #endif // SIDPLAYFP_H libsidplayfp-2.6.0/src/sidplayfp/siddefs.h0000644000175100001770000000401714544470307015513 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #ifndef SIDDEFS_H #define SIDDEFS_H /* DLL building support on win32 hosts */ #ifndef SID_EXTERN # ifdef DLL_EXPORT /* defined by libtool (if required) */ # define SID_EXTERN __declspec(dllexport) # endif # ifdef SID_DLL_IMPORT /* define if linking with this dll */ # define SID_EXTERN __declspec(dllimport) # endif # ifndef SID_EXTERN /* static linking or !_WIN32 */ # if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) # define SID_EXTERN __attribute__ ((visibility("default"))) # else # define SID_EXTERN # endif # endif #endif /* Deprecated attributes */ #if __cplusplus >= 201402L # define SID_DEPRECATED [[deprecated]] #elif defined(_MSCVER) # define SID_DEPRECATED __declspec(deprecated) #elif defined(__GNUC__) || defined(__clang__) # define SID_DEPRECATED __attribute__ ((deprecated)) #else # define SID_DEPRECATED #endif /* Unused attributes */ #if __cplusplus >= 201703L # define SID_UNUSED [[maybe_unused]] #elif defined(__GNUC__) || defined(__clang__) # define SID_UNUSED __attribute__ ((unused)) #else # define SID_UNUSED #endif #endif /* SIDDEFS_H */ libsidplayfp-2.6.0/src/sidplayfp/sidversion.h.in0000644000175100001770000000041614544470307016663 00000000000000#ifndef LIBSIDPLAYFP_VERSION_H #define LIBSIDPLAYFP_VERSION_H #ifndef SIDPLAYFP_H # error Do not include directly. #endif #define LIBSIDPLAYFP_VERSION_MAJ @LIB_MAJOR@ #define LIBSIDPLAYFP_VERSION_MIN @LIB_MINOR@ #define LIBSIDPLAYFP_VERSION_LEV @LIB_LEVEL@ #endif libsidplayfp-2.6.0/src/stringutils.h0000644000175100001770000000561314544470307014471 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2013-2023 Leandro Nini * * 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 */ #ifndef STRINGUTILS_H #define STRINGUTILS_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #if defined(_WIN32) # include #elif defined(HAVE_STRCASECMP) || defined (HAVE_STRNCASECMP) # include #endif #include #include #include namespace stringutils { /** * Compare two characters in a case insensitive way. */ inline bool casecompare(char c1, char c2) { return (tolower(c1) == tolower(c2)); } /** * Compare two strings in a case insensitive way. * * @return true if strings are equal. */ inline bool equal(const std::string& s1, const std::string& s2) { return s1.size() == s2.size() && std::equal(s1.begin(), s1.end(), s2.begin(), casecompare); } /** * Compare two strings in a case insensitive way. * * @return true if strings are equal. */ inline bool equal(const char* s1, const char* s2) { #if defined(_WIN32) return _stricmp(s1, s2) == 0; #elif defined(HAVE_STRCASECMP) return strcasecmp(s1, s2) == 0; #else if (s1 == s2) return true; if (s1 == 0 || s2 == 0) return false; while ((*s1 != '\0') || (*s2 != '\0')) { if (!casecompare(*s1, *s2)) return false; ++s1; ++s2; } return true; #endif } /** * Compare first n characters of two strings in a case insensitive way. * * @return true if strings are equal. */ inline bool equal(const char* s1, const char* s2, size_t n) { #if defined(_WIN32) return _strnicmp(s1, s2, n) == 0; #elif defined(HAVE_STRNCASECMP) return strncasecmp(s1, s2, n) == 0; #else if (s1 == s2 || n == 0) return true; if (s1 == 0 || s2 == 0) return false; while (n-- && ((*s1 != '\0') || (*s2 != '\0'))) { if (!casecompare(*s1, *s2)) return false; ++s1; ++s2; } return true; #endif } } #endif libsidplayfp-2.6.0/src/sidemu.h0000644000175100001770000000653214544470307013371 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #ifndef SIDEMU_H #define SIDEMU_H #include #include "sidplayfp/SidConfig.h" #include "sidplayfp/siddefs.h" #include "Event.h" #include "EventScheduler.h" #include "c64/c64sid.h" #include "sidcxx11.h" class sidbuilder; namespace libsidplayfp { /** * Inherit this class to create a new SID emulation. */ class sidemu : public c64sid { public: /** * Buffer size. 5000 is roughly 5 ms at 96 kHz */ enum { OUTPUTBUFFERSIZE = 5000 }; private: sidbuilder* const m_builder; protected: static const char ERR_UNSUPPORTED_FREQ[]; static const char ERR_INVALID_SAMPLING[]; static const char ERR_INVALID_CHIP[]; protected: EventScheduler *eventScheduler; event_clock_t m_accessClk; /// The sample buffer short *m_buffer; /// Current position in buffer int m_bufferpos; bool m_status; bool isLocked; std::string m_error; public: sidemu(sidbuilder *builder) : m_builder(builder), eventScheduler(nullptr), m_buffer(nullptr), m_bufferpos(0), m_status(true), isLocked(false), m_error("N/A") {} virtual ~sidemu() {} /** * Clock the SID chip. */ virtual void clock() = 0; /** * Set execution environment and lock sid to it. */ virtual bool lock(EventScheduler *scheduler); /** * Unlock sid. */ virtual void unlock(); // Standard SID functions /** * Mute/unmute voice. */ virtual void voice(unsigned int num, bool mute) = 0; /** * Set SID model. */ virtual void model(SidConfig::sid_model_t model, bool digiboost) = 0; /** * Set the sampling method. * * @param systemfreq * @param outputfreq * @param method * @param fast */ virtual void sampling(float systemfreq SID_UNUSED, float outputfreq SID_UNUSED, SidConfig::sampling_method_t method SID_UNUSED, bool fast SID_UNUSED) {} /** * Get a detailed error message. */ const char* error() const { return m_error.c_str(); } sidbuilder* builder() const { return m_builder; } /** * Get the current position in buffer. */ int bufferpos() const { return m_bufferpos; } /** * Set the position in buffer. */ void bufferpos(int pos) { m_bufferpos = pos; } /** * Get the buffer. */ short *buffer() const { return m_buffer; } }; } #endif // SIDEMU_H libsidplayfp-2.6.0/src/sidemu.cpp0000644000175100001770000000265514544470307013726 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "sidemu.h" namespace libsidplayfp { const char sidemu::ERR_UNSUPPORTED_FREQ[] = "Unable to set desired output frequency."; const char sidemu::ERR_INVALID_SAMPLING[] = "Invalid sampling method."; const char sidemu::ERR_INVALID_CHIP[] = "Invalid chip model."; bool sidemu::lock(EventScheduler *scheduler) { if (isLocked) return false; isLocked = true; eventScheduler = scheduler; return true; } void sidemu::unlock() { isLocked = false; eventScheduler = nullptr; } } libsidplayfp-2.6.0/src/mixer.cpp0000644000175100001770000001310614544470307013555 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "mixer.h" #include #include #include "sidemu.h" namespace libsidplayfp { void clockChip(sidemu *s) { s->clock(); } class bufferPos { public: bufferPos(int i) : pos(i) {} void operator()(sidemu *s) { s->bufferpos(pos); } private: int pos; }; class bufferMove { public: bufferMove(int p, int s) : pos(p), samples(s) {} void operator()(short *dest) { const short* src = dest + pos; for (int j = 0; j < samples; j++) { dest[j] = src[j]; } } private: int pos; int samples; }; void Mixer::clockChips() { std::for_each(m_chips.begin(), m_chips.end(), clockChip); } void Mixer::resetBufs() { std::for_each(m_chips.begin(), m_chips.end(), bufferPos(0)); } void Mixer::doMix() { short *buf = m_sampleBuffer + m_sampleIndex; // extract buffer info now that the SID is updated. // clock() may update bufferpos. // NB: if more than one chip exists, their bufferpos is identical to first chip's. const int sampleCount = m_chips.front()->bufferpos(); int i = 0; while (i < sampleCount) { // Handle whatever output the sid has generated so far if (m_sampleIndex >= m_sampleCount) { break; } // Are there enough samples to generate the next one? if (i + m_fastForwardFactor >= sampleCount) { break; } // This is a crude boxcar low-pass filter to // reduce aliasing during fast forward. for (size_t k = 0; k < m_buffers.size(); k++) { int_least32_t sample = 0; const short *buffer = m_buffers[k] + i; for (int j = 0; j < m_fastForwardFactor; j++) { sample += buffer[j]; } m_iSamples[k] = sample / m_fastForwardFactor; } // increment i to mark we ate some samples, finish the boxcar thing. i += m_fastForwardFactor; const unsigned int channels = m_stereo ? 2 : 1; for (unsigned int ch = 0; ch < channels; ch++) { const int_least32_t tmp = (this->*(m_scale[ch]))(ch); assert(tmp >= -32768 && tmp <= 32767); *buf++ = static_cast(tmp); m_sampleIndex++; } } // move the unhandled data to start of buffer, if any. const int samplesLeft = sampleCount - i; std::for_each(m_buffers.begin(), m_buffers.end(), bufferMove(i, samplesLeft)); std::for_each(m_chips.begin(), m_chips.end(), bufferPos(samplesLeft)); } void Mixer::begin(short *buffer, uint_least32_t count) { // sanity checks // don't allow odd counts for stereo playback if (m_stereo && (count & 1)) throw badBufferSize(); // TODO short buffers make the emulator crash, should investigate why // in the meantime set a reasonable lower bound of 5ms const uint_least32_t lowerBound = m_sampleRate / (m_stereo ? 100 : 200); if (count && (count < lowerBound)) throw badBufferSize(); m_sampleIndex = 0; m_sampleCount = count; m_sampleBuffer = buffer; } void Mixer::updateParams() { switch (m_buffers.size()) { case 1: m_mix[0] = m_stereo ? &Mixer::stereo_OneChip : &Mixer::mono<1>; if (m_stereo) m_mix[1] = &Mixer::stereo_OneChip; break; case 2: m_mix[0] = m_stereo ? &Mixer::stereo_ch1_TwoChips : &Mixer::mono<2>; if (m_stereo) m_mix[1] = &Mixer::stereo_ch2_TwoChips; break; case 3: m_mix[0] = m_stereo ? &Mixer::stereo_ch1_ThreeChips : &Mixer::mono<3>; if (m_stereo) m_mix[1] = &Mixer::stereo_ch2_ThreeChips; break; } } void Mixer::clearSids() { m_chips.clear(); m_buffers.clear(); } void Mixer::addSid(sidemu *chip) { if (chip != nullptr) { m_chips.push_back(chip); m_buffers.push_back(chip->buffer()); m_iSamples.resize(m_buffers.size()); if (m_mix.size() > 0) updateParams(); } } void Mixer::setStereo(bool stereo) { if (m_stereo != stereo) { m_stereo = stereo; m_mix.resize(m_stereo ? 2 : 1); updateParams(); } } void Mixer::setSamplerate(uint_least32_t rate) { m_sampleRate = rate; } bool Mixer::setFastForward(int ff) { if (ff < 1 || ff > 32) return false; m_fastForwardFactor = ff; return true; } void Mixer::setVolume(int_least32_t left, int_least32_t right) { m_volume.clear(); m_volume.push_back(left); m_volume.push_back(right); m_scale.clear(); m_scale.push_back(left == VOLUME_MAX ? &Mixer::noScale : &Mixer::scale); m_scale.push_back(right == VOLUME_MAX ? &Mixer::noScale : &Mixer::scale); } } libsidplayfp-2.6.0/src/psiddrv.bin0000644000175100001770000000355314544470307014077 00000000000000 0x01, 0x00, 0x6f, 0x36, 0x35, 0x00, 0x00, 0x00, 0x00, 0x10, 0xdf, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x10, 0xd5, 0x10, 0xde, 0x10, 0xde, 0x10, 0x9c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6c, 0x0e, 0x10, 0x6c, 0x0c, 0x10, 0x78, 0xa9, 0x00, 0x8d, 0x1a, 0xd0, 0xad, 0x19, 0xd0, 0x8d, 0x19, 0xd0, 0xa9, 0x7f, 0x8d, 0x0d, 0xdc, 0x8d, 0x0d, 0xdd, 0xad, 0x0d, 0xdc, 0xad, 0x0d, 0xdd, 0xa9, 0x0f, 0x8d, 0x18, 0xd4, 0xad, 0x14, 0x10, 0xf0, 0x07, 0xa2, 0x25, 0xa0, 0x40, 0x4c, 0x4c, 0x10, 0xa2, 0x95, 0xa0, 0x42, 0x8e, 0x04, 0xdc, 0x8c, 0x05, 0xdc, 0xa2, 0x9b, 0xa0, 0x37, 0x4d, 0x15, 0x10, 0x0d, 0x12, 0x10, 0xf0, 0x04, 0xa2, 0x1b, 0xa0, 0x00, 0x8e, 0x11, 0xd0, 0x8c, 0x12, 0xd0, 0xad, 0x12, 0x10, 0xf0, 0x0a, 0xad, 0x13, 0x10, 0xf0, 0x05, 0xa2, 0xc2, 0x8e, 0x14, 0x03, 0xae, 0x10, 0x10, 0xac, 0x11, 0x10, 0xe8, 0xc8, 0xca, 0xd0, 0xfd, 0x88, 0xd0, 0xfa, 0xad, 0x0b, 0x10, 0xd0, 0x08, 0xa9, 0x81, 0x8d, 0x1a, 0xd0, 0x4c, 0x9c, 0x10, 0xa9, 0x81, 0xa2, 0x01, 0x8d, 0x0d, 0xdc, 0x8e, 0x0e, 0xdc, 0xad, 0x12, 0x10, 0xd0, 0x02, 0xa9, 0x37, 0x85, 0x01, 0xad, 0x16, 0x10, 0x48, 0xad, 0x0a, 0x10, 0x28, 0x20, 0x1a, 0x10, 0xad, 0x12, 0x10, 0xf0, 0x0a, 0xad, 0x13, 0x10, 0xf0, 0x04, 0xa9, 0x37, 0x85, 0x01, 0x58, 0x4c, 0xbf, 0x10, 0xa5, 0x01, 0x48, 0xad, 0x13, 0x10, 0x85, 0x01, 0xa9, 0x00, 0x20, 0x17, 0x10, 0x68, 0x85, 0x01, 0xce, 0x19, 0xd0, 0xad, 0x0d, 0xdc, 0x68, 0xa8, 0x68, 0xaa, 0x68, 0x40, 0x02, 0x00, 0x00, 0x01, 0x82, 0x02, 0x82, 0x02, 0x82, 0x02, 0x82, 0x02, 0x82, 0x10, 0x82, 0x03, 0x82, 0x22, 0x82, 0x09, 0x82, 0x11, 0x82, 0x03, 0x82, 0x0f, 0x82, 0x05, 0x82, 0x05, 0x22, 0x05, 0x82, 0x03, 0x82, 0x0b, 0x82, 0x0a, 0x82, 0x0d, 0x82, 0x09, 0x82, 0x04, 0x82, 0x04, 0x82, 0x03, 0x82, 0x05, 0x82, 0x0a, 0x82, 0x06, 0x82, 0x07, 0x82, 0x00, 0x00, 0x00, 0x00, libsidplayfp-2.6.0/src/EventCallback.h0000644000175100001770000000270214544470307014574 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2011-2015 Leandro Nini * Copyright (C) 2009 Antti S. Lankila * Copyright (C) 2001 Simon White * * 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 */ #ifndef EVENTCALLBACK_H #define EVENTCALLBACK_H #include "Event.h" #include "sidcxx11.h" namespace libsidplayfp { template< class This > class EventCallback final : public Event { private: typedef void (This::*Callback) (); private: This &m_this; Callback const m_callback; private: void event() override { (m_this.*m_callback)(); } public: EventCallback(const char* const name, This &object, Callback callback) : Event(name), m_this(object), m_callback(callback) {} }; } #endif // EVENTCALLBACK_H libsidplayfp-2.6.0/src/EventScheduler.cpp0000644000175100001770000000302614544470307015351 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2011-2014 Leandro Nini * Copyright (C) 2009 Antti S. Lankila * Copyright (C) 2001 Simon White * * 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 */ #include "EventScheduler.h" namespace libsidplayfp { void EventScheduler::reset() { firstEvent = nullptr; currentTime = 0; } void EventScheduler::cancel(Event &event) { Event **scan = &firstEvent; while (*scan != nullptr) { if (&event == *scan) { *scan = (*scan)->next; break; } scan = &((*scan)->next); } } bool EventScheduler::isPending(Event &event) const { Event *scan = firstEvent; while (scan != nullptr) { if (&event == scan) { return true; } scan = scan->next; } return false; } } libsidplayfp-2.6.0/src/sidrandom.h0000644000175100001770000000250514544470307014057 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2013 Leandro Nini * * 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 */ #ifndef SIDRANDOM_H #define SIDRANDOM_H namespace libsidplayfp { /** * Simple thread-safe PRNG. */ class sidrandom { private: unsigned int m_seed; public: /** * Initialize PRNG. * * @param seed */ sidrandom(unsigned int seed) : m_seed(seed * 1103515245 + 12345) {} /** * Generate new pseudo-random number. */ unsigned int next() { m_seed = m_seed * 13 + 1; return m_seed; } }; } #endif libsidplayfp-2.6.0/src/reloc65.h0000644000175100001770000000432514544470307013360 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2013-2014 Leandro Nini * Copyright (C) 2001 Dag Lem * Copyright (C) 1989-1997 André Fachat (a.fachat@physik.tu-chemnitz.de) * * 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. */ /* Modified by Dag Lem Relocate and extract text segment from memory buffer instead of file. For use with VICE VSID. Ported to c++ and cut down for use in libsidplayfp by Leandro Nini */ #ifndef RELOC65_H #define RELOC65_H /** * reloc65 -- A part of xa65 - 65xx/65816 cross-assembler and utility suite * o65 file relocator. Trimmed down for our needs. */ class reloc65 { private: const int m_tbase; int m_tdiff; private: int reldiff(unsigned char s); /** * Relocate segment. * * @param buf segment * @param len segment size * @param rtab relocation table * @return a pointer to the next section */ unsigned char* reloc_seg(unsigned char *buf, int len, unsigned char *rtab); /** * Relocate exported globals list. * * @param buf exported globals list * @return a pointer to the next section */ unsigned char* reloc_globals(unsigned char *buf); public: /** * @param addr address of the segment to relocate */ reloc65(int addr); /** * Do the relocation. * * @param buf beffer containing o65 data * @param fsize size of the data */ bool reloc(unsigned char **buf, int *fsize); }; #endif libsidplayfp-2.6.0/src/SidInfoImpl.h0000644000175100001770000000662714544470307014265 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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 */ #ifndef SIDINFOIMPL_H #define SIDINFOIMPL_H #include #include #include #include "sidplayfp/SidInfo.h" #include "mixer.h" #include "sidcxx11.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifndef PACKAGE_NAME # define PACKAGE_NAME PACKAGE #endif #ifndef PACKAGE_VERSION # define PACKAGE_VERSION VERSION #endif /** * The implementation of the SidInfo interface. */ class SidInfoImpl final : public SidInfo { public: const std::string m_name; const std::string m_version; std::vector m_credits; std::string m_speedString; std::string m_kernalDesc; std::string m_basicDesc; std::string m_chargenDesc; const unsigned int m_maxsids; unsigned int m_channels; uint_least16_t m_driverAddr; uint_least16_t m_driverLength; uint_least16_t m_powerOnDelay; private: // prevent copying SidInfoImpl(const SidInfoImpl&); SidInfoImpl& operator=(SidInfoImpl&); public: SidInfoImpl() : m_name(PACKAGE_NAME), m_version(PACKAGE_VERSION), m_maxsids(libsidplayfp::Mixer::MAX_SIDS), m_channels(1), m_driverAddr(0), m_driverLength(0), m_powerOnDelay(0) { m_credits.push_back(PACKAGE_NAME " V" PACKAGE_VERSION " Engine:\n" "\tCopyright (C) 2000 Simon White\n" "\tCopyright (C) 2007-2010 Antti Lankila\n" "\tCopyright (C) 2010-2015 Leandro Nini\n" "\t" PACKAGE_URL "\n"); } const char *getName() const override { return m_name.c_str(); } const char *getVersion() const override { return m_version.c_str(); } unsigned int getNumberOfCredits() const override { return m_credits.size(); } const char *getCredits(unsigned int i) const override { return i * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #include "resid.h" #include #include #include "resid-emu.h" ReSIDBuilder::~ReSIDBuilder() { // Remove all SID emulations remove(); } // Create a new sid emulation. unsigned int ReSIDBuilder::create(unsigned int sids) { m_status = true; // Check available devices unsigned int count = availDevices(); if (count && (count < sids)) sids = count; for (count = 0; count < sids; count++) { try { sidobjs.insert(new libsidplayfp::ReSID(this)); } // Memory alloc failed? catch (std::bad_alloc const &) { m_errorBuffer.assign(name()).append(" ERROR: Unable to create ReSID object"); m_status = false; break; } } return count; } const char *ReSIDBuilder::credits() const { return libsidplayfp::ReSID::getCredits(); } void ReSIDBuilder::filter(bool enable) { std::for_each(sidobjs.begin(), sidobjs.end(), applyParameter(&libsidplayfp::ReSID::filter, enable)); } void ReSIDBuilder::bias(double dac_bias) { std::for_each(sidobjs.begin(), sidobjs.end(), applyParameter(&libsidplayfp::ReSID::bias, dac_bias)); } libsidplayfp-2.6.0/src/builders/resid-builder/resid/0000755000175100001770000000000014544470322017452 500000000000000libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581__ST.h0000644000175100001770000010775614544470322021616 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x0f0, 0x0f0, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x378: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3f0: */ 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, /* 0x3f8: */ 0x1e0, 0x1e0, 0x1e0, 0x1e0, 0x1f0, 0x1f0, 0x3f0, 0x3f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x530: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x538: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x540: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x548: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x550: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x558: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x560: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x568: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x570: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x578: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x580: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x588: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x590: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x598: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x5c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x0f0, 0x1f0, /* 0x600: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x608: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x610: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x618: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x620: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x628: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x630: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x638: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x640: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x648: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x650: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x658: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x660: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x668: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x670: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x678: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x680: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x688: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x690: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x698: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x6c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x700: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x708: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x710: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x718: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x720: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x728: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x730: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x738: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x740: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x748: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x750: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x758: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x760: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x768: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x770: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x778: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x780: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x788: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x790: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x798: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x7c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7e0: */ 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, /* 0x7e8: */ 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, /* 0x7f0: */ 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, /* 0x7f8: */ 0x3e0, 0x3e0, 0x3f0, 0x3f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, /* 0x800: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x808: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x810: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x818: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x820: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x828: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x830: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x838: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x840: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x848: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x850: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x858: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x860: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x868: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x870: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x878: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x880: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x888: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x890: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x898: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x8c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x900: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x908: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x910: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x918: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x920: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x928: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x930: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x938: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x940: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x948: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x950: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x958: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x960: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x968: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x970: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x978: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x980: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x988: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x990: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x998: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x9c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x0f0, 0x0f0, /* 0xa00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xa80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xac0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0xb00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xb40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xb80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xbc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf0: */ 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, /* 0xbf8: */ 0x1e0, 0x1e0, 0x1e0, 0x1e0, 0x1f0, 0x1f0, 0x3f0, 0x3f0, /* 0xc00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xc80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xcc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0xd00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xd40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xd80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xdc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x0f0, 0x1f0, /* 0xe00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xe80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xec0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xec8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0xf00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xf40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xf80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xfc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfe0: */ 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, /* 0xfe8: */ 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, /* 0xff0: */ 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, /* 0xff8: */ 0x3e0, 0x3e0, 0x3f0, 0x3f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/sid.h0000644000175100001770000001442614544470311020327 00000000000000/*! \file resid/sid.h */ // --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_SID_H #define RESID_SID_H #include "resid-config.h" #include "voice.h" #if NEW_8580_FILTER #include "filter8580new.h" #else #include "filter.h" #endif #include "extfilt.h" #include "pot.h" namespace reSID { class SID { public: SID(); ~SID(); void set_chip_model(chip_model model); void set_voice_mask(reg4 mask); void enable_filter(bool enable); void adjust_filter_bias(double dac_bias); void enable_external_filter(bool enable); bool set_sampling_parameters(double clock_freq, sampling_method method, double sample_freq, double pass_freq = -1, double filter_scale = 0.97); void adjust_sampling_frequency(double sample_freq); void enable_raw_debug_output(bool enable); void clock(); void clock(cycle_count delta_t); int clock(cycle_count& delta_t, short* buf, int n, int interleave = 1); void reset(); // Read/write registers. reg8 read(reg8 offset); void write(reg8 offset, reg8 value); // Read/write state. class State { public: State(); char sid_register[0x20]; reg8 bus_value; cycle_count bus_value_ttl; cycle_count write_pipeline; reg8 write_address; reg4 voice_mask; reg24 accumulator[3]; reg24 shift_register[3]; cycle_count shift_register_reset[3]; cycle_count shift_pipeline[3]; reg16 pulse_output[3]; cycle_count floating_output_ttl[3]; reg16 rate_counter[3]; reg16 rate_counter_period[3]; reg16 exponential_counter[3]; reg16 exponential_counter_period[3]; reg8 envelope_counter[3]; EnvelopeGenerator::State envelope_state[3]; bool hold_zero[3]; cycle_count envelope_pipeline[3]; }; State read_state(); void write_state(const State& state); // 16-bit input (EXT IN). void input(short sample); // 16-bit output (AUDIO OUT). int output(); void debugoutput(void); protected: static double I0(double x); int clock_fast(cycle_count& delta_t, short* buf, int n, int interleave); int clock_interpolate(cycle_count& delta_t, short* buf, int n, int interleave); int clock_resample(cycle_count& delta_t, short* buf, int n, int interleave); int clock_resample_fastmem(cycle_count& delta_t, short* buf, int n, int interleave); void write(); chip_model sid_model; Voice voice[3]; Filter filter; ExternalFilter extfilt; Potentiometer potx; Potentiometer poty; reg8 bus_value; cycle_count bus_value_ttl; // The data bus TTL for the selected chip model cycle_count databus_ttl; // Pipeline for writes on the MOS8580. cycle_count write_pipeline; reg8 write_address; double clock_frequency; enum { // Resampling constants. // The error in interpolated lookup is bounded by 1.234/L^2, // while the error in non-interpolated lookup is bounded by // 0.7854/L + 0.4113/L^2, see // http://www-ccrma.stanford.edu/~jos/resample/Choice_Table_Size.html // For a resolution of 16 bits this yields L >= 285 and L >= 51473, // respectively. FIR_N = 125, FIR_RES = 285, FIR_RES_FASTMEM = 51473, FIR_SHIFT = 15, RINGSIZE = 1 << 14, RINGMASK = RINGSIZE - 1, // Fixed point constants (16.16 bits). FIXP_SHIFT = 16, FIXP_MASK = 0xffff }; // Sampling variables. sampling_method sampling; cycle_count cycles_per_sample; cycle_count sample_offset; int sample_index; short sample_prev, sample_now; int fir_N; int fir_RES; double fir_beta; double fir_f_cycles_per_sample; double fir_filter_scale; // Ring buffer with overflow for contiguous storage of RINGSIZE samples. short* sample; // FIR_RES filter tables (FIR_N*FIR_RES). short* fir; bool raw_debug_output; // FIXME: should be private? }; // ---------------------------------------------------------------------------- // Inline functions. // The following functions are defined inline because they are called every // time a sample is calculated. // ---------------------------------------------------------------------------- #if RESID_INLINING || defined(RESID_SID_CC) // ---------------------------------------------------------------------------- // Read 16-bit sample from audio output. // ---------------------------------------------------------------------------- RESID_INLINE int SID::output() { return extfilt.output(); } // ---------------------------------------------------------------------------- // SID clocking - 1 cycle. // ---------------------------------------------------------------------------- RESID_INLINE void SID::clock() { int i; // Clock amplitude modulators. for (i = 0; i < 3; i++) { voice[i].envelope.clock(); } // Clock oscillators. for (i = 0; i < 3; i++) { voice[i].wave.clock(); } // Synchronize oscillators. for (i = 0; i < 3; i++) { voice[i].wave.synchronize(); } // Calculate waveform output. for (i = 0; i < 3; i++) { voice[i].wave.set_waveform_output(); } // Clock filter. filter.clock(voice[0].output(), voice[1].output(), voice[2].output()); // Clock external filter. extfilt.clock(filter.output()); // Pipelined writes on the MOS8580. if (unlikely(write_pipeline)) { write(); } // Age bus value. if (unlikely(!--bus_value_ttl)) { bus_value = 0; } if (unlikely(raw_debug_output)) { debugoutput(); } } #endif // RESID_INLINING || defined(RESID_SID_CC) } // namespace reSID #endif // not RESID_SID_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/samp2src.pl0000755000175100001770000000470314544470311021466 00000000000000#! /usr/bin/perl -w # --------------------------------------------------------------------------- # This file is part of reSID, a MOS6581 SID emulator engine. # Copyright (C) 2010 Dag Lem # # 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 # --------------------------------------------------------------------------- use strict; die("Usage: samp2src name data-in src-out\n") unless @ARGV == 3; my ($name, $in, $out) = @ARGV; open(F, "<$in") or die($!); local $/ = undef; my $data = ; close(F) or die($!); open(F, ">$out") or die($!); print F <<\EOF; // --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- EOF print F "{\n"; for (my $i = 0; $i < length($data); $i += 8) { print F sprintf("/* 0x%03x: */ ", $i), map(sprintf(" 0x%03x,", $_ << 4), unpack("C*", substr($data, $i, 8))), "\n"; } print F "},\n"; close(F) or die($!); exit(0); libsidplayfp-2.6.0/src/builders/resid-builder/resid/dac.h0000644000175100001770000000225014544470311020267 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_DAC_H #define RESID_DAC_H namespace reSID { void build_dac_table(unsigned short* dac, int bits, double _2R_div_R, bool term); } // namespace reSID #endif // not RESID_DAC_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581_PST.dat0000644000175100001770000001000014544470311022065 00000000000000? 0xx~? 0xx~libsidplayfp-2.6.0/src/builders/resid-builder/resid/voice.h0000644000175100001770000000662714544470311020661 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_VOICE_H #define RESID_VOICE_H #include "resid-config.h" #include "wave.h" #include "envelope.h" namespace reSID { class Voice { public: Voice(); void set_chip_model(chip_model model); void set_sync_source(Voice*); void reset(); void writeCONTROL_REG(reg8); // Amplitude modulated waveform output. // Range [-2048*255, 2047*255]. int output(); WaveformGenerator wave; EnvelopeGenerator envelope; protected: // Waveform D/A zero level. short wave_zero; friend class SID; }; // ---------------------------------------------------------------------------- // Inline functions. // The following function is defined inline because it is called every // time a sample is calculated. // ---------------------------------------------------------------------------- #if RESID_INLINING || defined(RESID_VOICE_CC) // ---------------------------------------------------------------------------- // Amplitude modulated waveform output (20 bits). // Ideal range [-2048*255, 2047*255]. // ---------------------------------------------------------------------------- // The output for a voice is produced by a multiplying DAC, where the // waveform output modulates the envelope output. // // As noted by Bob Yannes: "The 8-bit output of the Envelope Generator was then // sent to the Multiplying D/A converter to modulate the amplitude of the // selected Oscillator Waveform (to be technically accurate, actually the // waveform was modulating the output of the Envelope Generator, but the result // is the same)". // // 7 6 5 4 3 2 1 0 VGND // | | | | | | | | | Missing // 2R 2R 2R 2R 2R 2R 2R 2R 2R termination // | | | | | | | | | // --R---R---R---R---R---R---R-- --- // | _____ // __|__ __|__ | // ----- ===== | // | | | | | // 12V --- ----- ------- GND // | // vout // // Bit on: wout (see figure in wave.h) // Bit off: 5V (VGND) // // As is the case with all MOS 6581 DACs, the termination to (virtual) ground // at bit 0 is missing. The MOS 8580 has correct termination. // RESID_INLINE int Voice::output() { // Multiply oscillator output with envelope output. return (wave.output() - wave_zero)*envelope.output(); } #endif // RESID_INLINING || defined(RESID_VOICE_CC) } // namespace reSID #endif // not RESID_VOICE_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/THANKS0000644000175100001770000001250614544470311020307 00000000000000reSID was written by Dag Lem. The project was started after reading an interview with Bob Yannes, the head engineer of the SID chip. This interview was made by Andreas Varga, with additional questions from Linus Walleij. The interview can be found on the SID Homepage: http://stud1.tuwien.ac.at/~e9426444/sidpage.html The reverse engineering of the SID chip would not have been possible without this interview. Also found on the SID Homepage is an examination of the SID noise waveform written by Asger Alstrup. This article was of great help in reverse engineering the complete algorithm for the noise waveform. Lars Haugseth has been invaluable in the testing of reSID. In a matter of hours after hearing about my project, he had completed a 6510 disassembler in Perl. The importance of this was not evident to me until the next day when he had disassembled the music routine for "Outrun Remix" by Geir Tjelta, made some changes to it, reassembled, and produced a file containing 48K of SID register values. The first tests of reSID were run on this file. With an exceptional memory of Commodore 64 tunes Lars Haugseth has pointed out several errors in reSID that are now corrected. Morten Rollan and Kre Gunnar Nesheim have provided interesting and insightful information regarding digital filters. Kre Gunnar Nesheim has also kindly provided a 1901 monitor and a C64C from his private computer museum. His C64C was used to measure the MOS8580 filter cutoff characteristics. VICE has been an inspiration for this project, and testing of reSID has been greatly simplified by VICEs -sounddev dump option. Teemu Rantanen has written support for reSID in VICE, making it possible to choose at runtime between his excellent SID emulation and, given enough CPU power, the reSID emulator engine. Tibor Biczo, Andreas Boose, and Andr Fachat have provided combined waveform samples for 6581 R1, R3, R4, and 8580 R5 SID chips. The VICE home page is found at: http://vice-emu.sourceforge.net/ The author of SIDPLAY, Michael Schwendt, has implemented a patch to link libsidplay with reSID. Using his excellent tune player he has pointed out several bugs in reSID. He has also provided invaluable information related to the bugs as basis for further investigation. Most notably, the infamous ADSR delay bug, of which I was previously unaware, has finally been understood and is now correctly implemented in reSID. The SIDPLAY home page is found at: http://www.geocities.com/SiliconValley/Lakes/5147/ A bug report from Daniel Lacasse led to the discovery of a previously unknown SID bug, the ADSR boundary bug. Anders degrd has explained aspects of analog electronics and audio equipment. Bob Yannes has patiently answered questions and has provided lots of technical information on the SID filter. Thank you Bob! Julius O. Smith III has provided much of the theoretical basis for the audio resampling with his "Digital Audio Resampling Home Page": http://www-ccrma.stanford.edu/~jos/resample/ Hrsfalvi, Levente has made a thorough investigation of the DC levels in the MOS6581 chip. His results are available in C= Hacking Issue #20, and form the basis of DC corrections in reSID. Levente found that each voice independently contributes to the DC level in the mixer. Note that some of the conclusions in the article are incorrect, as the maximum and minimum voice output levels are interchanged. The author of SIDPLAY2, Simon White, has given a lot of feedback on reSID. Most importantly he found and fixed a bug in the fast clock version of the ADSR emulation. Laurent Ovaert found and fixed a bug in the fast version of the noise register shift routine. Andreas Dehmel has reported all sorts of initialization and overflow errors. Laurent Ganier demonstrated two crucial techniques for vectorizable filter convolution in a patch. Firstly, he made the filter elements correspond to the sampling frequency, allowing the linear interpolation to be factorized out from the convolution. Secondly, he duplicated elements in the sample ring buffer, achieving contiguous storage of the samples. The current resampling implementation builds on these ideas, improving on them by using shifted filter tables for generalization and accuracy. Otto Jarvinen has made great contributions to SID emulation by thoroughly investigating and documenting the effects of the test bit on the noise waveform shift register, and the behavior of waveform 0. He has demonstrated how the test bit can be used to generate entirely new waveforms, and how waveform 0 can be used to generate 8-bit samples. Michael Huth has made high quality SID die photographs available, and Tommi Lempinen has done impressive work revectorizing and annotating these die photographs. The current level of accuracy in the emulation of the SID filter would not have been possible without the work of Michael and Tommi. Antti Lankila has worked tirelessly on improving SID emulation in his fork of reSID, resid-fp. He has, among other things, measured and described the main non-monotonous behavior of the SID 6581 D/A converters, measured and analyzed small-signal filter cutoff curves for several SID 6581 chips, and is always willing to help with analysis in the quest for ever improved SID emulation. He has also found and corrected a bug in the reSID resampling code. Finally I would like to thank my business partner Stian W. Arnesen for putting up with all this nonsense. libsidplayfp-2.6.0/src/builders/resid-builder/resid/sid.cc0000644000175100001770000010135014544470311020456 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_SID_CC #ifdef _M_ARM #undef _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE #define _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE 1 #endif #include "sid.h" #include #include #include using namespace std; #ifndef round #define round(x) (x>=0.0?floor(x+0.5):ceil(x-0.5)) #endif namespace reSID { inline short clip(int input) { // Saturated arithmetics to guard against 16 bit sample overflow. if (unlikely(input > 32767)) { return 32767; } if (unlikely(input < -32768)) { return -32768; } return (short)input; } // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- SID::SID() { // Initialize pointers. sample = 0; fir = 0; fir_N = 0; fir_RES = 0; fir_beta = 0; fir_f_cycles_per_sample = 0; fir_filter_scale = 0; sid_model = MOS6581; voice[0].set_sync_source(&voice[2]); voice[1].set_sync_source(&voice[0]); voice[2].set_sync_source(&voice[1]); set_sampling_parameters(985248, SAMPLE_FAST, 44100); bus_value = 0; bus_value_ttl = 0; write_pipeline = 0; databus_ttl = 0; raw_debug_output = false; } // ---------------------------------------------------------------------------- // Destructor. // ---------------------------------------------------------------------------- SID::~SID() { delete[] sample; delete[] fir; } // ---------------------------------------------------------------------------- // Set chip model. // ---------------------------------------------------------------------------- void SID::set_chip_model(chip_model model) { sid_model = model; /* results from real C64 (testprogs/SID/bitfade/delayfrq0.prg): (new SID) (250469/8580R5) (250469/8580R5) delayfrq0 ~7a000 ~108000 (old SID) (250407/6581) delayfrq0 ~01d00 */ databus_ttl = sid_model == MOS8580 ? 0xa2000 : 0x1d00; for (int i = 0; i < 3; i++) { voice[i].set_chip_model(model); } filter.set_chip_model(model); } // ---------------------------------------------------------------------------- // SID reset. // ---------------------------------------------------------------------------- void SID::reset() { for (int i = 0; i < 3; i++) { voice[i].reset(); } filter.reset(); extfilt.reset(); bus_value = 0; bus_value_ttl = 0; } // ---------------------------------------------------------------------------- // Write 16-bit sample to audio input. // Note that to mix in an external audio signal, the signal should be // resampled to 1MHz first to avoid sampling noise. // ---------------------------------------------------------------------------- void SID::input(short sample) { // The input can be used to simulate the MOS8580 "digi boost" hardware hack. filter.input(sample); } // ---------------------------------------------------------------------------- // Read registers. // // Reading a write only register returns the last byte written to any SID // register. The individual bits in this value start to fade down towards // zero after a few cycles. All bits reach zero within approximately // $2000 - $4000 cycles. // It has been claimed that this fading happens in an orderly fashion, however // sampling of write only registers reveals that this is not the case. // NB! This is not correctly modeled. // The actual use of write only registers has largely been made in the belief // that all SID registers are readable. To support this belief the read // would have to be done immediately after a write to the same register // (remember that an intermediate write to another register would yield that // value instead). With this in mind we return the last value written to // any SID register for $4000 cycles without modeling the bit fading. // ---------------------------------------------------------------------------- reg8 SID::read(reg8 offset) { switch (offset) { case 0x19: bus_value = potx.readPOT(); bus_value_ttl = databus_ttl; break; case 0x1a: bus_value = poty.readPOT(); bus_value_ttl = databus_ttl; break; case 0x1b: bus_value = voice[2].wave.readOSC(); bus_value_ttl = databus_ttl; break; case 0x1c: bus_value = voice[2].envelope.readENV(); bus_value_ttl = databus_ttl; break; } return bus_value; } // ---------------------------------------------------------------------------- // Write registers. // Writes are one cycle delayed on the MOS8580. This is only modeled for // single cycle clocking. // ---------------------------------------------------------------------------- void SID::write(reg8 offset, reg8 value) { write_address = offset; bus_value = value; bus_value_ttl = databus_ttl; if (unlikely(sampling == SAMPLE_FAST) && (sid_model == MOS8580)) { // Fake one cycle pipeline delay on the MOS8580 // when using non cycle accurate emulation. // This will make the SID detection method work. write_pipeline = 1; } else { write(); } } // ---------------------------------------------------------------------------- // Write registers. // ---------------------------------------------------------------------------- void SID::write() { switch (write_address) { case 0x00: voice[0].wave.writeFREQ_LO(bus_value); break; case 0x01: voice[0].wave.writeFREQ_HI(bus_value); break; case 0x02: voice[0].wave.writePW_LO(bus_value); break; case 0x03: voice[0].wave.writePW_HI(bus_value); break; case 0x04: voice[0].writeCONTROL_REG(bus_value); break; case 0x05: voice[0].envelope.writeATTACK_DECAY(bus_value); break; case 0x06: voice[0].envelope.writeSUSTAIN_RELEASE(bus_value); break; case 0x07: voice[1].wave.writeFREQ_LO(bus_value); break; case 0x08: voice[1].wave.writeFREQ_HI(bus_value); break; case 0x09: voice[1].wave.writePW_LO(bus_value); break; case 0x0a: voice[1].wave.writePW_HI(bus_value); break; case 0x0b: voice[1].writeCONTROL_REG(bus_value); break; case 0x0c: voice[1].envelope.writeATTACK_DECAY(bus_value); break; case 0x0d: voice[1].envelope.writeSUSTAIN_RELEASE(bus_value); break; case 0x0e: voice[2].wave.writeFREQ_LO(bus_value); break; case 0x0f: voice[2].wave.writeFREQ_HI(bus_value); break; case 0x10: voice[2].wave.writePW_LO(bus_value); break; case 0x11: voice[2].wave.writePW_HI(bus_value); break; case 0x12: voice[2].writeCONTROL_REG(bus_value); break; case 0x13: voice[2].envelope.writeATTACK_DECAY(bus_value); break; case 0x14: voice[2].envelope.writeSUSTAIN_RELEASE(bus_value); break; case 0x15: filter.writeFC_LO(bus_value); break; case 0x16: filter.writeFC_HI(bus_value); break; case 0x17: filter.writeRES_FILT(bus_value); break; case 0x18: filter.writeMODE_VOL(bus_value); break; default: break; } // Tell clock() that the pipeline is empty. write_pipeline = 0; } // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- SID::State::State() { int i; for (i = 0; i < 0x20; i++) { sid_register[i] = 0; } bus_value = 0; bus_value_ttl = 0; write_pipeline = 0; write_address = 0; voice_mask = 0xff; for (i = 0; i < 3; i++) { accumulator[i] = 0; shift_register[i] = 0x7fffff; shift_register_reset[i] = 0; shift_pipeline[i] = 0; pulse_output[i] = 0; floating_output_ttl[i] = 0; rate_counter[i] = 0; rate_counter_period[i] = 9; exponential_counter[i] = 0; exponential_counter_period[i] = 1; envelope_counter[i] = 0; envelope_state[i] = EnvelopeGenerator::RELEASE; hold_zero[i] = true; envelope_pipeline[i] = 0; } } // ---------------------------------------------------------------------------- // Read state. // ---------------------------------------------------------------------------- SID::State SID::read_state() { State state; int i, j; for (i = 0, j = 0; i < 3; i++, j += 7) { WaveformGenerator& wave = voice[i].wave; EnvelopeGenerator& envelope = voice[i].envelope; state.sid_register[j + 0] = wave.freq & 0xff; state.sid_register[j + 1] = wave.freq >> 8; state.sid_register[j + 2] = wave.pw & 0xff; state.sid_register[j + 3] = wave.pw >> 8; state.sid_register[j + 4] = (wave.waveform << 4) | (wave.test ? 0x08 : 0) | (wave.ring_mod ? 0x04 : 0) | (wave.sync ? 0x02 : 0) | (envelope.gate ? 0x01 : 0); state.sid_register[j + 5] = (envelope.attack << 4) | envelope.decay; state.sid_register[j + 6] = (envelope.sustain << 4) | envelope.release; } state.sid_register[j++] = filter.fc & 0x007; state.sid_register[j++] = filter.fc >> 3; state.sid_register[j++] = (filter.res << 4) | filter.filt; state.sid_register[j++] = filter.mode | filter.vol; // These registers are superfluous, but are included for completeness. for (; j < 0x1d; j++) { state.sid_register[j] = read(j); } for (; j < 0x20; j++) { state.sid_register[j] = 0; } state.bus_value = bus_value; state.bus_value_ttl = bus_value_ttl; state.write_pipeline = write_pipeline; state.write_address = write_address; state.voice_mask = filter.voice_mask; for (i = 0; i < 3; i++) { state.accumulator[i] = voice[i].wave.accumulator; state.shift_register[i] = voice[i].wave.shift_register; state.shift_register_reset[i] = voice[i].wave.shift_register_reset; state.shift_pipeline[i] = voice[i].wave.shift_pipeline; state.pulse_output[i] = voice[i].wave.pulse_output; state.floating_output_ttl[i] = voice[i].wave.floating_output_ttl; state.rate_counter[i] = voice[i].envelope.rate_counter; state.rate_counter_period[i] = voice[i].envelope.rate_period; state.exponential_counter[i] = voice[i].envelope.exponential_counter; state.exponential_counter_period[i] = voice[i].envelope.exponential_counter_period; state.envelope_counter[i] = voice[i].envelope.envelope_counter; state.envelope_state[i] = voice[i].envelope.state; state.hold_zero[i] = voice[i].envelope.hold_zero; state.envelope_pipeline[i] = voice[i].envelope.envelope_pipeline; } return state; } // ---------------------------------------------------------------------------- // Write state. // ---------------------------------------------------------------------------- void SID::write_state(const State& state) { int i; sampling_method tmp; /* HACK: remember sampling mode and set it to resampling incase it was fast, else the write() call will not work correctly */ tmp = sampling; if (unlikely(sampling == SAMPLE_FAST) && (sid_model == MOS8580)) { sampling = SAMPLE_RESAMPLE; } for (i = 0; i <= 0x18; i++) { write(i, state.sid_register[i]); } sampling = tmp; /* restore original mode */ bus_value = state.bus_value; bus_value_ttl = state.bus_value_ttl; write_pipeline = state.write_pipeline; write_address = state.write_address; filter.set_voice_mask(state.voice_mask); for (i = 0; i < 3; i++) { voice[i].wave.accumulator = state.accumulator[i]; voice[i].wave.shift_register = state.shift_register[i]; voice[i].wave.shift_register_reset = state.shift_register_reset[i]; voice[i].wave.shift_pipeline = state.shift_pipeline[i]; voice[i].wave.pulse_output = state.pulse_output[i]; voice[i].wave.floating_output_ttl = state.floating_output_ttl[i]; voice[i].envelope.rate_counter = state.rate_counter[i]; voice[i].envelope.rate_period = state.rate_counter_period[i]; voice[i].envelope.exponential_counter = state.exponential_counter[i]; voice[i].envelope.exponential_counter_period = state.exponential_counter_period[i]; voice[i].envelope.envelope_counter = state.envelope_counter[i]; voice[i].envelope.state = state.envelope_state[i]; voice[i].envelope.hold_zero = state.hold_zero[i]; voice[i].envelope.envelope_pipeline = state.envelope_pipeline[i]; } } // ---------------------------------------------------------------------------- // Mask for voices routed into the filter / audio output stage. // Used to physically connect/disconnect EXT IN, and for test purposed // (voice muting). // ---------------------------------------------------------------------------- void SID::set_voice_mask(reg4 mask) { filter.set_voice_mask(mask); } // ---------------------------------------------------------------------------- // Enable filter. // ---------------------------------------------------------------------------- void SID::enable_filter(bool enable) { filter.enable_filter(enable); } // ---------------------------------------------------------------------------- // Adjust the DAC bias parameter of the filter. // This gives user variable control of the exact CF -> center frequency // mapping used by the filter. // The setting is currently only effective for 6581. // ---------------------------------------------------------------------------- void SID::adjust_filter_bias(double dac_bias) { filter.adjust_filter_bias(dac_bias); } // ---------------------------------------------------------------------------- // Enable external filter. // ---------------------------------------------------------------------------- void SID::enable_external_filter(bool enable) { extfilt.enable_filter(enable); } // ---------------------------------------------------------------------------- // write raw output to a file // ---------------------------------------------------------------------------- void SID::debugoutput(void) { static int recording = -1; static ofstream myFile; static int lastn; int n = filter.output(); if (recording == -1) { /* the first call opens the file */ recording = 0; myFile.open ("resid.raw", ios::out | ios::binary); lastn = n; std::cout << "reSID: waiting for output to change..." << std::endl; } else if ((recording == 0) && (lastn != n)) { /* start recording when the reSID output changes */ recording = 1; std::cout << "reSID: starting recording..." << std::endl; } /* write 16bit little endian signed data */ if (recording) { myFile.put(n & 0xff); myFile.put((n >> 8) & 0xff); } } // ---------------------------------------------------------------------------- // Enable raw debug output // ---------------------------------------------------------------------------- void SID::enable_raw_debug_output(bool enable) { raw_debug_output = enable; if (enable) { std::cout << "reSID: raw output enabled." << std::endl; } } // ---------------------------------------------------------------------------- // I0() computes the 0th order modified Bessel function of the first kind. // This function is originally from resample-1.5/filterkit.c by J. O. Smith. // ---------------------------------------------------------------------------- double SID::I0(double x) { // Max error acceptable in I0. const double I0e = 1e-6; double sum, u, halfx, temp; int n; sum = u = n = 1; halfx = x/2.0; do { temp = halfx/n++; u *= temp*temp; sum += u; } while (u >= I0e*sum); return sum; } // ---------------------------------------------------------------------------- // Setting of SID sampling parameters. // // Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. // The default end of passband frequency is pass_freq = 0.9*sample_freq/2 // for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample // frequencies. // // For resampling, the ratio between the clock frequency and the sample // frequency is limited as follows: // 125*clock_freq/sample_freq < 16384 // E.g. provided a clock frequency of ~ 1MHz, the sample frequency can not // be set lower than ~ 8kHz. A lower sample frequency would make the // resampling code overfill its 16k sample ring buffer. // // The end of passband frequency is also limited: // pass_freq <= 0.9*sample_freq/2 // E.g. for a 44.1kHz sampling rate the end of passband frequency is limited // to slightly below 20kHz. This constraint ensures that the FIR table is // not overfilled. // ---------------------------------------------------------------------------- bool SID::set_sampling_parameters(double clock_freq, sampling_method method, double sample_freq, double pass_freq, double filter_scale) { // Check resampling constraints. if (method == SAMPLE_RESAMPLE || method == SAMPLE_RESAMPLE_FASTMEM) { // Check whether the sample ring buffer would overfill. if (FIR_N*clock_freq/sample_freq >= RINGSIZE) { return false; } // The default passband limit is 0.9*sample_freq/2 for sample // frequencies below ~ 44.1kHz, and 20kHz for higher sample frequencies. if (pass_freq < 0) { pass_freq = 20000; if (2*pass_freq/sample_freq >= 0.9) { pass_freq = 0.9*sample_freq/2; } } // Check whether the FIR table would overfill. else if (pass_freq > 0.9*sample_freq/2) { return false; } // The filter scaling is only included to avoid clipping, so keep // it sane. if (filter_scale < 0.9 || filter_scale > 1.0) { return false; } } clock_frequency = clock_freq; sampling = method; cycles_per_sample = cycle_count(clock_freq/sample_freq*(1 << FIXP_SHIFT) + 0.5); sample_offset = 0; sample_prev = 0; sample_now = 0; // FIR initialization is only necessary for resampling. if (method != SAMPLE_RESAMPLE && method != SAMPLE_RESAMPLE_FASTMEM) { delete[] sample; delete[] fir; sample = 0; fir = 0; return true; } // Allocate sample buffer. if (!sample) { sample = new short[RINGSIZE*2]; } // Clear sample buffer. for (int j = 0; j < RINGSIZE*2; j++) { sample[j] = 0; } sample_index = 0; const double pi = 3.1415926535897932385; // 16 bits -> -96dB stopband attenuation. const double A = -20*log10(1.0/(1 << 16)); // A fraction of the bandwidth is allocated to the transition band, double dw = (1 - 2*pass_freq/sample_freq)*pi*2; // The cutoff frequency is midway through the transition band (nyquist) double wc = pi; // For calculation of beta and N see the reference for the kaiserord // function in the MATLAB Signal Processing Toolbox: // http://www.mathworks.com/access/helpdesk/help/toolbox/signal/kaiserord.html const double beta = 0.1102*(A - 8.7); const double I0beta = I0(beta); // The filter order will maximally be 124 with the current constraints. // N >= (96.33 - 7.95)/(2.285*0.1*pi) -> N >= 123 // The filter order is equal to the number of zero crossings, i.e. // it should be an even number (sinc is symmetric about x = 0). int N = int((A - 7.95)/(2.285*dw) + 0.5); N += N & 1; double f_samples_per_cycle = sample_freq/clock_freq; double f_cycles_per_sample = clock_freq/sample_freq; // The filter length is equal to the filter order + 1. // The filter length must be an odd number (sinc is symmetric about x = 0). int fir_N_new = int(N*f_cycles_per_sample) + 1; fir_N_new |= 1; // We clamp the filter table resolution to 2^n, making the fixed point // sample_offset a whole multiple of the filter table resolution. int res = method == SAMPLE_RESAMPLE ? FIR_RES : FIR_RES_FASTMEM; int n = (int)ceil(log(res/f_cycles_per_sample)/log(2.0f)); int fir_RES_new = 1 << n; /* Determine if we need to recalculate table, or whether we can reuse earlier cached copy. * This pays off on slow hardware such as current Android devices. */ if (fir && fir_RES_new == fir_RES && fir_N_new == fir_N && beta == fir_beta && f_cycles_per_sample == fir_f_cycles_per_sample && fir_filter_scale == filter_scale) { return true; } fir_RES = fir_RES_new; fir_N = fir_N_new; fir_beta = beta; fir_f_cycles_per_sample = f_cycles_per_sample; fir_filter_scale = filter_scale; // Allocate memory for FIR tables. delete[] fir; fir = new short[fir_N*fir_RES]; // Calculate fir_RES FIR tables for linear interpolation. for (int i = 0; i < fir_RES; i++) { int fir_offset = i*fir_N + fir_N/2; double j_offset = double(i)/fir_RES; // Calculate FIR table. This is the sinc function, weighted by the // Kaiser window. for (int j = -fir_N/2; j <= fir_N/2; j++) { double jx = j - j_offset; double wt = wc*jx/f_cycles_per_sample; double temp = jx/(fir_N/2); double Kaiser = fabs(temp) <= 1 ? I0(beta*sqrt(1 - temp*temp))/I0beta : 0; double sincwt = fabs(wt) >= 1e-6 ? sin(wt)/wt : 1; double val = (1 << FIR_SHIFT)*filter_scale*f_samples_per_cycle*wc/pi*sincwt*Kaiser; fir[fir_offset + j] = (short)round(val); } } return true; } // ---------------------------------------------------------------------------- // Adjustment of SID sampling frequency. // // In some applications, e.g. a C64 emulator, it can be desirable to // synchronize sound with a timer source. This is supported by adjustment of // the SID sampling frequency. // // NB! Adjustment of the sampling frequency may lead to noticeable shifts in // frequency, and should only be used for interactive applications. Note also // that any adjustment of the sampling frequency will change the // characteristics of the resampling filter, since the filter is not rebuilt. // ---------------------------------------------------------------------------- void SID::adjust_sampling_frequency(double sample_freq) { cycles_per_sample = cycle_count(clock_frequency/sample_freq*(1 << FIXP_SHIFT) + 0.5); } // ---------------------------------------------------------------------------- // SID clocking - delta_t cycles. // ---------------------------------------------------------------------------- void SID::clock(cycle_count delta_t) { int i; // Pipelined writes on the MOS8580. if (unlikely(write_pipeline) && likely(delta_t > 0)) { // Step one cycle by a recursive call to ourselves. write_pipeline = 0; clock(1); write(); delta_t -= 1; } if (unlikely(delta_t <= 0)) { return; } // Age bus value. bus_value_ttl -= delta_t; if (unlikely(bus_value_ttl <= 0)) { bus_value = 0; bus_value_ttl = 0; } // Clock amplitude modulators. for (i = 0; i < 3; i++) { voice[i].envelope.clock(delta_t); } // Clock and synchronize oscillators. // Loop until we reach the current cycle. cycle_count delta_t_osc = delta_t; while (delta_t_osc) { cycle_count delta_t_min = delta_t_osc; // Find minimum number of cycles to an oscillator accumulator MSB toggle. // We have to clock on each MSB on / MSB off for hard sync to operate // correctly. for (i = 0; i < 3; i++) { WaveformGenerator& wave = voice[i].wave; // It is only necessary to clock on the MSB of an oscillator that is // a sync source and has freq != 0. if (likely(!(wave.sync_dest->sync && wave.freq))) { continue; } reg16 freq = wave.freq; reg24 accumulator = wave.accumulator; // Clock on MSB off if MSB is on, clock on MSB on if MSB is off. reg24 delta_accumulator = (accumulator & 0x800000 ? 0x1000000 : 0x800000) - accumulator; cycle_count delta_t_next = delta_accumulator/freq; if (likely(delta_accumulator%freq)) { ++delta_t_next; } if (unlikely(delta_t_next < delta_t_min)) { delta_t_min = delta_t_next; } } // Clock oscillators. for (i = 0; i < 3; i++) { voice[i].wave.clock(delta_t_min); } // Synchronize oscillators. for (i = 0; i < 3; i++) { voice[i].wave.synchronize(); } delta_t_osc -= delta_t_min; } // Calculate waveform output. for (i = 0; i < 3; i++) { voice[i].wave.set_waveform_output(delta_t); } // Clock filter. filter.clock(delta_t, voice[0].output(), voice[1].output(), voice[2].output()); // Clock external filter. extfilt.clock(delta_t, filter.output()); } // ---------------------------------------------------------------------------- // SID clocking with audio sampling. // Fixed point arithmetics are used. // // The example below shows how to clock the SID a specified amount of cycles // while producing audio output: // // while (delta_t) { // bufindex += sid.clock(delta_t, buf + bufindex, buflength - bufindex); // write(dsp, buf, bufindex*2); // bufindex = 0; // } // // ---------------------------------------------------------------------------- int SID::clock(cycle_count& delta_t, short* buf, int n, int interleave) { switch (sampling) { default: case SAMPLE_FAST: return clock_fast(delta_t, buf, n, interleave); case SAMPLE_INTERPOLATE: return clock_interpolate(delta_t, buf, n, interleave); case SAMPLE_RESAMPLE: return clock_resample(delta_t, buf, n, interleave); case SAMPLE_RESAMPLE_FASTMEM: return clock_resample_fastmem(delta_t, buf, n, interleave); } } // ---------------------------------------------------------------------------- // SID clocking with audio sampling - delta clocking picking nearest sample. // ---------------------------------------------------------------------------- int SID::clock_fast(cycle_count& delta_t, short* buf, int n, int interleave) { int s; for (s = 0; s < n; s++) { cycle_count next_sample_offset = sample_offset + cycles_per_sample + (1 << (FIXP_SHIFT - 1)); cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; if (delta_t_sample > delta_t) { delta_t_sample = delta_t; } clock(delta_t_sample); if ((delta_t -= delta_t_sample) == 0) { sample_offset -= delta_t_sample << FIXP_SHIFT; break; } sample_offset = (next_sample_offset & FIXP_MASK) - (1 << (FIXP_SHIFT - 1)); buf[s*interleave] = output(); } return s; } // ---------------------------------------------------------------------------- // SID clocking with audio sampling - cycle based with linear sample // interpolation. // // Here the chip is clocked every cycle. This yields higher quality // sound since the samples are linearly interpolated, and since the // external filter attenuates frequencies above 16kHz, thus reducing // sampling noise. // ---------------------------------------------------------------------------- int SID::clock_interpolate(cycle_count& delta_t, short* buf, int n, int interleave) { int s; for (s = 0; s < n; s++) { cycle_count next_sample_offset = sample_offset + cycles_per_sample; cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; if (delta_t_sample > delta_t) { delta_t_sample = delta_t; } for (int i = delta_t_sample; i > 0; i--) { clock(); if (unlikely(i <= 2)) { sample_prev = sample_now; sample_now = output(); } } if ((delta_t -= delta_t_sample) == 0) { sample_offset -= delta_t_sample << FIXP_SHIFT; break; } sample_offset = next_sample_offset & FIXP_MASK; buf[s*interleave] = sample_prev + (sample_offset*(sample_now - sample_prev) >> FIXP_SHIFT); } return s; } // ---------------------------------------------------------------------------- // SID clocking with audio sampling - cycle based with audio resampling. // // This is the theoretically correct (and computationally intensive) audio // sample generation. The samples are generated by resampling to the specified // sampling frequency. The work rate is inversely proportional to the // percentage of the bandwidth allocated to the filter transition band. // // This implementation is based on the paper "A Flexible Sampling-Rate // Conversion Method", by J. O. Smith and P. Gosset, or rather on the // expanded tutorial on the "Digital Audio Resampling Home Page": // http://www-ccrma.stanford.edu/~jos/resample/ // // By building shifted FIR tables with samples according to the // sampling frequency, the implementation below dramatically reduces the // computational effort in the filter convolutions, without any loss // of accuracy. The filter convolutions are also vectorizable on // current hardware. // // Further possible optimizations are: // * An equiripple filter design could yield a lower filter order, see // http://www.mwrf.com/Articles/ArticleID/7229/7229.html // * The Convolution Theorem could be used to bring the complexity of // convolution down from O(n*n) to O(n*log(n)) using the Fast Fourier // Transform, see http://en.wikipedia.org/wiki/Convolution_theorem // * Simply resampling in two steps can also yield computational // savings, since the transition band will be wider in the first step // and the required filter order is thus lower in this step. // Laurent Ganier has found the optimal intermediate sampling frequency // to be (via derivation of sum of two steps): // 2 * pass_freq + sqrt [ 2 * pass_freq * orig_sample_freq // * (dest_sample_freq - 2 * pass_freq) / dest_sample_freq ] // // NB! the result of right shifting negative numbers is really // implementation dependent in the C++ standard. // ---------------------------------------------------------------------------- int SID::clock_resample(cycle_count& delta_t, short* buf, int n, int interleave) { int s; for (s = 0; s < n; s++) { cycle_count next_sample_offset = sample_offset + cycles_per_sample; cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; if (delta_t_sample > delta_t) { delta_t_sample = delta_t; } for (int i = 0; i < delta_t_sample; i++) { clock(); sample[sample_index] = sample[sample_index + RINGSIZE] = clip(output()); ++sample_index &= RINGMASK; } if ((delta_t -= delta_t_sample) == 0) { sample_offset -= delta_t_sample << FIXP_SHIFT; break; } sample_offset = next_sample_offset & FIXP_MASK; int fir_offset = sample_offset*fir_RES >> FIXP_SHIFT; int fir_offset_rmd = sample_offset*fir_RES & FIXP_MASK; short* fir_start = fir + fir_offset*fir_N; short* sample_start = sample + sample_index - fir_N - 1 + RINGSIZE; // Convolution with filter impulse response. int v1 = 0; for (int j = 0; j < fir_N; j++) { v1 += sample_start[j]*fir_start[j]; } // Use next FIR table, wrap around to first FIR table using // next sample. if (unlikely(++fir_offset == fir_RES)) { fir_offset = 0; ++sample_start; } fir_start = fir + fir_offset*fir_N; // Convolution with filter impulse response. int v2 = 0; for (int k = 0; k < fir_N; k++) { v2 += sample_start[k]*fir_start[k]; } // Linear interpolation. // fir_offset_rmd is equal for all samples, it can thus be factorized out: // sum(v1 + rmd*(v2 - v1)) = sum(v1) + rmd*(sum(v2) - sum(v1)) int v = v1 + int((unsigned(fir_offset_rmd)*unsigned(v2 - v1)) >> FIXP_SHIFT); v >>= FIR_SHIFT; buf[s*interleave] = clip(v); } return s; } // ---------------------------------------------------------------------------- // SID clocking with audio sampling - cycle based with audio resampling. // ---------------------------------------------------------------------------- int SID::clock_resample_fastmem(cycle_count& delta_t, short* buf, int n, int interleave) { int s; for (s = 0; s < n; s++) { cycle_count next_sample_offset = sample_offset + cycles_per_sample; cycle_count delta_t_sample = next_sample_offset >> FIXP_SHIFT; if (delta_t_sample > delta_t) { delta_t_sample = delta_t; } for (int i = 0; i < delta_t_sample; i++) { clock(); sample[sample_index] = sample[sample_index + RINGSIZE] = output(); ++sample_index &= RINGMASK; } if ((delta_t -= delta_t_sample) == 0) { sample_offset -= delta_t_sample << FIXP_SHIFT; break; } sample_offset = next_sample_offset & FIXP_MASK; int fir_offset = sample_offset*fir_RES >> FIXP_SHIFT; short* fir_start = fir + fir_offset*fir_N; short* sample_start = sample + sample_index - fir_N + RINGSIZE; // Convolution with filter impulse response. int v = 0; for (int j = 0; j < fir_N; j++) { v += sample_start[j]*fir_start[j]; } v >>= FIR_SHIFT; buf[s*interleave] = clip(v); } return s; } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/siddefs.h.in0000644000175100001770000000541714544470311021576 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_SIDDEFS_H #define RESID_SIDDEFS_H // Compilation configuration. #define RESID_INLINING @RESID_INLINING@ #define RESID_INLINE @RESID_INLINE@ #define RESID_BRANCH_HINTS @RESID_BRANCH_HINTS@ #define NEW_8580_FILTER @NEW_8580_FILTER@ // Compiler specifics. #define HAVE_BOOL @HAVE_BOOL@ #define HAVE_BUILTIN_EXPECT @HAVE_BUILTIN_EXPECT@ #define HAVE_LOG1P @HAVE_LOG1P@ // Define bool, true, and false for C++ compilers that lack these keywords. #if !HAVE_BOOL typedef int bool; const bool true = 1; const bool false = 0; #endif #if HAVE_LOG1P #define HAS_LOG1P #endif // Branch prediction macros, lifted off the Linux kernel. #if RESID_BRANCH_HINTS && HAVE_BUILTIN_EXPECT #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else #define likely(x) (x) #define unlikely(x) (x) #endif namespace reSID { // We could have used the smallest possible data type for each SID register, // however this would give a slower engine because of data type conversions. // An int is assumed to be at least 32 bits (necessary in the types reg24 // and cycle_count). GNU does not support 16-bit machines // (GNU Coding Standards: Portability between CPUs), so this should be // a valid assumption. typedef unsigned int reg4; typedef unsigned int reg8; typedef unsigned int reg12; typedef unsigned int reg16; typedef unsigned int reg24; typedef int cycle_count; typedef short short_point[2]; typedef double double_point[2]; enum chip_model { MOS6581, MOS8580 }; enum sampling_method { SAMPLE_FAST, SAMPLE_INTERPOLATE, SAMPLE_RESAMPLE, SAMPLE_RESAMPLE_FASTMEM }; } // namespace reSID extern "C" { #ifndef RESID_VERSION_CC extern const char* resid_version_string; #else const char* resid_version_string = VERSION; #endif } #endif // not RESID_SIDDEFS_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/version.cc0000644000175100001770000000203514544470311021364 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_VERSION_CC #include "resid-config.h" libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581__ST.dat0000644000175100001770000001000014544470311022104 00000000000000??8888888888888888<<<<<<<<>>????8888888888888888<<<<<<<<>>??libsidplayfp-2.6.0/src/builders/resid-builder/resid/pot.h0000644000175100001770000000222114544470311020340 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_POT_H #define RESID_POT_H #include "resid-config.h" namespace reSID { class Potentiometer { public: reg8 readPOT(); }; } // namespace reSID #endif libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave.h0000644000175100001770000005225714544470311020516 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_WAVE_H #define RESID_WAVE_H #include "resid-config.h" namespace reSID { // ---------------------------------------------------------------------------- // A 24 bit accumulator is the basis for waveform generation. FREQ is added to // the lower 16 bits of the accumulator each cycle. // The accumulator is set to zero when TEST is set, and starts counting // when TEST is cleared. // The noise waveform is taken from intermediate bits of a 23 bit shift // register. This register is clocked by bit 19 of the accumulator. // ---------------------------------------------------------------------------- class WaveformGenerator { public: WaveformGenerator(); void set_sync_source(WaveformGenerator*); void set_chip_model(chip_model model); void clock(); void clock(cycle_count delta_t); void synchronize(); void reset(); void writeFREQ_LO(reg8); void writeFREQ_HI(reg8); void writePW_LO(reg8); void writePW_HI(reg8); void writeCONTROL_REG(reg8); reg8 readOSC(); // 12-bit waveform output. short output(); // Calculate and set waveform output value. void set_waveform_output(); void set_waveform_output(cycle_count delta_t); protected: void clock_shift_register(); void write_shift_register(); void set_noise_output(); void wave_bitfade(); void shiftreg_bitfade(); const WaveformGenerator* sync_source; WaveformGenerator* sync_dest; reg24 accumulator; // Tell whether the accumulator MSB was set high on this cycle. bool msb_rising; // Fout = (Fn*Fclk/16777216)Hz // reg16 freq; reg24 freq; // PWout = (PWn/40.95)% reg12 pw; reg24 shift_register; // Remaining time to fully reset shift register. cycle_count shift_register_reset; // Emulation of pipeline causing bit 19 to clock the shift register. cycle_count shift_pipeline; // Helper variables for waveform table lookup. reg24 ring_msb_mask; unsigned short no_noise; unsigned short noise_output; unsigned short no_noise_or_noise_output; unsigned short no_pulse; unsigned short pulse_output; // The control register right-shifted 4 bits; used for waveform table lookup. reg8 waveform; // 8580 tri/saw pipeline reg12 tri_saw_pipeline; reg12 osc3; // The remaining control register bits. reg8 test; reg8 ring_mod; reg8 sync; // The gate bit is handled by the EnvelopeGenerator. // DAC input. reg12 waveform_output; // Fading time for floating DAC input (waveform 0). cycle_count floating_output_ttl; chip_model sid_model; // Sample data for waveforms, not including noise. unsigned short* wave; static unsigned short model_wave[2][8][1 << 12]; // DAC lookup tables. static unsigned short model_dac[2][1 << 12]; friend class Voice; friend class SID; }; // ---------------------------------------------------------------------------- // Inline functions. // The following functions are defined inline because they are called every // time a sample is calculated. // ---------------------------------------------------------------------------- #if RESID_INLINING || defined(RESID_WAVE_CC) // ---------------------------------------------------------------------------- // SID clocking - 1 cycle. // ---------------------------------------------------------------------------- RESID_INLINE void WaveformGenerator::clock() { if (unlikely(test)) { // Count down time to fully reset shift register. if (unlikely(shift_register_reset) && unlikely(!--shift_register_reset)) { shiftreg_bitfade(); } // The test bit sets pulse high. pulse_output = 0xfff; } else { // Calculate new accumulator value; reg24 accumulator_next = (accumulator + freq) & 0xffffff; reg24 accumulator_bits_set = ~accumulator & accumulator_next; accumulator = accumulator_next; // Check whether the MSB is set high. This is used for synchronization. msb_rising = (accumulator_bits_set & 0x800000) ? true : false; // Shift noise register once for each time accumulator bit 19 is set high. // The shift is delayed 2 cycles. if (unlikely(accumulator_bits_set & 0x080000)) { // Pipeline: Detect rising bit, shift phase 1, shift phase 2. shift_pipeline = 2; } else if (unlikely(shift_pipeline) && !--shift_pipeline) { clock_shift_register(); } } } // ---------------------------------------------------------------------------- // SID clocking - delta_t cycles. // ---------------------------------------------------------------------------- RESID_INLINE void WaveformGenerator::clock(cycle_count delta_t) { if (unlikely(test)) { // Count down time to fully reset shift register. if (shift_register_reset) { shift_register_reset -= delta_t; if (unlikely(shift_register_reset <= 0)) { shift_register = 0x7fffff; shift_register_reset = 0; // New noise waveform output. set_noise_output(); } } // The test bit sets pulse high. pulse_output = 0xfff; } else { // Calculate new accumulator value; reg24 delta_accumulator = delta_t*freq; reg24 accumulator_next = (accumulator + delta_accumulator) & 0xffffff; reg24 accumulator_bits_set = ~accumulator & accumulator_next; accumulator = accumulator_next; // Check whether the MSB is set high. This is used for synchronization. msb_rising = (accumulator_bits_set & 0x800000) ? true : false; // NB! Any pipelined shift register clocking from single cycle clocking // will be lost. It is not worth the trouble to flush the pipeline here. // Shift noise register once for each time accumulator bit 19 is set high. // Bit 19 is set high each time 2^20 (0x100000) is added to the accumulator. reg24 shift_period = 0x100000; while (delta_accumulator) { if (likely(delta_accumulator < shift_period)) { shift_period = delta_accumulator; // Determine whether bit 19 is set on the last period. // NB! Requires two's complement integer. if (likely(shift_period <= 0x080000)) { // Check for flip from 0 to 1. if (((accumulator - shift_period) & 0x080000) || !(accumulator & 0x080000)) { break; } } else { // Check for flip from 0 (to 1 or via 1 to 0) or from 1 via 0 to 1. if (((accumulator - shift_period) & 0x080000) && !(accumulator & 0x080000)) { break; } } } // Shift the noise/random register. // NB! The two-cycle pipeline delay is only modeled for 1 cycle clocking. clock_shift_register(); delta_accumulator -= shift_period; } // Calculate pulse high/low. // NB! The one-cycle pipeline delay is only modeled for 1 cycle clocking. pulse_output = (accumulator >> 12) >= pw ? 0xfff : 0x000; } } // ---------------------------------------------------------------------------- // Synchronize oscillators. // This must be done after all the oscillators have been clock()'ed since the // oscillators operate in parallel. // Note that the oscillators must be clocked exactly on the cycle when the // MSB is set high for hard sync to operate correctly. See SID::clock(). // ---------------------------------------------------------------------------- RESID_INLINE void WaveformGenerator::synchronize() { // A special case occurs when a sync source is synced itself on the same // cycle as when its MSB is set high. In this case the destination will // not be synced. This has been verified by sampling OSC3. if (unlikely(msb_rising) && sync_dest->sync && !(sync && sync_source->msb_rising)) { sync_dest->accumulator = 0; } } // ---------------------------------------------------------------------------- // Waveform output. // The output from SID 8580 is delayed one cycle compared to SID 6581; // this is only modeled for single cycle clocking (see sid.cc). // ---------------------------------------------------------------------------- // No waveform: // When no waveform is selected, the DAC input is floating. // // Triangle: // The upper 12 bits of the accumulator are used. // The MSB is used to create the falling edge of the triangle by inverting // the lower 11 bits. The MSB is thrown away and the lower 11 bits are // left-shifted (half the resolution, full amplitude). // Ring modulation substitutes the MSB with MSB EOR NOT sync_source MSB. // // Sawtooth: // The output is identical to the upper 12 bits of the accumulator. // // Pulse: // The upper 12 bits of the accumulator are used. // These bits are compared to the pulse width register by a 12 bit digital // comparator; output is either all one or all zero bits. // The pulse setting is delayed one cycle after the compare; this is only // modeled for single cycle clocking. // // The test bit, when set to one, holds the pulse waveform output at 0xfff // regardless of the pulse width setting. // // Noise: // The noise output is taken from intermediate bits of a 23-bit shift register // which is clocked by bit 19 of the accumulator. // The shift is delayed 2 cycles after bit 19 is set high; this is only // modeled for single cycle clocking. // // Operation: Calculate EOR result, shift register, set bit 0 = result. // // reset ------------------------------------------- // | | | // test--OR-->EOR<-- | // | | | // 2 2 2 1 1 1 1 1 1 1 1 1 1 | // Register bits: 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 <--- // | | | | | | | | // Waveform bits: 1 1 9 8 7 6 5 4 // 1 0 // // The low 4 waveform bits are zero (grounded). // RESID_INLINE void WaveformGenerator::clock_shift_register() { // bit0 = (bit22 | test) ^ bit17 reg24 bit0 = ((shift_register >> 22) ^ (shift_register >> 17)) & 0x1; shift_register = ((shift_register << 1) | bit0) & 0x7fffff; // New noise waveform output. set_noise_output(); } RESID_INLINE void WaveformGenerator::write_shift_register() { // Write changes to the shift register output caused by combined waveforms // back into the shift register. // A bit once set to zero cannot be changed, hence the and'ing. // FIXME: Write test program to check the effect of 1 bits and whether // neighboring bits are affected. shift_register &= ~((1<<20)|(1<<18)|(1<<14)|(1<<11)|(1<<9)|(1<<5)|(1<<2)|(1<<0)) | ((waveform_output & 0x800) << 9) | // Bit 11 -> bit 20 ((waveform_output & 0x400) << 8) | // Bit 10 -> bit 18 ((waveform_output & 0x200) << 5) | // Bit 9 -> bit 14 ((waveform_output & 0x100) << 3) | // Bit 8 -> bit 11 ((waveform_output & 0x080) << 2) | // Bit 7 -> bit 9 ((waveform_output & 0x040) >> 1) | // Bit 6 -> bit 5 ((waveform_output & 0x020) >> 3) | // Bit 5 -> bit 2 ((waveform_output & 0x010) >> 4); // Bit 4 -> bit 0 noise_output &= waveform_output; no_noise_or_noise_output = no_noise | noise_output; } RESID_INLINE void WaveformGenerator::set_noise_output() { noise_output = ((shift_register & 0x100000) >> 9) | ((shift_register & 0x040000) >> 8) | ((shift_register & 0x004000) >> 5) | ((shift_register & 0x000800) >> 3) | ((shift_register & 0x000200) >> 2) | ((shift_register & 0x000020) << 1) | ((shift_register & 0x000004) << 3) | ((shift_register & 0x000001) << 4); no_noise_or_noise_output = no_noise | noise_output; } // Combined waveforms: // By combining waveforms, the bits of each waveform are effectively short // circuited. A zero bit in one waveform will result in a zero output bit // (thus the infamous claim that the waveforms are AND'ed). // However, a zero bit in one waveform may also affect the neighboring bits // in the output. // // Example: // // 1 1 // Bit # 1 0 9 8 7 6 5 4 3 2 1 0 // ----------------------- // Sawtooth 0 0 0 1 1 1 1 1 1 0 0 0 // // Triangle 0 0 1 1 1 1 1 1 0 0 0 0 // // AND 0 0 0 1 1 1 1 1 0 0 0 0 // // Output 0 0 0 0 1 1 1 0 0 0 0 0 // // // Re-vectorized die photographs reveal the mechanism behind this behavior. // Each waveform selector bit acts as a switch, which directly connects // internal outputs into the waveform DAC inputs as follows: // // * Noise outputs the shift register bits to DAC inputs as described above. // Each output is also used as input to the next bit when the shift register // is shifted. // * Pulse connects a single line to all DAC inputs. The line is connected to // either 5V (pulse on) or 0V (pulse off) at bit 11, and ends at bit 0. // * Triangle connects the upper 11 bits of the (MSB EOR'ed) accumulator to the // DAC inputs, so that DAC bit 0 = 0, DAC bit n = accumulator bit n - 1. // * Sawtooth connects the upper 12 bits of the accumulator to the DAC inputs, // so that DAC bit n = accumulator bit n. Sawtooth blocks out the MSB from // the EOR used to generate the triangle waveform. // // We can thus draw the following conclusions: // // * The shift register may be written to by combined waveforms. // * The pulse waveform interconnects all bits in combined waveforms via the // pulse line. // * The combination of triangle and sawtooth interconnects neighboring bits // of the sawtooth waveform. // // This behavior would be quite difficult to model exactly, since the short // circuits are not binary, but are subject to analog effects. Tests show that // minor (1 bit) differences can actually occur in the output from otherwise // identical samples from OSC3 when waveforms are combined. To further // complicate the situation the output changes slightly with time (more // neighboring bits are successively set) when the 12-bit waveform // registers are kept unchanged. // // The output is instead approximated by using the upper bits of the // accumulator as an index to look up the combined output in a table // containing actual combined waveform samples from OSC3. // These samples are 8 bit, so 4 bits of waveform resolution is lost. // All OSC3 samples are taken with FREQ=0x1000, adding a 1 to the upper 12 // bits of the accumulator each cycle for a sample period of 4096 cycles. // // Sawtooth+Triangle: // The accumulator is used to look up an OSC3 sample. // // Pulse+Triangle: // The accumulator is used to look up an OSC3 sample. When ring modulation is // selected, the accumulator MSB is substituted with MSB EOR NOT sync_source MSB. // // Pulse+Sawtooth: // The accumulator is used to look up an OSC3 sample. // The sample is output if the pulse output is on. // // Pulse+Sawtooth+Triangle: // The accumulator is used to look up an OSC3 sample. // The sample is output if the pulse output is on. // // Combined waveforms including noise: // All waveform combinations including noise output zero after a few cycles, // since the waveform bits are and'ed into the shift register via the shift // register outputs. static reg12 noise_pulse6581(reg12 noise) { return (noise < 0xf00) ? 0x000 : noise & (noise<<1) & (noise<<2); } static reg12 noise_pulse8580(reg12 noise) { return (noise < 0xfc0) ? noise & (noise << 1) : 0xfc0; } RESID_INLINE void WaveformGenerator::set_waveform_output() { // Set output value. if (likely(waveform)) { // The bit masks no_pulse and no_noise are used to achieve branch-free // calculation of the output value. int ix = (accumulator ^ (~sync_source->accumulator & ring_msb_mask)) >> 12; waveform_output = wave[ix] & (no_pulse | pulse_output) & no_noise_or_noise_output; if (unlikely((waveform & 0xc) == 0xc)) { waveform_output = (sid_model == MOS6581) ? noise_pulse6581(waveform_output) : noise_pulse8580(waveform_output); } // Triangle/Sawtooth output is delayed half cycle on 8580. // This will appear as a one cycle delay on OSC3 as it is // latched in the first phase of the clock. if ((waveform & 3) && (sid_model == MOS8580)) { osc3 = tri_saw_pipeline & (no_pulse | pulse_output) & no_noise_or_noise_output; tri_saw_pipeline = wave[ix]; } else { osc3 = waveform_output; } if ((waveform & 0x2) && unlikely(waveform & 0xd) && (sid_model == MOS6581)) { // In the 6581 the top bit of the accumulator may be driven low by combined waveforms // when the sawtooth is selected accumulator &= (waveform_output << 12) | 0x7fffff; } if (unlikely(waveform > 0x8) && likely(!test) && likely(shift_pipeline != 1)) { // Combined waveforms write to the shift register. write_shift_register(); } } else { // Age floating DAC input. if (likely(floating_output_ttl) && unlikely(!--floating_output_ttl)) { wave_bitfade(); } } // The pulse level is defined as (accumulator >> 12) >= pw ? 0xfff : 0x000. // The expression -((accumulator >> 12) >= pw) & 0xfff yields the same // results without any branching (and thus without any pipeline stalls). // NB! This expression relies on that the result of a boolean expression // is either 0 or 1, and furthermore requires two's complement integer. // A few more cycles may be saved by storing the pulse width left shifted // 12 bits, and dropping the and with 0xfff (this is valid since pulse is // used as a bit mask on 12 bit values), yielding the expression // -(accumulator >= pw24). However this only results in negligible savings. // The result of the pulse width compare is delayed one cycle. // Push next pulse level into pulse level pipeline. pulse_output = -((accumulator >> 12) >= pw) & 0xfff; } RESID_INLINE void WaveformGenerator::set_waveform_output(cycle_count delta_t) { // Set output value. if (likely(waveform)) { // The bit masks no_pulse and no_noise are used to achieve branch-free // calculation of the output value. int ix = (accumulator ^ (~sync_source->accumulator & ring_msb_mask)) >> 12; waveform_output = wave[ix] & (no_pulse | pulse_output) & no_noise_or_noise_output; // Triangle/Sawtooth output delay for the 8580 is not modeled osc3 = waveform_output; if ((waveform & 0x2) && unlikely(waveform & 0xd) && (sid_model == MOS6581)) { accumulator &= (waveform_output << 12) | 0x7fffff; } if (unlikely(waveform > 0x8) && likely(!test)) { // Combined waveforms write to the shift register. // NB! Since cycles are skipped in delta_t clocking, writes will be // missed. Single cycle clocking must be used for 100% correct operation. write_shift_register(); } } else { if (likely(floating_output_ttl)) { // Age floating D/A output. floating_output_ttl -= delta_t; if (unlikely(floating_output_ttl <= 0)) { floating_output_ttl = 0; osc3 = waveform_output = 0; } } } } // ---------------------------------------------------------------------------- // Waveform output (12 bits). // ---------------------------------------------------------------------------- // The digital waveform output is converted to an analog signal by a 12-bit // DAC. Re-vectorized die photographs reveal that the DAC is an R-2R ladder // built up as follows: // // 12V 11 10 9 8 7 6 5 4 3 2 1 0 GND // Strange | | | | | | | | | | | | | | Missing // part 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R term. // (bias) | | | | | | | | | | | | | | // --R- --R---R---R---R---R---R---R---R---R---R---R-- --- // | _____ // __|__ __|__ | // ----- ===== | // | | | | | // 12V --- ----- ------- GND // | // wout // // Bit on: 5V // Bit off: 0V (GND) // // As is the case with all MOS 6581 DACs, the termination to (virtual) ground // at bit 0 is missing. The MOS 8580 has correct termination, and has also // done away with the bias part on the left hand side of the figure above. // RESID_INLINE short WaveformGenerator::output() { // DAC imperfections are emulated by using waveform_output as an index // into a DAC lookup table. readOSC() uses waveform_output directly. return model_dac[sid_model][waveform_output]; } #endif // RESID_INLINING || defined(RESID_WAVE_CC) } // namespace reSID #endif // not RESID_WAVE_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/dac.cc0000644000175100001770000001051314544470311020426 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_DAC_CC #ifdef _M_ARM #undef _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE #define _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE 1 #endif #include "dac.h" #include #ifndef INFINITY union MSVC_EVIL_FLOAT_HACK { unsigned char Bytes[4]; float Value; }; static union MSVC_EVIL_FLOAT_HACK INFINITY_HACK = {{0x00, 0x00, 0x80, 0x7F}}; #define INFINITY (INFINITY_HACK.Value) #endif namespace reSID { // ---------------------------------------------------------------------------- // Calculation of lookup tables for SID DACs. // ---------------------------------------------------------------------------- // The SID DACs are built up as follows: // // n n-1 2 1 0 VGND // | | | | | | Termination // 2R 2R 2R 2R 2R 2R only for // | | | | | | MOS 8580 // Vo --R---R--...--R---R-- --- // // // All MOS 6581 DACs are missing a termination resistor at bit 0. This causes // pronounced errors for the lower 4 - 5 bits (e.g. the output for bit 0 is // actually equal to the output for bit 1), resulting in DAC discontinuities // for the lower bits. // In addition to this, the 6581 DACs exhibit further severe discontinuities // for higher bits, which may be explained by a less than perfect match between // the R and 2R resistors, or by output impedance in the NMOS transistors // providing the bit voltages. A good approximation of the actual DAC output is // achieved for 2R/R ~ 2.20. // // The MOS 8580 DACs, on the other hand, do not exhibit any discontinuities. // These DACs include the correct termination resistor, and also seem to have // very accurately matched R and 2R resistors (2R/R = 2.00). void build_dac_table(unsigned short* dac, int bits, double _2R_div_R, bool term) { // FIXME: No variable length arrays in ISO C++, hardcoding to max 12 bits. // double vbit[bits]; double vbit[12]; // Calculate voltage contribution by each individual bit in the R-2R ladder. for (int set_bit = 0; set_bit < bits; set_bit++) { int bit; double Vn = 1.0; // Normalized bit voltage. double R = 1.0; // Normalized R double _2R = _2R_div_R*R; // 2R double Rn = term ? // Rn = 2R for correct termination, _2R : INFINITY; // INFINITY for missing termination. // Calculate DAC "tail" resistance by repeated parallel substitution. for (bit = 0; bit < set_bit; bit++) { if (Rn == INFINITY) { Rn = R + _2R; } else { Rn = R + _2R*Rn/(_2R + Rn); // R + 2R || Rn } } // Source transformation for bit voltage. if (Rn == INFINITY) { Rn = _2R; } else { Rn = _2R*Rn/(_2R + Rn); // 2R || Rn Vn = Vn*Rn/_2R; } // Calculate DAC output voltage by repeated source transformation from // the "tail". for (++bit; bit < bits; bit++) { Rn += R; double I = Vn/Rn; Rn = _2R*Rn/(_2R + Rn); // 2R || Rn Vn = Rn*I; } vbit[set_bit] = Vn; } // Calculate the voltage for any combination of bits by superpositioning. for (int i = 0; i < (1 << bits); i++) { int x = i; double Vo = 0; for (int j = 0; j < bits; j++) { Vo += (x & 0x1)*vbit[j]; x >>= 1; } // Scale maximum output to 2^bits - 1. dac[i] = (unsigned short)(((1 << bits) - 1)*Vo + 0.5); } } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581_PS_.h0000644000175100001770000010775614544470322021612 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x1f0, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x2f0, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x378: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x370, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3b0, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3d0, /* 0x3e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3e0, /* 0x3f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3f0, /* 0x3f8: */ 0x000, 0x000, 0x000, 0x3f0, 0x000, 0x3f0, 0x3f0, 0x3f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x4f0, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x530: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x538: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x540: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x548: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x550: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x558: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x560: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x568: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x570: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x578: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x570, /* 0x580: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x588: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x590: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x598: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x5b0, /* 0x5c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x5d0, /* 0x5e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x5e0, /* 0x5f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x5f0, /* 0x5f8: */ 0x000, 0x000, 0x000, 0x5f0, 0x000, 0x5f0, 0x5f0, 0x5f0, /* 0x600: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x608: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x610: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x618: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x620: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x628: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x630: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x638: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x640: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x648: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x650: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x658: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x660: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x668: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x670: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x678: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x670, /* 0x680: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x688: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x690: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x698: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x6b0, /* 0x6c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x6d0, /* 0x6e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x6e0, /* 0x6f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x6f0, /* 0x6f8: */ 0x000, 0x000, 0x000, 0x6f0, 0x000, 0x6f0, 0x6f0, 0x6f0, /* 0x700: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x708: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x710: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x718: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x720: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x728: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x730: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x738: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x730, /* 0x740: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x748: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x750: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x758: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x750, /* 0x760: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x768: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x760, /* 0x770: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x770, /* 0x778: */ 0x000, 0x000, 0x000, 0x770, 0x000, 0x770, 0x770, 0x770, /* 0x780: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x788: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x790: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x798: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x790, /* 0x7a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x7a0, /* 0x7b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x7b0, /* 0x7b8: */ 0x000, 0x400, 0x400, 0x7b0, 0x400, 0x7b0, 0x7b0, 0x7b0, /* 0x7c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7c8: */ 0x000, 0x000, 0x000, 0x400, 0x000, 0x000, 0x400, 0x7c0, /* 0x7d0: */ 0x000, 0x000, 0x000, 0x400, 0x000, 0x400, 0x400, 0x7d0, /* 0x7d8: */ 0x000, 0x400, 0x400, 0x7d0, 0x600, 0x7d0, 0x7d0, 0x7d0, /* 0x7e0: */ 0x000, 0x000, 0x000, 0x400, 0x000, 0x600, 0x600, 0x7e0, /* 0x7e8: */ 0x000, 0x600, 0x600, 0x7e0, 0x600, 0x7e0, 0x7e0, 0x7e0, /* 0x7f0: */ 0x000, 0x700, 0x700, 0x7f0, 0x700, 0x7f0, 0x7f0, 0x7f0, /* 0x7f8: */ 0x780, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, /* 0x800: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x808: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x810: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x818: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x820: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x828: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x830: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x838: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x840: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x848: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x850: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x858: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x860: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x868: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x870: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x878: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x830, /* 0x880: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x888: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x890: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x898: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x8a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x8b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x8b8: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x810, /* 0x8c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x8d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x8d8: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x8e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x8e8: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x8f0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x8f8: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x8f0, /* 0x900: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x908: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x910: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x918: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x920: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x928: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x930: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x938: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x940: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x948: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x950: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x958: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x960: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x968: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x970: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x978: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x970, /* 0x980: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x988: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x990: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x998: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x9a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x9a8: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x9b0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x9b8: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x9b0, /* 0x9c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x9c8: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9d0: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9d8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x9d0, /* 0x9e0: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9e8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x9e0, /* 0x9f0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x9f0, /* 0x9f8: */ 0x800, 0x900, 0x900, 0x9f0, 0x980, 0x9f0, 0x9f0, 0x9f0, /* 0xa00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa38: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xa40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa58: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xa60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa68: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xa70: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa78: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa70, /* 0xa80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa98: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xaa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xaa8: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xab0: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xab8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xab0, /* 0xac0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xac8: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xad0: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xad8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xad0, /* 0xae0: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xae8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, 0xa00, 0xae0, /* 0xaf0: */ 0x800, 0x800, 0x800, 0xa00, 0x800, 0xa00, 0xa00, 0xaf0, /* 0xaf8: */ 0x800, 0xa00, 0xa00, 0xaf0, 0xa00, 0xaf0, 0xaf0, 0xaf0, /* 0xb00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xb08: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xb10: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xb18: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb20: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xb28: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb30: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb38: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, 0xa00, 0xb30, /* 0xb40: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xb48: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xb50: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xb58: */ 0x800, 0x800, 0x800, 0xa00, 0x800, 0xa00, 0xa00, 0xb50, /* 0xb60: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xb68: */ 0x800, 0x800, 0x800, 0xa00, 0x800, 0xa00, 0xa00, 0xb60, /* 0xb70: */ 0x800, 0x800, 0x800, 0xa00, 0x800, 0xa00, 0xb00, 0xb70, /* 0xb78: */ 0x800, 0xb00, 0xb00, 0xb70, 0xb00, 0xb70, 0xb70, 0xb70, /* 0xb80: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xb88: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xb90: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xb98: */ 0x800, 0x800, 0x800, 0xa00, 0x800, 0xa00, 0xb00, 0xb90, /* 0xba0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xba8: */ 0x800, 0x800, 0x800, 0xb00, 0x800, 0xb00, 0xb00, 0xba0, /* 0xbb0: */ 0x800, 0x800, 0x800, 0xb00, 0x800, 0xb00, 0xb00, 0xbb0, /* 0xbb8: */ 0x800, 0xb00, 0xb00, 0xbb0, 0xb80, 0xbb0, 0xbb0, 0xbb0, /* 0xbc0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xb00, /* 0xbc8: */ 0x800, 0x800, 0x800, 0xb00, 0x800, 0xb00, 0xb00, 0xbc0, /* 0xbd0: */ 0x800, 0x800, 0x800, 0xb80, 0x800, 0xb80, 0xb80, 0xbd0, /* 0xbd8: */ 0x800, 0xb80, 0xb80, 0xbd0, 0xb80, 0xbd0, 0xbd0, 0xbd0, /* 0xbe0: */ 0x800, 0x800, 0x800, 0xb80, 0x800, 0xb80, 0xb80, 0xbe0, /* 0xbe8: */ 0x800, 0xb80, 0xb80, 0xbe0, 0xbc0, 0xbe0, 0xbe0, 0xbe0, /* 0xbf0: */ 0x800, 0xbc0, 0xbc0, 0xbf0, 0xbc0, 0xbf0, 0xbf0, 0xbf0, /* 0xbf8: */ 0xbc0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, /* 0xc00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xc20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xc30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xc38: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xc40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, /* 0xc50: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xc58: */ 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xc60: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xc68: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xc70: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xc78: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xc70, /* 0xc80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xc88: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xc90: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xc98: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xca0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xca8: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xcb0: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xcb8: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xcb0, /* 0xcc0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xcc8: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xcd0: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xcd8: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xcd0, /* 0xce0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xce8: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xce0, /* 0xcf0: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xcf0, /* 0xcf8: */ 0x800, 0xc00, 0xc00, 0xcf0, 0xc00, 0xcf0, 0xcf0, 0xcf0, /* 0xd00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xd08: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xd10: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xd18: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd20: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xd28: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd30: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd38: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xd30, /* 0xd40: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xd48: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd50: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd58: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xd50, /* 0xd60: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd68: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xd60, /* 0xd70: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xd70, /* 0xd78: */ 0x800, 0xd00, 0xd00, 0xd70, 0xd00, 0xd70, 0xd70, 0xd70, /* 0xd80: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xd88: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd90: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd98: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xd00, 0xd90, /* 0xda0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xd00, /* 0xda8: */ 0x800, 0x800, 0x800, 0xd00, 0x800, 0xd00, 0xd00, 0xda0, /* 0xdb0: */ 0x800, 0x800, 0x800, 0xd00, 0x800, 0xd00, 0xd00, 0xdb0, /* 0xdb8: */ 0xc00, 0xd00, 0xd00, 0xdb0, 0xd80, 0xdb0, 0xdb0, 0xdb0, /* 0xdc0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xd00, /* 0xdc8: */ 0x800, 0x800, 0x800, 0xd00, 0x800, 0xd00, 0xd00, 0xdc0, /* 0xdd0: */ 0x800, 0xc00, 0xc00, 0xd00, 0x800, 0xd80, 0xd80, 0xdd0, /* 0xdd8: */ 0xc00, 0xd80, 0xd80, 0xdd0, 0xd80, 0xdd0, 0xdd0, 0xdd0, /* 0xde0: */ 0x800, 0xc00, 0xc00, 0xd80, 0xc00, 0xd80, 0xd80, 0xde0, /* 0xde8: */ 0xc00, 0xd80, 0xd80, 0xde0, 0xdc0, 0xde0, 0xde0, 0xde0, /* 0xdf0: */ 0xc00, 0xdc0, 0xdc0, 0xdf0, 0xdc0, 0xdf0, 0xdf0, 0xdf0, /* 0xdf8: */ 0xdc0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, /* 0xe00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xe08: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xe10: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0xe18: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe20: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe28: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe30: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe38: */ 0x800, 0x800, 0x800, 0xe00, 0x800, 0xe00, 0xe00, 0xe30, /* 0xe40: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe48: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe50: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe58: */ 0x800, 0x800, 0x800, 0xe00, 0x800, 0xe00, 0xe00, 0xe50, /* 0xe60: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe68: */ 0x800, 0x800, 0x800, 0xe00, 0x800, 0xe00, 0xe00, 0xe60, /* 0xe70: */ 0x800, 0x800, 0x800, 0xe00, 0x800, 0xe00, 0xe00, 0xe70, /* 0xe78: */ 0xc00, 0xe00, 0xe00, 0xe70, 0xe00, 0xe70, 0xe70, 0xe70, /* 0xe80: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe88: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe90: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xe98: */ 0x800, 0x800, 0x800, 0xe00, 0x800, 0xe00, 0xe00, 0xe90, /* 0xea0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xe00, /* 0xea8: */ 0x800, 0x800, 0x800, 0xe00, 0xc00, 0xe00, 0xe00, 0xea0, /* 0xeb0: */ 0x800, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xeb0, /* 0xeb8: */ 0xc00, 0xe00, 0xe00, 0xeb0, 0xe80, 0xeb0, 0xeb0, 0xeb0, /* 0xec0: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xe00, /* 0xec8: */ 0x800, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xec0, /* 0xed0: */ 0x800, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe80, 0xed0, /* 0xed8: */ 0xc00, 0xe80, 0xe80, 0xed0, 0xe80, 0xed0, 0xed0, 0xed0, /* 0xee0: */ 0x800, 0xc00, 0xc00, 0xe80, 0xc00, 0xe80, 0xe80, 0xee0, /* 0xee8: */ 0xc00, 0xe80, 0xe80, 0xee0, 0xec0, 0xee0, 0xee0, 0xee0, /* 0xef0: */ 0xe00, 0xec0, 0xec0, 0xef0, 0xec0, 0xef0, 0xef0, 0xef0, /* 0xef8: */ 0xec0, 0xef0, 0xef0, 0xef0, 0xef0, 0xef0, 0xef0, 0xef0, /* 0xf00: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xf08: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xf00, /* 0xf10: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xf00, /* 0xf18: */ 0x800, 0xc00, 0xc00, 0xf00, 0xc00, 0xf00, 0xf00, 0xf10, /* 0xf20: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xf00, /* 0xf28: */ 0x800, 0xc00, 0xc00, 0xf00, 0xc00, 0xf00, 0xf00, 0xf20, /* 0xf30: */ 0x800, 0xc00, 0xc00, 0xf00, 0xc00, 0xf00, 0xf00, 0xf30, /* 0xf38: */ 0xc00, 0xf00, 0xf00, 0xf30, 0xf00, 0xf30, 0xf30, 0xf30, /* 0xf40: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xf00, /* 0xf48: */ 0x800, 0xc00, 0xc00, 0xf00, 0xc00, 0xf00, 0xf00, 0xf40, /* 0xf50: */ 0x800, 0xc00, 0xc00, 0xf00, 0xc00, 0xf00, 0xf00, 0xf50, /* 0xf58: */ 0xc00, 0xf00, 0xf00, 0xf50, 0xf00, 0xf50, 0xf50, 0xf50, /* 0xf60: */ 0x800, 0xc00, 0xc00, 0xf00, 0xe00, 0xf00, 0xf00, 0xf60, /* 0xf68: */ 0xe00, 0xf00, 0xf00, 0xf60, 0xf00, 0xf60, 0xf60, 0xf60, /* 0xf70: */ 0xe00, 0xf40, 0xf40, 0xf70, 0xf40, 0xf70, 0xf70, 0xf70, /* 0xf78: */ 0xf40, 0xf70, 0xf70, 0xf70, 0xf70, 0xf70, 0xf70, 0xf70, /* 0xf80: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xf80, /* 0xf88: */ 0x800, 0xc00, 0xc00, 0xf80, 0xe00, 0xf80, 0xf80, 0xf80, /* 0xf90: */ 0x800, 0xe00, 0xe00, 0xf80, 0xe00, 0xf80, 0xf80, 0xf90, /* 0xf98: */ 0xe00, 0xf80, 0xf80, 0xf90, 0xf80, 0xf90, 0xf90, 0xf90, /* 0xfa0: */ 0xc00, 0xe00, 0xe00, 0xf80, 0xe00, 0xf80, 0xf80, 0xfa0, /* 0xfa8: */ 0xe00, 0xf80, 0xf80, 0xfa0, 0xf80, 0xfa0, 0xfa0, 0xfa0, /* 0xfb0: */ 0xe00, 0xf80, 0xf80, 0xfb0, 0xf80, 0xfb0, 0xfb0, 0xfb0, /* 0xfb8: */ 0xf80, 0xfb0, 0xfb0, 0xfb0, 0xfb0, 0xfb0, 0xfb0, 0xfb0, /* 0xfc0: */ 0xc00, 0xe00, 0xe00, 0xfc0, 0xe00, 0xfc0, 0xfc0, 0xfc0, /* 0xfc8: */ 0xf00, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, /* 0xfd0: */ 0xf00, 0xfc0, 0xfc0, 0xfd0, 0xfc0, 0xfd0, 0xfd0, 0xfd0, /* 0xfd8: */ 0xfc0, 0xfd0, 0xfd0, 0xfd0, 0xfd0, 0xfd0, 0xfd0, 0xfd0, /* 0xfe0: */ 0xf00, 0xfc0, 0xfc0, 0xfe0, 0xfc0, 0xfe0, 0xfe0, 0xfe0, /* 0xfe8: */ 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, /* 0xff0: */ 0xfe0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, /* 0xff8: */ 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580__ST.dat0000644000175100001770000001000014544470311022105 000000000000008888888888888888<<<<<<<>??libsidplayfp-2.6.0/src/builders/resid-builder/resid/pot.cc0000644000175100001770000000215314544470311020502 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #include "pot.h" namespace reSID { reg8 Potentiometer::readPOT() { // NB! Not modeled. return 0xff; } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/filter.h0000644000175100001770000012547014544470311021037 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_FILTER_H #define RESID_FILTER_H #include "resid-config.h" namespace reSID { // ---------------------------------------------------------------------------- // The SID filter is modeled with a two-integrator-loop biquadratic filter, // which has been confirmed by Bob Yannes to be the actual circuit used in // the SID chip. // // Measurements show that excellent emulation of the SID filter is achieved, // except when high resonance is combined with high sustain levels. // In this case the SID op-amps are performing less than ideally and are // causing some peculiar behavior of the SID filter. This however seems to // have more effect on the overall amplitude than on the color of the sound. // // The theory for the filter circuit can be found in "Microelectric Circuits" // by Adel S. Sedra and Kenneth C. Smith. // The circuit is modeled based on the explanation found there except that // an additional inverter is used in the feedback from the bandpass output, // allowing the summer op-amp to operate in single-ended mode. This yields // filter outputs with levels independent of Q, which corresponds with the // results obtained from a real SID. // // We have been able to model the summer and the two integrators of the circuit // to form components of an IIR filter. // Vhp is the output of the summer, Vbp is the output of the first integrator, // and Vlp is the output of the second integrator in the filter circuit. // // According to Bob Yannes, the active stages of the SID filter are not really // op-amps. Rather, simple NMOS inverters are used. By biasing an inverter // into its region of quasi-linear operation using a feedback resistor from // input to output, a MOS inverter can be made to act like an op-amp for // small signals centered around the switching threshold. // // In 2008, Michael Huth facilitated closer investigation of the SID 6581 // filter circuit by publishing high quality microscope photographs of the die. // Tommi Lempinen has done an impressive work on re-vectorizing and annotating // the die photographs, substantially simplifying further analysis of the // filter circuit. // // The filter schematics below are reverse engineered from these re-vectorized // and annotated die photographs. While the filter first depicted in reSID 0.9 // is a correct model of the basic filter, the schematics are now completed // with the audio mixer and output stage, including details on intended // relative resistor values. Also included are schematics for the NMOS FET // voltage controlled resistors (VCRs) used to control cutoff frequency, the // DAC which controls the VCRs, the NMOS op-amps, and the output buffer. // // // SID filter / mixer / output // --------------------------- // // --------------------------------------------------- // | | // | --1R1-- \-- D7 | // | ---R1-- | | | // | | | |--2R1-- \--| D6 | // | --------------|--Rw-----[A>--|--Rw-----[A>--| // ve (EXT IN) | | | | // D3 \ ---------------R8--| | | (CAP2A) | (CAP1A) // | v3 | | vhp | vbp | vlp // D2 | \ -----------R8--| ----- | | // | | v2 | | | | // D1 | | \ -------R8--| | ---------------- | // | | | v1 | | | | // D0 | | | \ ---R8-- | | --------------------------- // | | | | | | | // R6 R6 R6 R6 R6 R6 R6 // | | | | $18 | | | $18 // | \ | | D7: 1=open \ \ \ D6 - D4: 0=open // | | | | | | | // --------------------------------- 12V // | // | D3 --/ --1R2-- | // | ---R8-- | | ---R2-- | // | | | D2 |--/ --2R2--| | | ||-- // ------[A>---------| |-----[A>-----|| // D1 |--/ --4R2--| (4.25R2) ||-- // $18 | | | // 0=open D0 --/ --8R2-- (8.75R2) | // // vo (AUDIO // OUT) // // // v1 - voice 1 // v2 - voice 2 // v3 - voice 3 // ve - ext in // vhp - highpass output // vbp - bandpass output // vlp - lowpass output // vo - audio out // [A> - single ended inverting op-amp (self-biased NMOS inverter) // Rn - "resistors", implemented with custom NMOS FETs // Rw - cutoff frequency resistor (VCR) // C - capacitor // // Notes: // // R2 ~ 2.0*R1 // R6 ~ 6.0*R1 // R8 ~ 8.0*R1 // R24 ~ 24.0*R1 // // The Rn "resistors" in the circuit are implemented with custom NMOS FETs, // probably because of space constraints on the SID die. The silicon substrate // is laid out in a narrow strip or "snake", with a strip length proportional // to the intended resistance. The polysilicon gate electrode covers the entire // silicon substrate and is fixed at 12V in order for the NMOS FET to operate // in triode mode (a.k.a. linear mode or ohmic mode). // // Even in "linear mode", an NMOS FET is only an approximation of a resistor, // as the apparant resistance increases with increasing drain-to-source // voltage. If the drain-to-source voltage should approach the gate voltage // of 12V, the NMOS FET will enter saturation mode (a.k.a. active mode), and // the NMOS FET will not operate anywhere like a resistor. // // // // NMOS FET voltage controlled resistor (VCR) // ------------------------------------------ // // Vw // // | // | // R1 // | // --R1--| // | __|__ // | ----- // | | | // vi ---------- -------- vo // | | // ----R24---- // // // vi - input // vo - output // Rn - "resistors", implemented with custom NMOS FETs // Vw - voltage from 11-bit DAC (frequency cutoff control) // // Notes: // // An approximate value for R24 can be found by using the formula for the // filter cutoff frequency: // // FCmin = 1/(2*pi*Rmax*C) // // Assuming that a the setting for minimum cutoff frequency in combination with // a low level input signal ensures that only negligible current will flow // through the transistor in the schematics above, values for FCmin and C can // be substituted in this formula to find Rmax. // Using C = 470pF and FCmin = 220Hz (measured value), we get: // // FCmin = 1/(2*pi*Rmax*C) // Rmax = 1/(2*pi*FCmin*C) = 1/(2*pi*220*470e-12) ~ 1.5MOhm // // From this it follows that: // R24 = Rmax ~ 1.5MOhm // R1 ~ R24/24 ~ 64kOhm // R2 ~ 2.0*R1 ~ 128kOhm // R6 ~ 6.0*R1 ~ 384kOhm // R8 ~ 8.0*R1 ~ 512kOhm // // Note that these are only approximate values for one particular SID chip, // due to process variations the values can be substantially different in // other chips. // // // // Filter frequency cutoff DAC // --------------------------- // // // 12V 10 9 8 7 6 5 4 3 2 1 0 VGND // | | | | | | | | | | | | | Missing // 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R termination // | | | | | | | | | | | | | // Vw ----R---R---R---R---R---R---R---R---R---R---R-- --- // // Bit on: 12V // Bit off: 5V (VGND) // // As is the case with all MOS 6581 DACs, the termination to (virtual) ground // at bit 0 is missing. // // Furthermore, the control of the two VCRs imposes a load on the DAC output // which varies with the input signals to the VCRs. This can be seen from the // VCR figure above. // // // // "Op-amp" (self-biased NMOS inverter) // ------------------------------------ // // // 12V // // | // -----------| // | | // | ------| // | | | // | | ||-- // | --|| // | ||-- // ||-- | // vi -----|| |--------- vo // ||-- | | // | ||-- | // |-------|| | // | ||-- | // ||-- | | // --|| | | // | ||-- | | // | | | | // | -----------| | // | | | // | | // | GND | // | | // ---------------------- // // // vi - input // vo - output // // Notes: // // The schematics above are laid out to show that the "op-amp" logically // consists of two building blocks; a saturated load NMOS inverter (on the // right hand side of the schematics) with a buffer / bias input stage // consisting of a variable saturated load NMOS inverter (on the left hand // side of the schematics). // // Provided a reasonably high input impedance and a reasonably low output // impedance, the "op-amp" can be modeled as a voltage transfer function // mapping input voltage to output voltage. // // // // Output buffer (NMOS voltage follower) // ------------------------------------- // // // 12V // // | // | // ||-- // vi -----|| // ||-- // | // |------ vo // | (AUDIO // Rext OUT) // | // | // // GND // // vi - input // vo - output // Rext - external resistor, 1kOhm // // Notes: // // The external resistor Rext is needed to complete the NMOS voltage follower, // this resistor has a recommended value of 1kOhm. // // Die photographs show that actually, two NMOS transistors are used in the // voltage follower. However the two transistors are coupled in parallel (all // terminals are pairwise common), which implies that we can model the two // transistors as one. // // ---------------------------------------------------------------------------- // Compile-time computation of op-amp summer and mixer table offsets. // The highpass summer has 2 - 6 inputs (bandpass, lowpass, and 0 - 4 voices). template struct summer_offset { enum { value = summer_offset::value + ((2 + i - 1) << 16) }; }; template<> struct summer_offset<0> { enum { value = 0 }; }; // The mixer has 0 - 7 inputs (0 - 4 voices and 0 - 3 filter outputs). template struct mixer_offset { enum { value = mixer_offset::value + ((i - 1) << 16) }; }; template<> struct mixer_offset<1> { enum { value = 1 }; }; template<> struct mixer_offset<0> { enum { value = 0 }; }; class Filter { public: Filter(); void enable_filter(bool enable); void adjust_filter_bias(double dac_bias); void set_chip_model(chip_model model); void set_voice_mask(reg4 mask); void clock(int voice1, int voice2, int voice3); void clock(cycle_count delta_t, int voice1, int voice2, int voice3); void reset(); // Write registers. void writeFC_LO(reg8); void writeFC_HI(reg8); void writeRES_FILT(reg8); void writeMODE_VOL(reg8); // SID audio input (16 bits). void input(short sample); // SID audio output (16 bits). short output(); protected: void set_sum_mix(); void set_w0(); void set_Q(); // Filter enabled. bool enabled; // Filter cutoff frequency. reg12 fc; // Filter resonance. reg8 res; // Selects which voices to route through the filter. reg8 filt; // Selects which filter outputs to route into the mixer. reg4 mode; // Output master volume. reg4 vol; // Used to mask out EXT IN if not connected, and for test purposes // (voice muting). reg8 voice_mask; // Select which inputs to route into the summer / mixer. // These are derived from filt, mode, and voice_mask. reg8 sum; reg8 mix; // State of filter. int Vhp; // highpass int Vbp; // bandpass int Vbp_x, Vbp_vc; int Vlp; // lowpass int Vlp_x, Vlp_vc; // Filter / mixer inputs. int ve; int v3; int v2; int v1; // Cutoff frequency DAC voltage, resonance. int Vddt_Vw_2, Vw_bias; int _8_div_Q; // FIXME: Temporarily used for MOS 8580 emulation. int w0; int _1024_div_Q; chip_model sid_model; typedef struct { unsigned short vx; short dvx; } opamp_t; typedef struct { int vo_N16; // Fixed point scaling for 16 bit op-amp output. int kVddt; // K*(Vdd - Vth) int n_snake; int voice_scale_s14; int voice_DC; int ak; int bk; int vc_min; int vc_max; // Reverse op-amp transfer function. unsigned short opamp_rev[1 << 16]; // Lookup tables for gain and summer op-amps in output stage / filter. unsigned short summer[summer_offset<5>::value]; unsigned short gain[16][1 << 16]; unsigned short mixer[mixer_offset<8>::value]; // Cutoff frequency DAC output voltage table. FC is an 11 bit register. unsigned short f0_dac[1 << 11]; } model_filter_t; int solve_gain(opamp_t* opamp, int n, int vi_t, int& x, model_filter_t& mf); int solve_integrate_6581(int dt, int vi_t, int& x, int& vc, model_filter_t& mf); // VCR - 6581 only. static unsigned short vcr_kVg[1 << 16]; static unsigned short vcr_n_Ids_term[1 << 16]; // Common parameters. static model_filter_t model_filter[2]; friend class SID; }; // ---------------------------------------------------------------------------- // Inline functions. // The following functions are defined inline because they are called every // time a sample is calculated. // ---------------------------------------------------------------------------- #if RESID_INLINING || defined(RESID_FILTER_CC) // ---------------------------------------------------------------------------- // SID clocking - 1 cycle. // ---------------------------------------------------------------------------- RESID_INLINE void Filter::clock(int voice1, int voice2, int voice3) { model_filter_t& f = model_filter[sid_model]; v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC; v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC; v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC; // Sum inputs routed into the filter. int Vi = 0; int offset = 0; switch (sum & 0xf) { case 0x0: Vi = 0; offset = summer_offset<0>::value; break; case 0x1: Vi = v1; offset = summer_offset<1>::value; break; case 0x2: Vi = v2; offset = summer_offset<1>::value; break; case 0x3: Vi = v2 + v1; offset = summer_offset<2>::value; break; case 0x4: Vi = v3; offset = summer_offset<1>::value; break; case 0x5: Vi = v3 + v1; offset = summer_offset<2>::value; break; case 0x6: Vi = v3 + v2; offset = summer_offset<2>::value; break; case 0x7: Vi = v3 + v2 + v1; offset = summer_offset<3>::value; break; case 0x8: Vi = ve; offset = summer_offset<1>::value; break; case 0x9: Vi = ve + v1; offset = summer_offset<2>::value; break; case 0xa: Vi = ve + v2; offset = summer_offset<2>::value; break; case 0xb: Vi = ve + v2 + v1; offset = summer_offset<3>::value; break; case 0xc: Vi = ve + v3; offset = summer_offset<2>::value; break; case 0xd: Vi = ve + v3 + v1; offset = summer_offset<3>::value; break; case 0xe: Vi = ve + v3 + v2; offset = summer_offset<3>::value; break; case 0xf: Vi = ve + v3 + v2 + v1; offset = summer_offset<4>::value; break; } // Calculate filter outputs. if (sid_model == 0) { // MOS 6581. Vlp = solve_integrate_6581(1, Vbp, Vlp_x, Vlp_vc, f); Vbp = solve_integrate_6581(1, Vhp, Vbp_x, Vbp_vc, f); Vhp = f.summer[offset + f.gain[_8_div_Q][Vbp] + Vlp + Vi]; } else { // MOS 8580. FIXME: Not yet using op-amp model. // delta_t = 1 is converted to seconds given a 1MHz clock by dividing // with 1 000 000. int dVbp = w0*(Vhp >> 4) >> 16; int dVlp = w0*(Vbp >> 4) >> 16; Vbp -= dVbp; Vlp -= dVlp; Vhp = (Vbp*_1024_div_Q >> 10) - Vlp - Vi; } } // ---------------------------------------------------------------------------- // SID clocking - delta_t cycles. // ---------------------------------------------------------------------------- RESID_INLINE void Filter::clock(cycle_count delta_t, int voice1, int voice2, int voice3) { model_filter_t& f = model_filter[sid_model]; v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC; v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC; v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC; // Enable filter on/off. // This is not really part of SID, but is useful for testing. // On slow CPUs it may be necessary to bypass the filter to lower the CPU // load. if (unlikely(!enabled)) { return; } // Sum inputs routed into the filter. int Vi = 0; int offset = 0; switch (sum & 0xf) { case 0x0: Vi = 0; offset = summer_offset<0>::value; break; case 0x1: Vi = v1; offset = summer_offset<1>::value; break; case 0x2: Vi = v2; offset = summer_offset<1>::value; break; case 0x3: Vi = v2 + v1; offset = summer_offset<2>::value; break; case 0x4: Vi = v3; offset = summer_offset<1>::value; break; case 0x5: Vi = v3 + v1; offset = summer_offset<2>::value; break; case 0x6: Vi = v3 + v2; offset = summer_offset<2>::value; break; case 0x7: Vi = v3 + v2 + v1; offset = summer_offset<3>::value; break; case 0x8: Vi = ve; offset = summer_offset<1>::value; break; case 0x9: Vi = ve + v1; offset = summer_offset<2>::value; break; case 0xa: Vi = ve + v2; offset = summer_offset<2>::value; break; case 0xb: Vi = ve + v2 + v1; offset = summer_offset<3>::value; break; case 0xc: Vi = ve + v3; offset = summer_offset<2>::value; break; case 0xd: Vi = ve + v3 + v1; offset = summer_offset<3>::value; break; case 0xe: Vi = ve + v3 + v2; offset = summer_offset<3>::value; break; case 0xf: Vi = ve + v3 + v2 + v1; offset = summer_offset<4>::value; break; } // Maximum delta cycles for filter fixpoint iteration to converge // is approximately 3. cycle_count delta_t_flt = 3; if (sid_model == 0) { // MOS 6581. while (delta_t) { if (unlikely(delta_t < delta_t_flt)) { delta_t_flt = delta_t; } // Calculate filter outputs. Vlp = solve_integrate_6581(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f); Vbp = solve_integrate_6581(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f); Vhp = f.summer[offset + f.gain[_8_div_Q][Vbp] + Vlp + Vi]; delta_t -= delta_t_flt; } } else { // MOS 8580. FIXME: Not yet using op-amp model. while (delta_t) { if (delta_t < delta_t_flt) { delta_t_flt = delta_t; } // delta_t is converted to seconds given a 1MHz clock by dividing // with 1 000 000. This is done in two operations to avoid integer // multiplication overflow. // Calculate filter outputs. int w0_delta_t = w0*delta_t_flt >> 2; int dVbp = w0_delta_t*(Vhp >> 4) >> 14; int dVlp = w0_delta_t*(Vbp >> 4) >> 14; Vbp -= dVbp; Vlp -= dVlp; Vhp = (Vbp*_1024_div_Q >> 10) - Vlp - Vi; delta_t -= delta_t_flt; } } } // ---------------------------------------------------------------------------- // SID audio input (16 bits). // ---------------------------------------------------------------------------- RESID_INLINE void Filter::input(short sample) { // Scale to three times the peak-to-peak for one voice and add the op-amp // "zero" DC level. // NB! Adding the op-amp "zero" DC level is a (wildly inaccurate) // approximation of feeding the input through an AC coupling capacitor. // This could be implemented as a separate filter circuit, however the // primary use of the emulator is not to process external signals. // The upside is that the MOS8580 "digi boost" works without a separate (DC) // input interface. // Note that the input is 16 bits, compared to the 20 bit voice output. model_filter_t& f = model_filter[sid_model]; ve = (sample*f.voice_scale_s14*3 >> 14) + f.mixer[0]; } // ---------------------------------------------------------------------------- // SID audio output (16 bits). // ---------------------------------------------------------------------------- RESID_INLINE short Filter::output() { model_filter_t& f = model_filter[sid_model]; // Writing the switch below manually would be tedious and error-prone; // it is rather generated by the following Perl program: /* my @i = qw(v1 v2 v3 ve Vlp Vbp Vhp); for my $mix (0..2**@i-1) { print sprintf(" case 0x%02x:\n", $mix); my @sum; for (@i) { unshift(@sum, $_) if $mix & 0x01; $mix >>= 1; } my $sum = join(" + ", @sum) || "0"; print " Vi = $sum;\n"; print " offset = mixer_offset<" . @sum . ">::value;\n"; print " break;\n"; } */ // Sum inputs routed into the mixer. int Vi = 0; int offset = 0; switch (mix & 0x7f) { case 0x00: Vi = 0; offset = mixer_offset<0>::value; break; case 0x01: Vi = v1; offset = mixer_offset<1>::value; break; case 0x02: Vi = v2; offset = mixer_offset<1>::value; break; case 0x03: Vi = v2 + v1; offset = mixer_offset<2>::value; break; case 0x04: Vi = v3; offset = mixer_offset<1>::value; break; case 0x05: Vi = v3 + v1; offset = mixer_offset<2>::value; break; case 0x06: Vi = v3 + v2; offset = mixer_offset<2>::value; break; case 0x07: Vi = v3 + v2 + v1; offset = mixer_offset<3>::value; break; case 0x08: Vi = ve; offset = mixer_offset<1>::value; break; case 0x09: Vi = ve + v1; offset = mixer_offset<2>::value; break; case 0x0a: Vi = ve + v2; offset = mixer_offset<2>::value; break; case 0x0b: Vi = ve + v2 + v1; offset = mixer_offset<3>::value; break; case 0x0c: Vi = ve + v3; offset = mixer_offset<2>::value; break; case 0x0d: Vi = ve + v3 + v1; offset = mixer_offset<3>::value; break; case 0x0e: Vi = ve + v3 + v2; offset = mixer_offset<3>::value; break; case 0x0f: Vi = ve + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x10: Vi = Vlp; offset = mixer_offset<1>::value; break; case 0x11: Vi = Vlp + v1; offset = mixer_offset<2>::value; break; case 0x12: Vi = Vlp + v2; offset = mixer_offset<2>::value; break; case 0x13: Vi = Vlp + v2 + v1; offset = mixer_offset<3>::value; break; case 0x14: Vi = Vlp + v3; offset = mixer_offset<2>::value; break; case 0x15: Vi = Vlp + v3 + v1; offset = mixer_offset<3>::value; break; case 0x16: Vi = Vlp + v3 + v2; offset = mixer_offset<3>::value; break; case 0x17: Vi = Vlp + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x18: Vi = Vlp + ve; offset = mixer_offset<2>::value; break; case 0x19: Vi = Vlp + ve + v1; offset = mixer_offset<3>::value; break; case 0x1a: Vi = Vlp + ve + v2; offset = mixer_offset<3>::value; break; case 0x1b: Vi = Vlp + ve + v2 + v1; offset = mixer_offset<4>::value; break; case 0x1c: Vi = Vlp + ve + v3; offset = mixer_offset<3>::value; break; case 0x1d: Vi = Vlp + ve + v3 + v1; offset = mixer_offset<4>::value; break; case 0x1e: Vi = Vlp + ve + v3 + v2; offset = mixer_offset<4>::value; break; case 0x1f: Vi = Vlp + ve + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x20: Vi = Vbp; offset = mixer_offset<1>::value; break; case 0x21: Vi = Vbp + v1; offset = mixer_offset<2>::value; break; case 0x22: Vi = Vbp + v2; offset = mixer_offset<2>::value; break; case 0x23: Vi = Vbp + v2 + v1; offset = mixer_offset<3>::value; break; case 0x24: Vi = Vbp + v3; offset = mixer_offset<2>::value; break; case 0x25: Vi = Vbp + v3 + v1; offset = mixer_offset<3>::value; break; case 0x26: Vi = Vbp + v3 + v2; offset = mixer_offset<3>::value; break; case 0x27: Vi = Vbp + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x28: Vi = Vbp + ve; offset = mixer_offset<2>::value; break; case 0x29: Vi = Vbp + ve + v1; offset = mixer_offset<3>::value; break; case 0x2a: Vi = Vbp + ve + v2; offset = mixer_offset<3>::value; break; case 0x2b: Vi = Vbp + ve + v2 + v1; offset = mixer_offset<4>::value; break; case 0x2c: Vi = Vbp + ve + v3; offset = mixer_offset<3>::value; break; case 0x2d: Vi = Vbp + ve + v3 + v1; offset = mixer_offset<4>::value; break; case 0x2e: Vi = Vbp + ve + v3 + v2; offset = mixer_offset<4>::value; break; case 0x2f: Vi = Vbp + ve + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x30: Vi = Vbp + Vlp; offset = mixer_offset<2>::value; break; case 0x31: Vi = Vbp + Vlp + v1; offset = mixer_offset<3>::value; break; case 0x32: Vi = Vbp + Vlp + v2; offset = mixer_offset<3>::value; break; case 0x33: Vi = Vbp + Vlp + v2 + v1; offset = mixer_offset<4>::value; break; case 0x34: Vi = Vbp + Vlp + v3; offset = mixer_offset<3>::value; break; case 0x35: Vi = Vbp + Vlp + v3 + v1; offset = mixer_offset<4>::value; break; case 0x36: Vi = Vbp + Vlp + v3 + v2; offset = mixer_offset<4>::value; break; case 0x37: Vi = Vbp + Vlp + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x38: Vi = Vbp + Vlp + ve; offset = mixer_offset<3>::value; break; case 0x39: Vi = Vbp + Vlp + ve + v1; offset = mixer_offset<4>::value; break; case 0x3a: Vi = Vbp + Vlp + ve + v2; offset = mixer_offset<4>::value; break; case 0x3b: Vi = Vbp + Vlp + ve + v2 + v1; offset = mixer_offset<5>::value; break; case 0x3c: Vi = Vbp + Vlp + ve + v3; offset = mixer_offset<4>::value; break; case 0x3d: Vi = Vbp + Vlp + ve + v3 + v1; offset = mixer_offset<5>::value; break; case 0x3e: Vi = Vbp + Vlp + ve + v3 + v2; offset = mixer_offset<5>::value; break; case 0x3f: Vi = Vbp + Vlp + ve + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x40: Vi = Vhp; offset = mixer_offset<1>::value; break; case 0x41: Vi = Vhp + v1; offset = mixer_offset<2>::value; break; case 0x42: Vi = Vhp + v2; offset = mixer_offset<2>::value; break; case 0x43: Vi = Vhp + v2 + v1; offset = mixer_offset<3>::value; break; case 0x44: Vi = Vhp + v3; offset = mixer_offset<2>::value; break; case 0x45: Vi = Vhp + v3 + v1; offset = mixer_offset<3>::value; break; case 0x46: Vi = Vhp + v3 + v2; offset = mixer_offset<3>::value; break; case 0x47: Vi = Vhp + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x48: Vi = Vhp + ve; offset = mixer_offset<2>::value; break; case 0x49: Vi = Vhp + ve + v1; offset = mixer_offset<3>::value; break; case 0x4a: Vi = Vhp + ve + v2; offset = mixer_offset<3>::value; break; case 0x4b: Vi = Vhp + ve + v2 + v1; offset = mixer_offset<4>::value; break; case 0x4c: Vi = Vhp + ve + v3; offset = mixer_offset<3>::value; break; case 0x4d: Vi = Vhp + ve + v3 + v1; offset = mixer_offset<4>::value; break; case 0x4e: Vi = Vhp + ve + v3 + v2; offset = mixer_offset<4>::value; break; case 0x4f: Vi = Vhp + ve + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x50: Vi = Vhp + Vlp; offset = mixer_offset<2>::value; break; case 0x51: Vi = Vhp + Vlp + v1; offset = mixer_offset<3>::value; break; case 0x52: Vi = Vhp + Vlp + v2; offset = mixer_offset<3>::value; break; case 0x53: Vi = Vhp + Vlp + v2 + v1; offset = mixer_offset<4>::value; break; case 0x54: Vi = Vhp + Vlp + v3; offset = mixer_offset<3>::value; break; case 0x55: Vi = Vhp + Vlp + v3 + v1; offset = mixer_offset<4>::value; break; case 0x56: Vi = Vhp + Vlp + v3 + v2; offset = mixer_offset<4>::value; break; case 0x57: Vi = Vhp + Vlp + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x58: Vi = Vhp + Vlp + ve; offset = mixer_offset<3>::value; break; case 0x59: Vi = Vhp + Vlp + ve + v1; offset = mixer_offset<4>::value; break; case 0x5a: Vi = Vhp + Vlp + ve + v2; offset = mixer_offset<4>::value; break; case 0x5b: Vi = Vhp + Vlp + ve + v2 + v1; offset = mixer_offset<5>::value; break; case 0x5c: Vi = Vhp + Vlp + ve + v3; offset = mixer_offset<4>::value; break; case 0x5d: Vi = Vhp + Vlp + ve + v3 + v1; offset = mixer_offset<5>::value; break; case 0x5e: Vi = Vhp + Vlp + ve + v3 + v2; offset = mixer_offset<5>::value; break; case 0x5f: Vi = Vhp + Vlp + ve + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x60: Vi = Vhp + Vbp; offset = mixer_offset<2>::value; break; case 0x61: Vi = Vhp + Vbp + v1; offset = mixer_offset<3>::value; break; case 0x62: Vi = Vhp + Vbp + v2; offset = mixer_offset<3>::value; break; case 0x63: Vi = Vhp + Vbp + v2 + v1; offset = mixer_offset<4>::value; break; case 0x64: Vi = Vhp + Vbp + v3; offset = mixer_offset<3>::value; break; case 0x65: Vi = Vhp + Vbp + v3 + v1; offset = mixer_offset<4>::value; break; case 0x66: Vi = Vhp + Vbp + v3 + v2; offset = mixer_offset<4>::value; break; case 0x67: Vi = Vhp + Vbp + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x68: Vi = Vhp + Vbp + ve; offset = mixer_offset<3>::value; break; case 0x69: Vi = Vhp + Vbp + ve + v1; offset = mixer_offset<4>::value; break; case 0x6a: Vi = Vhp + Vbp + ve + v2; offset = mixer_offset<4>::value; break; case 0x6b: Vi = Vhp + Vbp + ve + v2 + v1; offset = mixer_offset<5>::value; break; case 0x6c: Vi = Vhp + Vbp + ve + v3; offset = mixer_offset<4>::value; break; case 0x6d: Vi = Vhp + Vbp + ve + v3 + v1; offset = mixer_offset<5>::value; break; case 0x6e: Vi = Vhp + Vbp + ve + v3 + v2; offset = mixer_offset<5>::value; break; case 0x6f: Vi = Vhp + Vbp + ve + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x70: Vi = Vhp + Vbp + Vlp; offset = mixer_offset<3>::value; break; case 0x71: Vi = Vhp + Vbp + Vlp + v1; offset = mixer_offset<4>::value; break; case 0x72: Vi = Vhp + Vbp + Vlp + v2; offset = mixer_offset<4>::value; break; case 0x73: Vi = Vhp + Vbp + Vlp + v2 + v1; offset = mixer_offset<5>::value; break; case 0x74: Vi = Vhp + Vbp + Vlp + v3; offset = mixer_offset<4>::value; break; case 0x75: Vi = Vhp + Vbp + Vlp + v3 + v1; offset = mixer_offset<5>::value; break; case 0x76: Vi = Vhp + Vbp + Vlp + v3 + v2; offset = mixer_offset<5>::value; break; case 0x77: Vi = Vhp + Vbp + Vlp + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x78: Vi = Vhp + Vbp + Vlp + ve; offset = mixer_offset<4>::value; break; case 0x79: Vi = Vhp + Vbp + Vlp + ve + v1; offset = mixer_offset<5>::value; break; case 0x7a: Vi = Vhp + Vbp + Vlp + ve + v2; offset = mixer_offset<5>::value; break; case 0x7b: Vi = Vhp + Vbp + Vlp + ve + v2 + v1; offset = mixer_offset<6>::value; break; case 0x7c: Vi = Vhp + Vbp + Vlp + ve + v3; offset = mixer_offset<5>::value; break; case 0x7d: Vi = Vhp + Vbp + Vlp + ve + v3 + v1; offset = mixer_offset<6>::value; break; case 0x7e: Vi = Vhp + Vbp + Vlp + ve + v3 + v2; offset = mixer_offset<6>::value; break; case 0x7f: Vi = Vhp + Vbp + Vlp + ve + v3 + v2 + v1; offset = mixer_offset<7>::value; break; } // Sum the inputs in the mixer and run the mixer output through the gain. if (sid_model == 0) { return (short)(f.gain[vol][f.mixer[offset + Vi]] - (1 << 15)); } else { // FIXME: Temporary code for MOS 8580, should use code above. /* do hard clipping here, else some tunes manage to overflow this (eg /MUSICIANS/L/Linus/64_Forever.sid, starting at 0:44) */ int tmp = Vi*(int)vol >> 4; if (tmp < -32768) tmp = -32768; if (tmp > 32767) tmp = 32767; return (short)tmp; } } /* Find output voltage in inverting gain and inverting summer SID op-amp circuits, using a combination of Newton-Raphson and bisection. ---R2-- | | vi ---R1-----[A>----- vo vx From Kirchoff's current law it follows that IR1f + IR2r = 0 Substituting the triode mode transistor model K*W/L*(Vgst^2 - Vgdt^2) for the currents, we get: n*((Vddt - vx)^2 - (Vddt - vi)^2) + (Vddt - vx)^2 - (Vddt - vo)^2 = 0 Our root function f can thus be written as: f = (n + 1)*(Vddt - vx)^2 - n*(Vddt - vi)^2 - (Vddt - vo)^2 = 0 We are using the mapping function x = vo - vx -> vx. We thus substitute for vo = vx + x and get: f = (n + 1)*(Vddt - vx)^2 - n*(Vddt - vi)^2 - (Vddt - (vx + x))^2 = 0 Using substitution constants a = n + 1 b = Vddt c = n*(Vddt - vi)^2 the equations for the root function and its derivative can be written as: f = a*(b - vx)^2 - c - (b - (vx + x))^2 df = 2*((b - (vx + x))*(dvx + 1) - a*(b - vx)*dvx) */ RESID_INLINE int Filter::solve_gain(opamp_t* opamp, int n, int vi, int& x, model_filter_t& mf) { // Note that all variables are translated and scaled in order to fit // in 16 bits. It is not necessary to explicitly translate the variables here, // since they are all used in subtractions which cancel out the translation: // (a - t) - (b - t) = a - b // Start off with an estimate of x and a root bracket [ak, bk]. // f is increasing, so that f(ak) < 0 and f(bk) > 0. int ak = mf.ak, bk = mf.bk; int a = n + (1 << 7); // Scaled by 2^7 int b = mf.kVddt; // Scaled by m*2^16 int b_vi = b - vi; // Scaled by m*2^16 if (b_vi < 0) b_vi = 0; int c = n*int(unsigned(b_vi)*unsigned(b_vi) >> 12); // Scaled by m^2*2^27 for (;;) { int xk = x; // Calculate f and df. int vx = opamp[x].vx; // Scaled by m*2^16 int dvx = opamp[x].dvx; // Scaled by 2^11 // f = a*(b - vx)^2 - c - (b - vo)^2 // df = 2*((b - vo)*(dvx + 1) - a*(b - vx)*dvx) // int vo = vx + (x << 1) - (1 << 16); if (vo >= (1 << 16)) { vo = (1 << 16) - 1; } else if (vo < 0) { vo = 0; } int b_vx = b - vx; if (b_vx < 0) b_vx = 0; int b_vo = b - vo; if (b_vo < 0) b_vo = 0; // The dividend is scaled by m^2*2^27. int f = a*int(unsigned(b_vx)*unsigned(b_vx) >> 12) - c - int(unsigned(b_vo)*unsigned(b_vo) >> 5); // The divisor is scaled by m*2^11. int df = ((b_vo*(dvx + (1 << 11)) >> 1) - (a*(b_vx*dvx >> 8))) >> 14; // The resulting quotient is thus scaled by m*2^16. // Newton-Raphson step: xk1 = xk - f(xk)/f'(xk) // If f(xk) or f'(xk) are zero then we can't improve further. if (df) { x -= f/df; } if (unlikely(x == xk)) { // No further root improvement possible. return vo; } // Narrow down root bracket. if (f < 0) { // f(xk) < 0 ak = xk; } else { // f(xk) > 0 bk = xk; } if (unlikely(x <= ak) || unlikely(x >= bk)) { // Bisection step (ala Dekker's method). x = (ak + bk) >> 1; if (unlikely(x == ak)) { // No further bisection possible. return vo; } } } } /* Find output voltage in inverting integrator SID op-amp circuits, using a single fixpoint iteration step. A circuit diagram of a MOS 6581 integrator is shown below. ---C--- | | vi -----Rw-------[A>----- vo | | vx --Rs-- From Kirchoff's current law it follows that IRw + IRs + ICr = 0 Using the formula for current through a capacitor, i = C*dv/dt, we get IRw + IRs + C*(vc - vc0)/dt = 0 dt/C*(IRw + IRs) + vc - vc0 = 0 vc = vc0 - n*(IRw(vi,vx) + IRs(vi,vx)) which may be rewritten as the following iterative fixpoint function: vc = vc0 - n*(IRw(vi,g(vc)) + IRs(vi,g(vc))) To accurately calculate the currents through Rs and Rw, we need to use transistor models. Rs has a gate voltage of Vdd = 12V, and can be assumed to always be in triode mode. For Rw, the situation is rather more complex, as it turns out that this transistor will operate in both subthreshold, triode, and saturation modes. The Shichman-Hodges transistor model routinely used in textbooks may be written as follows: Ids = 0 , Vgst < 0 (subthreshold mode) Ids = K/2*W/L*(2*Vgst - Vds)*Vds , Vgst >= 0, Vds < Vgst (triode mode) Ids = K/2*W/L*Vgst^2 , Vgst >= 0, Vds >= Vgst (saturation mode) where K = u*Cox (conductance) W/L = ratio between substrate width and length Vgst = Vg - Vs - Vt (overdrive voltage) This transistor model is also called the quadratic model. Note that the equation for the triode mode can be reformulated as independent terms depending on Vgs and Vgd, respectively, by the following substitution: Vds = Vgst - (Vgst - Vds) = Vgst - Vgdt Ids = K*W/L*(2*Vgst - Vds)*Vds = K*W/L*(2*Vgst - (Vgst - Vgdt)*(Vgst - Vgdt) = K*W/L*(Vgst + Vgdt)*(Vgst - Vgdt) = K*W/L*(Vgst^2 - Vgdt^2) This turns out to be a general equation which covers both the triode and saturation modes (where the second term is 0 in saturation mode). The equation is also symmetrical, i.e. it can calculate negative currents without any change of parameters (since the terms for drain and source are identical except for the sign). FIXME: Subthreshold as function of Vgs, Vgd. Ids = I0*e^(Vgst/(n*VT)) , Vgst < 0 (subthreshold mode) The remaining problem with the textbook model is that the transition from subthreshold the triode/saturation is not continuous. Realizing that the subthreshold and triode/saturation modes may both be defined by independent (and equal) terms of Vgs and Vds, respectively, the corresponding terms can be blended into (equal) continuous functions suitable for table lookup. The EKV model (Enz, Krummenacher and Vittoz) essentially performs this blending using an elegant mathematical formulation: Ids = Is*(if - ir) Is = 2*u*Cox*Ut^2/k*W/L if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) For our purposes, the EKV model preserves two important properties discussed above: - It consists of two independent terms, which can be represented by the same lookup table. - It is symmetrical, i.e. it calculates current in both directions, facilitating a branch-free implementation. Rw in the circuit diagram above is a VCR (voltage controlled resistor), as shown in the circuit diagram below. Vw | Vdd | |---| _|_ | -- --| Vg | __|__ | ----- Rw | | | vi ------------ -------- vo In order to calculalate the current through the VCR, its gate voltage must be determined. Assuming triode mode and applying Kirchoff's current law, we get the following equation for Vg: u*Cox/2*W/L*((Vddt - Vg)^2 - (Vddt - vi)^2 + (Vddt - Vg)^2 - (Vddt - Vw)^2) = 0 2*(Vddt - Vg)^2 - (Vddt - vi)^2 - (Vddt - Vw)^2 = 0 (Vddt - Vg) = sqrt(((Vddt - vi)^2 + (Vddt - Vw)^2)/2) Vg = Vddt - sqrt(((Vddt - vi)^2 + (Vddt - Vw)^2)/2) */ RESID_INLINE int Filter::solve_integrate_6581(int dt, int vi, int& vx, int& vc, model_filter_t& mf) { // Note that all variables are translated and scaled in order to fit // in 16 bits. It is not necessary to explicitly translate the variables here, // since they are all used in subtractions which cancel out the translation: // (a - t) - (b - t) = a - b int kVddt = mf.kVddt; // Scaled by m*2^16 // "Snake" voltages for triode mode calculation. unsigned int Vgst = kVddt - vx; unsigned int Vgdt = kVddt - vi; unsigned int Vgdt_2 = Vgdt*Vgdt; // "Snake" current, scaled by (1/m)*2^13*m*2^16*m*2^16*2^-15 = m*2^30 int n_I_snake = mf.n_snake*(int(Vgst*Vgst - Vgdt_2) >> 15); // VCR gate voltage. // Scaled by m*2^16 // Vg = Vddt - sqrt(((Vddt - Vw)^2 + Vgdt^2)/2) int kVg = vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16]; // VCR voltages for EKV model table lookup. int Vgs = kVg - vx; if (Vgs < 0) Vgs = 0; int Vgd = kVg - vi; if (Vgd < 0) Vgd = 0; // VCR current, scaled by m*2^15*2^15 = m*2^30 int n_I_vcr = int(unsigned(vcr_n_Ids_term[Vgs] - vcr_n_Ids_term[Vgd]) << 15); // Change in capacitor charge. vc -= (n_I_snake + n_I_vcr)*dt; /* // FIXME: Determine whether this check is necessary. if (vc < mf.vc_min) { vc = mf.vc_min; } else if (vc > mf.vc_max) { vc = mf.vc_max; } */ // vx = g(vc) vx = mf.opamp_rev[(vc >> 15) + (1 << 15)]; // Return vo. return vx + (vc >> 14); } #endif // RESID_INLINING || defined(RESID_FILTER_CC) } // namespace reSID #endif // not RESID_FILTER_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/ChangeLog0000644000175100001770000004255414544470311021154 000000000000002010-??-?? Dag Lem * Version 1.0 released. * configure.ac: Updated to current autoconf/automake standards. New option --enable-arch for gcc architecture specific optimizations, including vectorization. New option --enable-branch-hints for branch prediction optimizations. * Makefile.am, samp2src.pl: Generate header files instead of source files for waveform samples. Added dac.h, dac.cc. * siddefs.h.in: Sampling method names now better reflect their operation (SAMPLE_RESAMPLE_INTERPOLATE -> SAMPLE_RESAMPLE, SAMPLE_RESAMPLE_FAST -> SAMPLE_RESAMPLE_FASTMEM). New macros for branch prediction: likely / unlikely. * dac.h: New file; accurate emulation of non-monotonic MOS 6581 D/A converters. * dac.cc: New file; accurate emulation of non-monotonic MOS 6581 D/A converters. * envelope.h (EnvelopeGenerator::clock): Emulation of one cycle pipeline delay in the exponential frequency divider. (EnvelopeGenerator::output): Emulation of non-ideal DAC output. (EnvelopeGenerator::set_chip_model): New function; for emulation of DAC imperfections. (EnvelopeGenerator::set_exponential_counter): New function; modularization of exponential counter update. * envelope.cc (EnvelopeGenerator::EnvelopeGenerator): Initialization of DAC lookup tables. (EnvelopeGenerator::readENV): Return envelope_counter directly, in order to allow EnvelopeGenerator::output to emulate DAC imperfections. (EnvelopeGenerator::reset): Initialization of new variables. (EnvelopeGenerator::set_chip_model): New function; for emulation of DAC imperfections. (EnvelopeGenerator::writeCONTROL_REG): Flush of exponential frequency divider pipeline on attack. * extfilt.h (ExternalFilter::clock): Cutoff frequency fixed point accuracy is traded off for for vastly improved filter signal fixed point accuracy. (ExternalFilter::output): Output range reduced from 20 to 16 bits. * extfilt.cc (ExternalFilter::ExternalFilter): Assumes audio equipment impedance of 10kOhm, yielding a high-pass 3-dB frequency of 1.6Hz (changed from 16Hz). Cutoff frequency fixed point accuracy is traded off for for vastly improved filter signal fixed point accuracy. (ExternalFilter::set_chip_model): Removed. Remaining DC levels can only be canceled by enabling the external filter (or by similar post processing). * filter.h: Major rewrite implementing an accurate model of the actual filter and output stage topology, including models for op-amps, input and feedback NMOS FET "resistors", and voltage controlled resistors (VCRs). (Filter::input): New interface to set external input level. (Filter::output): Output range reduced from 20 to 16 bits. (Filter::set_voice_mask): New function. Emulation of physical connection of EXT IN, and voice muting for test purposes. (Filter::solve_gain): New function; iterative solver using Newton-Raphson and bisection to calculate gain for SID op-amp gains and summers using NMOS FETs as input and feedback "resistors". (Filter::solve_integrate): New function; one-step fixpoint solver to calculate output from SID op-amp integrators using VCRs built from four NMOS FETs as inputs. * filter.cc: Major rewrite implementing an accurate model of the actual filter and output stage topology, including models for op-amps, input and feedback NMOS FET "resistors", and voltage controlled resistors (VCRs). (Filter::set_voice_mask): New function. Emulation of physical connection of EXT IN, and voice muting for test purposes. * sid.h: Resampling constants declared in enum. (SID::State): Added voice_mask, shift_register_reset, shift_pipeline, pulse_output, floating_output_ttl, envelope_pipeline. (SID::output): 16 bit output range only, n-bit interface removed. (SID::clock_resample): Renamed from SID::clock_resample_interpolate. (SID::clock_resample_fastmem): Renamed from SID::clock_resample_fast. * sid.cc (SID::clock): Emulation of one cycle pipeline write delay for the MOS8580. (SID::clock_resample): Renamed from SID::clock_resample_interpolate. Corrected bug in FIR table wraparound, courtesy of Antti Lankila. (SID::clock_resample_fastmem): Renamed from SID::clock_resample_fast. (SID::input): Hand off all processing of the external input to the filter. (SID::output): 16 bit output range only, n-bit output interface removed. (SID::read): Aging time for bus value increased from 0x2000 to 0x4000 cycles. (SID::read_state, SID::write_state): Added voice_mask, shift_register_reset, shift_pipeline, pulse_output, floating_output_ttl, envelope_pipeline. (SID::set_voice_mask): New function. Emulation of physical connection of EXT IN, and voice muting for test purposes. (SID::write): Emulation of one cycle pipeline write delay for the MOS8580. (SID::write_pipeline): New function. Emulation of one cycle pipeline write delay for the MOS8580. * spline.h (PointPlotter::operator()): Rounding to nearest integer. * voice.h (Voice::output): Handling of DC for waveform "zero" level moved to Filter::clock. * voice.cc (Voice::set_chip_model): Call set_chip_model for envelope generator. Handling of DC for "zero" level moved to Filter::set_chip_model. * wave.h (WaveformGenerator::clock): Corrected shift register model. Emulation of reset time for the shift register. Emulation of two cycle pipeline delay for accumulator bit 19 to shift the shift register. (WaveformGenerator::clock_shift_register) (WaveformGenerator::write_shift_register) (WaveformGenerator::reset_shift_register) (WaveformGenerator::set_noise_output): New functions. Emulation of writes to the shift register by combined waveforms. (WaveformGenerator::set_waveform_output): New function. Emulation of floating DAC input with aging. Emulation of one cycle pipeline delay for the pulse width comparator to change the pulse level. Emulation of writes to the shift register by combined waveforms. Highly optimized waveform calculation using nearly branch-free table lookup for all waveforms; replaces 16 previous waveform functions named WaveformGenerator::outputXXXX. (WaveformGenerator::output): Emulation of non-ideal DAC output. * wave.cc (WaveformGenerator::WaveformGenerator): Initialization of lookup tables for basic waveforms and DACs. (WaveformGenerator::readOSC): Return waveform_output directly, in order to allow WaveformGenerator::output to emulate DAC imperfections. (WaveformGenerator::set_chip_model): Update pointer to current waveform table. (WaveformGenerator::writePW_LO, WaveformGenerator::writePW_HI): Push next pulse level into pulse level pipeline. (WaveformGenerator::writeCONTROL_REG): Emulation of the effects of the test bit on the shift register (shifting, reset time). Emulation of fading time for floating DAC input (waveform 0). Update pointer to current waveform table. (WaveformGenerator::reset): Initialization of new variables. 2004-06-11 Dag Lem * Version 0.16 released. * envelope.h (EnvelopeGenerator::clock): Corrected off-by-one error in check for ADSR delay bug in delta_t cycle interface. * filter.cc (Filter::set_chip_model): Initialize filter cutoff mappings before call to set_chip_model. * sid.cc (SID::set_sampling_parameters): Build shifted FIR tables with samples according to the sampling frequency. (SID::clock_resample_interpolate): New function; factorized linear interpolation out from filter convolutions, and made convolutions vectorizable. (SID::clock_resample_fast): New function; single convolution, same accuracy as with interpolation by using more filter tables. (SID::State, SID::read_state, SID::write_state): Read and write rate_counter_period and exponential_counter_period. Read sustain value. 2003-10-20 Dag Lem * Version 0.15 released. * envelope.h (EnvelopeGenerator): Added public State enum. (EnvelopeGenerator::clock): Rate counter is 15 bits, count rate_period - 1 after wrapping from 0x8000 to 0 in ADSR delay bug. * sid.cc, sid.h (SID::State): Added envelope_state. (SID::State::write_state): Restore register 0x18. (SID::set_sampling_parameters): Scale resampling filter to avoid clipping. (SID::clock_resample): Saturated arithmetics to avoid clipping. 2002-12-31 Dag Lem * Version 0.14 released. * envelope.h (EnvelopeGenerator::clock): Corrected one cycle error in ADSR delay bug. Only load the exponential counter period at the envelope counter values 255, 93, 54, 26, 14, 6, 0. * filter.cc (Filter::set_chip_model): Call set_w0() and set_Q() to update filter settings. (Filter::set_w0): Limit cutoff frequency for both 1 cycle and delta_t cycle filter. * filter.h (Filter::clock): Mix in external audio input. * sid.cc, sid.h (SID::input): New function; accepts external audio input sample. * spline.h (PointPlotter::operator ()): Clamp negative values to zero. * voice.cc, voice.h: Changed misleading name wave_DC to wave_zero. * wave.h (WaveformGenerator::clock): Corrected bug in check for accumulator bit 19 in noise register shift. 2002-01-19 Dag Lem * Version 0.13 released. * configure.in: Replaced AC_TRY_COMPILER with AC_TRY_COMPILE, removed AC_PROG_RANLIB. * envelope.h (EnvelopeGenerator::clock): Reset rate_step on state change. * extfilt.cc (ExternalFilter::set_chip_model): New calculation of maximum mixer DC level. * filter.cc (Filter::set_chip_model): Moved calculation of voice_DC to voice.cc, corrected calculation of mixer_DC. * filter.h (Filter::output): Mixer output is not inverted. * sid.cc (SID::set_chip_model): Call voice.set_chip_model instead of voice.wave.set_chip_model. * voice.cc (Voice::Voice): Call set_chip_model. (Voice::set_chip_model): New function; model both waveform D/A converter and envelope multiplying D/A converter DC offsets. * voice.h (Voice::output): Add both waveform D/A converter and envelope multiplying D/A converter DC offsets. * wave.h (WaveformGenerator::output____): Reverted to output minimum wave level when no waveform is selected. The maximum and minimum wave output levels are interchanged in C= Hacking Issue #20. 2001-10-20 Dag Lem * Version 0.12 released. * envelope.cc, envelope.h, filter.cc, filter.h, wave.cc, wave.h: Removed bool usage. This avoids unnecessary conversion to 1/0. * filter.cc (Filter::set_chip_model): New function; selects voice and mixer DC offsets and mapping from the FC registers to filter cutoff frequency. The voice and mixer DC offsets for the MOS6581 are calculated from measurements made by Hrsfalvi, Levente in C= Hacking Issue #20. (Filter::Filter): Call set_chip_model. (Filter::f0_6581, Filter::f0_8580): Separate FC mapping tables. (Filter::f0_points_6581, Filter::f0_points_8580): Separate FC mapping points. * extfilt.cc, extfilt.h (ExternalFilter::set_chip_model): New function supporting separate DC correction for MOS6581 and MOS8580. * sid.cc, sid.h (SID::adjust_sampling_frequency): New function for on-the-fly adjustment of sampling frequency. (SID::clock_fast): Corrected sample calculation. (SID::set_chip_model): Set filter chip model. (SID::output): Added audio clipping. (SID::clock, SID::clock_fast, SID::clock_interpolate, SID::clock_resample): Added sample interleaving. * spline.h (interpolate): Generalized to accept repeated points to introduce points of non-differentiability and discontinuity. * wave.h (WaveformGenerator::output____): No selected waveform yields maximum wave output level. This was found by Hrsfalvi, Levente in C= Hacking Issue #20. (WaveformGenerator::clock): Optimized for speed (no division). 2001-03-10 Dag Lem * Version 0.11 released. * configure.in: Disable building of shared library by default. Control inlining with RESID_INLINING (0 or 1) and RESID_INLINE (blank or "inline"). * envelope.h, extfilt.h, filter.h, voice.h, wave.h: inline keyword in both function declarations and function definitions. * samp2src.pl: Beautified Perl code. * sid.h, sid.cc: Replaced voice variables with array. Removed filter variables from SID::State. (SID::clock): New audio sample generating interface. Three clocking methods are available; clocking at output sample frequency, clocking at cycle frequency with linear sample interpolation, and clocking at cycle frequency with audio resampling. (SID::clock_fast, SID::clock_interpolate, SID::clock_resample): New functions called by SID::clock. (SID::set_sampling_parameters): New function to set up SID for sample generation. The FIR table used in SID::clock_resample is calculated here. (SID::I0): 0th order modified Bessel function to calculate Kaiser window. * siddefs.h: Control inlining with RESID_INLINING (0 or 1) and RESID_INLINE (blank or "inline"). Added enum sampling_method. * voice.h, voice.cc (Voice::set_sync_source): Moved setting of sync source from constructor. * wave.h, wave.cc (WaveformGenerator::set_sync_source): Moved setting of sync source from constructor. 2000-11-22 Dag Lem * Version 0.10 released. * configure.in, Makefile.am: Use libtool to build library. The hack to "disable" install is removed. * extfilt.h, filter.h: Moved filter stability code from sid.cc. * sid.cc (SID::clock): Moved filter stability code to extfilt.h/filter.h. Don't clock the rest of the chip more frequently than necessary. * wave.cc: Typecast for pedantic (and probably incorrect) compilers. 2000-05-18 Dag Lem * Version 0.9 released. * filter.h (Filter::output): The sum of the filter outputs is no longer weighted. 1999-06-24 Dag Lem * Version 0.8 released. * filter.h, filter.cc, wave.h, wave.cc: Typecasts for pedantic compilers. * filter.h (Filter::clock): Voice 3 is only silenced by voice3off if it is not routed through the filter. * sid.cc (SID::State): Added constructor for proper initalization. * spline.h: Inlined template functions to avoid problems at link time with certain compilers. 1999-02-25 Dag Lem * Version 0.7 released. * configure.in: Check whether compiler supports bool. * extfilt.h, extfilt.cc: Implementation of C64 filter, external to the SID chip. * filter.h (Filter::clock): Optimized filter routing using a switch. (Filter::output): Optimized filter mixing using a switch, avoiding integer division. Corrected sign of filtered output, which is inverted compared to unfiltered output. * filter.cc (Filter::set_w0): Removed use of M_PI and math.h functions. Use spline table to map fc to w0. (Filter::fc_default): Return array of FC spline interpolation points. (Filter::fc_plotter): Return FC spline plotter object. * sid.h (SID::enable_external_filter): Enable/disable external filter. (SID::fc_default): Return array of FC spline interpolation points. (SID::fc_plotter): Return FC spline plotter object. (SID::State, SID::read_state, SID::write_state): Read and write complete SID state. * sid.cc (SID::clock): Age bus value. Clock external filter. (SID::enable_external_filter): Enable/disable external filter. * spline.h: Spline implementation. Used to specify mapping from the FC register to filter cutoff frequency. 1998-11-14 Dag Lem * Version 0.6 released. * configure.in: Allow compilation in a separate directory. * wave.h (WaveformGenerator::synchronize): Handle special case when a sync source is synced itself on the same cycle as its MSB is set high. * sid.cc (SID::clock): Only clock on MSB on/off for hard sync. 1998-09-06 Dag Lem * Version 0.5 released. * version.cc (resid_version_string): Version string with C linkage. * wave.cc (WaveformGenerator::set_chip_model): Emulation of MOS8580 combined waveforms. 1998-08-28 Dag Lem * Version 0.4 released. * envelope.h (EnvelopeGenerator::clock): Count up to rate_period twice during ADSR delay bug, and add one extra rate counter step. * filter.cc (Filter::bsd_copysign): Renamed copysign function for compilation on platforms where copysign is implemented as a macro. 1998-08-23 Dag Lem * Version 0.3 released. * envelope.h (EnvelopeGenerator::clock): Handle ADSR boundary bug. * envelope.cc (EnvelopeGenerator::rate_counter_period, EnvelopeGenerator::exponential_counter_period): Corrected counter periods. * filter.h (Filter::clock): Optimized for speed (division by shifting). * sid.h (SID::clock): New one-cycle optimized overload of the clock() function. * wave.h (WaveformGenerator::output_P_T): Combined waveform pulse+triangle indexing corrected. (WaveformGenerator::output_P__): Check for test bit to handle pulse+test bit samples. (WaveformGenerator::output): Optimized for speed (inlining). 1998-07-28 Dag Lem * Version 0.2 released. * envelope.h (EnvelopeGenerator::clock): Start decay cycle immediately at envelope counter 0xff. New sustain value is zero if the sustain level is raised above the current envelope counter value. (EnvelopeGenerator::step_envelope): Handle ADSR delay bug. * envelope.cc (EnvelopeGenerator::rate_counter_period, EnvelopeGenerator::exponential_counter_period): Corrected counter periods. (EnvelopeGenerator::writeCONTROL_REG): Do not modify rate counter. * filter.cc (Filter::set_Q): Constrain Q to keep filter stable. * sid.h (SID::read, SID::write, SID::bypass_filter): Simplified API routing register access through the SID class. * sid.cc (SID::output): Corrected variable-bit audio output return. (SID::read, SID::write): Allow read of write only registers. 1998-06-09 Dag Lem * Version 0.1 released. libsidplayfp-2.6.0/src/builders/resid-builder/resid/envelope.cc0000644000175100001770000002275214544470311021524 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_ENVELOPE_CC #include "envelope.h" #include "dac.h" namespace reSID { // Rate counter periods are calculated from the Envelope Rates table in // the Programmer's Reference Guide. The rate counter period is the number of // cycles between each increment of the envelope counter. // The rates have been verified by sampling ENV3. // // The rate counter is a 16 bit register which is incremented each cycle. // When the counter reaches a specific comparison value, the envelope counter // is incremented (attack) or decremented (decay/release) and the // counter is zeroed. // // NB! Sampling ENV3 shows that the calculated values are not exact. // It may seem like most calculated values have been rounded (.5 is rounded // down) and 1 has beed added to the result. A possible explanation for this // is that the SID designers have used the calculated values directly // as rate counter comparison values, not considering a one cycle delay to // zero the counter. This would yield an actual period of comparison value + 1. // // The time of the first envelope count can not be exactly controlled, except // possibly by resetting the chip. Because of this we cannot do cycle exact // sampling and must devise another method to calculate the rate counter // periods. // // The exact rate counter periods can be determined e.g. by counting the number // of cycles from envelope level 1 to envelope level 129, and dividing the // number of cycles by 128. CIA1 timer A and B in linked mode can perform // the cycle count. This is the method used to find the rates below. // // To avoid the ADSR delay bug, sampling of ENV3 should be done using // sustain = release = 0. This ensures that the attack state will not lower // the current rate counter period. // // The ENV3 sampling code below yields a maximum timing error of 14 cycles. // lda #$01 // l1: cmp $d41c // bne l1 // ... // lda #$ff // l2: cmp $d41c // bne l2 // // This yields a maximum error for the calculated rate period of 14/128 cycles. // The described method is thus sufficient for exact calculation of the rate // periods. // reg16 EnvelopeGenerator::rate_counter_period[] = { 8, // 2ms*1.0MHz/256 = 7.81 31, // 8ms*1.0MHz/256 = 31.25 62, // 16ms*1.0MHz/256 = 62.50 94, // 24ms*1.0MHz/256 = 93.75 148, // 38ms*1.0MHz/256 = 148.44 219, // 56ms*1.0MHz/256 = 218.75 266, // 68ms*1.0MHz/256 = 265.63 312, // 80ms*1.0MHz/256 = 312.50 391, // 100ms*1.0MHz/256 = 390.63 976, // 250ms*1.0MHz/256 = 976.56 1953, // 500ms*1.0MHz/256 = 1953.13 3125, // 800ms*1.0MHz/256 = 3125.00 3906, // 1 s*1.0MHz/256 = 3906.25 11719, // 3 s*1.0MHz/256 = 11718.75 19531, // 5 s*1.0MHz/256 = 19531.25 31250 // 8 s*1.0MHz/256 = 31250.00 }; // For decay and release, the clock to the envelope counter is sequentially // divided by 1, 2, 4, 8, 16, 30, 1 to create a piece-wise linear approximation // of an exponential. The exponential counter period is loaded at the envelope // counter values 255, 93, 54, 26, 14, 6, 0. The period can be different for the // same envelope counter value, depending on whether the envelope has been // rising (attack -> release) or sinking (decay/release). // // Since it is not possible to reset the rate counter (the test bit has no // influence on the envelope generator whatsoever) a method must be devised to // do cycle exact sampling of ENV3 to do the investigation. This is possible // with knowledge of the rate period for A=0, found above. // // The CPU can be synchronized with ENV3 by first synchronizing with the rate // counter by setting A=0 and wait in a carefully timed loop for the envelope // counter _not_ to change for 9 cycles. We can then wait for a specific value // of ENV3 with another timed loop to fully synchronize with ENV3. // // At the first period when an exponential counter period larger than one // is used (decay or relase), one extra cycle is spent before the envelope is // decremented. The envelope output is then delayed one cycle until the state // is changed to attack. Now one cycle less will be spent before the envelope // is incremented, and the situation is normalized. // The delay is probably caused by the comparison with the exponential counter, // and does not seem to affect the rate counter. This has been verified by // timing 256 consecutive complete envelopes with A = D = R = 1, S = 0, using // CIA1 timer A and B in linked mode. If the rate counter is not affected the // period of each complete envelope is // (255 + 162*1 + 39*2 + 28*4 + 12*8 + 8*16 + 6*30)*32 = 756*32 = 32352 // which corresponds exactly to the timed value divided by the number of // complete envelopes. // NB! This one cycle delay is only modeled for single cycle clocking. // From the sustain levels it follows that both the low and high 4 bits of the // envelope counter are compared to the 4-bit sustain value. // This has been verified by sampling ENV3. // reg8 EnvelopeGenerator::sustain_level[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, }; // DAC lookup tables. unsigned short EnvelopeGenerator::model_dac[2][1 << 8] = { {0}, {0}, }; // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- EnvelopeGenerator::EnvelopeGenerator() { static bool class_init; if (!class_init) { // Build DAC lookup tables for 8-bit DACs. // MOS 6581: 2R/R ~ 2.20, missing termination resistor. build_dac_table(model_dac[0], 8, 2.20, false); // MOS 8580: 2R/R ~ 2.00, correct termination. build_dac_table(model_dac[1], 8, 2.00, true); class_init = true; } set_chip_model(MOS6581); // Counter's odd bits are high on powerup envelope_counter = 0xaa; // just to avoid uninitialized access with delta clocking next_state = RELEASE; reset(); } // ---------------------------------------------------------------------------- // SID reset. // ---------------------------------------------------------------------------- void EnvelopeGenerator::reset() { // counter is not changed on reset envelope_pipeline = 0; exponential_pipeline = 0; state_pipeline = 0; attack = 0; decay = 0; sustain = 0; release = 0; gate = 0; rate_counter = 0; exponential_counter = 0; exponential_counter_period = 1; new_exponential_counter_period = 0; reset_rate_counter = false; state = RELEASE; rate_period = rate_counter_period[release]; hold_zero = false; } // ---------------------------------------------------------------------------- // Set chip model. // ---------------------------------------------------------------------------- void EnvelopeGenerator::set_chip_model(chip_model model) { sid_model = model; } // ---------------------------------------------------------------------------- // Register functions. // ---------------------------------------------------------------------------- void EnvelopeGenerator::writeCONTROL_REG(reg8 control) { reg8 gate_next = control & 0x01; // The rate counter is never reset, thus there will be a delay before the // envelope counter starts counting up (attack) or down (release). if (gate != gate_next) { // Gate bit on: Start attack, decay, sustain. // Gate bit off: Start release. next_state = gate_next ? ATTACK : RELEASE; if (next_state == ATTACK) { // The decay register is "accidentally" activated during first cycle of attack phase state = DECAY_SUSTAIN; rate_period = rate_counter_period[decay]; state_pipeline = 2; if (reset_rate_counter || exponential_pipeline == 2) { envelope_pipeline = exponential_counter_period == 1 || exponential_pipeline == 2 ? 2 : 4; } else if (exponential_pipeline == 1) { state_pipeline = 3; } } else {state_pipeline = envelope_pipeline > 0 ? 3 : 2;} gate = gate_next; } } void EnvelopeGenerator::writeATTACK_DECAY(reg8 attack_decay) { attack = (attack_decay >> 4) & 0x0f; decay = attack_decay & 0x0f; if (state == ATTACK) { rate_period = rate_counter_period[attack]; } else if (state == DECAY_SUSTAIN) { rate_period = rate_counter_period[decay]; } } void EnvelopeGenerator::writeSUSTAIN_RELEASE(reg8 sustain_release) { sustain = (sustain_release >> 4) & 0x0f; release = sustain_release & 0x0f; if (state == RELEASE) { rate_period = rate_counter_period[release]; } } reg8 EnvelopeGenerator::readENV() { return env3; } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/filter8580new.h0000644000175100001770000015203214544470311022070 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_FILTER_H #define RESID_FILTER_H #include "resid-config.h" namespace reSID { // ---------------------------------------------------------------------------- // The SID filter is modeled with a two-integrator-loop biquadratic filter, // which has been confirmed by Bob Yannes to be the actual circuit used in // the SID chip. // // Measurements show that excellent emulation of the SID filter is achieved, // except when high resonance is combined with high sustain levels. // In this case the SID op-amps are performing less than ideally and are // causing some peculiar behavior of the SID filter. This however seems to // have more effect on the overall amplitude than on the color of the sound. // // The theory for the filter circuit can be found in "Microelectric Circuits" // by Adel S. Sedra and Kenneth C. Smith. // The circuit is modeled based on the explanation found there except that // an additional inverter is used in the feedback from the bandpass output, // allowing the summer op-amp to operate in single-ended mode. This yields // filter outputs with levels independent of Q, which corresponds with the // results obtained from a real SID. // // We have been able to model the summer and the two integrators of the circuit // to form components of an IIR filter. // Vhp is the output of the summer, Vbp is the output of the first integrator, // and Vlp is the output of the second integrator in the filter circuit. // // According to Bob Yannes, the active stages of the SID filter are not really // op-amps. Rather, simple NMOS inverters are used. By biasing an inverter // into its region of quasi-linear operation using a feedback resistor from // input to output, a MOS inverter can be made to act like an op-amp for // small signals centered around the switching threshold. // // In 2008, Michael Huth facilitated closer investigation of the SID 6581 // filter circuit by publishing high quality microscope photographs of the die. // Tommi Lempinen has done an impressive work on re-vectorizing and annotating // the die photographs, substantially simplifying further analysis of the // filter circuit. // // The filter schematics below are reverse engineered from these re-vectorized // and annotated die photographs. While the filter first depicted in reSID 0.9 // is a correct model of the basic filter, the schematics are now completed // with the audio mixer and output stage, including details on intended // relative resistor values. Also included are schematics for the NMOS FET // voltage controlled resistors (VCRs) used to control cutoff frequency, the // DAC which controls the VCRs, the NMOS op-amps, and the output buffer. // // // SID 6581 filter / mixer / output // -------------------------------- // // --------------------------------------------------- // | | // | --1R1-- \-- D7 | // | ---R1-- | | | // | | | |--2R1-- \--| D6 | // | --------------|--Rw-----[A>--|--Rw-----[A>--| // ve (EXT IN) | | | | // D3 \ ---------------R8--| | | (CAP2A) | (CAP1A) // | v3 | | vhp | vbp | vlp // D2 | \ -----------R8--| ----- | | // | | v2 | | | | // D1 | | \ -------R8--| | ---------------- | // | | | v1 | | | | // D0 | | | \ ---R8-- | | --------------------------- // | | | | | | | // R6 R6 R6 R6 R6 R6 R6 // | | | | $18 | | | $18 // | \ | | D7: 1=open \ \ \ D6 - D4: 0=open // | | | | | | | // --------------------------------- 12V // | // | D3 --/ --1R4-- | // | ---R8-- | | ---R3-- | // | | | D2 |--/ --2R4--| | | ||-- // ------[A>---------| |-----[A>-----|| // D1 |--/ --4R4--| (4.25R2) ||-- // $18 | | | // 0=open D0 --/ --8R4-- (8.75R2) | // // vo (AUDIO // OUT) // // // v1 - voice 1 // v2 - voice 2 // v3 - voice 3 // ve - ext in // vhp - highpass output // vbp - bandpass output // vlp - lowpass output // vo - audio out // [A> - single ended inverting op-amp (self-biased NMOS inverter) // Rn - "resistors", implemented with custom NMOS FETs // Rw - cutoff frequency resistor (VCR) // C - capacitor // // Notes: // // R2 ~ 2.0*R1 // R6 ~ 6.0*R1 // R8 ~ 8.0*R1 // R24 ~ 24.0*R1 // // The Rn "resistors" in the circuit are implemented with custom NMOS FETs, // probably because of space constraints on the SID die. The silicon substrate // is laid out in a narrow strip or "snake", with a strip length proportional // to the intended resistance. The polysilicon gate electrode covers the entire // silicon substrate and is fixed at 12V in order for the NMOS FET to operate // in triode mode (a.k.a. linear mode or ohmic mode). // // Even in "linear mode", an NMOS FET is only an approximation of a resistor, // as the apparant resistance increases with increasing drain-to-source // voltage. If the drain-to-source voltage should approach the gate voltage // of 12V, the NMOS FET will enter saturation mode (a.k.a. active mode), and // the NMOS FET will not operate anywhere like a resistor. // // // // NMOS FET voltage controlled resistor (VCR) // ------------------------------------------ // // Vw // // | // | // R1 // | // --R1--| // | __|__ // | ----- // | | | // vi ---------- -------- vo // | | // ----R24---- // // // vi - input // vo - output // Rn - "resistors", implemented with custom NMOS FETs // Vw - voltage from 11-bit DAC (frequency cutoff control) // // Notes: // // An approximate value for R24 can be found by using the formula for the // filter cutoff frequency: // // FCmin = 1/(2*pi*Rmax*C) // // Assuming that a the setting for minimum cutoff frequency in combination with // a low level input signal ensures that only negligible current will flow // through the transistor in the schematics above, values for FCmin and C can // be substituted in this formula to find Rmax. // Using C = 470pF and FCmin = 220Hz (measured value), we get: // // FCmin = 1/(2*pi*Rmax*C) // Rmax = 1/(2*pi*FCmin*C) = 1/(2*pi*220*470e-12) ~ 1.5MOhm // // From this it follows that: // R24 = Rmax ~ 1.5MOhm // R1 ~ R24/24 ~ 64kOhm // R2 ~ 2.0*R1 ~ 128kOhm // R6 ~ 6.0*R1 ~ 384kOhm // R8 ~ 8.0*R1 ~ 512kOhm // // Note that these are only approximate values for one particular SID chip, // due to process variations the values can be substantially different in // other chips. // // // // Filter frequency cutoff DAC // --------------------------- // // // 12V 10 9 8 7 6 5 4 3 2 1 0 VGND // | | | | | | | | | | | | | Missing // 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R termination // | | | | | | | | | | | | | // Vw ----R---R---R---R---R---R---R---R---R---R---R-- --- // // Bit on: 12V // Bit off: 5V (VGND) // // As is the case with all MOS 6581 DACs, the termination to (virtual) ground // at bit 0 is missing. // // Furthermore, the control of the two VCRs imposes a load on the DAC output // which varies with the input signals to the VCRs. This can be seen from the // VCR figure above. // // // // "Op-amp" (self-biased NMOS inverter) // ------------------------------------ // // // 12V // // | // -----------| // | | // | ------| // | | | // | | ||-- // | --|| // | ||-- // ||-- | // vi -----|| |--------- vo // ||-- | | // | ||-- | // |-------|| | // | ||-- | // ||-- | | // --|| | | // | ||-- | | // | | | | // | -----------| | // | | | // | | // | GND | // | | // ---------------------- // // // vi - input // vo - output // // Notes: // // The schematics above are laid out to show that the "op-amp" logically // consists of two building blocks; a saturated load NMOS inverter (on the // right hand side of the schematics) with a buffer / bias input stage // consisting of a variable saturated load NMOS inverter (on the left hand // side of the schematics). // // Provided a reasonably high input impedance and a reasonably low output // impedance, the "op-amp" can be modeled as a voltage transfer function // mapping input voltage to output voltage. // // // // Output buffer (NMOS voltage follower) // ------------------------------------- // // // 12V // // | // | // ||-- // vi -----|| // ||-- // | // |------ vo // | (AUDIO // Rext OUT) // | // | // // GND // // vi - input // vo - output // Rext - external resistor, 1kOhm // // Notes: // // The external resistor Rext is needed to complete the NMOS voltage follower, // this resistor has a recommended value of 1kOhm. // // Die photographs show that actually, two NMOS transistors are used in the // voltage follower. However the two transistors are coupled in parallel (all // terminals are pairwise common), which implies that we can model the two // transistors as one. // // ---------------------------------------------------------------------------- // // SID 8580 filter / mixer / output // -------------------------------- // // +---------------------------------------------------+ // | $17 +----Rf-+ | // | | | | // | D4&!D5 o- \-R3-o | // | | | $17 | // | !D4&!D5 o- \-R2-o | // | | | +---R8-- \--+ !D6&D7 | // | D4&!D5 o- \-R1-o | | | // | | | o---RC-- \--o D6&D7 | // | +---------o----o--Rfc-o--[A>--o--Rfc-o--[A>--o // ve (EXT IN) | | | | // D3 \ --------------R12--o | | (CAP2A) | (CAP1A) // | v3 | | vhp | vbp | vlp // D2 | \ -----------R7--o +-----+ | | // | | v2 | | | | // D1 | | \ -------R7--o | +----------------+ | // | | | v1 | | | | // D0 | | | \ ---R7--+ | | +---------------------------+ // | | | | | | | // R9 R5 R5 R5 R5 R5 R5 // | | | | $18 | | | $18 // | \ | | D7: 1=open \ \ \ D6 - D4: 0=open // | | | | | | | // +---o---o---o-------------o---o---+ // | // | D3 +--/ --1R4--+ // | +---R8--+ | | +---R2--+ // | | | D2 o--/ --2R4--o | | // +---o--[A>--o------o o--o--[A>--o-- vo (AUDIO OUT) // D1 o--/ --4R4--o // $18 | | // 0=open D0 +--/ --8R4--+ // // // // // R1 = 15.3*Ri // R2 = 7.3*Ri // R3 = 4.7*Ri // Rf = 1.4*Ri // R4 = 1.4*Ri // R8 = 2.0*Ri // RC = 2.8*Ri // // // // Op-amps // ------- // Unlike the 6581, the 8580 has real OpAmps. // // Temperature compensated differential amplifier: // // 9V // // | // +-------o-o-o-------+ // | | | | // | R R | // +--|| | | ||--+ // ||---o o---|| // +--|| | | ||--+ // | | | | // o-----+ | | o--- Va // | | | | | // +--|| | | | ||--+ // ||-o-+---+---|| // +--|| | | ||--+ // | | | | // | | // GND | | GND // ||--+ +--|| // in- -----|| ||------ in+ // ||----o----|| // | // 8 Current sink // | // // GND // // Inverter + non-inverting output amplifier: // // Va ---o---||-------------------o--------------------+ // | | 9V | // | +----------+----------+ | | // | 9V | | 9V | ||--+ | // | | | 9V | | +-|| | // | R | | | ||--+ ||--+ | // | | | ||--+ +--|| o---o--- Vout // | o---o---|| ||--+ ||--+ // | | ||--+ o-----|| // | ||--+ | ||--+ ||--+ // +-----|| o-----|| | // ||--+ | ||--+ // | R | GND // | // GND GND // GND // // // // Virtual ground // -------------- // A PolySi resitive voltage divider provides the voltage // for the non-inverting input of the filter op-amps. // // 5V // +----------+ // | | |\ | // R1 +---|-\ | // 5V | |A >---o--- Vref // o-------|+/ // | | |/ // R10 R4 // | | // o---+ // | // R10 // | // // GND // // Rn = n*R1 // // // // Rfc - freq control DAC resistance ladder // ---------------------------------------- // The resistance for the bandpass and lowpass integrator stages of the filter are determined // by an 11 bit DAC driven by the FC register. // If all 11 bits are '0', the impedance of the DAC would be "infinitely high". // To get around this, there is an 11 input NOR gate below the DAC sensing those 11 bits. // If they are all 0, the NOR gate gives the gate control voltage to the 12 bit DAC LSB. // // // // Crystal stabilized precision switched capacitor voltage divider // --------------------------------------------------------------- // There is a FET working as a temperature sensor close to the DACs which changes the gate voltage // of the frequency control DACs according to the temperature, to reduce its effects on the filter curve. // An asynchronous 3 bit binary counter, running at the speed of PHI2, drives two big capacitors // which AC resistance is then used as a voltage divider. // This implicates that frequency difference between PAL and NTSC might shift the filter curve by 4% or such. // // https://en.wikipedia.org/wiki/Switched_capacitor // // |\ OpAmp has a smaller capacitor // Vref ---|+\ than the other OPs // |A >---o--- Vdac // o-------|-/ | // | |/ | // | | // C1 | C2 | // +---||---o---+ +---o-----||-------o // | | | | | | // o----+ | ----- | | // | | | ----- +----+ +-----+ // | ----- | | | | // | ----- | ----- | // | | | ----- | // | +-----------+ | | // | /Q Q | +-------+ // GND +-----------+ FET close to DAC // | clk/8 | working as temperature sensor // +-----------+ // | | // clk1 clk2 // // Compile-time computation of op-amp summer and mixer table offsets. // The highpass summer has 2 - 6 inputs (bandpass, lowpass, and 0 - 4 voices). template struct summer_offset { enum { value = summer_offset::value + ((2 + i - 1) << 16) }; }; template<> struct summer_offset<0> { enum { value = 0 }; }; // The mixer has 0 - 7 inputs (0 - 4 voices and 0 - 3 filter outputs). template struct mixer_offset { enum { value = mixer_offset::value + ((i - 1) << 16) }; }; template<> struct mixer_offset<1> { enum { value = 1 }; }; template<> struct mixer_offset<0> { enum { value = 0 }; }; class Filter { public: Filter(); void enable_filter(bool enable); void adjust_filter_bias(double dac_bias); void set_chip_model(chip_model model); void set_voice_mask(reg4 mask); void clock(int voice1, int voice2, int voice3); void clock(cycle_count delta_t, int voice1, int voice2, int voice3); void reset(); // Write registers. void writeFC_LO(reg8); void writeFC_HI(reg8); void writeRES_FILT(reg8); void writeMODE_VOL(reg8); // SID audio input (16 bits). void input(short sample); // SID audio output (16 bits). short output(); protected: void set_sum_mix(); void set_w0(); // Filter enabled. bool enabled; // Filter cutoff frequency. reg12 fc; // Filter resonance. reg8 res; // Selects which voices to route through the filter. reg8 filt; // Selects which filter outputs to route into the mixer. reg4 mode; // Output master volume. reg4 vol; // Used to mask out EXT IN if not connected, and for test purposes // (voice muting). reg8 voice_mask; // Select which inputs to route into the summer / mixer. // These are derived from filt, mode, and voice_mask. reg8 sum; reg8 mix; // State of filter. int Vhp; // highpass int Vbp; // bandpass int Vbp_x, Vbp_vc; int Vlp; // lowpass int Vlp_x, Vlp_vc; // Filter / mixer inputs. int ve; int v3; int v2; int v1; chip_model sid_model; typedef struct { unsigned short vx; short dvx; } opamp_t; typedef struct { int kVddt; // K*(Vdd - Vth) int voice_scale_s14; int voice_DC; int ak; int bk; int vc_min; int vc_max; double vo_N16; // Fixed point scaling for 16 bit op-amp output. // Reverse op-amp transfer function. unsigned short opamp_rev[1 << 16]; // Lookup tables for gain and summer op-amps in output stage / filter. unsigned short summer[summer_offset<5>::value]; unsigned short gain[16][1 << 16]; unsigned short resonance[16][1 << 16]; unsigned short mixer[mixer_offset<8>::value]; // Cutoff frequency DAC output voltage table. FC is an 11 bit register. unsigned short f0_dac[1 << 11]; } model_filter_t; // 6581 only // Cutoff frequency DAC voltage, resonance. int Vddt_Vw_2, Vw_bias; static int n_snake; // 8580 only int n_dac; static int n_param; // DAC gate voltage int nVgt; //int solve_gain(opamp_t* opamp, int n, int vi_t, int& x, model_filter_t& mf); int solve_gain_d(opamp_t* opamp, double n, int vi_t, int& x, model_filter_t& mf); int solve_integrate_6581(int dt, int vi_t, int& x, int& vc, model_filter_t& mf); int solve_integrate_8580(int dt, int vi_t, int& x, int& vc, model_filter_t& mf); // VCR - 6581 only. static unsigned short vcr_kVg[1 << 16]; static unsigned short vcr_n_Ids_term[1 << 16]; // Common parameters. static model_filter_t model_filter[2]; friend class SID; }; // ---------------------------------------------------------------------------- // Inline functions. // The following functions are defined inline because they are called every // time a sample is calculated. // ---------------------------------------------------------------------------- #if RESID_INLINING || defined(RESID_FILTER_CC) // ---------------------------------------------------------------------------- // SID clocking - 1 cycle. // ---------------------------------------------------------------------------- RESID_INLINE void Filter::clock(int voice1, int voice2, int voice3) { model_filter_t& f = model_filter[sid_model]; v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC; v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC; v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC; // Sum inputs routed into the filter. int Vi = 0; int offset = 0; switch (sum & 0xf) { case 0x0: Vi = 0; offset = summer_offset<0>::value; break; case 0x1: Vi = v1; offset = summer_offset<1>::value; break; case 0x2: Vi = v2; offset = summer_offset<1>::value; break; case 0x3: Vi = v2 + v1; offset = summer_offset<2>::value; break; case 0x4: Vi = v3; offset = summer_offset<1>::value; break; case 0x5: Vi = v3 + v1; offset = summer_offset<2>::value; break; case 0x6: Vi = v3 + v2; offset = summer_offset<2>::value; break; case 0x7: Vi = v3 + v2 + v1; offset = summer_offset<3>::value; break; case 0x8: Vi = ve; offset = summer_offset<1>::value; break; case 0x9: Vi = ve + v1; offset = summer_offset<2>::value; break; case 0xa: Vi = ve + v2; offset = summer_offset<2>::value; break; case 0xb: Vi = ve + v2 + v1; offset = summer_offset<3>::value; break; case 0xc: Vi = ve + v3; offset = summer_offset<2>::value; break; case 0xd: Vi = ve + v3 + v1; offset = summer_offset<3>::value; break; case 0xe: Vi = ve + v3 + v2; offset = summer_offset<3>::value; break; case 0xf: Vi = ve + v3 + v2 + v1; offset = summer_offset<4>::value; break; } // Calculate filter outputs. if (sid_model == 0) { // MOS 6581. Vlp = solve_integrate_6581(1, Vbp, Vlp_x, Vlp_vc, f); Vbp = solve_integrate_6581(1, Vhp, Vbp_x, Vbp_vc, f); Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi]; } else { // MOS 8580. Vlp = solve_integrate_8580(1, Vbp, Vlp_x, Vlp_vc, f); Vbp = solve_integrate_8580(1, Vhp, Vbp_x, Vbp_vc, f); Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi]; } } // ---------------------------------------------------------------------------- // SID clocking - delta_t cycles. // ---------------------------------------------------------------------------- RESID_INLINE void Filter::clock(cycle_count delta_t, int voice1, int voice2, int voice3) { model_filter_t& f = model_filter[sid_model]; v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC; v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC; v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC; // Enable filter on/off. // This is not really part of SID, but is useful for testing. // On slow CPUs it may be necessary to bypass the filter to lower the CPU // load. if (unlikely(!enabled)) { return; } // Sum inputs routed into the filter. int Vi = 0; int offset = 0; switch (sum & 0xf) { case 0x0: Vi = 0; offset = summer_offset<0>::value; break; case 0x1: Vi = v1; offset = summer_offset<1>::value; break; case 0x2: Vi = v2; offset = summer_offset<1>::value; break; case 0x3: Vi = v2 + v1; offset = summer_offset<2>::value; break; case 0x4: Vi = v3; offset = summer_offset<1>::value; break; case 0x5: Vi = v3 + v1; offset = summer_offset<2>::value; break; case 0x6: Vi = v3 + v2; offset = summer_offset<2>::value; break; case 0x7: Vi = v3 + v2 + v1; offset = summer_offset<3>::value; break; case 0x8: Vi = ve; offset = summer_offset<1>::value; break; case 0x9: Vi = ve + v1; offset = summer_offset<2>::value; break; case 0xa: Vi = ve + v2; offset = summer_offset<2>::value; break; case 0xb: Vi = ve + v2 + v1; offset = summer_offset<3>::value; break; case 0xc: Vi = ve + v3; offset = summer_offset<2>::value; break; case 0xd: Vi = ve + v3 + v1; offset = summer_offset<3>::value; break; case 0xe: Vi = ve + v3 + v2; offset = summer_offset<3>::value; break; case 0xf: Vi = ve + v3 + v2 + v1; offset = summer_offset<4>::value; break; } // Maximum delta cycles for filter fixpoint iteration to converge // is approximately 3. cycle_count delta_t_flt = 3; if (sid_model == 0) { // MOS 6581. while (delta_t) { if (unlikely(delta_t < delta_t_flt)) { delta_t_flt = delta_t; } // Calculate filter outputs. Vlp = solve_integrate_6581(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f); Vbp = solve_integrate_6581(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f); Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi]; delta_t -= delta_t_flt; } } else { // MOS 8580. while (delta_t) { if (unlikely(delta_t < delta_t_flt)) { delta_t_flt = delta_t; } // Calculate filter outputs. Vlp = solve_integrate_8580(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f); Vbp = solve_integrate_8580(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f); Vhp = f.summer[offset + f.resonance[res][Vbp] + Vlp + Vi]; delta_t -= delta_t_flt; } } } // ---------------------------------------------------------------------------- // SID audio input (16 bits). // ---------------------------------------------------------------------------- RESID_INLINE void Filter::input(short sample) { // Scale to three times the peak-to-peak for one voice and add the op-amp // "zero" DC level. // NB! Adding the op-amp "zero" DC level is a (wildly inaccurate) // approximation of feeding the input through an AC coupling capacitor. // This could be implemented as a separate filter circuit, however the // primary use of the emulator is not to process external signals. // The upside is that the MOS8580 "digi boost" works without a separate (DC) // input interface. // Note that the input is 16 bits, compared to the 20 bit voice output. model_filter_t& f = model_filter[sid_model]; ve = (sample*f.voice_scale_s14*3 >> 14) + f.mixer[0]; } // ---------------------------------------------------------------------------- // SID audio output (16 bits). // ---------------------------------------------------------------------------- RESID_INLINE short Filter::output() { model_filter_t& f = model_filter[sid_model]; // Writing the switch below manually would be tedious and error-prone; // it is rather generated by the following Perl program: /* my @i = qw(v1 v2 v3 ve Vlp Vbp Vhp); for my $mix (0..2**@i-1) { print sprintf(" case 0x%02x:\n", $mix); my @sum; for (@i) { unshift(@sum, $_) if $mix & 0x01; $mix >>= 1; } my $sum = join(" + ", @sum) || "0"; print " Vi = $sum;\n"; print " offset = mixer_offset<" . @sum . ">::value;\n"; print " break;\n"; } */ // Sum inputs routed into the mixer. int Vi = 0; int offset = 0; switch (mix & 0x7f) { case 0x00: Vi = 0; offset = mixer_offset<0>::value; break; case 0x01: Vi = v1; offset = mixer_offset<1>::value; break; case 0x02: Vi = v2; offset = mixer_offset<1>::value; break; case 0x03: Vi = v2 + v1; offset = mixer_offset<2>::value; break; case 0x04: Vi = v3; offset = mixer_offset<1>::value; break; case 0x05: Vi = v3 + v1; offset = mixer_offset<2>::value; break; case 0x06: Vi = v3 + v2; offset = mixer_offset<2>::value; break; case 0x07: Vi = v3 + v2 + v1; offset = mixer_offset<3>::value; break; case 0x08: Vi = ve; offset = mixer_offset<1>::value; break; case 0x09: Vi = ve + v1; offset = mixer_offset<2>::value; break; case 0x0a: Vi = ve + v2; offset = mixer_offset<2>::value; break; case 0x0b: Vi = ve + v2 + v1; offset = mixer_offset<3>::value; break; case 0x0c: Vi = ve + v3; offset = mixer_offset<2>::value; break; case 0x0d: Vi = ve + v3 + v1; offset = mixer_offset<3>::value; break; case 0x0e: Vi = ve + v3 + v2; offset = mixer_offset<3>::value; break; case 0x0f: Vi = ve + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x10: Vi = Vlp; offset = mixer_offset<1>::value; break; case 0x11: Vi = Vlp + v1; offset = mixer_offset<2>::value; break; case 0x12: Vi = Vlp + v2; offset = mixer_offset<2>::value; break; case 0x13: Vi = Vlp + v2 + v1; offset = mixer_offset<3>::value; break; case 0x14: Vi = Vlp + v3; offset = mixer_offset<2>::value; break; case 0x15: Vi = Vlp + v3 + v1; offset = mixer_offset<3>::value; break; case 0x16: Vi = Vlp + v3 + v2; offset = mixer_offset<3>::value; break; case 0x17: Vi = Vlp + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x18: Vi = Vlp + ve; offset = mixer_offset<2>::value; break; case 0x19: Vi = Vlp + ve + v1; offset = mixer_offset<3>::value; break; case 0x1a: Vi = Vlp + ve + v2; offset = mixer_offset<3>::value; break; case 0x1b: Vi = Vlp + ve + v2 + v1; offset = mixer_offset<4>::value; break; case 0x1c: Vi = Vlp + ve + v3; offset = mixer_offset<3>::value; break; case 0x1d: Vi = Vlp + ve + v3 + v1; offset = mixer_offset<4>::value; break; case 0x1e: Vi = Vlp + ve + v3 + v2; offset = mixer_offset<4>::value; break; case 0x1f: Vi = Vlp + ve + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x20: Vi = Vbp; offset = mixer_offset<1>::value; break; case 0x21: Vi = Vbp + v1; offset = mixer_offset<2>::value; break; case 0x22: Vi = Vbp + v2; offset = mixer_offset<2>::value; break; case 0x23: Vi = Vbp + v2 + v1; offset = mixer_offset<3>::value; break; case 0x24: Vi = Vbp + v3; offset = mixer_offset<2>::value; break; case 0x25: Vi = Vbp + v3 + v1; offset = mixer_offset<3>::value; break; case 0x26: Vi = Vbp + v3 + v2; offset = mixer_offset<3>::value; break; case 0x27: Vi = Vbp + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x28: Vi = Vbp + ve; offset = mixer_offset<2>::value; break; case 0x29: Vi = Vbp + ve + v1; offset = mixer_offset<3>::value; break; case 0x2a: Vi = Vbp + ve + v2; offset = mixer_offset<3>::value; break; case 0x2b: Vi = Vbp + ve + v2 + v1; offset = mixer_offset<4>::value; break; case 0x2c: Vi = Vbp + ve + v3; offset = mixer_offset<3>::value; break; case 0x2d: Vi = Vbp + ve + v3 + v1; offset = mixer_offset<4>::value; break; case 0x2e: Vi = Vbp + ve + v3 + v2; offset = mixer_offset<4>::value; break; case 0x2f: Vi = Vbp + ve + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x30: Vi = Vbp + Vlp; offset = mixer_offset<2>::value; break; case 0x31: Vi = Vbp + Vlp + v1; offset = mixer_offset<3>::value; break; case 0x32: Vi = Vbp + Vlp + v2; offset = mixer_offset<3>::value; break; case 0x33: Vi = Vbp + Vlp + v2 + v1; offset = mixer_offset<4>::value; break; case 0x34: Vi = Vbp + Vlp + v3; offset = mixer_offset<3>::value; break; case 0x35: Vi = Vbp + Vlp + v3 + v1; offset = mixer_offset<4>::value; break; case 0x36: Vi = Vbp + Vlp + v3 + v2; offset = mixer_offset<4>::value; break; case 0x37: Vi = Vbp + Vlp + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x38: Vi = Vbp + Vlp + ve; offset = mixer_offset<3>::value; break; case 0x39: Vi = Vbp + Vlp + ve + v1; offset = mixer_offset<4>::value; break; case 0x3a: Vi = Vbp + Vlp + ve + v2; offset = mixer_offset<4>::value; break; case 0x3b: Vi = Vbp + Vlp + ve + v2 + v1; offset = mixer_offset<5>::value; break; case 0x3c: Vi = Vbp + Vlp + ve + v3; offset = mixer_offset<4>::value; break; case 0x3d: Vi = Vbp + Vlp + ve + v3 + v1; offset = mixer_offset<5>::value; break; case 0x3e: Vi = Vbp + Vlp + ve + v3 + v2; offset = mixer_offset<5>::value; break; case 0x3f: Vi = Vbp + Vlp + ve + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x40: Vi = Vhp; offset = mixer_offset<1>::value; break; case 0x41: Vi = Vhp + v1; offset = mixer_offset<2>::value; break; case 0x42: Vi = Vhp + v2; offset = mixer_offset<2>::value; break; case 0x43: Vi = Vhp + v2 + v1; offset = mixer_offset<3>::value; break; case 0x44: Vi = Vhp + v3; offset = mixer_offset<2>::value; break; case 0x45: Vi = Vhp + v3 + v1; offset = mixer_offset<3>::value; break; case 0x46: Vi = Vhp + v3 + v2; offset = mixer_offset<3>::value; break; case 0x47: Vi = Vhp + v3 + v2 + v1; offset = mixer_offset<4>::value; break; case 0x48: Vi = Vhp + ve; offset = mixer_offset<2>::value; break; case 0x49: Vi = Vhp + ve + v1; offset = mixer_offset<3>::value; break; case 0x4a: Vi = Vhp + ve + v2; offset = mixer_offset<3>::value; break; case 0x4b: Vi = Vhp + ve + v2 + v1; offset = mixer_offset<4>::value; break; case 0x4c: Vi = Vhp + ve + v3; offset = mixer_offset<3>::value; break; case 0x4d: Vi = Vhp + ve + v3 + v1; offset = mixer_offset<4>::value; break; case 0x4e: Vi = Vhp + ve + v3 + v2; offset = mixer_offset<4>::value; break; case 0x4f: Vi = Vhp + ve + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x50: Vi = Vhp + Vlp; offset = mixer_offset<2>::value; break; case 0x51: Vi = Vhp + Vlp + v1; offset = mixer_offset<3>::value; break; case 0x52: Vi = Vhp + Vlp + v2; offset = mixer_offset<3>::value; break; case 0x53: Vi = Vhp + Vlp + v2 + v1; offset = mixer_offset<4>::value; break; case 0x54: Vi = Vhp + Vlp + v3; offset = mixer_offset<3>::value; break; case 0x55: Vi = Vhp + Vlp + v3 + v1; offset = mixer_offset<4>::value; break; case 0x56: Vi = Vhp + Vlp + v3 + v2; offset = mixer_offset<4>::value; break; case 0x57: Vi = Vhp + Vlp + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x58: Vi = Vhp + Vlp + ve; offset = mixer_offset<3>::value; break; case 0x59: Vi = Vhp + Vlp + ve + v1; offset = mixer_offset<4>::value; break; case 0x5a: Vi = Vhp + Vlp + ve + v2; offset = mixer_offset<4>::value; break; case 0x5b: Vi = Vhp + Vlp + ve + v2 + v1; offset = mixer_offset<5>::value; break; case 0x5c: Vi = Vhp + Vlp + ve + v3; offset = mixer_offset<4>::value; break; case 0x5d: Vi = Vhp + Vlp + ve + v3 + v1; offset = mixer_offset<5>::value; break; case 0x5e: Vi = Vhp + Vlp + ve + v3 + v2; offset = mixer_offset<5>::value; break; case 0x5f: Vi = Vhp + Vlp + ve + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x60: Vi = Vhp + Vbp; offset = mixer_offset<2>::value; break; case 0x61: Vi = Vhp + Vbp + v1; offset = mixer_offset<3>::value; break; case 0x62: Vi = Vhp + Vbp + v2; offset = mixer_offset<3>::value; break; case 0x63: Vi = Vhp + Vbp + v2 + v1; offset = mixer_offset<4>::value; break; case 0x64: Vi = Vhp + Vbp + v3; offset = mixer_offset<3>::value; break; case 0x65: Vi = Vhp + Vbp + v3 + v1; offset = mixer_offset<4>::value; break; case 0x66: Vi = Vhp + Vbp + v3 + v2; offset = mixer_offset<4>::value; break; case 0x67: Vi = Vhp + Vbp + v3 + v2 + v1; offset = mixer_offset<5>::value; break; case 0x68: Vi = Vhp + Vbp + ve; offset = mixer_offset<3>::value; break; case 0x69: Vi = Vhp + Vbp + ve + v1; offset = mixer_offset<4>::value; break; case 0x6a: Vi = Vhp + Vbp + ve + v2; offset = mixer_offset<4>::value; break; case 0x6b: Vi = Vhp + Vbp + ve + v2 + v1; offset = mixer_offset<5>::value; break; case 0x6c: Vi = Vhp + Vbp + ve + v3; offset = mixer_offset<4>::value; break; case 0x6d: Vi = Vhp + Vbp + ve + v3 + v1; offset = mixer_offset<5>::value; break; case 0x6e: Vi = Vhp + Vbp + ve + v3 + v2; offset = mixer_offset<5>::value; break; case 0x6f: Vi = Vhp + Vbp + ve + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x70: Vi = Vhp + Vbp + Vlp; offset = mixer_offset<3>::value; break; case 0x71: Vi = Vhp + Vbp + Vlp + v1; offset = mixer_offset<4>::value; break; case 0x72: Vi = Vhp + Vbp + Vlp + v2; offset = mixer_offset<4>::value; break; case 0x73: Vi = Vhp + Vbp + Vlp + v2 + v1; offset = mixer_offset<5>::value; break; case 0x74: Vi = Vhp + Vbp + Vlp + v3; offset = mixer_offset<4>::value; break; case 0x75: Vi = Vhp + Vbp + Vlp + v3 + v1; offset = mixer_offset<5>::value; break; case 0x76: Vi = Vhp + Vbp + Vlp + v3 + v2; offset = mixer_offset<5>::value; break; case 0x77: Vi = Vhp + Vbp + Vlp + v3 + v2 + v1; offset = mixer_offset<6>::value; break; case 0x78: Vi = Vhp + Vbp + Vlp + ve; offset = mixer_offset<4>::value; break; case 0x79: Vi = Vhp + Vbp + Vlp + ve + v1; offset = mixer_offset<5>::value; break; case 0x7a: Vi = Vhp + Vbp + Vlp + ve + v2; offset = mixer_offset<5>::value; break; case 0x7b: Vi = Vhp + Vbp + Vlp + ve + v2 + v1; offset = mixer_offset<6>::value; break; case 0x7c: Vi = Vhp + Vbp + Vlp + ve + v3; offset = mixer_offset<5>::value; break; case 0x7d: Vi = Vhp + Vbp + Vlp + ve + v3 + v1; offset = mixer_offset<6>::value; break; case 0x7e: Vi = Vhp + Vbp + Vlp + ve + v3 + v2; offset = mixer_offset<6>::value; break; case 0x7f: Vi = Vhp + Vbp + Vlp + ve + v3 + v2 + v1; offset = mixer_offset<7>::value; break; } // Sum the inputs in the mixer and run the mixer output through the gain. return (short)(f.gain[vol][f.mixer[offset + Vi]] - (1 << 15)); } /* Find output voltage in inverting gain and inverting summer SID op-amp circuits, using a combination of Newton-Raphson and bisection. ---R2-- | | vi ---R1-----[A>----- vo vx From Kirchoff's current law it follows that IR1f + IR2r = 0 Substituting the triode mode transistor model K*W/L*(Vgst^2 - Vgdt^2) for the currents, we get: n*((Vddt - vx)^2 - (Vddt - vi)^2) + (Vddt - vx)^2 - (Vddt - vo)^2 = 0 Our root function f can thus be written as: f = (n + 1)*(Vddt - vx)^2 - n*(Vddt - vi)^2 - (Vddt - vo)^2 = 0 We are using the mapping function x = vo - vx -> vx. We thus substitute for vo = vx + x and get: f(vx) = (n + 1)*(Vddt - vx)^2 - n*(Vddt - vi)^2 - (Vddt - (vx + x))^2 = 0 Using substitution constants a = n + 1 b = Vddt c = n*(Vddt - vi)^2 the equations for the root function can be written and expanded as: f(vx) = a*(b - vx)^2 - c - (b - (vx + x))^2 = a*(b^2 + vx^2 - 2*b*vx) - c - (b^2 + (vx + x)^2 - 2*b*(vx + x)) = a*b^2 + a*vx^2 - 2*a*b*vx - c - b^2 - (vx + x)^2 + 2*b*(vx + x) = a*b^2 + a*vx^2 - 2*a*b*vx - c - b^2 - vx^2 - x^2 - 2*x*vx + 2*b*vx + 2*b*x Then we calculate the derivative: f'(vx) = 2*a*vx - 2*a*b - 2*vx - 2*x + 2*b = 2*(a*vx - a*b - vx - x + b) = 2*(a*(vx - b) + b - (vx + x)) = 2*(b - (vx + x) - a*(b - vx)) = 2*(b - vo - a*(b - vx)) Given f'(x) = df/dx, we have the resulting df = 2*((b - (vx + x)) - a*(b - vx))*dvx */ #if 0 RESID_INLINE int Filter::solve_gain(opamp_t* opamp, int n, int vi, int& x, model_filter_t& mf) { // Note that all variables are translated and scaled in order to fit // in 16 bits. It is not necessary to explicitly translate the variables here, // since they are all used in subtractions which cancel out the translation: // (a - t) - (b - t) = a - b // Start off with an estimate of x and a root bracket [ak, bk]. // f is increasing, so that f(ak) < 0 and f(bk) > 0. int ak = mf.ak, bk = mf.bk; int a = n + (1 << 7); // Scaled by 2^7 int b = mf.kVddt; // Scaled by m*2^16 int b_vi = b - vi; // Scaled by m*2^16 if (b_vi < 0) b_vi = 0; int c = n*int(unsigned(b_vi)*unsigned(b_vi) >> 12); // Scaled by m^2*2^27 for (;;) { int xk = x; // Calculate f and df. int vx = opamp[x].vx; // Scaled by m*2^16 int dvx = opamp[x].dvx; // Scaled by 2^11 // f = a*(b - vx)^2 - c - (b - vo)^2 // df = 2*((b - vo)*(dvx + 1) - a*(b - vx)*dvx) // int vo = vx + (x << 1) - (1 << 16); if (vo >= (1 << 16)) { vo = (1 << 16) - 1; } else if (vo < 0) { vo = 0; } int b_vx = b - vx; if (b_vx < 0) b_vx = 0; int b_vo = b - vo; if (b_vo < 0) b_vo = 0; // The dividend is scaled by m^2*2^27. int f = a*int(unsigned(b_vx)*unsigned(b_vx) >> 12) - c - int(unsigned(b_vo)*unsigned(b_vo) >> 5); // The divisor is scaled by m*2^11. int df = ((b_vo*(dvx + (1 << 11)) >> 1) - (a*(b_vx*dvx >> 8))) >> 14; // The resulting quotient is thus scaled by m*2^16. // Newton-Raphson step: xk1 = xk - f(xk)/f'(xk) // If f(xk) or f'(xk) are zero then we can't improve further. if (df) { x -= f/df; } if (unlikely(x == xk)) { // No further root improvement possible. return vo; } // Narrow down root bracket. if (f < 0) { // f(xk) < 0 ak = xk; } else { // f(xk) > 0 bk = xk; } if (unlikely(x <= ak) || unlikely(x >= bk)) { // Bisection step (ala Dekker's method). x = (ak + bk) >> 1; if (unlikely(x == ak)) { // No further bisection possible. return vo; } } } } #endif RESID_INLINE int Filter::solve_gain_d(opamp_t* opamp, double n, int vi, int& x, model_filter_t& mf) { // Note that all variables are translated and scaled in order to fit // in 16 bits. It is not necessary to explicitly translate the variables here, // since they are all used in subtractions which cancel out the translation: // (a - t) - (b - t) = a - b // Start off with an estimate of x and a root bracket [ak, bk]. // f is increasing, so that f(ak) < 0 and f(bk) > 0. int ak = mf.ak, bk = mf.bk; double a = n + 1.; int b = mf.kVddt; // Scaled by m*2^16 double b_vi = b > vi ? double(b - vi) : 0.; // Scaled by m*2^16 double c = n*(b_vi*b_vi); // Scaled by m^2*2^32 for (;;) { int xk = x; // Calculate f and df. int vx = opamp[x].vx; // Scaled by m*2^16 int dvx = opamp[x].dvx; // Scaled by m*2^11 // f = a*(b - vx)^2 - c - (b - vo)^2 // df = 2*((b - vo) - a*(b - vx))*dvx // int vo = vx + (x << 1) - (1 << 16); if (vo > (1 << 16) - 1) { vo = (1 << 16) - 1; } else if (vo < 0) { vo = 0; } double b_vx = b > vx ? double(b - vx) : 0.; double b_vo = b > vo ? double(b - vo) : 0.; // The dividend is scaled by m^2*2^32. double f = a*(b_vx*b_vx) - c - (b_vo*b_vo); // The divisor is scaled by m*2^27. double df = 2.*(b_vo - a*b_vx)*double(dvx); // The resulting quotient is thus scaled by m*2^5. // Newton-Raphson step: xk1 = xk - f(xk)/f'(xk) // If f(xk) or f'(xk) are zero then we can't improve further. if (df) { // Multiply by 2^11 so it's scaled by m*2^16. x -= int(double(1<<11)*f/df); } if (unlikely(x == xk)) { // No further root improvement possible. return vo; } // Narrow down root bracket. if (f < 0) { // f(xk) < 0 ak = xk; } else { // f(xk) > 0 bk = xk; } if (unlikely(x <= ak) || unlikely(x >= bk)) { // Bisection step (ala Dekker's method). x = (ak + bk) >> 1; if (unlikely(x == ak)) { // No further bisection possible. return vo; } } } } /* Find output voltage in inverting integrator SID op-amp circuits, using a single fixpoint iteration step. A circuit diagram of a MOS 6581 integrator is shown below. ---C--- | | vi -----Rw-------[A>----- vo | | vx --Rs-- From Kirchoff's current law it follows that IRw + IRs + ICr = 0 Using the formula for current through a capacitor, i = C*dv/dt, we get IRw + IRs + C*(vc - vc0)/dt = 0 dt/C*(IRw + IRs) + vc - vc0 = 0 vc = vc0 - n*(IRw(vi,vx) + IRs(vi,vx)) which may be rewritten as the following iterative fixpoint function: vc = vc0 - n*(IRw(vi,g(vc)) + IRs(vi,g(vc))) To accurately calculate the currents through Rs and Rw, we need to use transistor models. Rs has a gate voltage of Vdd = 12V, and can be assumed to always be in triode mode. For Rw, the situation is rather more complex, as it turns out that this transistor will operate in both subthreshold, triode, and saturation modes. The Shichman-Hodges transistor model routinely used in textbooks may be written as follows: Ids = 0 , Vgst < 0 (subthreshold mode) Ids = K/2*W/L*(2*Vgst - Vds)*Vds , Vgst >= 0, Vds < Vgst (triode mode) Ids = K/2*W/L*Vgst^2 , Vgst >= 0, Vds >= Vgst (saturation mode) where K = u*Cox (conductance) W/L = ratio between substrate width and length Vgst = Vg - Vs - Vt (overdrive voltage) This transistor model is also called the quadratic model. Note that the equation for the triode mode can be reformulated as independent terms depending on Vgs and Vgd, respectively, by the following substitution: Vds = Vgst - (Vgst - Vds) = Vgst - Vgdt Ids = K/2*W/L*(2*Vgst - Vds)*Vds = K/2*W/L*(2*Vgst - (Vgst - Vgdt)*(Vgst - Vgdt) = K/2*W/L*(Vgst + Vgdt)*(Vgst - Vgdt) = K/2*W/L*(Vgst^2 - Vgdt^2) This turns out to be a general equation which covers both the triode and saturation modes (where the second term is 0 in saturation mode). The equation is also symmetrical, i.e. it can calculate negative currents without any change of parameters (since the terms for drain and source are identical except for the sign). FIXME: Subthreshold as function of Vgs, Vgd. Ids = I0*e^(Vgst/(n*VT)) , Vgst < 0 (subthreshold mode) The remaining problem with the textbook model is that the transition from subthreshold the triode/saturation is not continuous. Realizing that the subthreshold and triode/saturation modes may both be defined by independent (and equal) terms of Vgs and Vds, respectively, the corresponding terms can be blended into (equal) continuous functions suitable for table lookup. The EKV model (Enz, Krummenacher and Vittoz) essentially performs this blending using an elegant mathematical formulation: Ids = Is*(if - ir) Is = ((2*u*Cox*Ut^2)/k)*W/L if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) For our purposes, the EKV model preserves two important properties discussed above: - It consists of two independent terms, which can be represented by the same lookup table. - It is symmetrical, i.e. it calculates current in both directions, facilitating a branch-free implementation. Rw in the circuit diagram above is a VCR (voltage controlled resistor), as shown in the circuit diagram below. Vw | Vdd | |---| _|_ | -- --| Vg | __|__ | ----- Rw | | | vi ------------ -------- vo In order to calculalate the current through the VCR, its gate voltage must be determined. Assuming triode mode and applying Kirchoff's current law, we get the following equation for Vg: u*Cox/2*W/L*((Vddt - Vg)^2 - (Vddt - vi)^2 + (Vddt - Vg)^2 - (Vddt - Vw)^2) = 0 2*(Vddt - Vg)^2 - (Vddt - vi)^2 - (Vddt - Vw)^2 = 0 (Vddt - Vg) = sqrt(((Vddt - vi)^2 + (Vddt - Vw)^2)/2) Vg = Vddt - sqrt(((Vddt - vi)^2 + (Vddt - Vw)^2)/2) */ RESID_INLINE int Filter::solve_integrate_6581(int dt, int vi, int& vx, int& vc, model_filter_t& mf) { // Note that all variables are translated and scaled in order to fit // in 16 bits. It is not necessary to explicitly translate the variables here, // since they are all used in subtractions which cancel out the translation: // (a - t) - (b - t) = a - b int kVddt = mf.kVddt; // Scaled by m*2^16 // "Snake" voltages for triode mode calculation. unsigned int Vgst = kVddt - vx; unsigned int Vgdt = kVddt - vi; unsigned int Vgdt_2 = Vgdt*Vgdt; // "Snake" current, scaled by (1/m)*2^13*m*2^16*m*2^16*2^-15 = m*2^30 int n_I_snake = n_snake*(int(Vgst*Vgst - Vgdt_2) >> 15); // VCR gate voltage. // Scaled by m*2^16 // Vg = Vddt - sqrt(((Vddt - Vw)^2 + Vgdt^2)/2) int kVg = vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16]; // VCR voltages for EKV model table lookup. int Vgs = kVg - vx + (1 << 15); int Vgd = kVg - vi + (1 << 15); // VCR current, scaled by m*2^15*2^15 = m*2^30 int n_I_vcr = int(unsigned(vcr_n_Ids_term[Vgs] - vcr_n_Ids_term[Vgd]) << 15); // Change in capacitor charge. vc -= (n_I_snake + n_I_vcr)*dt; /* // FIXME: Determine whether this check is necessary. if (vc < mf.vc_min) { vc = mf.vc_min; } else if (vc > mf.vc_max) { vc = mf.vc_max; } */ // vx = g(vc) vx = mf.opamp_rev[(vc >> 15) + (1 << 15)]; // Return vo. return vx + (vc >> 14); } /* The 8580 integrator is similar to those found in 6581 but the resistance is formed by multiple NMOS transistors in parallel controlled by the fc bits where the gate voltage is driven by a temperature dependent voltage divider. ---C--- | | vi -----Rfc------[A>----- vo vx IRfc + ICr = 0 IRfc + C*(vc - vc0)/dt = 0 dt/C*(IRfc) + vc - vc0 = 0 vc = vc0 - n*(IRfc(vi,vx)) vc = vc0 - n*(IRfc(vi,g(vc))) IRfc = K/2*W/L*(Vgst^2 - Vgdt^2) = n*((Vgt - vx)^2 - (Vgt - vi)^2) */ RESID_INLINE int Filter::solve_integrate_8580(int dt, int vi, int& vx, int& vc, model_filter_t& mf) { // Note that all variables are translated and scaled in order to fit // in 16 bits. It is not necessary to explicitly translate the variables here, // since they are all used in subtractions which cancel out the translation: // (a - t) - (b - t) = a - b // Dac voltages. unsigned int Vgst = nVgt - vx; unsigned int Vgdt = (vi < nVgt) ? nVgt - vi : 0; // triode/saturation mode // Dac current, scaled by (1/m)*2^13*m*2^16*m*2^16*2^-15 = m*2^30 int n_I_rfc = n_dac*(int(Vgst*Vgst - Vgdt*Vgdt) >> 15); // Change in capacitor charge. vc -= n_I_rfc*dt; // vx = g(vc) vx = mf.opamp_rev[(vc >> 15) + (1 << 15)]; // Return vo. return vx + (vc >> 14); } #endif // RESID_INLINING || defined(RESID_FILTER_CC) } // namespace reSID #endif // not RESID_FILTER_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/extfilt.h0000644000175100001770000001223714544470311021225 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_EXTFILT_H #define RESID_EXTFILT_H #include "resid-config.h" namespace reSID { // ---------------------------------------------------------------------------- // The audio output stage in a Commodore 64 consists of two STC networks, // a low-pass filter with 3-dB frequency 16kHz followed by a high-pass // filter with 3-dB frequency 16Hz (the latter provided an audio equipment // input impedance of 1kOhm). // The STC networks are connected with a BJT supposedly meant to act as // a unity gain buffer, which is not really how it works. A more elaborate // model would include the BJT, however DC circuit analysis yields BJT // base-emitter and emitter-base impedances sufficiently low to produce // additional low-pass and high-pass 3dB-frequencies in the order of hundreds // of kHz. This calls for a sampling frequency of several MHz, which is far // too high for practical use. // // 9/12V // -----+ // audio| 10k | // +----+---R---+--------+-----(K) +----- // out | | | | | |audio // -----+ R 1k C 1000 | | 10 uF | // | | pF +-C----+-----C-----+ 1K // 470 | | // GND GND pF R 1K | amp // | +----- // // GND // // ---------------------------------------------------------------------------- class ExternalFilter { public: ExternalFilter(); void enable_filter(bool enable); void clock(short Vi); void clock(cycle_count delta_t, short Vi); void reset(); // Audio output (16 bits). int output(); protected: // Filter enabled. bool enabled; // State of filters (27 bits). int Vlp; // lowpass int Vhp; // highpass // Cutoff frequencies. int w0lp_1_s7; int w0hp_1_s17; friend class SID; }; // ---------------------------------------------------------------------------- // Inline functions. // The following functions are defined inline because they are called every // time a sample is calculated. // ---------------------------------------------------------------------------- #if RESID_INLINING || defined(RESID_EXTFILT_CC) // ---------------------------------------------------------------------------- // SID clocking - 1 cycle. // ---------------------------------------------------------------------------- RESID_INLINE void ExternalFilter::clock(short Vi) { // This is handy for testing. if (unlikely(!enabled)) { // Vo = Vlp - Vhp; Vlp = Vi << 11; Vhp = 0; return; } // Calculate filter outputs. // Vlp = Vlp + w0lp*(Vi - Vlp)*delta_t; // Vhp = Vhp + w0hp*(Vlp - Vhp)*delta_t; // Vo = Vlp - Vhp; int dVlp = w0lp_1_s7*int((unsigned(Vi) << 11) - unsigned(Vlp)) >> 7; int dVhp = w0hp_1_s17*(Vlp - Vhp) >> 17; Vlp += dVlp; Vhp += dVhp; } // ---------------------------------------------------------------------------- // SID clocking - delta_t cycles. // ---------------------------------------------------------------------------- RESID_INLINE void ExternalFilter::clock(cycle_count delta_t, short Vi) { // This is handy for testing. if (unlikely(!enabled)) { // Vo = Vlp - Vhp; Vlp = Vi << 11; Vhp = 0; return; } // Maximum delta cycles for the external filter to work satisfactorily // is approximately 8. cycle_count delta_t_flt = 8; while (delta_t) { if (unlikely(delta_t < delta_t_flt)) { delta_t_flt = delta_t; } // Calculate filter outputs. // Vlp = Vlp + w0lp*(Vi - Vlp)*delta_t; // Vhp = Vhp + w0hp*(Vlp - Vhp)*delta_t; // Vo = Vlp - Vhp; int dVlp = (w0lp_1_s7*delta_t_flt >> 3)*((Vi << 11) - Vlp) >> 4; int dVhp = (w0hp_1_s17*delta_t_flt >> 3)*(Vlp - Vhp) >> 14; Vlp += dVlp; Vhp += dVhp; delta_t -= delta_t_flt; } } // ---------------------------------------------------------------------------- // Audio output (16 bits). // ---------------------------------------------------------------------------- RESID_INLINE int ExternalFilter::output() { return (Vlp - Vhp) >> 11; } #endif // RESID_INLINING || defined(RESID_EXTFILT_CC) } // namespace reSID #endif // not RESID_EXTFILT_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/extfilt.cc0000644000175100001770000000441714544470311021364 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_EXTFILT_CC #include "extfilt.h" namespace reSID { // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- ExternalFilter::ExternalFilter() { reset(); enable_filter(true); // Low-pass: R = 10 kOhm, C = 1000 pF; w0l = dt/(dt+RC) = 1e-6/(1e-6+1e4*1e-9) = 0.091 // High-pass: R = 1 kOhm, C = 10 uF; w0h = dt/(dt+RC) = 1e-6/(1e-6+1e3*1e-5) = 0.0000999 // Assume a 1MHz clock. // Cutoff frequency accuracy (4 bits) is traded off for filter signal // accuracy (27 bits). This is crucial since w0lp and w0hp are so far apart. w0lp_1_s7 = int(1e-6/(1e-6+1e4*1e-9)*(1 << 7) + 0.5); w0hp_1_s17 = int(1e-6/(1e-6+1e3*1e-5)*(1 << 17) + 0.5); } // ---------------------------------------------------------------------------- // Enable filter. // ---------------------------------------------------------------------------- void ExternalFilter::enable_filter(bool enable) { enabled = enable; } // ---------------------------------------------------------------------------- // SID reset. // ---------------------------------------------------------------------------- void ExternalFilter::reset() { // State of filter. Vlp = 0; Vhp = 0; } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/voice.cc0000644000175100001770000001070514544470311021007 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2004 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_VOICE_CC #include "voice.h" namespace reSID { // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- Voice::Voice() { set_chip_model(MOS6581); } // ---------------------------------------------------------------------------- // Set chip model. // ---------------------------------------------------------------------------- void Voice::set_chip_model(chip_model model) { wave.set_chip_model(model); envelope.set_chip_model(model); if (model == MOS6581) { // The waveform D/A converter introduces a DC offset in the signal // to the envelope multiplying D/A converter. The "zero" level of // the waveform D/A converter can be found as follows: // // Measure the "zero" voltage of voice 3 on the SID audio output // pin, routing only voice 3 to the mixer ($d417 = $0b, $d418 = // $0f, all other registers zeroed). // // Then set the sustain level for voice 3 to maximum and search for // the waveform output value yielding the same voltage as found // above. This is done by trying out different waveform output // values until the correct value is found, e.g. with the following // program: // // lda #$08 // sta $d412 // lda #$0b // sta $d417 // lda #$0f // sta $d418 // lda #$f0 // sta $d414 // lda #$21 // sta $d412 // lda #$01 // sta $d40e // // ldx #$00 // lda #$38 ; Tweak this to find the "zero" level //l cmp $d41b // bne l // stx $d40e ; Stop frequency counter - freeze waveform output // brk // // The waveform output range is 0x000 to 0xfff, so the "zero" // level should ideally have been 0x800. In the measured chip, the // waveform output "zero" level was found to be 0x380 (i.e. $d41b // = 0x38) at an audio output voltage of 5.94V. // // With knowledge of the mixer op-amp characteristics, further estimates // of waveform voltages can be obtained by sampling the EXT IN pin. // From EXT IN samples, the corresponding waveform output can be found by // using the model for the mixer. // // Such measurements have been done on a chip marked MOS 6581R4AR // 0687 14, and the following results have been obtained: // * The full range of one voice is approximately 1.5V. // * The "zero" level rides at approximately 5.0V. // wave_zero = 0x380; } else { // No DC offsets in the MOS8580. wave_zero = 0x9e0; } } // ---------------------------------------------------------------------------- // Set sync source. // ---------------------------------------------------------------------------- void Voice::set_sync_source(Voice* source) { wave.set_sync_source(&source->wave); } // ---------------------------------------------------------------------------- // Register functions. // ---------------------------------------------------------------------------- void Voice::writeCONTROL_REG(reg8 control) { wave.writeCONTROL_REG(control); envelope.writeCONTROL_REG(control); } // ---------------------------------------------------------------------------- // SID reset. // ---------------------------------------------------------------------------- void Voice::reset() { wave.reset(); envelope.reset(); } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580_PST.h0000644000175100001770000010775614544470322021600 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x378: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x1f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x530: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x538: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x540: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x548: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x550: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x558: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x560: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x568: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x570: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x578: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x580: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x588: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x590: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x598: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x600: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x608: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x610: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x618: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x620: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x628: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x630: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x638: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x640: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x648: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x650: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x658: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x660: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x668: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x670: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x678: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x680: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x688: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x690: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x698: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x700: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x708: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x710: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x718: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x720: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x728: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x730: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x738: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x740: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x748: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x750: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x758: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x760: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x768: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x770: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x778: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x780: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x788: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x790: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x798: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, 0x700, /* 0x7f0: */ 0x600, 0x200, 0x700, 0x700, 0x700, 0x700, 0x700, 0x780, /* 0x7f8: */ 0x780, 0x780, 0x7c0, 0x7c0, 0x7e0, 0x7e0, 0x7f0, 0x7f0, /* 0x800: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x808: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x810: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x818: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x820: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x828: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x830: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x838: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x840: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x848: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x850: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x858: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x860: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x868: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x870: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x878: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x880: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x888: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x890: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x898: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x900: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x908: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x910: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x918: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x920: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x928: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x930: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x938: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x940: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x948: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x950: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x958: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x960: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x968: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x970: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x978: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x980: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x988: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x990: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x998: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x080, 0x1e0, 0x3f0, /* 0xc00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xdf8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x8c0, 0x9f0, /* 0xe00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, /* 0xe40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, /* 0xe60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x000, /* 0xe68: */ 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe70: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe78: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe80: */ 0x000, 0x000, 0x800, 0x000, 0x000, 0x800, 0x800, 0x800, /* 0xe88: */ 0x800, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe90: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe98: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xea0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xea8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xeb0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xeb8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xec0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xec8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xed0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xed8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xee0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xee8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, 0xc00, /* 0xef0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xef8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xcf0, /* 0xf00: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf08: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf10: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf18: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf20: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf28: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf30: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf38: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf40: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf48: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf50: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf58: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf60: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf68: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, /* 0xf70: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf78: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe30, /* 0xf80: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf88: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf90: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf98: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xfa0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xfa8: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xfb0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xf00, 0xf00, /* 0xfb8: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfc0: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfc8: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfd0: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfd8: */ 0xf00, 0xf00, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0xfe0: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0xfe8: */ 0xf80, 0xf80, 0xf80, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, /* 0xff0: */ 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfe0, 0xfe0, 0xfe0, /* 0xff8: */ 0xfe0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580_PS_.h0000644000175100001770000010775614544470322021613 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0f0, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x070, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x1f0, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, 0x0f0, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x378: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x170, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3b0, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3d0, /* 0x3e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3e0, /* 0x3f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3f0, /* 0x3f8: */ 0x000, 0x0c0, 0x1c0, 0x3f0, 0x1e0, 0x3f0, 0x3f0, 0x3f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0f0, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x530: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x538: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x540: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x548: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x550: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x558: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x560: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x568: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x570: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x578: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x070, /* 0x580: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x588: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x590: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x598: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0b0, /* 0x5c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x0a0, /* 0x5e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x5e0, /* 0x5f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x5f0, /* 0x5f8: */ 0x000, 0x000, 0x000, 0x5f0, 0x0c0, 0x5f0, 0x5f0, 0x5f0, /* 0x600: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x608: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x610: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x618: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x620: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x628: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x630: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x638: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x640: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x648: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x650: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x658: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x660: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x668: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x670: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x678: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x470, /* 0x680: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x688: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x690: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x698: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x430, /* 0x6c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x650, /* 0x6e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x6e0, /* 0x6f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x6f0, /* 0x6f8: */ 0x000, 0x400, 0x400, 0x6f0, 0x400, 0x6f0, 0x6f0, 0x6f0, /* 0x700: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x708: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x710: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x718: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x720: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x728: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x730: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x738: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x630, /* 0x740: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x748: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x750: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x758: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, 0x610, /* 0x760: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, /* 0x768: */ 0x000, 0x000, 0x000, 0x400, 0x000, 0x400, 0x400, 0x700, /* 0x770: */ 0x000, 0x000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x700, /* 0x778: */ 0x400, 0x600, 0x600, 0x770, 0x600, 0x770, 0x770, 0x770, /* 0x780: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x788: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, /* 0x790: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, 0x600, /* 0x798: */ 0x000, 0x400, 0x400, 0x600, 0x400, 0x600, 0x600, 0x790, /* 0x7a0: */ 0x000, 0x400, 0x400, 0x400, 0x400, 0x400, 0x400, 0x600, /* 0x7a8: */ 0x400, 0x400, 0x400, 0x600, 0x600, 0x600, 0x600, 0x780, /* 0x7b0: */ 0x400, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x780, /* 0x7b8: */ 0x600, 0x700, 0x700, 0x780, 0x700, 0x790, 0x7b0, 0x7b0, /* 0x7c0: */ 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x600, 0x700, /* 0x7c8: */ 0x600, 0x600, 0x600, 0x700, 0x600, 0x700, 0x700, 0x7c0, /* 0x7d0: */ 0x600, 0x700, 0x700, 0x700, 0x700, 0x700, 0x700, 0x7c0, /* 0x7d8: */ 0x700, 0x780, 0x780, 0x7c0, 0x780, 0x7c0, 0x7c0, 0x7d0, /* 0x7e0: */ 0x700, 0x780, 0x780, 0x780, 0x780, 0x780, 0x780, 0x7c0, /* 0x7e8: */ 0x780, 0x7c0, 0x7c0, 0x7e0, 0x7c0, 0x7e0, 0x7e0, 0x7e0, /* 0x7f0: */ 0x7c0, 0x7c0, 0x7c0, 0x7e0, 0x7e0, 0x7f0, 0x7f0, 0x7f0, /* 0x7f8: */ 0x7e0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0xff0, /* 0x800: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x808: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x810: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x818: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x820: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x828: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x830: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x838: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x840: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x848: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x850: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x858: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x860: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x868: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x870: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x878: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, /* 0x880: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x888: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x890: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x898: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x8c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x8f0, /* 0x900: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x908: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x910: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x918: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x920: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x928: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x930: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x938: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x940: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x948: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x950: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x958: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x960: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x968: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x970: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x978: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x870, /* 0x980: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x988: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x990: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x998: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x830, /* 0x9c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x8d0, /* 0x9e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x9e8: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x8e0, /* 0x9f0: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x8f0, /* 0x9f8: */ 0x800, 0x800, 0x800, 0x9f0, 0x800, 0x9f0, 0x9f0, 0x9f0, /* 0xa00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xa40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xa78: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x870, /* 0xa80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xaa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xab0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xab8: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x830, /* 0xac0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xad0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, /* 0xad8: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x810, /* 0xae0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xae8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x840, /* 0xaf0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x870, /* 0xaf8: */ 0x800, 0x800, 0x800, 0x870, 0x800, 0x8f0, 0xaf0, 0xaf0, /* 0xb00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xb10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0xb18: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb20: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x000, 0x800, 0x800, /* 0xb28: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb30: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb38: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x830, /* 0xb40: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb48: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb50: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb58: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x810, /* 0xb60: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb68: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xb70: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xb78: */ 0x800, 0x800, 0x800, 0xa00, 0x800, 0xa30, 0xb70, 0xb70, /* 0xb80: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb88: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb90: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb98: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xb10, /* 0xba0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xba8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xb00, /* 0xbb0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xb00, /* 0xbb8: */ 0x800, 0xa00, 0xa00, 0xb00, 0xa00, 0xb80, 0xb90, 0xbb0, /* 0xbc0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0xbc8: */ 0x800, 0x800, 0x800, 0xa00, 0x800, 0xa00, 0xa00, 0xb80, /* 0xbd0: */ 0x800, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xb80, /* 0xbd8: */ 0xa00, 0xb00, 0xb00, 0xb80, 0xb00, 0xbc0, 0xbc0, 0xbd0, /* 0xbe0: */ 0xa00, 0xb00, 0xb00, 0xb00, 0xb00, 0xb80, 0xb80, 0xbc0, /* 0xbe8: */ 0xb00, 0xb80, 0xb80, 0xbc0, 0xb80, 0xbc0, 0xbe0, 0xbe0, /* 0xbf0: */ 0xb80, 0xbc0, 0xbc0, 0xbe0, 0xbc0, 0xbe0, 0xbe0, 0xbf0, /* 0xbf8: */ 0xbe0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, 0xbf0, /* 0xc00: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x000, 0x000, 0x800, /* 0xc08: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x000, 0x000, 0x800, /* 0xc10: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc18: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc20: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc28: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc30: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc38: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x810, /* 0xc40: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc48: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc50: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc58: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc60: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc68: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc70: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc78: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc70, /* 0xc80: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc88: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc90: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xc98: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xca0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xca8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xcb0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xcb8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, 0xc30, /* 0xcc0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xcc8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xcd0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xcd8: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xc10, /* 0xce0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xce8: */ 0x800, 0x800, 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xcf0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc70, /* 0xcf8: */ 0xc00, 0xc00, 0xc00, 0xc70, 0xc00, 0xcf0, 0xcf0, 0xcf0, /* 0xd00: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xd08: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xd10: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xd18: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd20: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xd28: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd30: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, 0xc00, /* 0xd38: */ 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc30, /* 0xd40: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0xd48: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xc00, /* 0xd50: */ 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xd58: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc10, /* 0xd60: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xd68: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xd70: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xd78: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc10, 0xc70, 0xd70, /* 0xd80: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xd88: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xd90: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xd98: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xda0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xda8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd00, /* 0xdb0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd00, /* 0xdb8: */ 0xc00, 0xc00, 0xc00, 0xd00, 0xc00, 0xd00, 0xd80, 0xdb0, /* 0xdc0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xdc8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd80, /* 0xdd0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd80, /* 0xdd8: */ 0xc00, 0xc00, 0xc00, 0xd80, 0xd00, 0xd80, 0xd80, 0xdd0, /* 0xde0: */ 0xc00, 0xc00, 0xc00, 0xd00, 0xc00, 0xd00, 0xd00, 0xdc0, /* 0xde8: */ 0xd00, 0xd80, 0xd80, 0xdc0, 0xd80, 0xdc0, 0xdc0, 0xde0, /* 0xdf0: */ 0xd80, 0xdc0, 0xdc0, 0xde0, 0xdc0, 0xde0, 0xde0, 0xdf0, /* 0xdf8: */ 0xde0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, 0xdf0, /* 0xe00: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe08: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe10: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe18: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe20: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe28: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe30: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe38: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xe30, /* 0xe40: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe48: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xe50: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, /* 0xe58: */ 0xc00, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xe10, /* 0xe60: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, /* 0xe68: */ 0xc00, 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xe70: */ 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xe78: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe10, 0xe30, 0xe70, /* 0xe80: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, /* 0xe88: */ 0xc00, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xe00, /* 0xe90: */ 0xc00, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xe00, /* 0xe98: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xea0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xea8: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xeb0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xeb8: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xeb0, /* 0xec0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xec8: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xed0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xed8: */ 0xe00, 0xe00, 0xe00, 0xe80, 0xe00, 0xe80, 0xe80, 0xed0, /* 0xee0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xec0, /* 0xee8: */ 0xe00, 0xe00, 0xe00, 0xec0, 0xe80, 0xec0, 0xec0, 0xee0, /* 0xef0: */ 0xe80, 0xe80, 0xe80, 0xec0, 0xec0, 0xee0, 0xee0, 0xef0, /* 0xef8: */ 0xec0, 0xef0, 0xef0, 0xef0, 0xef0, 0xef0, 0xef0, 0xef0, /* 0xf00: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf08: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf10: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf18: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xf00, /* 0xf20: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xf00, /* 0xf28: */ 0xe00, 0xe00, 0xe00, 0xf00, 0xe00, 0xf00, 0xf00, 0xf00, /* 0xf30: */ 0xe00, 0xe00, 0xe00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf38: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf30, /* 0xf40: */ 0xe00, 0xe00, 0xe00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf48: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf50: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf58: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf50, /* 0xf60: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf68: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf40, 0xf40, 0xf60, /* 0xf70: */ 0xf00, 0xf00, 0xf00, 0xf40, 0xf00, 0xf40, 0xf60, 0xf70, /* 0xf78: */ 0xf40, 0xf60, 0xf60, 0xf70, 0xf70, 0xf70, 0xf70, 0xf70, /* 0xf80: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf80, /* 0xf88: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf80, 0xf80, 0xf80, /* 0xf90: */ 0xf00, 0xf00, 0xf00, 0xf80, 0xf00, 0xf80, 0xf80, 0xf80, /* 0xf98: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf90, /* 0xfa0: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0xfa8: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xfa0, /* 0xfb0: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xfb0, /* 0xfb8: */ 0xf80, 0xfa0, 0xfa0, 0xfb0, 0xfb0, 0xfb0, 0xfb0, 0xfb0, /* 0xfc0: */ 0xf80, 0xf80, 0xf80, 0xfc0, 0xf80, 0xfc0, 0xfc0, 0xfc0, /* 0xfc8: */ 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, /* 0xfd0: */ 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfd0, /* 0xfd8: */ 0xfc0, 0xfc0, 0xfc0, 0xfd0, 0xfd0, 0xfd0, 0xfd0, 0xfd0, /* 0xfe0: */ 0xfc0, 0xfc0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, /* 0xfe8: */ 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, /* 0xff0: */ 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, /* 0xff8: */ 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/configure.in0000755000175100001770000001313714544470311021711 00000000000000dnl This file is part of reSID, a MOS6581 SID emulator engine. dnl Copyright (C) 2010 Dag Lem dnl dnl Process this file with autoconf to produce a configure script. dnl Use Autoconf AC_PREREQ([2.56]) AC_INIT([reSID], [1.0-pre2], [resid@nimrod.no]) AC_CONFIG_SRCDIR([sid.h]) dnl Use Automake AM_INIT_AUTOMAKE([1.7.1]) dnl Avoid "ar: `u' modifier ignored since `D' is the default (see `U')" warning dnl caused by a longstanding bug in libtool. dnl See https://github.com/rsyslog/rsyslog/issues/1179 for some details. : ${ARFLAGS="cr"} : ${AR_FLAGS="cr"} AC_SUBST(ARFLAGS) AC_SUBST(AR_FLAGS) dnl Use Libtool dnl LT_PREREQ([2.2.2]) dnl LT_INIT([disable-shared]) dnl AC_SUBST([LTVERSION], [6:0:0]) dnl Use C++ for tests. AC_LANG([C++]) AC_CANONICAL_HOST dnl Enable inlining. AC_ARG_ENABLE([inline], [AC_HELP_STRING([--enable-inline], [enable inlining of functions [default=yes]])], [], [enable_inline=yes]) AS_IF([test "$enable_inline" != no], [AC_SUBST([RESID_INLINING], [1]) AC_SUBST([RESID_INLINE], [inline])], [AC_SUBST([RESID_INLINING], [0]) AC_SUBST([RESID_INLINE], [])]) dnl Enable architecture specific compilation. AC_ARG_ENABLE([arch], [AC_HELP_STRING([--enable-arch[[=arch]]], [enable architecture specific compilation [default=no]])], [], [enable_arch=yes]) dnl Enable branch prediction hints. AC_ARG_ENABLE([branch-hints], [AC_HELP_STRING([--enable-branch-hints], [enable static branch prediction hints [default=yes]])], [], [enable_branch_hints=yes]) AS_IF([test "$enable_branch_hints" != no], [AC_SUBST([RESID_BRANCH_HINTS], [1])], [AC_SUBST([RESID_BRANCH_HINTS], [0])]) dnl Enable experimental 8580 filters. AC_ARG_ENABLE([new8580filter], [AS_HELP_STRING([--disable-new8580filter], [disable new 8580 filter implementation [default=no]])] ) AM_CONDITIONAL([NEW_8580_FILTER], [test x"$enable_new8580filter" != "xno"]) AS_IF([test x"$enable_new8580filter" != "xno"], [AC_SUBST([NEW_8580_FILTER], [1])], [AC_SUBST([NEW_8580_FILTER], [0])] ) dnl Store CXXFLAGS status. resid_test_CXXFLAGS=${CXXFLAGS+set} dnl Checks for programs. AC_PROG_CXX([c++ g++ clang++]) dnl Set CXXFLAGS for g++. if test x"$enable_arch" = "xno"; then march="" else if test x"$enable_arch" = "xyes"; then AC_MSG_CHECKING([if the compiler supports -march=native]) ORIG_CXXFLAGS=$CXXFLAGS CXXFLAGS="$CXXFLAGS -march=native" AC_TRY_COMPILE([], [int test;], [ AC_MSG_RESULT(yes) march="-march=native" ], [ AC_MSG_RESULT(no) march="" ]) CXXFLAGS=$ORIG_CXXFLAGS else AC_MSG_CHECKING([if the compiler supports -march=$enable_arch]) ORIG_CXXFLAGS=$CXXFLAGS CXXFLAGS="$CXXFLAGS -march=$enable_arch" AC_TRY_COMPILE([], [int test;], [ AC_MSG_RESULT(yes) march="-march=$enable_arch" ], [ AC_MSG_RESULT(no) march="" ]) CXXFLAGS=$ORIG_CXXFLAGS fi fi AS_IF([test "$GXX" = yes -a "$resid_test_CXXFLAGS" != set], [resid_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g -Wall -O3 $march -fno-exceptions" AC_MSG_CHECKING([whether g++ accepts $CXXFLAGS]) AC_COMPILE_IFELSE([int test;], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) CXXFLAGS="-g -Wall -O3 -fno-exceptions" AC_MSG_CHECKING([whether g++ accepts $CXXFLAGS]) AC_COMPILE_IFELSE([int test;], [AC_MSG_RESULT(yes)], [AC_MSG_RESULT(no) CXXFLAGS=$resid_save_CXXFLAGS])])]) case $host_os in darwin*) dnl Support targeting a specific macOS version AC_ARG_ENABLE([macos-target-sdk-version], [AC_HELP_STRING([--enable-macos-target-sdk-version[[=version]]], [compile for a specific sdk version such as 10.10 [default=no]])], [], [enable_macos_target_sdk_version=10.10]) AS_IF([test "$enable_macos_target_sdk_version" != no], [CFLAGS="$CFLAGS -mmacosx-version-min=$enable_macos_target_sdk_version" OBJCFLAGS="$OBJCFLAGS -mmacosx-version-min=$enable_macos_target_sdk_version" CXXFLAGS="$CXXFLAGS -mmacosx-version-min=$enable_macos_target_sdk_version" LDFLAGS="$LDFLAGS -mmacosx-version-min=$enable_macos_target_sdk_version"]) ;; *) ;; esac AC_CHECK_PROG([AR], [ar], [ar], [ar]) AC_PROG_RANLIB AC_PATH_PROG([PERL], [perl]) dnl Checks for libraries. dnl Checks for header files. AC_CHECK_HEADER([math.h], [], AC_MSG_ERROR([missing math.h])) dnl Checks for typedefs, structures, and compiler characteristics. AC_CHECK_SIZEOF([int], [4]) AS_IF([test $ac_cv_sizeof_int -lt 4], AC_MSG_ERROR([only 32 bit or better CPUs are supported])) AC_CACHE_CHECK([for working bool], [resid_cv_cxx_bool], [AC_COMPILE_IFELSE([bool flag;], [resid_cv_cxx_bool=yes], [resid_cv_cxx_bool=no])]) AS_IF([test "$resid_cv_cxx_bool" = no], [AC_SUBST([HAVE_BOOL], [0])], [AC_SUBST([HAVE_BOOL], [1])]) AC_CACHE_CHECK([for __builtin_expect], [resid_cv_builtin_expect], [AC_COMPILE_IFELSE([int main() { __builtin_expect(0, 0); }], [resid_cv_builtin_expect=yes], [resid_cv_builtin_expect=no])]) AS_IF([test "$resid_cv_builtin_expect" = no], [AC_SUBST([HAVE_BUILTIN_EXPECT], [0])], [AC_SUBST([HAVE_BUILTIN_EXPECT], [1])]) AC_CACHE_CHECK([for log1p], [resid_cv_log1p], [AC_TRY_COMPILE([#include ], [ log1p(1); ], resid_cv_log1p=yes, resid_cv_log1p=no)]) AS_IF([test "$resid_cv_log1p" = no], [AC_SUBST([HAVE_LOG1P], [0])], [AC_SUBST([HAVE_LOG1P], [1])]) AC_CONFIG_FILES([Makefile siddefs.h]) AC_OUTPUT libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580_P_T.h0000644000175100001770000010775614544470322021614 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x070, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x000, 0x000, 0x000, 0x1c0, 0x000, 0x3c0, 0x3f0, 0x3f0, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x0c0, 0x5e0, 0x5f0, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, /* 0x378: */ 0x000, 0x000, 0x000, 0x400, 0x400, 0x600, 0x600, 0x6f0, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, 0x400, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x400, 0x400, 0x400, 0x400, 0x600, /* 0x3b8: */ 0x400, 0x400, 0x600, 0x600, 0x600, 0x600, 0x700, 0x770, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, 0x400, 0x400, /* 0x3c8: */ 0x400, 0x400, 0x400, 0x400, 0x400, 0x600, 0x600, 0x600, /* 0x3d0: */ 0x400, 0x400, 0x400, 0x600, 0x600, 0x600, 0x600, 0x700, /* 0x3d8: */ 0x600, 0x600, 0x600, 0x700, 0x700, 0x700, 0x780, 0x7b0, /* 0x3e0: */ 0x600, 0x600, 0x600, 0x700, 0x600, 0x700, 0x700, 0x700, /* 0x3e8: */ 0x700, 0x700, 0x700, 0x780, 0x780, 0x780, 0x780, 0x7c0, /* 0x3f0: */ 0x780, 0x780, 0x780, 0x7c0, 0x780, 0x7c0, 0x7c0, 0x7e0, /* 0x3f8: */ 0x7c0, 0x7e0, 0x7e0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x4d8: */ 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x4e8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x4f0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x4f8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x8e0, 0x9f0, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x530: */ 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x538: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x540: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0x800, /* 0x548: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x550: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x558: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x560: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x568: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x570: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x578: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xaf0, /* 0x580: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x588: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x590: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x598: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x5a0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x5a8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x5b0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x5b8: */ 0x800, 0x800, 0x800, 0xa00, 0xa00, 0xa00, 0xa00, 0xb70, /* 0x5c0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x5c8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, /* 0x5d0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xa00, 0xa00, /* 0x5d8: */ 0xa00, 0xa00, 0xa00, 0xb00, 0xa00, 0xb00, 0xb00, 0xbb0, /* 0x5e0: */ 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xb00, 0xb00, /* 0x5e8: */ 0xa00, 0xb00, 0xb00, 0xb80, 0xb00, 0xb80, 0xb80, 0xbc0, /* 0x5f0: */ 0xb00, 0xb80, 0xb80, 0xb80, 0xb80, 0xbc0, 0xbc0, 0xbe0, /* 0x5f8: */ 0xbc0, 0xbc0, 0xbe0, 0xbf0, 0xbe0, 0xbf0, 0xbf0, 0xbf0, /* 0x600: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x608: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x610: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x618: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x620: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x628: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x630: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x638: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, 0xc00, /* 0x640: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x648: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x650: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0x658: */ 0x800, 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x660: */ 0x800, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xc00, /* 0x668: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x670: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x678: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xcf0, /* 0x680: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0xc00, 0xc00, /* 0x688: */ 0xc00, 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x690: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x698: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x6a0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x6a8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x6b0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x6b8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd70, /* 0x6c0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x6c8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x6d0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x6d8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd00, 0xd00, 0xd90, /* 0x6e0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd00, /* 0x6e8: */ 0xc00, 0xd00, 0xd00, 0xd00, 0xd00, 0xd80, 0xd80, 0xdc0, /* 0x6f0: */ 0xd00, 0xd00, 0xd80, 0xd80, 0xd80, 0xdc0, 0xdc0, 0xde0, /* 0x6f8: */ 0xdc0, 0xdc0, 0xde0, 0xdf0, 0xde0, 0xdf0, 0xdf0, 0xdf0, /* 0x700: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x708: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x710: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x718: */ 0xc00, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xe00, /* 0x720: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, /* 0x728: */ 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x730: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x738: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe70, /* 0x740: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x748: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x750: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x758: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe80, /* 0x760: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x768: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe80, 0xec0, /* 0x770: */ 0xe00, 0xe00, 0xe00, 0xe80, 0xe80, 0xe80, 0xec0, 0xee0, /* 0x778: */ 0xec0, 0xec0, 0xec0, 0xee0, 0xee0, 0xef0, 0xef0, 0xef0, /* 0x780: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x788: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xf00, 0xf00, 0xf00, /* 0x790: */ 0xe00, 0xe00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x798: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x7a0: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x7a8: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf40, /* 0x7b0: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf40, /* 0x7b8: */ 0xf00, 0xf40, 0xf40, 0xf60, 0xf60, 0xf70, 0xf70, 0xf70, /* 0x7c0: */ 0xf00, 0xf00, 0xf00, 0xf80, 0xf00, 0xf80, 0xf80, 0xf80, /* 0x7c8: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0x7d0: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0x7d8: */ 0xf80, 0xf80, 0xf80, 0xfa0, 0xfa0, 0xfb0, 0xfb0, 0xfb0, /* 0x7e0: */ 0xf80, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, /* 0x7e8: */ 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfd0, 0xfd0, 0xfd0, /* 0x7f0: */ 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, /* 0x7f8: */ 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, /* 0x800: */ 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, /* 0x808: */ 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfc0, /* 0x810: */ 0xfd0, 0xfd0, 0xfd0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, /* 0x818: */ 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xf80, /* 0x820: */ 0xfb0, 0xfb0, 0xfb0, 0xfa0, 0xfa0, 0xf80, 0xf80, 0xf80, /* 0x828: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0x830: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0x838: */ 0xf80, 0xf80, 0xf80, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x840: */ 0xf70, 0xf70, 0xf70, 0xf60, 0xf60, 0xf40, 0xf40, 0xf00, /* 0x848: */ 0xf40, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x850: */ 0xf40, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x858: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x860: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0x868: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xe00, 0xe00, /* 0x870: */ 0xf00, 0xf00, 0xf00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x878: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x880: */ 0xef0, 0xef0, 0xef0, 0xee0, 0xee0, 0xec0, 0xec0, 0xe80, /* 0x888: */ 0xee0, 0xec0, 0xe80, 0xe80, 0xe80, 0xe00, 0xe00, 0xe00, /* 0x890: */ 0xec0, 0xe80, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x898: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x8a0: */ 0xe80, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x8a8: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x8b0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x8b8: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x8c0: */ 0xe70, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x8c8: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0x8d0: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xc00, 0xc00, /* 0x8d8: */ 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x8e0: */ 0xe00, 0xe00, 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x8e8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x8f0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x8f8: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x900: */ 0xdf0, 0xdf0, 0xdf0, 0xde0, 0xdf0, 0xde0, 0xdc0, 0xdc0, /* 0x908: */ 0xde0, 0xdc0, 0xdc0, 0xd80, 0xd80, 0xd80, 0xd00, 0xd00, /* 0x910: */ 0xdc0, 0xd80, 0xd80, 0xd00, 0xd00, 0xd00, 0xd00, 0xc00, /* 0x918: */ 0xd00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x920: */ 0xd90, 0xd00, 0xd00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x928: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x930: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x938: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x940: */ 0xd70, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x948: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x950: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x958: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x960: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x968: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x970: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, /* 0x978: */ 0xc00, 0xc00, 0xc00, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x980: */ 0xcf0, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x988: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x990: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0x998: */ 0xc00, 0xc00, 0xc00, 0x800, 0xc00, 0x800, 0x800, 0x800, /* 0x9a0: */ 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, 0x800, /* 0x9a8: */ 0xc00, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9b0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9b8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9c0: */ 0xc00, 0xc00, 0xc00, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9c8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9d0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9d8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9e0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9e8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9f0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0x9f8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa00: */ 0xbf0, 0xbf0, 0xbf0, 0xbe0, 0xbf0, 0xbe0, 0xbc0, 0xbc0, /* 0xa08: */ 0xbe0, 0xbc0, 0xbc0, 0xb80, 0xb80, 0xb80, 0xb80, 0xb00, /* 0xa10: */ 0xbc0, 0xb80, 0xb80, 0xb00, 0xb80, 0xb00, 0xb00, 0xb00, /* 0xa18: */ 0xb00, 0xb00, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, 0xa00, /* 0xa20: */ 0xbb0, 0xb00, 0xb00, 0xa00, 0xb00, 0xa00, 0xa00, 0xa00, /* 0xa28: */ 0xa00, 0xa00, 0xa00, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa30: */ 0xa00, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa38: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa40: */ 0xb70, 0xb00, 0xa00, 0xa00, 0xa00, 0x800, 0x800, 0x800, /* 0xa48: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa50: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa58: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa60: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa68: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa70: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa78: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa80: */ 0xaf0, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa88: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa90: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xa98: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xaa0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xaa8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xab0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xab8: */ 0x800, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0xac0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xac8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x000, 0x000, /* 0xad0: */ 0x800, 0x800, 0x000, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0xad8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae0: */ 0x800, 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb00: */ 0x9f0, 0x9e0, 0x880, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb08: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb10: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xb18: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x000, 0x000, 0x000, /* 0xb20: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x000, 0x000, 0x000, /* 0xb28: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb30: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb40: */ 0x800, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0xb48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb80: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc00: */ 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7e0, 0x7e0, 0x7c0, /* 0xc08: */ 0x7e0, 0x7c0, 0x7c0, 0x780, 0x7c0, 0x780, 0x780, 0x780, /* 0xc10: */ 0x7c0, 0x780, 0x780, 0x780, 0x780, 0x700, 0x700, 0x700, /* 0xc18: */ 0x780, 0x700, 0x700, 0x600, 0x700, 0x600, 0x600, 0x600, /* 0xc20: */ 0x7b0, 0x780, 0x700, 0x700, 0x700, 0x600, 0x600, 0x600, /* 0xc28: */ 0x700, 0x600, 0x600, 0x600, 0x600, 0x400, 0x400, 0x400, /* 0xc30: */ 0x600, 0x600, 0x600, 0x400, 0x400, 0x400, 0x400, 0x400, /* 0xc38: */ 0x400, 0x400, 0x400, 0x000, 0x400, 0x000, 0x000, 0x000, /* 0xc40: */ 0x770, 0x700, 0x600, 0x600, 0x600, 0x600, 0x400, 0x400, /* 0xc48: */ 0x600, 0x400, 0x400, 0x400, 0x400, 0x000, 0x000, 0x000, /* 0xc50: */ 0x400, 0x400, 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc60: */ 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc80: */ 0x6f0, 0x640, 0x600, 0x400, 0x400, 0x000, 0x000, 0x000, /* 0xc88: */ 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd00: */ 0x5f0, 0x5e0, 0x4c0, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe00: */ 0x3f0, 0x3f0, 0x3e0, 0x000, 0x1c0, 0x000, 0x000, 0x000, /* 0xe08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xec0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xec8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf00: */ 0x070, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xff0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xff8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/Makefile.am0000644000175100001770000000160114544470311021422 00000000000000## Process this file with automake to create Makefile.in AR = @AR@ AM_CFLAGS = @VICE_CFLAGS@ AM_LDFLAGS = @VICE_LDFLAGS@ #AM_CXXFLAGS = @VICE_CXXFLAGS@ noinst_LIBRARIES = libresid.a if NEW_8580_FILTER FILTER8580SRC = filter8580new.cc else FILTER8580SRC = filter.cc endif libresid_a_SOURCES = sid.cc voice.cc wave.cc envelope.cc $(FILTER8580SRC) dac.cc extfilt.cc pot.cc version.cc BUILT_SOURCES = $(noinst_DATA:.dat=.h) noinst_HEADERS = sid.h voice.h wave.h envelope.h filter.h filter8580new.h dac.h extfilt.h pot.h spline.h resid-config.h $(noinst_DATA:.dat=.h) noinst_DATA = wave6581_PST.dat wave6581_PS_.dat wave6581_P_T.dat wave6581__ST.dat wave8580_PST.dat wave8580_PS_.dat wave8580_P_T.dat wave8580__ST.dat noinst_SCRIPTS = samp2src.pl EXTRA_DIST = $(noinst_HEADERS) $(noinst_DATA) $(noinst_SCRIPTS) README.VICE SUFFIXES = .dat .dat.h: $(PERL) $(srcdir)/samp2src.pl $* $< $@ libsidplayfp-2.6.0/src/builders/resid-builder/resid/resid-config.h0000644000175100001770000000206514544470311022115 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_CONFIG_H #define RESID_CONFIG_H #include "siddefs.h" #endif libsidplayfp-2.6.0/src/builders/resid-builder/resid/envelope.h0000644000175100001770000003130014544470311021353 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_ENVELOPE_H #define RESID_ENVELOPE_H #include "resid-config.h" namespace reSID { // ---------------------------------------------------------------------------- // A 15 bit counter is used to implement the envelope rates, in effect // dividing the clock to the envelope counter by the currently selected rate // period. // In addition, another counter is used to implement the exponential envelope // decay, in effect further dividing the clock to the envelope counter. // The period of this counter is set to 1, 2, 4, 8, 16, 30 at the envelope // counter values 255, 93, 54, 26, 14, 6, respectively. // ---------------------------------------------------------------------------- class EnvelopeGenerator { public: EnvelopeGenerator(); enum State { ATTACK, DECAY_SUSTAIN, RELEASE, FREEZED }; void set_chip_model(chip_model model); void clock(); void clock(cycle_count delta_t); void reset(); void writeCONTROL_REG(reg8); void writeATTACK_DECAY(reg8); void writeSUSTAIN_RELEASE(reg8); reg8 readENV(); // 8-bit envelope output. short output(); protected: void set_exponential_counter(); void state_change(); reg16 rate_counter; reg16 rate_period; reg8 exponential_counter; reg8 exponential_counter_period; reg8 new_exponential_counter_period; reg8 envelope_counter; reg8 env3; // Emulation of pipeline delay for envelope decrement. cycle_count envelope_pipeline; cycle_count exponential_pipeline; cycle_count state_pipeline; bool hold_zero; bool reset_rate_counter; reg4 attack; reg4 decay; reg4 sustain; reg4 release; reg8 gate; State state; State next_state; chip_model sid_model; // Lookup table to convert from attack, decay, or release value to rate // counter period. static reg16 rate_counter_period[]; // The 16 selectable sustain levels. static reg8 sustain_level[]; // DAC lookup tables. static unsigned short model_dac[2][1 << 8]; friend class SID; }; // ---------------------------------------------------------------------------- // Inline functions. // The following functions are defined inline because they are called every // time a sample is calculated. // ---------------------------------------------------------------------------- #if RESID_INLINING || defined(RESID_ENVELOPE_CC) // ---------------------------------------------------------------------------- // SID clocking - 1 cycle. // ---------------------------------------------------------------------------- RESID_INLINE void EnvelopeGenerator::clock() { // The ENV3 value is sampled at the first phase of the clock env3 = envelope_counter; if (unlikely(state_pipeline)) { state_change(); } // If the exponential counter period != 1, the envelope decrement is delayed // 1 cycle. This is only modeled for single cycle clocking. if (unlikely(envelope_pipeline != 0) && (--envelope_pipeline == 0)) { if (likely(!hold_zero)) { if (state == ATTACK) { ++envelope_counter &= 0xff; if (unlikely(envelope_counter == 0xff)) { state = DECAY_SUSTAIN; rate_period = rate_counter_period[decay]; } } else if ((state == DECAY_SUSTAIN) || (state == RELEASE)) { --envelope_counter &= 0xff; } set_exponential_counter(); } } if (unlikely(exponential_pipeline != 0) && (--exponential_pipeline == 0)) { exponential_counter = 0; if (((state == DECAY_SUSTAIN) && (envelope_counter != sustain_level[sustain])) || (state == RELEASE)) { // The envelope counter can flip from 0x00 to 0xff by changing state to // attack, then to release. The envelope counter will then continue // counting down in the release state. // This has been verified by sampling ENV3. envelope_pipeline = 1; } } else if (unlikely(reset_rate_counter)) { rate_counter = 0; reset_rate_counter = false; if (state == ATTACK) { // The first envelope step in the attack state also resets the exponential // counter. This has been verified by sampling ENV3. exponential_counter = 0; // NOTE this is actually delayed one cycle, not modeled // The envelope counter can flip from 0xff to 0x00 by changing state to // release, then to attack. The envelope counter is then frozen at // zero; to unlock this situation the state must be changed to release, // then to attack. This has been verified by sampling ENV3. envelope_pipeline = 2; } else { if ((!hold_zero) && ++exponential_counter == exponential_counter_period) { exponential_pipeline = exponential_counter_period != 1 ? 2 : 1; } } } // Check for ADSR delay bug. // If the rate counter comparison value is set below the current value of the // rate counter, the counter will continue counting up until it wraps around // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the // envelope can finally be stepped. // This has been verified by sampling ENV3. // if (likely(rate_counter != rate_period)) { if (unlikely(++rate_counter & 0x8000)) { ++rate_counter &= 0x7fff; } } else reset_rate_counter = true; } // ---------------------------------------------------------------------------- // SID clocking - delta_t cycles. // ---------------------------------------------------------------------------- RESID_INLINE void EnvelopeGenerator::clock(cycle_count delta_t) { // NB! Any pipelined envelope counter decrement from single cycle clocking // will be lost. It is not worth the trouble to flush the pipeline here. if (unlikely(state_pipeline)) { if (next_state == ATTACK) { state = ATTACK; hold_zero = false; rate_period = rate_counter_period[attack]; } else if (next_state == RELEASE) { state = RELEASE; rate_period = rate_counter_period[release]; } else if (next_state == FREEZED) { hold_zero = true; } state_pipeline = 0; } // Check for ADSR delay bug. // If the rate counter comparison value is set below the current value of the // rate counter, the counter will continue counting up until it wraps around // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the // envelope can finally be stepped. // This has been verified by sampling ENV3. // // NB! This requires two's complement integer. int rate_step = rate_period - rate_counter; if (unlikely(rate_step <= 0)) { rate_step += 0x7fff; } while (delta_t) { if (delta_t < rate_step) { // likely (~65%) rate_counter += delta_t; if (unlikely(rate_counter & 0x8000)) { ++rate_counter &= 0x7fff; } return; } rate_counter = 0; delta_t -= rate_step; // The first envelope step in the attack state also resets the exponential // counter. This has been verified by sampling ENV3. // if (state == ATTACK || ++exponential_counter == exponential_counter_period) { // likely (~50%) exponential_counter = 0; // Check whether the envelope counter is frozen at zero. if (unlikely(hold_zero)) { rate_step = rate_period; continue; } switch (state) { case ATTACK: // The envelope counter can flip from 0xff to 0x00 by changing state to // release, then to attack. The envelope counter is then frozen at // zero; to unlock this situation the state must be changed to release, // then to attack. This has been verified by sampling ENV3. // ++envelope_counter &= 0xff; if (unlikely(envelope_counter == 0xff)) { state = DECAY_SUSTAIN; rate_period = rate_counter_period[decay]; } break; case DECAY_SUSTAIN: if (likely(envelope_counter != sustain_level[sustain])) { --envelope_counter; } break; case RELEASE: // The envelope counter can flip from 0x00 to 0xff by changing state to // attack, then to release. The envelope counter will then continue // counting down in the release state. // This has been verified by sampling ENV3. // NB! The operation below requires two's complement integer. // --envelope_counter &= 0xff; break; case FREEZED: // we should never get here break; } // Check for change of exponential counter period. set_exponential_counter(); if (unlikely(new_exponential_counter_period > 0)) { exponential_counter_period = new_exponential_counter_period; new_exponential_counter_period = 0; if (next_state == FREEZED) { hold_zero = true; } } } rate_step = rate_period; } } /** * This is what happens on chip during state switching, * based on die reverse engineering and transistor level * emulation. * * Attack * * 0 - Gate on * 1 - Counting direction changes * During this cycle the decay rate is "accidentally" activated * 2 - Counter is being inverted * Now the attack rate is correctly activated * Counter is enabled * 3 - Counter will be counting upward from now on * * Decay * * 0 - Counter == $ff * 1 - Counting direction changes * The attack state is still active * 2 - Counter is being inverted * During this cycle the decay state is activated * 3 - Counter will be counting downward from now on * * Release * * 0 - Gate off * 1 - During this cycle the release state is activated if coming from sustain/decay * *2 - Counter is being inverted, the release state is activated * *3 - Counter will be counting downward from now on * * (* only if coming directly from Attack state) * * Freeze * * 0 - Counter == $00 * 1 - Nothing * 2 - Counter is disabled */ RESID_INLINE void EnvelopeGenerator::state_change() { state_pipeline--; switch (next_state) { case ATTACK: if (state_pipeline == 0) { state = ATTACK; // The attack register is correctly activated during second cycle of attack phase rate_period = rate_counter_period[attack]; hold_zero = false; } break; case DECAY_SUSTAIN: break; case RELEASE: if (((state == ATTACK) && (state_pipeline == 0)) || ((state == DECAY_SUSTAIN) && (state_pipeline == 1))) { state = RELEASE; rate_period = rate_counter_period[release]; } break; case FREEZED: break; } } // ---------------------------------------------------------------------------- // Read the envelope generator output. // ---------------------------------------------------------------------------- RESID_INLINE short EnvelopeGenerator::output() { // DAC imperfections are emulated by using envelope_counter as an index // into a DAC lookup table. readENV() uses envelope_counter directly. return model_dac[sid_model][envelope_counter]; } RESID_INLINE void EnvelopeGenerator::set_exponential_counter() { // Check for change of exponential counter period. switch (envelope_counter) { case 0xff: exponential_counter_period = 1; break; case 0x5d: exponential_counter_period = 2; break; case 0x36: exponential_counter_period = 4; break; case 0x1a: exponential_counter_period = 8; break; case 0x0e: exponential_counter_period = 16; break; case 0x06: exponential_counter_period = 30; break; case 0x00: // TODO write a test to verify that 0x00 really changes the period // e.g. set R = 0xf, gate on to 0x06, gate off to 0x00, gate on to 0x04, // gate off, sample. exponential_counter_period = 1; // When the envelope counter is changed to zero, it is frozen at zero. // This has been verified by sampling ENV3. hold_zero = true; break; } } #endif // RESID_INLINING || defined(RESID_ENVELOPE_CC) } // namespace reSID #endif // not RESID_ENVELOPE_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/README0000644000175100001770000000262214544470311020252 00000000000000This is reSID, a reverse engineered software emulation of the MOS6581 SID (Sound Interface Device). This chip was used in the Commodore 64 computer. reSID is free software. See the file COPYING for copying permission. reSID is a C++ library containing a complete emulation of the SID chip. This library can be linked into programs emulating the MOS6510 MPU to play music made for the Commodore 64 computer. reSID has been successfully linked into VICE, a full-fledged Commodore 64 emulator, and SIDPLAY, a popular SID tune player. The VICE home page is: http://vice-emu.sourceforge.net/ A patch for SIDPLAY can be found on the SIDPLAY home page: http://www.geocities.com/SiliconValley/Lakes/5147/ Various SID emulators exist, however reSID should still be of great interest to Commodore 64 nostalgics. The emulator engine is cycle-based, emulating the internal operations of the SID chip. SID's audio filter is modeled as an actual two-integrator-loop biquadratic filter circuit. The engine has been developed based on available information on SID, sampling of the OSC3 and ENV3 registers, filter theory, and meticulous testing. In short, a scientific approach has been taken to model the SID chip as accurately as possible. To our knowledge reSID is by far the most accurate SID emulator ever created. This comes at a price; what is considered a fairly fast CPU at the time of this writing is needed to run the emulator. libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave.cc0000644000175100001770000002326714544470311020653 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_WAVE_CC #include "wave.h" #include "dac.h" namespace reSID { // Number of cycles after which the shift register is reset // when the test bit is set. const cycle_count SHIFT_REGISTER_RESET_START_6581 = 35000; // 0x8000 const cycle_count SHIFT_REGISTER_RESET_BIT_6581 = 1000; const cycle_count SHIFT_REGISTER_RESET_START_8580 = 2519864; // 0x950000 const cycle_count SHIFT_REGISTER_RESET_BIT_8580 = 315000; // Number of cycles after which the waveform output fades to 0 when setting // the waveform register to 0. // // We have two SOAS/C samplings showing that floating DAC // keeps its state for at least 0x14000 cycles. // // This can't be found via sampling OSC3, it seems that // the actual analog output must be sampled and timed. const cycle_count FLOATING_OUTPUT_TTL_START_6581 = 182000; // ~200ms const cycle_count FLOATING_OUTPUT_TTL_BIT_6581 = 1500; const cycle_count FLOATING_OUTPUT_TTL_START_8580 = 4400000; // ~5s const cycle_count FLOATING_OUTPUT_TTL_BIT_8580 = 50000; // Waveform lookup tables. unsigned short WaveformGenerator::model_wave[2][8][1 << 12] = { { {0}, {0}, {0}, #include "wave6581__ST.h" {0}, #include "wave6581_P_T.h" #include "wave6581_PS_.h" #include "wave6581_PST.h" }, { {0}, {0}, {0}, #include "wave8580__ST.h" {0}, #include "wave8580_P_T.h" #include "wave8580_PS_.h" #include "wave8580_PST.h" } }; // DAC lookup tables. unsigned short WaveformGenerator::model_dac[2][1 << 12] = { {0}, {0}, }; // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- WaveformGenerator::WaveformGenerator() { static bool class_init; if (!class_init) { // Calculate tables for normal waveforms. accumulator = 0; for (int i = 0; i < (1 << 12); i++) { reg24 msb = accumulator & 0x800000; // Noise mask, triangle, sawtooth, pulse mask. // The triangle calculation is made branch-free, just for the hell of it. model_wave[0][0][i] = model_wave[1][0][i] = 0xfff; model_wave[0][1][i] = model_wave[1][1][i] = ((accumulator ^ -!!msb) >> 11) & 0xffe; model_wave[0][2][i] = model_wave[1][2][i] = accumulator >> 12; model_wave[0][4][i] = model_wave[1][4][i] = 0xfff; accumulator += 0x1000; } // Build DAC lookup tables for 12-bit DACs. // MOS 6581: 2R/R ~ 2.20, missing termination resistor. build_dac_table(model_dac[0], 12, 2.20, false); // MOS 8580: 2R/R ~ 2.00, correct termination. build_dac_table(model_dac[1], 12, 2.00, true); class_init = true; } sync_source = this; sid_model = MOS6581; // Accumulator's even bits are high on powerup accumulator = 0x555555; tri_saw_pipeline = 0x555; reset(); } // ---------------------------------------------------------------------------- // Set sync source. // ---------------------------------------------------------------------------- void WaveformGenerator::set_sync_source(WaveformGenerator* source) { sync_source = source; source->sync_dest = this; } // ---------------------------------------------------------------------------- // Set chip model. // ---------------------------------------------------------------------------- void WaveformGenerator::set_chip_model(chip_model model) { sid_model = model; wave = model_wave[model][waveform & 0x7]; } // ---------------------------------------------------------------------------- // Register functions. // ---------------------------------------------------------------------------- void WaveformGenerator::writeFREQ_LO(reg8 freq_lo) { freq = (freq & 0xff00) | (freq_lo & 0x00ff); } void WaveformGenerator::writeFREQ_HI(reg8 freq_hi) { freq = ((freq_hi << 8) & 0xff00) | (freq & 0x00ff); } void WaveformGenerator::writePW_LO(reg8 pw_lo) { pw = (pw & 0xf00) | (pw_lo & 0x0ff); // Push next pulse level into pulse level pipeline. pulse_output = (accumulator >> 12) >= pw ? 0xfff : 0x000; } void WaveformGenerator::writePW_HI(reg8 pw_hi) { pw = ((pw_hi << 8) & 0xf00) | (pw & 0x0ff); // Push next pulse level into pulse level pipeline. pulse_output = (accumulator >> 12) >= pw ? 0xfff : 0x000; } bool do_pre_writeback(reg8 waveform_prev, reg8 waveform, bool is6581) { // no writeback without combined waveforms if (likely(waveform_prev <= 0x8)) { return false; } #if 0 // This need more investigation if (waveform == 8) { return false; } #endif if (waveform_prev == 0xc) { if (is6581) { return false; } else if ((waveform != 0x9) && (waveform != 0xe)) { return false; } } // What's happening here? if (is6581 && ((((waveform_prev & 0x3) == 0x1) && ((waveform & 0x3) == 0x2)) || (((waveform_prev & 0x3) == 0x2) && ((waveform & 0x3) == 0x1)))) { return false; } // ok do the writeback return true; } void WaveformGenerator::writeCONTROL_REG(reg8 control) { reg8 waveform_prev = waveform; reg8 test_prev = test; waveform = (control >> 4) & 0x0f; test = control & 0x08; ring_mod = control & 0x04; sync = control & 0x02; // Set up waveform table. wave = model_wave[sid_model][waveform & 0x7]; // Substitution of accumulator MSB when sawtooth = 0, ring_mod = 1. ring_msb_mask = ((~control >> 5) & (control >> 2) & 0x1) << 23; // no_noise and no_pulse are used in set_waveform_output() as bitmasks to // only let the noise or pulse influence the output when the noise or pulse // waveforms are selected. no_noise = waveform & 0x8 ? 0x000 : 0xfff; no_noise_or_noise_output = no_noise | noise_output; no_pulse = waveform & 0x4 ? 0x000 : 0xfff; // Test bit rising. // The accumulator is cleared, while the the shift register is prepared for // shifting by interconnecting the register bits. The internal SRAM cells // start to slowly rise up towards one. The SRAM cells reach one within // approximately $8000 cycles, yielding a shift register value of // 0x7fffff. if (!test_prev && test) { // Reset accumulator. accumulator = 0; // Flush shift pipeline. shift_pipeline = 0; // Set reset time for shift register. shift_register_reset = (sid_model == MOS6581) ? SHIFT_REGISTER_RESET_START_6581 : SHIFT_REGISTER_RESET_START_8580; // The test bit sets pulse high. pulse_output = 0xfff; } else if (test_prev && !test) { // When the test bit is falling, the second phase of the shift is // completed by enabling SRAM write. // During first phase of the shift the bits are interconnected // and the output of each bit is latched into the following. // The output may overwrite the latched value. if (do_pre_writeback(waveform_prev, waveform, sid_model == MOS6581)) { write_shift_register(); } // bit0 = (bit22 | test) ^ bit17 = 1 ^ bit17 = ~bit17 reg24 bit0 = (~shift_register >> 17) & 0x1; shift_register = ((shift_register << 1) | bit0) & 0x7fffff; // Set new noise waveform output. set_noise_output(); } if (waveform) { // Set new waveform output. set_waveform_output(); } else if (waveform_prev) { // Change to floating DAC input. // Reset fading time for floating DAC input. floating_output_ttl = (sid_model == MOS6581) ? FLOATING_OUTPUT_TTL_START_6581 : FLOATING_OUTPUT_TTL_START_8580; } // The gate bit is handled by the EnvelopeGenerator. } void WaveformGenerator::wave_bitfade() { waveform_output &= waveform_output >> 1; osc3 = waveform_output; if (waveform_output != 0) floating_output_ttl = (sid_model == MOS6581) ? FLOATING_OUTPUT_TTL_BIT_6581 : FLOATING_OUTPUT_TTL_BIT_8580; } void WaveformGenerator::shiftreg_bitfade() { shift_register |= 1; shift_register |= shift_register << 1; // New noise waveform output. set_noise_output(); if (shift_register != 0x7fffff) shift_register_reset = (sid_model == MOS6581) ? SHIFT_REGISTER_RESET_BIT_6581 : SHIFT_REGISTER_RESET_BIT_8580; } reg8 WaveformGenerator::readOSC() { return osc3 >> 4; } // ---------------------------------------------------------------------------- // SID reset. // ---------------------------------------------------------------------------- void WaveformGenerator::reset() { // accumulator is not changed on reset freq = 0; pw = 0; msb_rising = false; waveform = 0; test = 0; ring_mod = 0; sync = 0; wave = model_wave[sid_model][0]; ring_msb_mask = 0; no_noise = 0xfff; no_pulse = 0xfff; pulse_output = 0xfff; // reset shift register // when reset is released the shift register is clocked once shift_register = 0x7ffffe; shift_register_reset = 0; set_noise_output(); shift_pipeline = 0; waveform_output = 0; osc3 = 0; floating_output_ttl = 0; } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580_P_T.dat0000644000175100001770000001000014544470311022102 00000000000000libsidplayfp-2.6.0/src/builders/resid-builder/resid/TODO0000644000175100001770000000047614544470311020067 00000000000000* Refine the MOS 6581 filter model / parameters. Build an accurate MOS 8580 filter model. * Expose an interface for tunable filter parameters. * Write documentation. Possibly a paper describing how SID was reverse engineered. * Implement a SID tune player. A PSID player, VSID, is partly implemented in VICE. libsidplayfp-2.6.0/src/builders/resid-builder/resid/AUTHORS0000644000175100001770000000011714544470311020437 00000000000000Authors of reSID. Dag Lem: Designed and programmed complete emulation engine. libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581_P_T.dat0000644000175100001770000001000014544470311022101 00000000000000 8?@@@_@@```o@````pw``p@pp{@p@@p`px}@`x`xx~p||~Ѐ뀀~||p~|x`x``}xx`p@@p@{xp@p@``wpp```@o```@@_X@@@?<0libsidplayfp-2.6.0/src/builders/resid-builder/resid/README.VICE0000644000175100001770000000041314544470311020773 00000000000000This version of reSID has been modified for use with VICE. In particular, libtool is not used to build the library, and there might be some workarounds for various substandard compilers. Please get the original version if you want to use reSID in your own project. libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581_PS_.dat0000644000175100001770000001000014544470311022100 00000000000000/7;=>?????OW[]^_____gkmnooooosuvwwwwwyz{@@{@{{{@@|@@@}@@}`}}}@``~``~`~~~pppx̀΀πՀր׀ـЀЀڀЀۀЀЀ܀Ѐ݀倀怀退뀀񀀀󀀀libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581_PST.h0000644000175100001770000010775614544470322021577 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x378: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x530: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x538: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x540: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x548: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x550: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x558: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x560: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x568: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x570: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x578: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x580: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x588: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x590: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x598: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x600: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x608: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x610: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x618: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x620: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x628: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x630: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x638: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x640: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x648: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x650: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x658: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x660: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x668: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x670: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x678: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x680: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x688: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x690: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x698: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x700: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x708: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x710: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x718: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x720: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x728: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x730: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x738: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x740: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x748: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x750: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x758: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x760: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x768: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x770: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x778: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x780: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x788: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x790: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x798: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, /* 0x7f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x300, /* 0x7f8: */ 0x000, 0x000, 0x000, 0x780, 0x780, 0x7e0, 0x7f0, 0x7f0, /* 0x800: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x808: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x810: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x818: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x820: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x828: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x830: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x838: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x840: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x848: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x850: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x858: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x860: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x868: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x870: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x878: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x880: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x888: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x890: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x898: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x900: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x908: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x910: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x918: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x920: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x928: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x930: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x938: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x940: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x948: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x950: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x958: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x960: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x968: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x970: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x978: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x980: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x988: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x990: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x998: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x3f0, /* 0xc00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xec0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xec8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, /* 0xff0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x300, /* 0xff8: */ 0x000, 0x000, 0x000, 0x780, 0x780, 0x7e0, 0x7f0, 0x7f0, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580__ST.h0000644000175100001770000010775614544470322021617 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x0f0, 0x0f0, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x378: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3f0: */ 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, /* 0x3f8: */ 0x1e0, 0x1e0, 0x1f0, 0x1f0, 0x1f0, 0x1f0, 0x1f0, 0x1f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x530: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x538: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x540: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x548: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x550: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x558: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x560: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x568: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x570: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x578: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x580: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x588: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x590: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x598: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5f8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x0f0, 0x1f0, /* 0x600: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x608: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x610: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x618: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x620: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x628: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x630: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x638: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x640: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x648: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x650: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x658: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x660: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x668: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x670: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x678: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x680: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x688: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x690: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x698: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x6f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x700: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x708: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x710: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x718: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x720: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x728: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x730: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x738: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x740: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x748: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x750: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x758: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x760: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x768: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x770: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x778: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x780: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x788: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x790: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x798: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0x7c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x7e0: */ 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, /* 0x7e8: */ 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, 0x380, /* 0x7f0: */ 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3c0, 0x3e0, /* 0x7f8: */ 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, 0x7f0, /* 0x800: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x808: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x810: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x818: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x820: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x828: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x830: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x838: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x840: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x848: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x850: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x858: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x860: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x868: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x870: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x878: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x880: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x888: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x890: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x898: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0x900: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x908: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x910: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x918: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x920: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x928: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x930: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x938: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x940: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x948: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x950: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x958: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x960: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x968: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x970: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x978: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0x980: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x988: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x990: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x998: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x0f0, 0x0f0, /* 0xa00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xa80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0xb00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xb80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xbc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf0: */ 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, 0x1c0, /* 0xbf8: */ 0x1e0, 0x1e0, 0x1f0, 0x1f0, 0x1f0, 0x1f0, 0x3f0, 0x3f0, /* 0xc00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xc80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf8: */ 0x000, 0x000, 0x000, 0x000, 0x070, 0x070, 0x070, 0x070, /* 0xd00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x030, 0x030, /* 0xd80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x010, /* 0xdc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf8: */ 0x0e0, 0x0e0, 0x0e0, 0x0e0, 0x0f0, 0x0f0, 0x1f0, 0x1f0, /* 0xe00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe78: */ 0x000, 0x000, 0x000, 0x000, 0x800, 0x000, 0x830, 0x830, /* 0xe80: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe88: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe90: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xe98: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xea0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xea8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xeb0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xeb8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xec0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xec8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xed0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xed8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xee0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xee8: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xef0: */ 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, 0x800, /* 0xef8: */ 0x800, 0x800, 0x800, 0x800, 0x870, 0x870, 0x870, 0x8f0, /* 0xf00: */ 0xc00, 0xe00, 0xe00, 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, /* 0xf08: */ 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf10: */ 0xc00, 0xe00, 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf18: */ 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, /* 0xf20: */ 0xc00, 0xe00, 0xe00, 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, /* 0xf28: */ 0xe00, 0xe00, 0xe00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, /* 0xf30: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf38: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf40: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf48: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf50: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf58: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf60: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf68: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf70: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, /* 0xf78: */ 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe30, 0xe30, /* 0xf80: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf88: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf90: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xf98: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfa0: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfa8: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfb0: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, /* 0xfb8: */ 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf10, /* 0xfc0: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0xfc8: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0xfd0: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0xfd8: */ 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, 0xf80, /* 0xfe0: */ 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, /* 0xfe8: */ 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, 0xfc0, /* 0xff0: */ 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, /* 0xff8: */ 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/filter.cc0000644000175100001770000005407214544470311021174 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_FILTER_CC #ifdef _M_ARM #undef _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE #define _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE 1 #endif #include "filter.h" #include "dac.h" #include "spline.h" #include namespace reSID { // This is the SID 6581 op-amp voltage transfer function, measured on // CAP1B/CAP1A on a chip marked MOS 6581R4AR 0687 14. // All measured chips have op-amps with output voltages (and thus input // voltages) within the range of 0.81V - 10.31V. static double_point opamp_voltage_6581[] = { { 0.81, 10.31 }, // Approximate start of actual range { 0.81, 10.31 }, // Repeated point { 2.40, 10.31 }, { 2.60, 10.30 }, { 2.70, 10.29 }, { 2.80, 10.26 }, { 2.90, 10.17 }, { 3.00, 10.04 }, { 3.10, 9.83 }, { 3.20, 9.58 }, { 3.30, 9.32 }, { 3.50, 8.69 }, { 3.70, 8.00 }, { 4.00, 6.89 }, { 4.40, 5.21 }, { 4.54, 4.54 }, // Working point (vi = vo) { 4.60, 4.19 }, { 4.80, 3.00 }, { 4.90, 2.30 }, // Change of curvature { 4.95, 2.03 }, { 5.00, 1.88 }, { 5.05, 1.77 }, { 5.10, 1.69 }, { 5.20, 1.58 }, { 5.40, 1.44 }, { 5.60, 1.33 }, { 5.80, 1.26 }, { 6.00, 1.21 }, { 6.40, 1.12 }, { 7.00, 1.02 }, { 7.50, 0.97 }, { 8.50, 0.89 }, { 10.00, 0.81 }, { 10.31, 0.81 }, // Approximate end of actual range { 10.31, 0.81 } // Repeated end point }; // This is the SID 8580 op-amp voltage transfer function, measured on // CAP1B/CAP1A on a chip marked CSG 8580R5 1690 25. static double_point opamp_voltage_8580[] = { { 1.30, 8.91 }, // Approximate start of actual range { 1.30, 8.91 }, // Repeated end point { 4.76, 8.91 }, { 4.77, 8.90 }, { 4.78, 8.88 }, { 4.785, 8.86 }, { 4.79, 8.80 }, { 4.795, 8.60 }, { 4.80, 8.25 }, { 4.805, 7.50 }, { 4.81, 6.10 }, { 4.815, 4.05 }, // Change of curvature { 4.82, 2.27 }, { 4.825, 1.65 }, { 4.83, 1.55 }, { 4.84, 1.47 }, { 4.85, 1.43 }, { 4.87, 1.37 }, { 4.90, 1.34 }, { 5.00, 1.30 }, { 5.10, 1.30 }, { 8.91, 1.30 }, // Approximate end of actual range { 8.91, 1.30 } // Repeated end point }; typedef struct { // Op-amp transfer function. double_point* opamp_voltage; int opamp_voltage_size; // Voice output characteristics. double voice_voltage_range; double voice_DC_voltage; // Capacitor value. double C; // Transistor parameters. double Vdd; double Vth; // Threshold voltage double Ut; // Thermal voltage: Ut = k*T/q = 8.61734315e-5*T ~ 26mV double k; // Gate coupling coefficient: K = Cox/(Cox+Cdep) ~ 0.7 double uCox; // u*Cox double WL_vcr; // W/L for VCR double WL_snake; // W/L for "snake" // DAC parameters. double dac_zero; double dac_scale; double dac_2R_div_R; bool dac_term; } model_filter_init_t; static model_filter_init_t model_filter_init[2] = { { opamp_voltage_6581, sizeof(opamp_voltage_6581)/sizeof(*opamp_voltage_6581), // The dynamic analog range of one voice is approximately 1.5V, // riding at a DC level of approximately 5.0V. 1.5, 5.0, // Capacitor value. 470e-12, // Transistor parameters. 12.18, 1.31, 26.0e-3, 1.0, 20e-6, 9.0/1, 1.0/115, // DAC parameters. 6.65, 2.63, 2.20, false }, { opamp_voltage_8580, sizeof(opamp_voltage_8580)/sizeof(*opamp_voltage_8580), // FIXME: Measure for the 8580. 1.0, // 4.75, 1.30, // FIXME: For now we pretend that the working point is 0V. 22e-9, 9.09, 0.80, 26.0e-3, 1.0, 10e-6, // FIXME: 6581 only 0, 0, 0, 0, 2.00, true } }; unsigned short Filter::vcr_kVg[1 << 16]; unsigned short Filter::vcr_n_Ids_term[1 << 16]; #if defined(__amiga__) && defined(__mc68000__) #undef HAS_LOG1P #endif #ifndef HAS_LOG1P static double log1p(double x) { return log(1 + x) - (((1 + x) - 1) - x) / (1 + x); } #endif Filter::model_filter_t Filter::model_filter[2]; // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- Filter::Filter() { static bool class_init; if (!class_init) { // Temporary table for op-amp transfer function. unsigned int* voltages = new unsigned int[1 << 16]; opamp_t* opamp = new opamp_t[1 << 16]; for (int m = 0; m < 2; m++) { model_filter_init_t& fi = model_filter_init[m]; model_filter_t& mf = model_filter[m]; // Convert op-amp voltage transfer to 16 bit values. double vmin = fi.opamp_voltage[0][0]; double opamp_max = fi.opamp_voltage[0][1]; double kVddt = fi.k*(fi.Vdd - fi.Vth); double vmax = kVddt < opamp_max ? opamp_max : kVddt; double denorm = vmax - vmin; double norm = 1.0/denorm; // Scaling and translation constants. double N16 = norm*((1u << 16) - 1); double N30 = norm*((1u << 30) - 1); double N31 = norm*((1u << 31) - 1); mf.vo_N16 = (int)(N16); // FIXME: Remove? // The "zero" output level of the voices. // The digital range of one voice is 20 bits; create a scaling term // for multiplication which fits in 11 bits. double N14 = norm*(1u << 14); mf.voice_scale_s14 = (int)(N14*fi.voice_voltage_range); mf.voice_DC = (int)(N16*(fi.voice_DC_voltage - vmin)); // Vdd - Vth, normalized so that translated values can be subtracted: // k*Vddt - x = (k*Vddt - t) - (x - t) mf.kVddt = (int)(N16*(kVddt - vmin) + 0.5); // Normalized snake current factor, 1 cycle at 1MHz. // Fit in 5 bits. mf.n_snake = (int)(denorm*(1 << 13)*(fi.uCox/(2*fi.k)*fi.WL_snake*1.0e-6/fi.C) + 0.5); // Create lookup table mapping op-amp voltage across output and input // to input voltage: vo - vx -> vx // FIXME: No variable length arrays in ISO C++, hardcoding to max 50 // points. // double_point scaled_voltage[fi.opamp_voltage_size]; double_point scaled_voltage[50]; for (int i = 0; i < fi.opamp_voltage_size; i++) { // The target output range is 16 bits, in order to fit in an unsigned // short. // // The y axis is temporarily scaled to 31 bits for maximum accuracy in // the calculated derivative. // // Values are normalized using // // x_n = m*2^N*(x - xmin) // // and are translated back later (for fixed point math) using // // m*2^N*x = x_n - m*2^N*xmin // scaled_voltage[fi.opamp_voltage_size - 1 - i][0] = int((N16*(fi.opamp_voltage[i][1] - fi.opamp_voltage[i][0]) + (1 << 16))/2 + 0.5); scaled_voltage[fi.opamp_voltage_size - 1 - i][1] = N31*(fi.opamp_voltage[i][0] - vmin); } // Clamp x to 16 bits (rounding may cause overflow). if (scaled_voltage[fi.opamp_voltage_size - 1][0] >= (1 << 16)) { // The last point is repeated. scaled_voltage[fi.opamp_voltage_size - 1][0] = scaled_voltage[fi.opamp_voltage_size - 2][0] = (1 << 16) - 1; } interpolate(scaled_voltage, scaled_voltage + fi.opamp_voltage_size - 1, PointPlotter(voltages), 1.0); // Store both fn and dfn in the same table. mf.ak = (int)scaled_voltage[0][0]; mf.bk = (int)scaled_voltage[fi.opamp_voltage_size - 1][0]; int j; for (j = 0; j < mf.ak; j++) { opamp[j].vx = 0; opamp[j].dvx = 0; } unsigned int f = voltages[j]; for (; j <= mf.bk; j++) { unsigned int fp = f; f = voltages[j]; // Scaled by m*2^31 // m*2^31*dy/1 = (m*2^31*dy)/(m*2^16*dx) = 2^15*dy/dx int df = f - fp; // Scaled by 2^15 // 16 bits unsigned: m*2^16*(fn - xmin) opamp[j].vx = f > (0xffff << 15) ? 0xffff : f >> 15; // 16 bits (15 bits + sign bit): 2^11*dfn opamp[j].dvx = df >> (15 - 11); } for (; j < (1 << 16); j++) { opamp[j].vx = 0; opamp[j].dvx = 0; } // Create lookup tables for gains / summers. // 4 bit "resistor" ladders in the bandpass resonance gain and the audio // output gain necessitate 16 gain tables. // From die photographs of the bandpass and volume "resistor" ladders // it follows that gain ~ vol/8 and 1/Q ~ ~res/8 (assuming ideal // op-amps and ideal "resistors"). for (int n8 = 0; n8 < 16; n8++) { int n = n8 << 4; // Scaled by 2^7 int x = mf.ak; for (int vi = 0; vi < (1 << 16); vi++) { mf.gain[n8][vi] = solve_gain(opamp, n, vi, x, mf); } } // The filter summer operates at n ~ 1, and has 5 fundamentally different // input configurations (2 - 6 input "resistors"). // // Note that all "on" transistors are modeled as one. This is not // entirely accurate, since the input for each transistor is different, // and transistors are not linear components. However modeling all // transistors separately would be extremely costly. int offset = 0; int size; for (int k = 0; k < 5; k++) { int idiv = 2 + k; // 2 - 6 input "resistors". int n_idiv = idiv << 7; // n*idiv, scaled by 2^7 size = idiv << 16; int x = mf.ak; for (int vi = 0; vi < size; vi++) { mf.summer[offset + vi] = solve_gain(opamp, n_idiv, vi/idiv, x, mf); } offset += size; } // The audio mixer operates at n ~ 8/6, and has 8 fundamentally different // input configurations (0 - 7 input "resistors"). // // All "on", transistors are modeled as one - see comments above for // the filter summer. offset = 0; size = 1; // Only one lookup element for 0 input "resistors". for (int l = 0; l < 8; l++) { int idiv = l; // 0 - 7 input "resistors". int n_idiv = (idiv << 7)*8/6; // n*idiv, scaled by 2^7 if (idiv == 0) { // Avoid division by zero; the result will be correct since // n_idiv = 0. idiv = 1; } int x = mf.ak; for (int vi = 0; vi < size; vi++) { mf.mixer[offset + vi] = solve_gain(opamp, n_idiv, vi/idiv, x, mf); } offset += size; size = (l + 1) << 16; } // Create lookup table mapping capacitor voltage to op-amp input voltage: // vc -> vx for (int m = 0; m < (1 << 16); m++) { mf.opamp_rev[m] = opamp[m].vx; } mf.vc_max = (int)(N30*(fi.opamp_voltage[0][1] - fi.opamp_voltage[0][0])); mf.vc_min = (int)(N30*(fi.opamp_voltage[fi.opamp_voltage_size - 1][1] - fi.opamp_voltage[fi.opamp_voltage_size - 1][0])); // DAC table. int bits = 11; build_dac_table(mf.f0_dac, bits, fi.dac_2R_div_R, fi.dac_term); for (int n = 0; n < (1 << bits); n++) { mf.f0_dac[n] = (unsigned short)(N16*(fi.dac_zero + mf.f0_dac[n]*fi.dac_scale/(1 << bits) - vmin) + 0.5); } } // Free temporary tables. delete[] voltages; delete[] opamp; // VCR - 6581 only. model_filter_init_t& fi = model_filter_init[0]; double N16 = model_filter[0].vo_N16; double vmin = N16*fi.opamp_voltage[0][0]; double k = fi.k; double kVddt = N16*(k*(fi.Vdd - fi.Vth)); for (int i = 0; i < (1 << 16); i++) { // The table index is right-shifted 16 times in order to fit in // 16 bits; the argument to sqrt is thus multiplied by (1 << 16). // // The returned value must be corrected for translation. Vg always // takes part in a subtraction as follows: // // k*Vg - Vx = (k*Vg - t) - (Vx - t) // // I.e. k*Vg - t must be returned. double Vg = kVddt - sqrt((double)i*(1 << 16)); vcr_kVg[i] = (unsigned short)(k*Vg - vmin + 0.5); } /* EKV model: Ids = Is*(if - ir) Is = 2*u*Cox*Ut^2/k*W/L if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) */ double kVt = fi.k*fi.Vth; double Ut = fi.Ut; double Is = 2*fi.uCox*Ut*Ut/fi.k*fi.WL_vcr; // Normalized current factor for 1 cycle at 1MHz. double N15 = N16/2; double n_Is = N15*1.0e-6/fi.C*Is; // kVg_Vx = k*Vg - Vx // I.e. if k != 1.0, Vg must be scaled accordingly. for (int kVg_Vx = 0; kVg_Vx < (1 << 16); kVg_Vx++) { double log_term = log1p(exp((kVg_Vx/N16 - kVt)/(2*Ut))); // Scaled by m*2^15 vcr_n_Ids_term[kVg_Vx] = (unsigned short)(n_Is*log_term*log_term); } class_init = true; } enable_filter(true); set_chip_model(MOS6581); set_voice_mask(0x07); input(0); reset(); } // ---------------------------------------------------------------------------- // Enable filter. // ---------------------------------------------------------------------------- void Filter::enable_filter(bool enable) { enabled = enable; set_sum_mix(); } // ---------------------------------------------------------------------------- // Adjust the DAC bias parameter of the filter. // This gives user variable control of the exact CF -> center frequency // mapping used by the filter. // The setting is currently only effective for 6581. // ---------------------------------------------------------------------------- void Filter::adjust_filter_bias(double dac_bias) { Vw_bias = int(dac_bias*model_filter[sid_model].vo_N16); set_w0(); } // ---------------------------------------------------------------------------- // Set chip model. // ---------------------------------------------------------------------------- void Filter::set_chip_model(chip_model model) { sid_model = model; /* We initialize the state variables again just to make sure that * the earlier model didn't leave behind some foreign, unrecoverable * state. Hopefully set_chip_model() only occurs simultaneously with * reset(). */ Vhp = 0; Vbp = Vbp_x = Vbp_vc = 0; Vlp = Vlp_x = Vlp_vc = 0; } // ---------------------------------------------------------------------------- // Mask for voices routed into the filter / audio output stage. // Used to physically connect/disconnect EXT IN, and for test purposes // (voice muting). // ---------------------------------------------------------------------------- void Filter::set_voice_mask(reg4 mask) { voice_mask = 0xf0 | (mask & 0x0f); set_sum_mix(); } // ---------------------------------------------------------------------------- // SID reset. // ---------------------------------------------------------------------------- void Filter::reset() { fc = 0; res = 0; filt = 0; mode = 0; vol = 0; Vhp = 0; Vbp = Vbp_x = Vbp_vc = 0; Vlp = Vlp_x = Vlp_vc = 0; set_w0(); set_Q(); set_sum_mix(); } // ---------------------------------------------------------------------------- // Register functions. // ---------------------------------------------------------------------------- void Filter::writeFC_LO(reg8 fc_lo) { fc = (fc & 0x7f8) | (fc_lo & 0x007); set_w0(); } void Filter::writeFC_HI(reg8 fc_hi) { fc = ((fc_hi << 3) & 0x7f8) | (fc & 0x007); set_w0(); } void Filter::writeRES_FILT(reg8 res_filt) { res = (res_filt >> 4) & 0x0f; set_Q(); filt = res_filt & 0x0f; set_sum_mix(); } void Filter::writeMODE_VOL(reg8 mode_vol) { mode = mode_vol & 0xf0; set_sum_mix(); vol = mode_vol & 0x0f; } // Set filter cutoff frequency. void Filter::set_w0() { model_filter_t& f = model_filter[sid_model]; int Vw = Vw_bias + f.f0_dac[fc]; Vddt_Vw_2 = unsigned(f.kVddt - Vw)*unsigned(f.kVddt - Vw) >> 1; // FIXME: w0 is temporarily used for MOS 8580 emulation. // MOS 8580 cutoff: 0 - 12.5kHz. // Multiply with 1.048576 to facilitate division by 1 000 000 by right- // shifting 20 times (2 ^ 20 = 1048576). // 1.048576*2*pi*12500 = 82355 w0 = 82355*(fc + 1) >> 11; } /* Set filter resonance. In the MOS 6581, 1/Q is controlled linearly by res. From die photographs of the resonance "resistor" ladder it follows that 1/Q ~ ~res/8 (assuming an ideal op-amp and ideal "resistors"). This implies that Q ranges from 0.533 (res = 0) to 8 (res = E). For res = F, Q is actually theoretically unlimited, which is quite unheard of in a filter circuit. To obtain Q ~ 1/sqrt(2) = 0.707 for maximally flat frequency response, res should be set to 4: Q = 8/~4 = 8/11 = 0.7272 (again assuming an ideal op-amp and ideal "resistors"). Q as low as 0.707 is not achievable because of low gain op-amps; res = 0 should yield the flattest possible frequency response at Q ~ 0.8 - 1.0 in the op-amp's pseudo-linear range (high amplitude signals will be clipped). As resonance is increased, the filter must be clocked more often to keep it stable. In the MOS 8580, the resonance "resistor" ladder above the bp feedback op-amp is split in two parts; one ladder for the op-amp input and one ladder for the op-amp feedback. input: feedback: Rf Ri R4 RC R8 R3 R2 R1 The "resistors" are switched in as follows by bits in register $17: feedback: R1: bit4&!bit5 R2: !bit4&bit5 R3: bit4&bit5 Rf: always on input: R4: bit6&!bit7 R8: !bit6&bit7 RC: bit6&bit7 Ri: !(R4|R8|RC) = !(bit6|bit7) = !bit6&!bit7 The relative "resistor" values are approximately (using channel length): R1 = 15.3*Ri R2 = 7.3*Ri R3 = 4.7*Ri Rf = 1.4*Ri R4 = 1.4*Ri R8 = 2.0*Ri RC = 2.8*Ri Approximate values for 1/Q can now be found as follows (assuming an ideal op-amp): res feedback input -gain (1/Q) --- -------- ----- ---------- 0 Rf Ri Rf/Ri = 1/(Ri*(1/Rf)) = 1/0.71 1 Rf|R1 Ri (Rf|R1)/Ri = 1/(Ri*(1/Rf+1/R1)) = 1/0.78 2 Rf|R2 Ri (Rf|R2)/Ri = 1/(Ri*(1/Rf+1/R2)) = 1/0.85 3 Rf|R3 Ri (Rf|R3)/Ri = 1/(Ri*(1/Rf+1/R3)) = 1/0.92 4 Rf R4 Rf/R4 = 1/(R4*(1/Rf)) = 1/1.00 5 Rf|R1 R4 (Rf|R1)/R4 = 1/(R4*(1/Rf+1/R1)) = 1/1.10 6 Rf|R2 R4 (Rf|R2)/R4 = 1/(R4*(1/Rf+1/R2)) = 1/1.20 7 Rf|R3 R4 (Rf|R3)/R4 = 1/(R4*(1/Rf+1/R3)) = 1/1.30 8 Rf R8 Rf/R8 = 1/(R8*(1/Rf)) = 1/1.43 9 Rf|R1 R8 (Rf|R1)/R8 = 1/(R8*(1/Rf+1/R1)) = 1/1.56 A Rf|R2 R8 (Rf|R2)/R8 = 1/(R8*(1/Rf+1/R2)) = 1/1.70 B Rf|R3 R8 (Rf|R3)/R8 = 1/(R8*(1/Rf+1/R3)) = 1/1.86 C Rf RC Rf/RC = 1/(RC*(1/Rf)) = 1/2.00 D Rf|R1 RC (Rf|R1)/RC = 1/(RC*(1/Rf+1/R1)) = 1/2.18 E Rf|R2 RC (Rf|R2)/RC = 1/(RC*(1/Rf+1/R2)) = 1/2.38 F Rf|R3 RC (Rf|R3)/RC = 1/(RC*(1/Rf+1/R3)) = 1/2.60 These data indicate that the following function for 1/Q has been modeled in the MOS 8580: 1/Q = 2^(1/2)*2^(-x/8) = 2^(1/2 - x/8) = 2^((4 - x)/8) */ void Filter::set_Q() { // Cutoff for MOS 6581. // The coefficient 8 is dispensed of later by right-shifting 3 times // (2 ^ 3 = 8). _8_div_Q = ~res & 0x0f; // FIXME: Temporary cutoff code for MOS 8580. // 1024*1/Q = 1024*2^((4 - res)/8) // The coefficient 1024 is dispensed of later by right-shifting 10 times // (2 ^ 10 = 1024). static const int _1024_div_Q_table[] = { 1448, 1328, 1218, 1117, 1024, 939, 861, 790, 724, 664, 609, 558, 512, 470, 431, 395 }; _1024_div_Q = _1024_div_Q_table[res]; } // Set input routing bits. void Filter::set_sum_mix() { // NB! voice3off (mode bit 7) only affects voice 3 if it is routed directly // to the mixer. sum = (enabled ? filt : 0x00) & voice_mask; mix = (enabled ? (mode & 0x70) | ((~(filt | (mode & 0x80) >> 5)) & 0x0f) : 0x0f) & voice_mask; } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580_PST.dat0000644000175100001770000001000014544470311022066 00000000000000 p` pppppxxx||~~?libsidplayfp-2.6.0/src/builders/resid-builder/resid/NEWS0000644000175100001770000003225714544470311020100 00000000000000Changes in reSID version 1.0 ---------------------------- *** NB! This is a pre-release, for testing only. *** This release of reSID brings SID emulation to the next level. The complete known digital state machine is emulated with full cycle accuracy, and the emulation of the SID 6581 filter is, for the first time, getting quite close to a real SID chip. This release would not have been possible without the work of Michael Huth, who has made high quality SID die photographs available, and Tommi Lempinen, who has done impressive work revectorizing and annotating these die photographs. The revectorized die photographs have made it possible to model the SID filter and audio output stage topology at the transistor level. A DAQ has been used to sample the SID capacitor pins in order to work out an op-amp transfer function, and furthermore transistor currents and thus transistor parameters. The revectorized die photographs have also been used to work out correct models for the noise waveform shift register and for the MOS 6581 non-monotonic D/A converters. Honorable mention must also go to Otto Jarvinen, for his important contributions to understanding of the SID chip and thus emulation quality (test bit behavior, waveform 0 behavior), and to Antti Lankila, for tirelessly working to improve SID emulation. The improvements to emulation are summarized as follows: * Data bus - MOS 8580 one-cycle pipeline write delay * Waveform generator - Shift register - corrected output and feedback topology - effects of the test bit - two-cycle pipeline delay (only for single-cycle clocking) - writes by combined waveforms - Pulse waveform one-cycle pipeline delay (only for single-cycle clocking) - Emulation of floating waveform DAC input for waveform 0 - Accurate model of non-monotonic MOS 6581 D/A converter * Envelope generator - Exponential frequency divider one-cycle pipeline delay (only for single-cycle clocking) - Accurate model of non-monotonic MOS 6581 D/A converter * Filter and audio output stage - Accurate model of complete topology for the MOS 6581 - Accurate model of the MOS 6581 op-amps - Accurate model of gain/summer op-amp transistor inputs and feedbacks - Accurate model of integrator op-amp VCR inputs - Accurate model of non-monotonic MOS 6581 D/A converter * External filter - Improved resolution Some other improvements are: * The SID interface is enclosed in the namespace "reSID" to avoid name clashes with other libraries. * Architecture specific optimizations, including vectorization, are available via the default configure option --enable-arch=native. * Branch prediction hints are included via the default configure option --enable-branch-hints. * Fixed a bug in resampling FIR table wraparound, courtesy of Antti Lankila. * Novel near branch-free calculation of waveform outputs, inspired by Antti Lankilas resid-fp fork. * Voice muting is available for test purposes. Enjoy! Dag Lem Changes in reSID version 0.16 ----------------------------- An off-by-one error in the emulation of the ADSR delay bug has been fixed in the fast version of the envelope clocking. An initialization bug in the Filter class which caused floating point exceptions on some platforms has been fixed. Missing fields have been added to SID::State for correct snapshots. By building shifted FIR tables with samples according to the sampling frequency, the resampling code dramatically reduces the computational effort in the filter convolutions, without any loss of accuracy. The filter convolutions are now also vectorizable on current hardware. The implementation builds on ideas by Laurent Ganier. The resampling code has been split into two functions, one using interpolation and a small set of shifted filter tables, and one using direct lookup and a large set of shifted filter tables. The accuracy is the same, the difference is that the direct lookup runs has the potential of running at almost twice the speed (depending on cache size and memory bandwidth) using approximately 16MB more memory. It is now possible to run high quality resampling in real time on quite modest hardware, provided that a vectorizing compiler is used. Changes in reSID version 0.15 ----------------------------- An error in the emulation of the ADSR delay bug has been fixed. When emulation of the ADSR delay bug was introduced in reSID 0.2, the delay was one cycle too long. One cycle was subtracted from the delay in reSID 0.4, however unfortunately one rate counter period was added as well, thus increasing the error. At the time there was no method to fully synchronize the CPU with envelope 3, so the measurements relied on averaging. Because of pipelining in the envelope logic the effects of a write are delayed, and this caused the test code to miss the target by exactly one rate counter period on a real SID. The current test code does achieve full synchronization with envelope 3, so this time the delay should be 100% correct. There are still side effects caused by pipelining which are not implemented in reSID, however these effects are not controllable without full synchronization with the envelope, something which is hard to achieve with envelope 3, and impossible with envelope 1 and 2. The envelope state (ADSR) has been added to the SID state, and the volume setting is now restored from the SID state. Filter scaling and clipping has been added to avoid sample overflows in the resampling filter. Changes in reSID version 0.14 ----------------------------- The SID external audio input is now emulated. This can be used e.g. to simulate the hack of connecting a resistor from EXT IN to GND to boost the sample volume on the MOS8580. Calling sid.input(-32768) makes the MOS8580 sound more or less like the MOS6581 with respect to samples. The interface could also be used to mix in an external audio signal, but note that to do this correctly you should really resample the audio signal to 1MHz first. The filter settings are now updated immediately when the chip model is changed. Earlier the filter cutoff frequency would not change until the FC registers were updated. A one cycle error in the fast version of the envelope clocking has been fixed. This bug was introduced in reSID 0.13 and could affect the ADSR delay emulation. The exponential counter period is now only loaded at the envelope counter values 255, 93, 54, 26, 14, 6, 0. The period can be different for the same envelope counter value, depending on whether the envelope has been rising (attack -> release) or sinking (decay/release). A bug in the fast version of the noise register shift routine has been corrected. This bug caused too low noise frequency in some cases. The filter cutoff frequency is limited to 16kHz to keep the filter stable. Changes in reSID version 0.13 ----------------------------- The internal DC levels of the MOS6581 have been double checked and corrected. The reason for the asymmetric scaling of the voice output has been found; there is a DC offset from the waveform D/A converter in addition to the DC offset from the envelope multiplying D/A converter. No selected waveform (N=P=S=T=0) yields minimum wave output level again. A bug in the fast version of the envelope clocking has been corrected. This bug could incorrectly invoke the ADSR delay emulation. Changes in reSID version 0.12 ----------------------------- A bug causing incorrect sample spacing in the new SAMPLE_FAST sample calculation has been corrected. Audio clipping has been added to guard against sample overflows. To support multi-channel sampling, sample interleaving has been added to the clock() interface. To support synchronization with an external timer, an interface for sample rate adjustment has been added. The internal DC levels have been corrected. No selected waveform (N=P=S=T=0) yields maximum wave output level. Furthermore, each voice in the MOS6581 independently contributes to the DC level in the mixer, and the mixer itself has a small DC offset as well. The MOS8580 has no DC offsets. The spline interpolation routine has been generalized to accept repeated points to introduce points of non-differentiability and discontinuity. A separate mapping from the FC registers to filter cutoff frequency has been included for the MOS8580, and the mapping for the MOS6581 has been refined. Changes in reSID version 0.11 ----------------------------- A new clock() interface has been added. This function generates audio samples into a buffer, greatly simplifying the task of writing driver code for reSID. It also facilitates more advanced audio sample generation, as described below. Three clocking methods are available: clocking at output sample frequency, clocking at cycle frequency with linear sample interpolation, and clocking at cycle frequency with audio resampling. Clocking at output sample frequency is fast, and yields acceptable sound quality, except for the SID combined waveforms, which have a very high frequency content. Clocking at cycle frequency with linear sample interpolation is approximately five to ten times slower at 44.1kHz sampling frequency, but the sound quality is improved because of the linear sample interpolation, and because some sampling noise is removed by the SID external filter, which attenuates signals above 16kHz. Finally, clocking at cycle frequency with audio resampling has a work rate which is independent of the sampling frequency; it is rather inversely proportional to the percentage of the bandwidth allocated to the filter transition band. This implies that e.g. with the transition band starting at ~ 20kHz, it is faster to generate 48kHz than 44.1kHz samples. Audio resampling is the theoretically correct method for sample generation, and delivers SID sound quality previously unheard of. This should make connoisseurs nod in appreciation, and for some time to come it could possibly also make people tear their hair over having to buy state of the art hardware to handle the obscene workload in real time. By trading off passband bandwidth for speed, real time processing is possible on current hardware. A 60% passband bandwidth is within the reach of reasonably fast machines, while maximum sound quality at 90% passband bandwidth, requiring four times the processing power, is not. Yet. Changes in reSID version 0.10 ----------------------------- Libtool is now used to build the library. To keep the filters stable it is necessary to clock them at above sample rate. The chip clocking code has been modified to only "overclock" the filters, not the whole chip. This yields a considerable speedup without noticeably lowering sound quality. Note that this is aimed at slow hardware, if possible the 1 cycle clock interface should be used to eliminate sampling noise. Changes in reSID version 0.9 ---------------------------- The sum of the filter outputs is no longer weighted. Changes in reSID version 0.8 ---------------------------- voice3off has no effect if voice 3 is routed through the filter. Changes in reSID version 0.7 ---------------------------- The audio output filter in the C64, external to the SID chip, has been modeled. The mapping function between the FC register and filter cutoff frequency can now be specified with spline interpolation points. This facilitates interactive modification of the mapping function by graphical presentation of the interpolation curve. The implementation of this novel spline design is fast and general purpose, and should be well suited for use in other projects as well. Filtered output has been inverted compared to unfiltered output. Aging of the bus value obtained when reading write only registers has been partly implemented. To facilitate offline storage the complete state of SID can be read and written. Changes in reSID version 0.6 ---------------------------- A special case in synchronization has been implemented. The Autoconf script is cleaned up to allow compilation in a separate directory. Changes in reSID version 0.5 ---------------------------- Emulation of MOS8580 combined waveforms. Version string resid_version_string provided for e.g. Autoconf tests. The string has C linkage. Changes in reSID version 0.4 ---------------------------- The implementation of the ADSR delay bug has been refined and should now be cycle exact. The patch for VICE has been removed since VICE 0.15 will include reSID support. Changes in reSID version 0.3 ---------------------------- The reSID library has changed name from libmos6581.a to libresid.a The pulse+sawtooth combined waveform has been corrected. Pulse+test bit samples are implemented. The envelope rate periods have finally been exactly determined. A new SID bug, the ADSR boundary bug, has been discovered and implemented. This bug makes it possible to step from envelope level 0x00 to 0xff or from 0xff to 0x00 in one step. One-cycle optimized overloads of the clock() functions have been implemented to facilitate sampling at 1MHz. The code has been further optimized for speed. Changes in reSID version 0.2 ---------------------------- The implementation of the Envelope Generator has been rewritten to handle the infamous ADSR delay bug. All known envelope related bugs have been corrected. The maximum filter resonance is lowered to keep the filter stable. The reSID API has been simplified. Reading write only registers is allowed. libsidplayfp-2.6.0/src/builders/resid-builder/resid/spline.h0000644000175100001770000002132714544470311021040 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #ifndef RESID_SPLINE_H #define RESID_SPLINE_H namespace reSID { // Our objective is to construct a smooth interpolating single-valued function // y = f(x). // // Catmull-Rom splines are widely used for interpolation, however these are // parametric curves [x(t) y(t) ...] and can not be used to directly calculate // y = f(x). // For a discussion of Catmull-Rom splines see Catmull, E., and R. Rom, // "A Class of Local Interpolating Splines", Computer Aided Geometric Design. // // Natural cubic splines are single-valued functions, and have been used in // several applications e.g. to specify gamma curves for image display. // These splines do not afford local control, and a set of linear equations // including all interpolation points must be solved before any point on the // curve can be calculated. The lack of local control makes the splines // more difficult to handle than e.g. Catmull-Rom splines, and real-time // interpolation of a stream of data points is not possible. // For a discussion of natural cubic splines, see e.g. Kreyszig, E., "Advanced // Engineering Mathematics". // // Our approach is to approximate the properties of Catmull-Rom splines for // piecewice cubic polynomials f(x) = ax^3 + bx^2 + cx + d as follows: // Each curve segment is specified by four interpolation points, // p0, p1, p2, p3. // The curve between p1 and p2 must interpolate both p1 and p2, and in addition // f'(p1.x) = k1 = (p2.y - p0.y)/(p2.x - p0.x) and // f'(p2.x) = k2 = (p3.y - p1.y)/(p3.x - p1.x). // // The constraints are expressed by the following system of linear equations // // [ 1 xi xi^2 xi^3 ] [ d ] [ yi ] // [ 1 2*xi 3*xi^2 ] * [ c ] = [ ki ] // [ 1 xj xj^2 xj^3 ] [ b ] [ yj ] // [ 1 2*xj 3*xj^2 ] [ a ] [ kj ] // // Solving using Gaussian elimination and back substitution, setting // dy = yj - yi, dx = xj - xi, we get // // a = ((ki + kj) - 2*dy/dx)/(dx*dx); // b = ((kj - ki)/dx - 3*(xi + xj)*a)/2; // c = ki - (3*xi*a + 2*b)*xi; // d = yi - ((xi*a + b)*xi + c)*xi; // // Having calculated the coefficients of the cubic polynomial we have the // choice of evaluation by brute force // // for (x = x1; x <= x2; x += res) { // y = ((a*x + b)*x + c)*x + d; // plot(x, y); // } // // or by forward differencing // // y = ((a*x1 + b)*x1 + c)*x1 + d; // dy = (3*a*(x1 + res) + 2*b)*x1*res + ((a*res + b)*res + c)*res; // d2y = (6*a*(x1 + res) + 2*b)*res*res; // d3y = 6*a*res*res*res; // // for (x = x1; x <= x2; x += res) { // plot(x, y); // y += dy; dy += d2y; d2y += d3y; // } // // See Foley, Van Dam, Feiner, Hughes, "Computer Graphics, Principles and // Practice" for a discussion of forward differencing. // // If we have a set of interpolation points p0, ..., pn, we may specify // curve segments between p0 and p1, and between pn-1 and pn by using the // following constraints: // f''(p0.x) = 0 and // f''(pn.x) = 0. // // Substituting the results for a and b in // // 2*b + 6*a*xi = 0 // // we get // // ki = (3*dy/dx - kj)/2; // // or by substituting the results for a and b in // // 2*b + 6*a*xj = 0 // // we get // // kj = (3*dy/dx - ki)/2; // // Finally, if we have only two interpolation points, the cubic polynomial // will degenerate to a straight line if we set // // ki = kj = dy/dx; // #if SPLINE_BRUTE_FORCE #define interpolate_segment interpolate_brute_force #else #define interpolate_segment interpolate_forward_difference #endif // ---------------------------------------------------------------------------- // Calculation of coefficients. // ---------------------------------------------------------------------------- inline void cubic_coefficients(double x1, double y1, double x2, double y2, double k1, double k2, double& a, double& b, double& c, double& d) { double dx = x2 - x1, dy = y2 - y1; a = ((k1 + k2) - 2*dy/dx)/(dx*dx); b = ((k2 - k1)/dx - 3*(x1 + x2)*a)/2; c = k1 - (3*x1*a + 2*b)*x1; d = y1 - ((x1*a + b)*x1 + c)*x1; } // ---------------------------------------------------------------------------- // Evaluation of cubic polynomial by brute force. // ---------------------------------------------------------------------------- template inline void interpolate_brute_force(double x1, double y1, double x2, double y2, double k1, double k2, PointPlotter plot, double res) { double a, b, c, d; cubic_coefficients(x1, y1, x2, y2, k1, k2, a, b, c, d); // Calculate each point. for (double x = x1; x <= x2; x += res) { double y = ((a*x + b)*x + c)*x + d; plot(x, y); } } // ---------------------------------------------------------------------------- // Evaluation of cubic polynomial by forward differencing. // ---------------------------------------------------------------------------- template inline void interpolate_forward_difference(double x1, double y1, double x2, double y2, double k1, double k2, PointPlotter plot, double res) { double a, b, c, d; cubic_coefficients(x1, y1, x2, y2, k1, k2, a, b, c, d); double y = ((a*x1 + b)*x1 + c)*x1 + d; double dy = (3*a*(x1 + res) + 2*b)*x1*res + ((a*res + b)*res + c)*res; double d2y = (6*a*(x1 + res) + 2*b)*res*res; double d3y = 6*a*res*res*res; // Calculate each point. for (double x = x1; x <= x2; x += res) { plot(x, y); y += dy; dy += d2y; d2y += d3y; } } template inline double x(PointIter p) { return (*p)[0]; } template inline double y(PointIter p) { return (*p)[1]; } // ---------------------------------------------------------------------------- // Evaluation of complete interpolating function. // Note that since each curve segment is controlled by four points, the // end points will not be interpolated. If extra control points are not // desirable, the end points can simply be repeated to ensure interpolation. // Note also that points of non-differentiability and discontinuity can be // introduced by repeating points. // ---------------------------------------------------------------------------- template inline void interpolate(PointIter p0, PointIter pn, PointPlotter plot, double res) { double k1, k2; // Set up points for first curve segment. PointIter p1 = p0; ++p1; PointIter p2 = p1; ++p2; PointIter p3 = p2; ++p3; // Draw each curve segment. for (; p2 != pn; ++p0, ++p1, ++p2, ++p3) { // p1 and p2 equal; single point. if (x(p1) == x(p2)) { continue; } // Both end points repeated; straight line. if (x(p0) == x(p1) && x(p2) == x(p3)) { k1 = k2 = (y(p2) - y(p1))/(x(p2) - x(p1)); } // p0 and p1 equal; use f''(x1) = 0. else if (x(p0) == x(p1)) { k2 = (y(p3) - y(p1))/(x(p3) - x(p1)); k1 = (3*(y(p2) - y(p1))/(x(p2) - x(p1)) - k2)/2; } // p2 and p3 equal; use f''(x2) = 0. else if (x(p2) == x(p3)) { k1 = (y(p2) - y(p0))/(x(p2) - x(p0)); k2 = (3*(y(p2) - y(p1))/(x(p2) - x(p1)) - k1)/2; } // Normal curve. else { k1 = (y(p2) - y(p0))/(x(p2) - x(p0)); k2 = (y(p3) - y(p1))/(x(p3) - x(p1)); } interpolate_segment(x(p1), y(p1), x(p2), y(p2), k1, k2, plot, res); } } // ---------------------------------------------------------------------------- // Class for plotting integers into an array. // ---------------------------------------------------------------------------- template class PointPlotter { protected: F* f; public: PointPlotter(F* arr) : f(arr) { } void operator ()(double x, double y) { // Clamp negative values to zero. if (y < 0) { y = 0; } f[int(x)] = F(y + 0.5); } }; } // namespace reSID #endif // not RESID_SPLINE_H libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave6581_P_T.h0000644000175100001770000010775614544470322021613 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- { /* 0x000: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x008: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x010: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x018: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x020: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x028: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x030: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x038: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x040: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x048: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x050: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x058: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x060: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x068: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x070: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x078: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x080: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x088: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x090: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x098: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x0f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x100: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x108: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x110: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x118: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x120: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x128: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x130: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x138: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x140: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x148: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x150: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x158: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x160: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x168: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x170: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x178: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x180: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x188: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x190: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x198: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x1f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x200, 0x380, 0x3f0, /* 0x200: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x208: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x210: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x218: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x220: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x228: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x230: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x238: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x240: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x248: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x250: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x258: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x260: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x268: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x270: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x278: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x280: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x288: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x290: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x298: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x2f8: */ 0x000, 0x000, 0x000, 0x400, 0x000, 0x400, 0x400, 0x5f0, /* 0x300: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x308: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x310: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x318: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x320: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x328: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x330: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x338: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x340: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x348: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x350: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x358: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x360: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x368: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, /* 0x370: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, /* 0x378: */ 0x000, 0x000, 0x000, 0x600, 0x000, 0x600, 0x600, 0x6f0, /* 0x380: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x388: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x390: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x398: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, /* 0x3a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x600, /* 0x3b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x600, /* 0x3b8: */ 0x000, 0x000, 0x000, 0x600, 0x000, 0x600, 0x700, 0x770, /* 0x3c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x3c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x600, /* 0x3d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x600, /* 0x3d8: */ 0x000, 0x000, 0x000, 0x700, 0x400, 0x700, 0x700, 0x7b0, /* 0x3e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x400, 0x700, /* 0x3e8: */ 0x000, 0x400, 0x400, 0x700, 0x600, 0x700, 0x780, 0x7d0, /* 0x3f0: */ 0x000, 0x400, 0x600, 0x780, 0x600, 0x780, 0x780, 0x7e0, /* 0x3f8: */ 0x700, 0x7c0, 0x7c0, 0x7f0, 0x7e0, 0x7f0, 0x7f0, 0x7f0, /* 0x400: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x408: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x410: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x418: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x420: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x428: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x430: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x438: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x440: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x448: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x450: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x458: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x460: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x468: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x470: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x478: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x480: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x488: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x490: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x498: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x4c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x4e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x4e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x4f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x4f8: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0x9f0, /* 0x500: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x508: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x510: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x518: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x520: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x528: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x530: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x538: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x540: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x548: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x550: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x558: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x560: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x568: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x570: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x578: */ 0x000, 0x800, 0x800, 0x800, 0x800, 0xa00, 0xa00, 0xaf0, /* 0x580: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x588: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x590: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x598: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x5a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x5a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, /* 0x5b0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xa00, /* 0x5b8: */ 0x000, 0x800, 0x800, 0xa00, 0x800, 0xa00, 0xb00, 0xb70, /* 0x5c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x5c8: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xa00, /* 0x5d0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xa00, /* 0x5d8: */ 0x000, 0x800, 0x800, 0xa00, 0x800, 0xb00, 0xb00, 0xbb0, /* 0x5e0: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0xb00, /* 0x5e8: */ 0x800, 0x800, 0x800, 0xb00, 0x800, 0xb00, 0xb80, 0xbd0, /* 0x5f0: */ 0x800, 0x800, 0x800, 0xb80, 0xa00, 0xb80, 0xb80, 0xbe0, /* 0x5f8: */ 0xa00, 0xb80, 0xbc0, 0xbf0, 0xbe0, 0xbf0, 0xbf0, 0xbf0, /* 0x600: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x608: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x610: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x618: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x620: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x628: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x630: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x638: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0xc00, /* 0x640: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x648: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x650: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x658: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, 0x800, 0xc00, /* 0x660: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x668: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xc00, /* 0x670: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xc00, /* 0x678: */ 0x000, 0x800, 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xcf0, /* 0x680: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x688: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x690: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x698: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xc00, /* 0x6a0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x6a8: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xc00, /* 0x6b0: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0xc00, 0xc00, /* 0x6b8: */ 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xd00, 0xd70, /* 0x6c0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x6c8: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0xc00, 0xc00, /* 0x6d0: */ 0x000, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xc00, /* 0x6d8: */ 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xd00, 0xd00, 0xdb0, /* 0x6e0: */ 0x000, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xd00, /* 0x6e8: */ 0x800, 0xc00, 0xc00, 0xd00, 0xc00, 0xd00, 0xd80, 0xdd0, /* 0x6f0: */ 0xc00, 0xc00, 0xc00, 0xd00, 0xc00, 0xd80, 0xd80, 0xde0, /* 0x6f8: */ 0xc00, 0xd80, 0xdc0, 0xdf0, 0xdc0, 0xdf0, 0xdf0, 0xdf0, /* 0x700: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x708: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x710: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x718: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0xc00, 0xc00, 0xe00, /* 0x720: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x800, /* 0x728: */ 0x000, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xe00, /* 0x730: */ 0x000, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xe00, /* 0x738: */ 0x800, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xe70, /* 0x740: */ 0x000, 0x000, 0x000, 0x800, 0x000, 0x800, 0x800, 0xc00, /* 0x748: */ 0x000, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xe00, /* 0x750: */ 0x000, 0x800, 0x800, 0xc00, 0x800, 0xc00, 0xc00, 0xe00, /* 0x758: */ 0xc00, 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, 0xeb0, /* 0x760: */ 0x800, 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, /* 0x768: */ 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xed0, /* 0x770: */ 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, 0xe80, 0xe80, 0xee0, /* 0x778: */ 0xe00, 0xe80, 0xec0, 0xef0, 0xec0, 0xef0, 0xef0, 0xef0, /* 0x780: */ 0x000, 0x000, 0x000, 0x800, 0x800, 0x800, 0x800, 0xc00, /* 0x788: */ 0x800, 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0xf00, /* 0x790: */ 0x800, 0xc00, 0xc00, 0xc00, 0xc00, 0xe00, 0xe00, 0xf00, /* 0x798: */ 0xc00, 0xe00, 0xe00, 0xf00, 0xe00, 0xf00, 0xf00, 0xf30, /* 0x7a0: */ 0x800, 0xc00, 0xc00, 0xe00, 0xc00, 0xe00, 0xe00, 0xf00, /* 0x7a8: */ 0xc00, 0xe00, 0xe00, 0xf00, 0xe00, 0xf00, 0xf00, 0xf50, /* 0x7b0: */ 0xe00, 0xe00, 0xe00, 0xf00, 0xf00, 0xf00, 0xf00, 0xf60, /* 0x7b8: */ 0xf00, 0xf00, 0xf40, 0xf70, 0xf40, 0xf70, 0xf70, 0xf70, /* 0x7c0: */ 0xc00, 0xc00, 0xc00, 0xe00, 0xe00, 0xe00, 0xe00, 0xf00, /* 0x7c8: */ 0xe00, 0xe00, 0xe00, 0xf80, 0xf00, 0xf80, 0xf80, 0xf90, /* 0x7d0: */ 0xe00, 0xf00, 0xf00, 0xf80, 0xf00, 0xf80, 0xf80, 0xfa0, /* 0x7d8: */ 0xf00, 0xf80, 0xf80, 0xfb0, 0xf80, 0xfb0, 0xfb0, 0xfb0, /* 0x7e0: */ 0xe00, 0xf00, 0xf00, 0xf80, 0xf00, 0xf80, 0xfc0, 0xfc0, /* 0x7e8: */ 0xf80, 0xfc0, 0xfc0, 0xfd0, 0xfc0, 0xfd0, 0xfd0, 0xfd0, /* 0x7f0: */ 0xf80, 0xfc0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, /* 0x7f8: */ 0xfe0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, /* 0x800: */ 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xff0, 0xfe0, /* 0x808: */ 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfe0, 0xfc0, 0xf80, /* 0x810: */ 0xfd0, 0xfd0, 0xfd0, 0xfc0, 0xfd0, 0xfc0, 0xfc0, 0xf80, /* 0x818: */ 0xfc0, 0xfc0, 0xfc0, 0xf00, 0xf80, 0xf00, 0xf00, 0xe00, /* 0x820: */ 0xfb0, 0xfb0, 0xfb0, 0xf80, 0xfb0, 0xf80, 0xf80, 0xf00, /* 0x828: */ 0xfa0, 0xf80, 0xf80, 0xf00, 0xf80, 0xf00, 0xf00, 0xe00, /* 0x830: */ 0xf90, 0xf80, 0xf80, 0xf00, 0xf80, 0xf00, 0xe00, 0xe00, /* 0x838: */ 0xf00, 0xe00, 0xe00, 0xe00, 0xe00, 0xc00, 0xc00, 0xc00, /* 0x840: */ 0xf70, 0xf70, 0xf70, 0xf40, 0xf70, 0xf40, 0xf00, 0xf00, /* 0x848: */ 0xf60, 0xf00, 0xf00, 0xf00, 0xf00, 0xe00, 0xe00, 0xe00, /* 0x850: */ 0xf50, 0xf00, 0xf00, 0xe00, 0xf00, 0xe00, 0xe00, 0xc00, /* 0x858: */ 0xf00, 0xe00, 0xe00, 0xc00, 0xe00, 0xc00, 0xc00, 0x800, /* 0x860: */ 0xf30, 0xf00, 0xf00, 0xe00, 0xf00, 0xe00, 0xe00, 0xc00, /* 0x868: */ 0xf00, 0xe00, 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, /* 0x870: */ 0xf00, 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, 0x800, /* 0x878: */ 0xc00, 0x800, 0x800, 0x800, 0x800, 0x000, 0x000, 0x000, /* 0x880: */ 0xef0, 0xef0, 0xef0, 0xec0, 0xef0, 0xec0, 0xe80, 0xe00, /* 0x888: */ 0xee0, 0xe80, 0xe80, 0xe00, 0xe00, 0xe00, 0xe00, 0xc00, /* 0x890: */ 0xed0, 0xe80, 0xe00, 0xe00, 0xe00, 0xe00, 0xe00, 0xc00, /* 0x898: */ 0xe00, 0xe00, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, 0x800, /* 0x8a0: */ 0xeb0, 0xe00, 0xe00, 0xe00, 0xe00, 0xc00, 0xc00, 0xc00, /* 0x8a8: */ 0xe00, 0xc00, 0xc00, 0x800, 0xc00, 0x800, 0x800, 0x000, /* 0x8b0: */ 0xe00, 0xc00, 0xc00, 0x800, 0xc00, 0x800, 0x800, 0x000, /* 0x8b8: */ 0xc00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0x8c0: */ 0xe70, 0xe00, 0xe00, 0xc00, 0xe00, 0xc00, 0xc00, 0x800, /* 0x8c8: */ 0xe00, 0xc00, 0xc00, 0x800, 0xc00, 0x800, 0x800, 0x000, /* 0x8d0: */ 0xe00, 0xc00, 0xc00, 0x800, 0xc00, 0x800, 0x800, 0x000, /* 0x8d8: */ 0x800, 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8e0: */ 0xe00, 0xc00, 0xc00, 0x800, 0x800, 0x000, 0x000, 0x000, /* 0x8e8: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f0: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x8f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x900: */ 0xdf0, 0xdf0, 0xdf0, 0xdc0, 0xdf0, 0xdc0, 0xd80, 0xc00, /* 0x908: */ 0xde0, 0xd80, 0xd80, 0xc00, 0xd80, 0xc00, 0xc00, 0xc00, /* 0x910: */ 0xdd0, 0xd80, 0xd00, 0xc00, 0xd00, 0xc00, 0xc00, 0x800, /* 0x918: */ 0xd00, 0xc00, 0xc00, 0x800, 0xc00, 0x800, 0x800, 0x000, /* 0x920: */ 0xdb0, 0xd00, 0xd00, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, /* 0x928: */ 0xc00, 0xc00, 0xc00, 0x800, 0xc00, 0x800, 0x800, 0x000, /* 0x930: */ 0xc00, 0xc00, 0x800, 0x800, 0x800, 0x000, 0x000, 0x000, /* 0x938: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x940: */ 0xd70, 0xd00, 0xc00, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, /* 0x948: */ 0xc00, 0xc00, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0x950: */ 0xc00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0x958: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x960: */ 0xc00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0x968: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x970: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x978: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x980: */ 0xcf0, 0xc00, 0xc00, 0xc00, 0xc00, 0x800, 0x800, 0x000, /* 0x988: */ 0xc00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0x990: */ 0xc00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0x998: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a0: */ 0xc00, 0x800, 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9a8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9b8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c0: */ 0xc00, 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9c8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9d8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9e8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0x9f8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa00: */ 0xbf0, 0xbf0, 0xbf0, 0xbe0, 0xbf0, 0xbc0, 0xbc0, 0xa00, /* 0xa08: */ 0xbe0, 0xbc0, 0xb80, 0xa00, 0xb80, 0xa00, 0x800, 0x800, /* 0xa10: */ 0xbd0, 0xb80, 0xb00, 0x800, 0xb00, 0x800, 0x800, 0x800, /* 0xa18: */ 0xb00, 0x800, 0x800, 0x800, 0x800, 0x000, 0x000, 0x000, /* 0xa20: */ 0xbb0, 0xb00, 0xb00, 0x800, 0xa00, 0x800, 0x800, 0x000, /* 0xa28: */ 0xa00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0xa30: */ 0xa00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0xa38: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa40: */ 0xb70, 0xb00, 0xa00, 0x800, 0xa00, 0x800, 0x800, 0x000, /* 0xa48: */ 0xa00, 0x800, 0x800, 0x000, 0x800, 0x000, 0x000, 0x000, /* 0xa50: */ 0x800, 0x800, 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa60: */ 0x800, 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa80: */ 0xaf0, 0xa00, 0xa00, 0x800, 0x800, 0x800, 0x800, 0x000, /* 0xa88: */ 0x800, 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa90: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xa98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa0: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xab8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac0: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xac8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xad8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xae8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xaf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb00: */ 0x9f0, 0x900, 0x800, 0x800, 0x800, 0x000, 0x000, 0x000, /* 0xb08: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb10: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb20: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb40: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb80: */ 0x800, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xb98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xba8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xbf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc00: */ 0x7f0, 0x7f0, 0x7f0, 0x7e0, 0x7f0, 0x7c0, 0x7c0, 0x700, /* 0xc08: */ 0x7e0, 0x7c0, 0x780, 0x600, 0x780, 0x600, 0x600, 0x000, /* 0xc10: */ 0x7d0, 0x780, 0x780, 0x600, 0x700, 0x400, 0x400, 0x000, /* 0xc18: */ 0x700, 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc20: */ 0x7b0, 0x780, 0x700, 0x400, 0x700, 0x400, 0x000, 0x000, /* 0xc28: */ 0x600, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc30: */ 0x600, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc40: */ 0x770, 0x700, 0x700, 0x000, 0x600, 0x000, 0x000, 0x000, /* 0xc48: */ 0x600, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc50: */ 0x600, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc60: */ 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc80: */ 0x6f0, 0x600, 0x600, 0x000, 0x600, 0x000, 0x000, 0x000, /* 0xc88: */ 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc90: */ 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xc98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xca8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xce8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xcf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd00: */ 0x5f0, 0x580, 0x400, 0x000, 0x400, 0x000, 0x000, 0x000, /* 0xd08: */ 0x400, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xd98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xda8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xde8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xdf8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe00: */ 0x3f0, 0x3c0, 0x300, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xe98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xea8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xeb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xec0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xec8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xed8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xee8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xef8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf00: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf08: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf10: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf18: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf20: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf28: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf30: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf38: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf40: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf48: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf50: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf58: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf60: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf68: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf70: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf78: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf80: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf88: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf90: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xf98: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfa8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfb8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfc0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfc8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfd8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfe0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xfe8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xff0: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, /* 0xff8: */ 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, 0x000, }, libsidplayfp-2.6.0/src/builders/resid-builder/resid/filter8580new.cc0000644000175100001770000006045514544470311022235 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2010 Dag Lem // // 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 // --------------------------------------------------------------------------- #define RESID_FILTER_CC #ifdef _M_ARM #undef _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE #define _ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE 1 #endif #include "filter8580new.h" #include "dac.h" #include "spline.h" #include namespace reSID { // This is the SID 6581 op-amp voltage transfer function, measured on // CAP1B/CAP1A on a chip marked MOS 6581R4AR 0687 14. // All measured chips have op-amps with output voltages (and thus input // voltages) within the range of 0.81V - 10.31V. static double_point opamp_voltage_6581[] = { { 0.81, 10.31 }, // Approximate start of actual range { 0.81, 10.31 }, // Repeated point { 2.40, 10.31 }, { 2.60, 10.30 }, { 2.70, 10.29 }, { 2.80, 10.26 }, { 2.90, 10.17 }, { 3.00, 10.04 }, { 3.10, 9.83 }, { 3.20, 9.58 }, { 3.30, 9.32 }, { 3.50, 8.69 }, { 3.70, 8.00 }, { 4.00, 6.89 }, { 4.40, 5.21 }, { 4.54, 4.54 }, // Working point (vi = vo) { 4.60, 4.19 }, { 4.80, 3.00 }, { 4.90, 2.30 }, // Change of curvature { 4.95, 2.03 }, { 5.00, 1.88 }, { 5.05, 1.77 }, { 5.10, 1.69 }, { 5.20, 1.58 }, { 5.40, 1.44 }, { 5.60, 1.33 }, { 5.80, 1.26 }, { 6.00, 1.21 }, { 6.40, 1.12 }, { 7.00, 1.02 }, { 7.50, 0.97 }, { 8.50, 0.89 }, { 10.00, 0.81 }, { 10.31, 0.81 }, // Approximate end of actual range { 10.31, 0.81 } // Repeated end point }; // This is the SID 8580 op-amp voltage transfer function, measured on // CAP1B/CAP1A on a chip marked CSG 8580R5 1690 25. static double_point opamp_voltage_8580[] = { { 1.30, 8.91 }, // Approximate start of actual range { 1.30, 8.91 }, // Repeated end point { 4.76, 8.91 }, { 4.77, 8.90 }, { 4.78, 8.88 }, { 4.785, 8.86 }, { 4.79, 8.80 }, { 4.795, 8.60 }, { 4.80, 8.25 }, { 4.805, 7.50 }, { 4.81, 6.10 }, { 4.815, 4.05 }, // Change of curvature { 4.82, 2.27 }, { 4.825, 1.65 }, { 4.83, 1.55 }, { 4.84, 1.47 }, { 4.85, 1.43 }, { 4.87, 1.37 }, { 4.90, 1.34 }, { 5.00, 1.30 }, { 5.10, 1.30 }, { 8.91, 1.30 }, // Approximate end of actual range { 8.91, 1.30 } // Repeated end point }; /* * R1 = 15.3*Ri * R2 = 7.3*Ri * R3 = 4.7*Ri * Rf = 1.4*Ri * R4 = 1.4*Ri * R8 = 2.0*Ri * RC = 2.8*Ri * * res feedback input * --- -------- ----- * 0 Rf Ri * 1 Rf|R1 Ri * 2 Rf|R2 Ri * 3 Rf|R3 Ri * 4 Rf R4 * 5 Rf|R1 R4 * 6 Rf|R2 R4 * 7 Rf|R3 R4 * 8 Rf R8 * 9 Rf|R1 R8 * A Rf|R2 R8 * B Rf|R3 R8 * C Rf RC * D Rf|R1 RC * E Rf|R2 RC * F Rf|R3 RC */ static double resGain[16] = { ((1.4/1.0)), // Rf/Ri 1.4 ((((1.4*15.3)/(1.4+15.3))/1.0)), // (Rf|R1)/Ri 1.28263 ((((1.4*7.3)/(1.4+7.3))/1.0)), // (Rf|R2)/Ri 1.17471 ((((1.4*4.7)/(1.4+4.7))/1.0)), // (Rf|R3)/Ri 1.07869 ((1.4/1.4)), // Rf/R4 1.0 ((((1.4*15.3)/(1.4+15.3))/1.4)), // (Rf|R1)/R4 0.916168 ((((1.4*7.3)/(1.4+7.3))/1.4)), // (Rf|R2)/R4 0.83908 ((((1.4*4.7)/(1.4+4.7))/1.4)), // (Rf|R3)/R4 0.770492 ((1.4/2.0)), // Rf/R8 0.7 ((((1.4*15.3)/(1.4+15.3))/2.0)), // (Rf|R1)/R8 0.641317 ((((1.4*7.3)/(1.4+7.3))/2.0)), // (Rf|R2)/R8 0.587356 ((((1.4*4.7)/(1.4+4.7))/2.0)), // (Rf|R3)/R8 0.539344 ((1.4/2.8)), // Rf/RC 0.5 ((((1.4*15.3)/(1.4+15.3))/2.8)), // (Rf|R1)/RC 0.458084 ((((1.4*7.3)/(1.4+7.3))/2.8)), // (Rf|R2)/RC 0.41954 ((((1.4*4.7)/(1.4+4.7))/2.8)), // (Rf|R3)/RC 0.385246 }; typedef struct { // Op-amp transfer function. double_point* opamp_voltage; int opamp_voltage_size; // Voice output characteristics. double voice_voltage_range; double voice_DC_voltage; // Capacitor value. double C; // Transistor parameters. double Vdd; double Vth; // Threshold voltage double Ut; // Thermal voltage: Ut = k*T/q = 8.61734315e-5*T ~ 26mV double k; // Gate coupling coefficient: K = Cox/(Cox+Cdep) ~ 0.7 double uCox; // u*Cox double WL_vcr; // W/L for VCR double WL_snake; // W/L for "snake" // DAC parameters. double dac_zero; double dac_scale; double dac_2R_div_R; bool dac_term; } model_filter_init_t; static model_filter_init_t model_filter_init[2] = { { opamp_voltage_6581, sizeof(opamp_voltage_6581)/sizeof(*opamp_voltage_6581), // The dynamic analog range of one voice is approximately 1.5V, 1.5, // riding at a DC level of approximately 5.0V. 5.075, // Capacitor value. 470e-12, // Transistor parameters. 12.18, 1.31, 26.0e-3, 1.0, 20e-6, 9.0/1.0, 1.0/115, // DAC parameters. 6.65, 2.63, 2.20, false }, { opamp_voltage_8580, sizeof(opamp_voltage_8580)/sizeof(*opamp_voltage_8580), // FIXME: Measure for the 8580. 0.30, // FIXME: Measure for the 8580. 4.84, // Capacitor value. 22e-9, // Transistor parameters. 9.09, 0.80, 26.0e-3, 1.0, // Unused, leave at 1 100e-6, // FIXME: 6581 only 0, 0, 0, 0, 2.00, true } }; unsigned short Filter::vcr_kVg[1 << 16]; unsigned short Filter::vcr_n_Ids_term[1 << 16]; int Filter::n_snake; int Filter::n_param; #if defined(__amiga__) && defined(__mc68000__) #undef HAS_LOG1P #endif #ifndef HAS_LOG1P static double log1p(double x) { return log(1 + x) - (((1 + x) - 1) - x) / (1 + x); } #endif Filter::model_filter_t Filter::model_filter[2]; // The 4.75V voltage for the virtual ground is generated by a PolySi resistor divider static const double Vref = 4.75; // ---------------------------------------------------------------------------- // Constructor. // ---------------------------------------------------------------------------- Filter::Filter() { static bool class_init; if (!class_init) { double tmp_n_param[2]; unsigned int dac_bits = 11; // Temporary tables for op-amp transfer function. unsigned int* voltages = new unsigned int[1 << 16]; opamp_t* opamp = new opamp_t[1 << 16]; for (int m = 0; m < 2; m++) { model_filter_init_t& fi = model_filter_init[m]; model_filter_t& mf = model_filter[m]; // Convert op-amp voltage transfer to 16 bit values. double vmin = fi.opamp_voltage[0][0]; double opamp_max = fi.opamp_voltage[0][1]; double kVddt = fi.k*(fi.Vdd - fi.Vth); double vmax = kVddt < opamp_max ? opamp_max : kVddt; double denorm = vmax - vmin; double norm = 1.0/denorm; // Scaling and translation constants. double N16 = norm*((1u << 16) - 1); double N30 = norm*((1u << 30) - 1); double N31 = norm*((1u << 31) - 1); mf.vo_N16 = N16; // The "zero" output level of the voices. // The digital range of one voice is 20 bits; create a scaling term // for multiplication which fits in 11 bits. double N14 = norm*(1u << 14); mf.voice_scale_s14 = (int)(N14*fi.voice_voltage_range); mf.voice_DC = (int)(N16*(fi.voice_DC_voltage - vmin)); // Vdd - Vth, normalized so that translated values can be subtracted: // k*Vddt - x = (k*Vddt - t) - (x - t) mf.kVddt = (int)(N16*(kVddt - vmin) + 0.5); tmp_n_param[m] = denorm*(1 << 13)*((fi.uCox/2.)*1.0e-6/fi.C); // Create lookup table mapping op-amp voltage across output and input // to input voltage: vo - vx -> vx // FIXME: No variable length arrays in ISO C++, hardcoding to max 50 // points. // double_point scaled_voltage[fi.opamp_voltage_size]; double_point scaled_voltage[50]; for (int i = 0; i < fi.opamp_voltage_size; i++) { // The target output range is 16 bits, in order to fit in an unsigned // short. // // The y axis is temporarily scaled to 31 bits for maximum accuracy in // the calculated derivative. // // Values are normalized using // // x_n = m*2^N*(x - xmin) // // and are translated back later (for fixed point math) using // // m*2^N*x = x_n - m*2^N*xmin // scaled_voltage[fi.opamp_voltage_size - 1 - i][0] = N16*(fi.opamp_voltage[i][1] - fi.opamp_voltage[i][0])/2.; // Translate value to the positive axis by adding 32768 // The same is done later in the integrator function when accessing the opamp array scaled_voltage[fi.opamp_voltage_size - 1 - i][0] += double(1 << 15); scaled_voltage[fi.opamp_voltage_size - 1 - i][1] = N31*(fi.opamp_voltage[i][0] - vmin); } // Clamp x to 16 bit range (rounding may cause overflow). if (scaled_voltage[fi.opamp_voltage_size - 1][0] > 65535.) { // The last point is repeated. scaled_voltage[fi.opamp_voltage_size - 1][0] = scaled_voltage[fi.opamp_voltage_size - 2][0] = 65535.; } interpolate(scaled_voltage, scaled_voltage + fi.opamp_voltage_size - 1, PointPlotter(voltages), 1.0); // Store both fn and dfn in the same table. mf.ak = (int)(scaled_voltage[0][0] + 0.5); mf.bk = (int)(scaled_voltage[fi.opamp_voltage_size - 1][0] + 0.5); int j; for (j = 0; j < mf.ak; j++) { opamp[j].vx = 0; opamp[j].dvx = 0; } unsigned int f = voltages[j]; for (; j < mf.bk; j++) { unsigned int fp = f; f = voltages[j]; // Scaled by m*2^31 // m*2^31*dy/1 = (m*2^31*dy)/(m*2^16*dx) = 2^15*dy/dx int df = f - fp; // Scaled by 2^15 // 16 bits unsigned: m*2^16*(fn - xmin) opamp[j].vx = f > (0xffff << 15) ? 0xffff : f >> 15; // 16 bits (15 bits + sign bit): 2^11*dfn opamp[j].dvx = df >> (15 - 11); } for (; j < (1 << 16); j++) { opamp[j].vx = 0; opamp[j].dvx = 0; } // We don't have the differential for the first point so just assume // it's the same as the second point's opamp[mf.ak].dvx = opamp[mf.ak+1].dvx; // Create lookup tables. // The filter summer operates at n ~ 1, and has 5 fundamentally different // input configurations (2 - 6 input "resistors"). // // Note that all "on" transistors are modeled as one. This is not // entirely accurate, since the input for each transistor is different, // and transistors are not linear components. However modeling all // transistors separately would be extremely costly. int offset = 0; int size; for (int k = 0; k < 5; k++) { int idiv = 2 + k; // 2 - 6 input "resistors". double n_idiv = double(idiv); size = idiv << 16; int x = mf.ak; for (int vi = 0; vi < size; vi++) { mf.summer[offset + vi] = solve_gain_d(opamp, n_idiv, vi/idiv, x, mf); } offset += size; } // The audio mixer operates at n ~ 8/6 (6581) 8/5 (8580), // and has 8 fundamentally different // input configurations (0 - 7 input "resistors"). // // All "on", transistors are modeled as one - see comments above for // the filter summer. double divider = m==0 ? 6. : 5.; offset = 0; size = 1; // Only one lookup element for 0 input "resistors". for (int l = 0; l < 8; l++) { int idiv = l; // 0 - 7 input "resistors". double n_idiv = double(idiv << 3)/divider; // n*idiv if (idiv == 0) { // Avoid division by zero; the result will be correct since // n_idiv = 0. idiv = 1; } int x = mf.ak; for (int vi = 0; vi < size; vi++) { mf.mixer[offset + vi] = solve_gain_d(opamp, n_idiv, vi/idiv, x, mf); } offset += size; size = (l + 1) << 16; } // 4 bit "resistor" ladders in the audio // output gain necessitate 16 gain tables. // From die photographs of the volume "resistor" ladders // it follows that gain ~ vol/12 (6581) vol/16 (8580) // (assuming ideal op-amps and ideal "resistors"). divider = m==0 ? 12. : 16.; for (int n8 = 0; n8 < 16; n8++) { double n = double(n8) / divider; int x = mf.ak; for (int vi = 0; vi < (1 << 16); vi++) { mf.gain[n8][vi] = solve_gain_d(opamp, n, vi, x, mf); } } // Create lookup table mapping capacitor voltage to op-amp input voltage: // vc -> vx for (int i = 0; i < (1 << 16); i++) { mf.opamp_rev[i] = opamp[i].vx; } mf.vc_max = (int)(N30*(fi.opamp_voltage[0][1] - fi.opamp_voltage[0][0])); mf.vc_min = (int)(N30*(fi.opamp_voltage[fi.opamp_voltage_size - 1][1] - fi.opamp_voltage[fi.opamp_voltage_size - 1][0])); if (m == 0) { // 6581 only // In the MOS 6581, 1/Q is controlled linearly by res. From die photographs // of the resonance "resistor" ladder it follows that 1/Q ~ ~res/8 // (assuming an ideal op-amp and ideal "resistors"). This implies that Q // ranges from 0.533 (res = 0) to 8 (res = E). For res = F, Q is actually // theoretically unlimited, which is quite unheard of in a filter // circuit. // // To obtain Q ~ 1/sqrt(2) = 0.707 for maximally flat frequency response, // res should be set to 4: Q = 8/~4 = 8/11 = 0.7272 (again assuming an ideal // op-amp and ideal "resistors"). // // Q as low as 0.707 is not achievable because of low gain op-amps; res = 0 // should yield the flattest possible frequency response at Q ~ 0.8 - 1.0 // in the op-amp's pseudo-linear range (high amplitude signals will be // clipped). As resonance is increased, the filter must be clocked more // often to keep it stable. for (int n8 = 0; n8 < 16; n8++) { double n = double(~n8 & 0xf) / 8.; int x = mf.ak; for (int vi = 0; vi < (1 << 16); vi++) { mf.resonance[n8][vi] = solve_gain_d(opamp, n, vi, x, mf); } } Vw_bias = 0; // Normalized snake current factor, 1 cycle at 1MHz. // Fit in 5 bits. n_snake = (int)(fi.WL_snake * tmp_n_param[0] + 0.5); // DAC table. build_dac_table(mf.f0_dac, dac_bits, fi.dac_2R_div_R, fi.dac_term); for (int n = 0; n < (1 << dac_bits); n++) { mf.f0_dac[n] = (unsigned short)(N16*(fi.dac_zero + mf.f0_dac[n]*fi.dac_scale/(1 << dac_bits) - vmin) + 0.5); } // VCR table. double k = fi.k; double kVddt = N16*(k*(fi.Vdd - fi.Vth)); vmin *= N16; for (int i = 0; i < (1 << 16); i++) { // The table index is right-shifted 16 times in order to fit in // 16 bits; the argument to sqrt is thus multiplied by (1 << 16). // // The returned value must be corrected for translation. Vg always // takes part in a subtraction as follows: // // k*Vg - Vx = (k*Vg - t) - (Vx - t) // // I.e. k*Vg - t must be returned. double Vg = kVddt - sqrt((double)i*(1 << 16)); vcr_kVg[i] = (unsigned short)(k*Vg - vmin + 0.5); } /* EKV model: Ids = Is*(if - ir) Is = ((2*u*Cox*Ut^2)/k)*W/L if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) */ double kVt = fi.k*fi.Vth; double Ut = fi.Ut; double Is = ((2*fi.uCox*Ut*Ut)/fi.k)*fi.WL_vcr; // Normalized current factor for 1 cycle at 1MHz. double N15 = N16/2; double n_Is = N15*1.0e-6/fi.C*Is; // kVg_Vx = k*Vg - Vx // I.e. if k != 1.0, Vg must be scaled accordingly. for (int i = 0; i < (1 << 16); i++) { int kVg_Vx = i - (1 << 15); double log_term = log1p(exp((kVg_Vx/N16 - kVt)/(2*Ut))); // Scaled by m*2^15 vcr_n_Ids_term[i] = (unsigned short)(n_Is*log_term*log_term); } } else { // 8580 only // In the MOS 8580, the resonance "resistor" ladder above the bp feedback // op-amp is split in two parts; one ladder for the op-amp input and one // ladder for the op-amp feedback. // // input: feedback: // // Rf // Ri R4 RC R8 R3 // R2 // R1 // // // The "resistors" are switched in as follows by bits in register $17: // // feedback: // R1: bit4&!bit5 // R2: !bit4&bit5 // R3: bit4&bit5 // Rf: always on // // input: // R4: bit6&!bit7 // R8: !bit6&bit7 // RC: bit6&bit7 // Ri: !(R4|R8|RC) = !(bit6|bit7) = !bit6&!bit7 // // // The relative "resistor" values are approximately (using channel length): // // R1 = 15.3*Ri // R2 = 7.3*Ri // R3 = 4.7*Ri // Rf = 1.4*Ri // R4 = 1.4*Ri // R8 = 2.0*Ri // RC = 2.8*Ri // // // Approximate values for 1/Q can now be found as follows (assuming an // ideal op-amp): // // res feedback input -gain (1/Q) // --- -------- ----- ---------- // 0 Rf Ri Rf/Ri = 1/(Ri*(1/Rf)) = 1/0.71 // 1 Rf|R1 Ri (Rf|R1)/Ri = 1/(Ri*(1/Rf+1/R1)) = 1/0.78 // 2 Rf|R2 Ri (Rf|R2)/Ri = 1/(Ri*(1/Rf+1/R2)) = 1/0.85 // 3 Rf|R3 Ri (Rf|R3)/Ri = 1/(Ri*(1/Rf+1/R3)) = 1/0.92 // 4 Rf R4 Rf/R4 = 1/(R4*(1/Rf)) = 1/1.00 // 5 Rf|R1 R4 (Rf|R1)/R4 = 1/(R4*(1/Rf+1/R1)) = 1/1.10 // 6 Rf|R2 R4 (Rf|R2)/R4 = 1/(R4*(1/Rf+1/R2)) = 1/1.20 // 7 Rf|R3 R4 (Rf|R3)/R4 = 1/(R4*(1/Rf+1/R3)) = 1/1.30 // 8 Rf R8 Rf/R8 = 1/(R8*(1/Rf)) = 1/1.43 // 9 Rf|R1 R8 (Rf|R1)/R8 = 1/(R8*(1/Rf+1/R1)) = 1/1.56 // A Rf|R2 R8 (Rf|R2)/R8 = 1/(R8*(1/Rf+1/R2)) = 1/1.70 // B Rf|R3 R8 (Rf|R3)/R8 = 1/(R8*(1/Rf+1/R3)) = 1/1.86 // C Rf RC Rf/RC = 1/(RC*(1/Rf)) = 1/2.00 // D Rf|R1 RC (Rf|R1)/RC = 1/(RC*(1/Rf+1/R1)) = 1/2.18 // E Rf|R2 RC (Rf|R2)/RC = 1/(RC*(1/Rf+1/R2)) = 1/2.38 // F Rf|R3 RC (Rf|R3)/RC = 1/(RC*(1/Rf+1/R3)) = 1/2.60 // // // These data indicate that the following function for 1/Q has been // modeled in the MOS 8580: // // 1/Q = 2^(1/2)*2^(-x/8) = 2^(1/2 - x/8) = 2^((4 - x)/8) for (int n8 = 0; n8 < 16; n8++) { int x = mf.ak; for (int vi = 0; vi < (1 << 16); vi++) { mf.resonance[n8][vi] = solve_gain_d(opamp, resGain[n8], vi, x, mf); } } // scaled 5 bits n_param = (int)(tmp_n_param[1] * 32 + 0.5); double Vgt = (Vref * 1.6) - fi.Vth; nVgt = (int)(N16 * (Vgt - vmin) + 0.5); // DAC table. // W/L ratio for frequency DAC, bits are proportional. // scaled 5 bits unsigned int dacWL = 806; // 0,00307464599609375 * 1024 * 256 (actual value is ~= 0.003075) mf.f0_dac[0] = dacWL >> 8; for (int n = 1; n < (1 << dac_bits); n++) { // Calculate W/L ratio for parallel NMOS resistances unsigned int wl = 0; for (unsigned int i = 0; i < dac_bits; i++) { unsigned int bitmask = 1 << i; if (n & bitmask) { wl += dacWL * (bitmask<<1); } } mf.f0_dac[n] = wl >> 8; } } } // Free temporary tables. delete[] voltages; delete[] opamp; class_init = true; } enable_filter(true); set_chip_model(MOS6581); set_voice_mask(0x07); input(0); reset(); } // ---------------------------------------------------------------------------- // Enable filter. // ---------------------------------------------------------------------------- void Filter::enable_filter(bool enable) { enabled = enable; set_sum_mix(); } // ---------------------------------------------------------------------------- // Adjust the DAC bias parameter of the filter. // This gives user variable control of the exact CF -> center frequency // mapping used by the filter. // ---------------------------------------------------------------------------- void Filter::adjust_filter_bias(double dac_bias) { Vw_bias = int(dac_bias*model_filter[0].vo_N16); set_w0(); // Gate voltage is controlled by the switched capacitor voltage divider // Ua = Ue * v = 4.75v 1> 4) & 0x0f; filt = res_filt & 0x0f; set_sum_mix(); } void Filter::writeMODE_VOL(reg8 mode_vol) { mode = mode_vol & 0xf0; set_sum_mix(); vol = mode_vol & 0x0f; } // Set filter cutoff frequency. void Filter::set_w0() { { // MOS 6581 model_filter_t& f = model_filter[0]; int Vw = Vw_bias + f.f0_dac[fc]; Vddt_Vw_2 = unsigned(f.kVddt - Vw)*unsigned(f.kVddt - Vw) >> 1; } { // MOS 8580 cutoff: 0 - 12.5kHz. model_filter_t& f = model_filter[1]; n_dac = (n_param * f.f0_dac[fc]) >> 15; } } // Set input routing bits. void Filter::set_sum_mix() { // NB! voice3off (mode bit 7) only affects voice 3 if it is routed directly // to the mixer. sum = (enabled ? filt : 0x00) & voice_mask; mix = (enabled ? (mode & 0x70) | ((~(filt | (mode & 0x80) >> 5)) & 0x0f) : 0x0f) & voice_mask; } } // namespace reSID libsidplayfp-2.6.0/src/builders/resid-builder/resid/wave8580_PS_.dat0000644000175100001770000001000014544470311022101 00000000000000;=>? ???? ^__ ___GCeno@@o@oooc@a@@@@p@@@@@p@``w`www@@`@@`@``y@@@@@@`@@@````x@``````x`ppxpy{{```````p```p`pp|`pppppp|pxx|x||}pxxxxxx|x||~|~~~|||~~~ǀÀπÀlibsidplayfp-2.6.0/src/builders/resid-builder/resid-emu.h0000644000175100001770000000376214544470307020342 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef RESID_EMU_H #define RESID_EMU_H #include #include "sidplayfp/SidConfig.h" #include "sidemu.h" #include "Event.h" #include "resid/sid.h" #include "sidcxx11.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif namespace libsidplayfp { class ReSID final : public sidemu { private: reSID::SID &m_sid; uint8_t m_voiceMask; public: static const char* getCredits(); public: ReSID(sidbuilder *builder); ~ReSID(); bool getStatus() const { return m_status; } uint8_t read(uint_least8_t addr) override; void write(uint_least8_t addr, uint8_t data) override; // c64sid functions void reset(uint8_t volume) override; // Standard SID emu functions void clock() override; void sampling(float systemclock, float freq, SidConfig::sampling_method_t method, bool fast) override; void voice(unsigned int num, bool mute) override; void model(SidConfig::sid_model_t model, bool digiboost) override; // Specific to resid void bias(double dac_bias); void filter(bool enable); }; } #endif // RESID_EMU_H libsidplayfp-2.6.0/src/builders/resid-builder/resid-emu.cpp0000644000175100001770000001013314544470307020663 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #include "resid-emu.h" #include #include #include #include #include "resid/siddefs.h" #include "resid/spline.h" namespace libsidplayfp { const char* ReSID::getCredits() { static std::string credits; if (credits.empty()) { // Setup credits std::ostringstream ss; ss << "ReSID V" << VERSION << " Engine:\n"; ss << "\t(C) 1999-2002 Simon White\n"; ss << "MOS6581 (SID) Emulation (ReSID V" << resid_version_string << "):\n"; ss << "\t(C) 1999-2010 Dag Lem\n"; credits = ss.str(); } return credits.c_str(); } ReSID::ReSID(sidbuilder *builder) : sidemu(builder), m_sid(*(new reSID::SID)), m_voiceMask(0x07) { m_buffer = new short[OUTPUTBUFFERSIZE]; reset(0); } ReSID::~ReSID() { delete &m_sid; delete[] m_buffer; } void ReSID::bias(double dac_bias) { m_sid.adjust_filter_bias(dac_bias); } // Standard component options void ReSID::reset(uint8_t volume) { m_accessClk = 0; m_sid.reset(); m_sid.write(0x18, volume); } uint8_t ReSID::read(uint_least8_t addr) { clock(); return m_sid.read(addr); } void ReSID::write(uint_least8_t addr, uint8_t data) { clock(); m_sid.write(addr, data); } void ReSID::clock() { reSID::cycle_count cycles = eventScheduler->getTime(EVENT_CLOCK_PHI1) - m_accessClk; m_accessClk += cycles; m_bufferpos += m_sid.clock(cycles, (short *) m_buffer + m_bufferpos, OUTPUTBUFFERSIZE - m_bufferpos, 1); } void ReSID::filter(bool enable) { m_sid.enable_filter(enable); } void ReSID::sampling(float systemclock, float freq, SidConfig::sampling_method_t method, bool fast) { reSID::sampling_method sampleMethod; switch (method) { case SidConfig::INTERPOLATE: sampleMethod = fast ? reSID::SAMPLE_FAST : reSID::SAMPLE_INTERPOLATE; break; case SidConfig::RESAMPLE_INTERPOLATE: sampleMethod = fast ? reSID::SAMPLE_RESAMPLE_FASTMEM : reSID::SAMPLE_RESAMPLE; break; default: m_status = false; m_error = ERR_INVALID_SAMPLING; return; } if (! m_sid.set_sampling_parameters(systemclock, sampleMethod, freq)) { m_status = false; m_error = ERR_UNSUPPORTED_FREQ; return; } m_status = true; } void ReSID::voice(unsigned int num, bool mute) { if (mute) m_voiceMask &= ~(1< * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef RESID_H #define RESID_H #include "sidplayfp/sidbuilder.h" #include "sidplayfp/siddefs.h" /** * ReSID Builder Class */ class SID_EXTERN ReSIDBuilder : public sidbuilder { public: ReSIDBuilder(const char * const name) : sidbuilder(name) {} ~ReSIDBuilder(); /** * Available sids. * * @return the number of available sids, 0 = endless. */ unsigned int availDevices() const { return 0; } unsigned int create(unsigned int sids); const char *credits() const; /// @name global settings /// Settings that affect all SIDs //@{ /** * enable/disable filter. */ void filter(bool enable); /** * The bias is given in millivolts, and a maximum reasonable * control range is approximately -500 to 500. */ void bias(double dac_bias); //@} }; #endif // RESID_H libsidplayfp-2.6.0/src/builders/hardsid-builder/0000755000175100001770000000000014544470322016654 500000000000000libsidplayfp-2.6.0/src/builders/hardsid-builder/hardsid-builder.cpp0000644000175100001770000001724214544470307022353 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #include "hardsid.h" #include "sidcxx11.h" #include #include #include #include #include #include #ifdef _WIN32 # include #endif #include "hardsid-emu.h" #ifdef _WIN32 //************************************************************************** // Version 1 Interface typedef BYTE (CALLBACK* HsidDLL1_InitMapper_t) (); libsidplayfp::HsidDLL2 hsid2 = {0}; #endif bool HardSIDBuilder::m_initialised = false; #ifndef _WIN32 unsigned int HardSIDBuilder::m_count = 0; #endif HardSIDBuilder::HardSIDBuilder(const char * const name) : sidbuilder (name) { if (!m_initialised) { if (init() < 0) return; m_initialised = true; } } HardSIDBuilder::~HardSIDBuilder() { // Remove all SID emulations remove(); } // Create a new sid emulation. unsigned int HardSIDBuilder::create(unsigned int sids) { m_status = true; // Check available devices unsigned int count = availDevices(); if (count == 0) { m_errorBuffer = "HARDSID ERROR: No devices found (run HardSIDConfig)"; goto HardSIDBuilder_create_error; } if (count < sids) sids = count; for (count = 0; count < sids; count++) { try { std::unique_ptr sid(new libsidplayfp::HardSID(this)); // SID init failed? if (!sid->getStatus()) { m_errorBuffer = sid->error(); goto HardSIDBuilder_create_error; } sidobjs.insert(sid.release()); } // Memory alloc failed? catch (std::bad_alloc const &) { m_errorBuffer.assign(name()).append(" ERROR: Unable to create HardSID object"); goto HardSIDBuilder_create_error; } } return count; HardSIDBuilder_create_error: m_status = false; return count; } unsigned int HardSIDBuilder::availDevices() const { // Available devices // @FIXME@ not yet supported on Linux #ifdef _WIN32 return hsid2.Instance ? hsid2.Devices() : 0; #else return m_count; #endif } const char *HardSIDBuilder::credits() const { return libsidplayfp::HardSID::getCredits(); } void HardSIDBuilder::flush() { for (emuset_t::iterator it=sidobjs.begin(); it != sidobjs.end(); ++it) static_cast(*it)->flush(); } void HardSIDBuilder::filter(bool enable) { std::for_each(sidobjs.begin(), sidobjs.end(), applyParameter(&libsidplayfp::HardSID::filter, enable)); } #ifdef _WIN32 // Load the library and initialise the hardsid int HardSIDBuilder::init() { HINSTANCE dll; if (hsid2.Instance) return 0; m_status = false; dll = LoadLibrary(TEXT("HARDSID.DLL")); if (!dll) { DWORD err = GetLastError(); if (err == ERROR_DLL_INIT_FAILED) m_errorBuffer = "HARDSID ERROR: hardsid.dll init failed!"; else m_errorBuffer = "HARDSID ERROR: hardsid.dll not found!"; goto HardSID_init_error; } { // Export Needed Version 1 Interface HsidDLL1_InitMapper_t mapper; mapper = (HsidDLL1_InitMapper_t) GetProcAddress(dll, "InitHardSID_Mapper"); if (mapper) mapper(); else { m_errorBuffer = "HARDSID ERROR: hardsid.dll is corrupt!"; goto HardSID_init_error; } } { // Check for the Version 2 interface HsidDLL2_Version_t version; version = (HsidDLL2_Version_t) GetProcAddress(dll, "HardSID_Version"); if (!version) { m_errorBuffer = "HARDSID ERROR: hardsid.dll not V2"; goto HardSID_init_error; } hsid2.Version = version (); } { WORD version = hsid2.Version; if ((version >> 8) != (HSID_VERSION_MIN >> 8)) { std::ostringstream ss; ss << "HARDSID ERROR: hardsid.dll not V" << (HSID_VERSION_MIN >> 8) << std::endl; m_errorBuffer = ss.str(); goto HardSID_init_error; } if (version < HSID_VERSION_MIN) { std::ostringstream ss; ss.fill('0'); ss << "HARDSID ERROR: hardsid.dll hardsid.dll must be V"; ss << std::setw(2) << (HSID_VERSION_MIN >> 8); ss << "."; ss << std::setw(2) << (HSID_VERSION_MIN & 0xff); ss << " or greater" << std::endl; m_errorBuffer = ss.str(); goto HardSID_init_error; } } // Export Needed Version 2 Interface hsid2.Delay = (HsidDLL2_Delay_t) GetProcAddress(dll, "HardSID_Delay"); hsid2.Devices = (HsidDLL2_Devices_t) GetProcAddress(dll, "HardSID_Devices"); hsid2.Filter = (HsidDLL2_Filter_t) GetProcAddress(dll, "HardSID_Filter"); hsid2.Flush = (HsidDLL2_Flush_t) GetProcAddress(dll, "HardSID_Flush"); hsid2.MuteAll = (HsidDLL2_MuteAll_t) GetProcAddress(dll, "HardSID_MuteAll"); hsid2.Read = (HsidDLL2_Read_t) GetProcAddress(dll, "HardSID_Read"); hsid2.Sync = (HsidDLL2_Sync_t) GetProcAddress(dll, "HardSID_Sync"); hsid2.Write = (HsidDLL2_Write_t) GetProcAddress(dll, "HardSID_Write"); if (hsid2.Version < HSID_VERSION_204) hsid2.Reset = (HsidDLL2_Reset_t) GetProcAddress(dll, "HardSID_Reset"); else { hsid2.Lock = (HsidDLL2_Lock_t) GetProcAddress(dll, "HardSID_Lock"); hsid2.Unlock = (HsidDLL2_Unlock_t) GetProcAddress(dll, "HardSID_Unlock"); hsid2.Reset2 = (HsidDLL2_Reset2_t) GetProcAddress(dll, "HardSID_Reset2"); } if (hsid2.Version < HSID_VERSION_207) hsid2.Mute = (HsidDLL2_Mute_t) GetProcAddress(dll, "HardSID_Mute"); else hsid2.Mute2 = (HsidDLL2_Mute2_t) GetProcAddress(dll, "HardSID_Mute2"); hsid2.Instance = dll; m_status = true; return 0; HardSID_init_error: if (dll) FreeLibrary(dll); return -1; } #else #include #include // Find the number of sid devices. We do not care about // stuppid device numbering or drivers not loaded for the // available nodes. int HardSIDBuilder::init() { DIR *dir = opendir("/dev"); if (!dir) return -1; m_count = 0; while (dirent *entry=readdir(dir)) { // SID device if (strncmp ("sid", entry->d_name, 3)) continue; // if it is truely one of ours then it will be // followed by numerics only const char *p = entry->d_name+3; unsigned int index = 0; while (*p) { if (!isdigit(*p)) continue; index = index * 10 + (*p++ - '0'); } index++; if (m_count < index) m_count = index; } closedir(dir); return 0; } #endif // _WIN32 libsidplayfp-2.6.0/src/builders/hardsid-builder/hardsid-emu.h0000644000175100001770000001125214544470307021153 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001-2002 by Jarno Paananen * Copyright 2000-2002 Simon White * * 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. */ #ifndef HARDSID_EMU_H #define HARDSID_EMU_H #include "sidemu.h" #include "Event.h" #include "EventScheduler.h" #include "sidplayfp/siddefs.h" #include "sidcxx11.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif class sidbuilder; #ifdef _WIN32 #include #define HSID_VERSION_MIN (WORD) 0x0200 #define HSID_VERSION_204 (WORD) 0x0204 #define HSID_VERSION_207 (WORD) 0x0207 //************************************************************************** // Version 2 Interface typedef void (CALLBACK* HsidDLL2_Delay_t) (BYTE deviceID, WORD cycles); typedef BYTE (CALLBACK* HsidDLL2_Devices_t) (); typedef void (CALLBACK* HsidDLL2_Filter_t) (BYTE deviceID, BOOL filter); typedef void (CALLBACK* HsidDLL2_Flush_t) (BYTE deviceID); typedef void (CALLBACK* HsidDLL2_Mute_t) (BYTE deviceID, BYTE channel, BOOL mute); typedef void (CALLBACK* HsidDLL2_MuteAll_t) (BYTE deviceID, BOOL mute); typedef void (CALLBACK* HsidDLL2_Reset_t) (BYTE deviceID); typedef BYTE (CALLBACK* HsidDLL2_Read_t) (BYTE deviceID, WORD cycles, BYTE SID_reg); typedef void (CALLBACK* HsidDLL2_Sync_t) (BYTE deviceID); typedef void (CALLBACK* HsidDLL2_Write_t) (BYTE deviceID, WORD cycles, BYTE SID_reg, BYTE data); typedef WORD (CALLBACK* HsidDLL2_Version_t) (); // Version 2.04 Extensions typedef BOOL (CALLBACK* HsidDLL2_Lock_t) (BYTE deviceID); typedef void (CALLBACK* HsidDLL2_Unlock_t) (BYTE deviceID); typedef void (CALLBACK* HsidDLL2_Reset2_t) (BYTE deviceID, BYTE volume); // Version 2.07 Extensions typedef void (CALLBACK* HsidDLL2_Mute2_t) (BYTE deviceID, BYTE channel, BOOL mute, BOOL manual); namespace libsidplayfp { struct HsidDLL2 { HINSTANCE Instance; HsidDLL2_Delay_t Delay; HsidDLL2_Devices_t Devices; HsidDLL2_Filter_t Filter; HsidDLL2_Flush_t Flush; HsidDLL2_Lock_t Lock; HsidDLL2_Unlock_t Unlock; HsidDLL2_Mute_t Mute; HsidDLL2_Mute2_t Mute2; HsidDLL2_MuteAll_t MuteAll; HsidDLL2_Reset_t Reset; HsidDLL2_Reset2_t Reset2; HsidDLL2_Read_t Read; HsidDLL2_Sync_t Sync; HsidDLL2_Write_t Write; WORD Version; }; } #endif // _WIN32 namespace libsidplayfp { #define HARDSID_VOICES 3 // Approx 60ms #define HARDSID_DELAY_CYCLES 60000 /*************************************************************************** * HardSID SID Specialisation ***************************************************************************/ class HardSID final : public sidemu, private Event { private: friend class HardSIDBuilder; // HardSID specific data #ifndef _WIN32 static bool m_sidFree[16]; int m_handle; #endif static const unsigned int voices; static unsigned int sid; // Must stay in this order bool muted[HARDSID_VOICES]; unsigned int m_instance; private: event_clock_t delay(); public: static const char* getCredits(); public: HardSID(sidbuilder *builder); ~HardSID(); bool getStatus() const { return m_status; } uint8_t read(uint_least8_t addr) override; void write(uint_least8_t addr, uint8_t data) override; // c64sid functions void reset(uint8_t volume) override; // Standard SID functions void clock() override; void model(SidConfig::sid_model_t, bool digiboost) override {} void voice(unsigned int num, bool mute) override; // HardSID specific void flush(); void filter(bool enable); // Must lock the SID before using the standard functions. bool lock(EventScheduler *env) override; void unlock() override; private: // Fixed interval timer delay to prevent sidplay2 // shoot to 100% CPU usage when song no longer // writes to SID. void event() override; }; } #endif // HARDSID_EMU_H libsidplayfp-2.6.0/src/builders/hardsid-builder/hardsid-emu-unix.cpp0000644000175100001770000001311514544470307022467 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001-2001 by Jarno Paananen * * 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. */ #include "hardsid-emu.h" #include #include #include #include #include #include #include #ifdef HAVE_CONFIG_H # include "config.h" #endif namespace libsidplayfp { // Move these to common header file #define HSID_IOCTL_RESET _IOW('S', 0, int) #define HSID_IOCTL_FIFOSIZE _IOR('S', 1, int) #define HSID_IOCTL_FIFOFREE _IOR('S', 2, int) #define HSID_IOCTL_SIDTYPE _IOR('S', 3, int) #define HSID_IOCTL_CARDTYPE _IOR('S', 4, int) #define HSID_IOCTL_MUTE _IOW('S', 5, int) #define HSID_IOCTL_NOFILTER _IOW('S', 6, int) #define HSID_IOCTL_FLUSH _IO ('S', 7) #define HSID_IOCTL_DELAY _IOW('S', 8, int) #define HSID_IOCTL_READ _IOWR('S', 9, int*) bool HardSID::m_sidFree[16] = {0}; const unsigned int HardSID::voices = HARDSID_VOICES; unsigned int HardSID::sid = 0; const char* HardSID::getCredits() { return "HardSID V" VERSION " Engine:\n" "\t(C) 2001-2002 Jarno Paanenen\n"; } HardSID::HardSID (sidbuilder *builder) : sidemu(builder), Event("HardSID Delay"), m_handle(0), m_instance(sid++) { unsigned int num = 16; for (unsigned int i = 0; i < 16; i++) { if (m_sidFree[i] == false) { m_sidFree[i] = true; num = i; break; } } // All sids in use?!? if (num == 16) return; m_instance = num; { char device[20]; sprintf(device, "/dev/sid%u", m_instance); m_handle = open (device, O_RDWR); if (m_handle < 0) { if (m_instance == 0) { m_handle = open("/dev/sid", O_RDWR); if (m_handle < 0) { m_error.assign("HARDSID ERROR: Cannot access \"/dev/sid\" or \"").append(device).append("\""); return; } } else { m_error.assign("HARDSID ERROR: Cannot access \"").append(device).append("\""); return; } } } m_status = true; sidemu::reset(); } HardSID::~HardSID() { sid--; m_sidFree[m_instance] = false; if (m_handle) close(m_handle); } void HardSID::reset(uint8_t volume) { for (unsigned int i= 0; i < voices; i++) muted[i] = false; ioctl(m_handle, HSID_IOCTL_RESET, volume); m_accessClk = 0; if (eventScheduler != nullptr) eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES, EVENT_CLOCK_PHI1); } event_clock_t HardSID::delay() { event_clock_t cycles = eventScheduler->getTime(EVENT_CLOCK_PHI1) - m_accessClk; m_accessClk += cycles; while (cycles > 0xffff) { ioctl(m_handle, HSID_IOCTL_DELAY, 0xffff); cycles -= 0xffff; } return cycles; } void HardSID::clock() { if (!m_handle) return; const event_clock_t cycles = delay(); if (cycles) ioctl(m_handle, HSID_IOCTL_DELAY, cycles); } uint8_t HardSID::read(uint_least8_t addr) { if (!m_handle) return 0; const event_clock_t cycles = delay(); unsigned int packet = ((cycles & 0xffff) << 16) | ((addr & 0x1f) << 8); ioctl(m_handle, HSID_IOCTL_READ, &packet); return static_cast(packet & 0xff); } void HardSID::write(uint_least8_t addr, uint8_t data) { if (!m_handle) return; const event_clock_t cycles = delay(); unsigned int packet = ((cycles & 0xffff) << 16) | ((addr & 0x1f) << 8) | (data & 0xff); ::write(m_handle, &packet, sizeof(packet)); } void HardSID::voice(unsigned int num, bool mute) { // Only have 3 voices! if (num >= voices) return; muted[num] = mute; int cmute = 0; for (unsigned int i = 0; i < voices; i++) cmute |= (muted[i] << i); ioctl(m_handle, HSID_IOCTL_MUTE, cmute); } void HardSID::event() { event_clock_t cycles = eventScheduler->getTime(EVENT_CLOCK_PHI1) - m_accessClk; if (cycles < HARDSID_DELAY_CYCLES) { eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES - cycles, EVENT_CLOCK_PHI1); } else { m_accessClk += cycles; ioctl(m_handle, HSID_IOCTL_DELAY, static_cast(cycles)); eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES, EVENT_CLOCK_PHI1); } } void HardSID::filter(bool enable) { ioctl(m_handle, HSID_IOCTL_NOFILTER, !enable); } void HardSID::flush() { ioctl(m_handle, HSID_IOCTL_FLUSH); } bool HardSID::lock(EventScheduler* env) { sidemu::lock(env); eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES, EVENT_CLOCK_PHI1); return true; } void HardSID::unlock() { eventScheduler->cancel(*this); sidemu::unlock(); } } libsidplayfp-2.6.0/src/builders/hardsid-builder/hardsid-emu-win.cpp0000644000175100001770000001050114544470307022275 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2002 Simon White * * 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. */ #include "hardsid-emu.h" #include #include #include #include "hardsid.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif /*************************************************************************** Hardsid support interface. Created from Jarnos original Sidplay2 patch ***************************************************************************/ extern libsidplayfp::HsidDLL2 hsid2; namespace libsidplayfp { const unsigned int HardSID::voices = HARDSID_VOICES; unsigned int HardSID::sid = 0; const char* HardSID::getCredits() { return "HardSID V" VERSION " Engine:\n" "\t(C) 1999-2002 Simon White\n"; } HardSID::HardSID(sidbuilder *builder) : sidemu(builder), Event("HardSID Delay"), m_instance(sid++) { if (m_instance >= hsid2.Devices()) { m_error = "HARDSID WARNING: System dosen't have enough SID chips."; return; } m_status = true; sidemu::reset(); } HardSID::~HardSID() { sid--; } event_clock_t HardSID::delay() { event_clock_t cycles = eventScheduler->getTime(EVENT_CLOCK_PHI1) - m_accessClk; m_accessClk += cycles; while (cycles > 0xFFFF) { hsid2.Delay((BYTE) m_instance, 0xFFFF); cycles -= 0xFFFF; } return cycles; } void HardSID::clock() { return; } uint8_t HardSID::read(uint_least8_t addr) { const event_clock_t cycles = delay(); return hsid2.Read((BYTE) m_instance, (WORD) cycles, (BYTE) addr); } void HardSID::write(uint_least8_t addr, uint8_t data) { const event_clock_t cycles = delay(); hsid2.Write((BYTE) m_instance, (WORD) cycles, (BYTE) addr, (BYTE) data); } void HardSID::reset(uint8_t volume) { m_accessClk = 0; // Clear hardsid buffers hsid2.Flush ((BYTE) m_instance); if (hsid2.Version >= HSID_VERSION_204) hsid2.Reset2((BYTE) m_instance, volume); else hsid2.Reset((BYTE) m_instance); hsid2.Sync((BYTE) m_instance); if (eventScheduler != nullptr) eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES, EVENT_CLOCK_PHI1); } void HardSID::voice(unsigned int num, bool mute) { if (hsid2.Version >= HSID_VERSION_207) hsid2.Mute2((BYTE) m_instance, (BYTE) num, (BOOL) mute, FALSE); else hsid2.Mute((BYTE) m_instance, (BYTE) num, (BOOL) mute); } // Set execution environment and lock sid to it bool HardSID::lock(EventScheduler *env) { if (hsid2.Version >= HSID_VERSION_204) { if (hsid2.Lock(m_instance) == FALSE) return false; } sidemu::lock(env); eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES, EVENT_CLOCK_PHI1); return true; } // Unlock sid void HardSID::unlock() { if (hsid2.Version >= HSID_VERSION_204) hsid2.Unlock(m_instance); eventScheduler->cancel(*this); sidemu::unlock(); } void HardSID::event() { event_clock_t cycles = eventScheduler->getTime(EVENT_CLOCK_PHI1) - m_accessClk; if (cycles < HARDSID_DELAY_CYCLES) { eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES - cycles, EVENT_CLOCK_PHI1); } else { m_accessClk += cycles; hsid2.Delay((BYTE) m_instance, (WORD) cycles); eventScheduler->schedule(*this, HARDSID_DELAY_CYCLES, EVENT_CLOCK_PHI1); } } // Disable/Enable SID filter void HardSID::filter(bool enable) { hsid2.Filter((BYTE) m_instance, (BOOL) enable); } void HardSID::flush() { hsid2.Flush((BYTE) m_instance); } } libsidplayfp-2.6.0/src/builders/hardsid-builder/hardsid.h0000644000175100001770000000333714544470307020374 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2002 Simon White * * 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. */ #ifndef HARDSID_H #define HARDSID_H #include "sidplayfp/sidbuilder.h" #include "sidplayfp/siddefs.h" /** * HardSID Builder Class */ class SID_EXTERN HardSIDBuilder : public sidbuilder { private: static bool m_initialised; #ifndef _WIN32 static unsigned int m_count; #endif int init(); public: HardSIDBuilder(const char * const name); ~HardSIDBuilder(); /** * Available sids. * * @return the number of available sids, 0 = endless. */ unsigned int availDevices() const; const char *credits() const; void flush(); /** * enable/disable filter. */ void filter(bool enable); /** * Create the sid emu. * * @param sids the number of required sid emu */ unsigned int create(unsigned int sids); }; #endif // HARDSID_H libsidplayfp-2.6.0/src/builders/residfp-builder/0000755000175100001770000000000014544470322016672 500000000000000libsidplayfp-2.6.0/src/builders/residfp-builder/residfp-emu.cpp0000644000175100001770000000743614544470307021553 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #include "residfp-emu.h" #include #include #include #include "residfp/siddefs-fp.h" #include "sidplayfp/siddefs.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif namespace libsidplayfp { const char* ReSIDfp::getCredits() { return "ReSIDfp V" VERSION " Engine:\n" "\t(C) 1999-2002 Simon White\n" "MOS6581/CSG8580 (SID) Emulation:\n" "\t(C) 1999-2002 Dag Lem\n" "\t(C) 2005-2011 Antti S. Lankila\n" "\t(C) 2010-2023 Leandro Nini\n"; } ReSIDfp::ReSIDfp(sidbuilder *builder) : sidemu(builder), m_sid(*(new reSIDfp::SID)) { m_buffer = new short[OUTPUTBUFFERSIZE]; reset(0); } ReSIDfp::~ReSIDfp() { delete &m_sid; delete[] m_buffer; } void ReSIDfp::filter6581Curve(double filterCurve) { m_sid.setFilter6581Curve(filterCurve); } void ReSIDfp::filter8580Curve(double filterCurve) { m_sid.setFilter8580Curve(filterCurve); } // Standard component options void ReSIDfp::reset(uint8_t volume) { m_accessClk = 0; m_sid.reset(); m_sid.write(0x18, volume); } uint8_t ReSIDfp::read(uint_least8_t addr) { clock(); return m_sid.read(addr); } void ReSIDfp::write(uint_least8_t addr, uint8_t data) { clock(); m_sid.write(addr, data); } void ReSIDfp::clock() { const event_clock_t cycles = eventScheduler->getTime(EVENT_CLOCK_PHI1) - m_accessClk; m_accessClk += cycles; m_bufferpos += m_sid.clock(cycles, m_buffer+m_bufferpos); } void ReSIDfp::filter(bool enable) { m_sid.enableFilter(enable); } void ReSIDfp::sampling(float systemclock, float freq, SidConfig::sampling_method_t method, bool) { reSIDfp::SamplingMethod sampleMethod; switch (method) { case SidConfig::INTERPOLATE: sampleMethod = reSIDfp::DECIMATE; break; case SidConfig::RESAMPLE_INTERPOLATE: sampleMethod = reSIDfp::RESAMPLE; break; default: m_status = false; m_error = ERR_INVALID_SAMPLING; return; } try { const int halfFreq = (freq > 44000) ? 20000 : 9 * freq / 20; m_sid.setSamplingParameters(systemclock, sampleMethod, freq, halfFreq); } catch (reSIDfp::SIDError const &) { m_status = false; m_error = ERR_UNSUPPORTED_FREQ; return; } m_status = true; } // Set the emulated SID model void ReSIDfp::model(SidConfig::sid_model_t model, bool digiboost) { reSIDfp::ChipModel chipModel; switch (model) { case SidConfig::MOS6581: chipModel = reSIDfp::MOS6581; m_sid.input(0); break; case SidConfig::MOS8580: chipModel = reSIDfp::MOS8580; m_sid.input(digiboost ? -32768 : 0); break; default: m_status = false; m_error = ERR_INVALID_CHIP; return; } m_sid.setChipModel(chipModel); m_status = true; } } libsidplayfp-2.6.0/src/builders/residfp-builder/residfp-emu.h0000644000175100001770000000402214544470307021204 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef RESIDFP_EMU_H #define RESIDFP_EMU_H #include #include "residfp/SID.h" #include "sidplayfp/SidConfig.h" #include "sidemu.h" #include "Event.h" #include "sidcxx11.h" class sidbuilder; namespace libsidplayfp { class ReSIDfp final : public sidemu { private: reSIDfp::SID &m_sid; public: static const char* getCredits(); public: ReSIDfp(sidbuilder *builder); ~ReSIDfp(); bool getStatus() const { return m_status; } uint8_t read(uint_least8_t addr) override; void write(uint_least8_t addr, uint8_t data) override; // c64sid functions void reset(uint8_t volume) override; // Standard SID emu functions void clock() override; void sampling(float systemclock, float freq, SidConfig::sampling_method_t method, bool) override; void voice(unsigned int num, bool mute) override { m_sid.mute(num, mute); } void model(SidConfig::sid_model_t model, bool digiboost) override; // Specific to resid void filter(bool enable); void filter6581Curve(double filterCurve); void filter8580Curve(double filterCurve); }; } #endif // RESIDFP_EMU_H libsidplayfp-2.6.0/src/builders/residfp-builder/residfp.h0000644000175100001770000000404314544470307020423 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef RESIDFP_H #define RESIDFP_H #include "sidplayfp/sidbuilder.h" #include "sidplayfp/siddefs.h" /** * ReSIDfp Builder Class */ class SID_EXTERN ReSIDfpBuilder: public sidbuilder { public: ReSIDfpBuilder(const char * const name) : sidbuilder(name) {} ~ReSIDfpBuilder(); /** * Available sids. * * @return the number of available sids, 0 = endless. */ unsigned int availDevices() const { return 0; } /** * Create the sid emu. * * @param sids the number of required sid emu */ unsigned int create(unsigned int sids); const char *credits() const; /// @name global settings /// Settings that affect all SIDs. //@{ /** * enable/disable filter. */ void filter(bool enable); /** * Set 6581 filter curve. * * @param filterCurve from 0.0 (light) to 1.0 (dark) (default 0.5) */ void filter6581Curve(double filterCurve); /** * Set 8580 filter curve. * * @param filterCurve curve center frequency (default 12500) */ void filter8580Curve(double filterCurve); //@} }; #endif // RESIDFP_H libsidplayfp-2.6.0/src/builders/residfp-builder/residfp-builder.cpp0000644000175100001770000000461514544470307022407 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #include "residfp.h" #include #include #include "residfp-emu.h" ReSIDfpBuilder::~ReSIDfpBuilder() { // Remove all SID emulations remove(); } // Create a new sid emulation. unsigned int ReSIDfpBuilder::create(unsigned int sids) { m_status = true; // Check available devices unsigned int count = availDevices(); if (count && (count < sids)) sids = count; for (count = 0; count < sids; count++) { try { sidobjs.insert(new libsidplayfp::ReSIDfp(this)); } // Memory alloc failed? catch (std::bad_alloc const &) { m_errorBuffer.assign(name()).append(" ERROR: Unable to create ReSIDfp object"); m_status = false; break; } } return count; } const char *ReSIDfpBuilder::credits() const { return libsidplayfp::ReSIDfp::getCredits(); } void ReSIDfpBuilder::filter(bool enable) { std::for_each(sidobjs.begin(), sidobjs.end(), applyParameter(&libsidplayfp::ReSIDfp::filter, enable)); } void ReSIDfpBuilder::filter6581Curve(double filterCurve) { std::for_each(sidobjs.begin(), sidobjs.end(), applyParameter(&libsidplayfp::ReSIDfp::filter6581Curve, filterCurve)); } void ReSIDfpBuilder::filter8580Curve(double filterCurve) { std::for_each(sidobjs.begin(), sidobjs.end(), applyParameter(&libsidplayfp::ReSIDfp::filter8580Curve, filterCurve)); } libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/0000755000175100001770000000000014544470322020326 500000000000000libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/SID.cpp0000644000175100001770000003320014544470307021372 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2016 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #define SID_CPP #include "SID.h" #include #include "array.h" #include "Dac.h" #include "Filter6581.h" #include "Filter8580.h" #include "Potentiometer.h" #include "WaveformCalculator.h" #include "resample/TwoPassSincResampler.h" #include "resample/ZeroOrderResampler.h" namespace reSIDfp { const unsigned int ENV_DAC_BITS = 8; const unsigned int OSC_DAC_BITS = 12; /** * The waveform D/A converter introduces a DC offset in the signal * to the envelope multiplying D/A converter. The "zero" level of * the waveform D/A converter can be found as follows: * * Measure the "zero" voltage of voice 3 on the SID audio output * pin, routing only voice 3 to the mixer ($d417 = $0b, $d418 = * $0f, all other registers zeroed). * * Then set the sustain level for voice 3 to maximum and search for * the waveform output value yielding the same voltage as found * above. This is done by trying out different waveform output * values until the correct value is found, e.g. with the following * program: * * lda #$08 * sta $d412 * lda #$0b * sta $d417 * lda #$0f * sta $d418 * lda #$f0 * sta $d414 * lda #$21 * sta $d412 * lda #$01 * sta $d40e * * ldx #$00 * lda #$38 ; Tweak this to find the "zero" level *l cmp $d41b * bne l * stx $d40e ; Stop frequency counter - freeze waveform output * brk * * The waveform output range is 0x000 to 0xfff, so the "zero" * level should ideally have been 0x800. In the measured chip, the * waveform output "zero" level was found to be 0x380 (i.e. $d41b * = 0x38) at an audio output voltage of 5.94V. * * With knowledge of the mixer op-amp characteristics, further estimates * of waveform voltages can be obtained by sampling the EXT IN pin. * From EXT IN samples, the corresponding waveform output can be found by * using the model for the mixer. * * Such measurements have been done on a chip marked MOS 6581R4AR * 0687 14, and the following results have been obtained: * * The full range of one voice is approximately 1.5V. * * The "zero" level rides at approximately 5.0V. * * * zero-x did the measuring on the 8580 (https://sourceforge.net/p/vice-emu/bugs/1036/#c5b3): * When it sits on basic from powerup it's at 4.72 * Run 1.prg and check the output pin level. * Then run 2.prg and adjust it until the output level is the same... * 0x94-0xA8 gives me the same 4.72 1.prg shows. * On another 8580 it's 0x90-0x9C * Third chip 0x94-0xA8 * Fourth chip 0x90-0xA4 * On the 8580 that plays digis the output is 4.66 and 0x93 is the only value to reach that. * To me that seems as regular 8580s have somewhat wide 0-level range, * whereas that digi-compatible 8580 has it very narrow. * On my 6581R4AR has 0x3A as the only value giving the same output level as 1.prg */ //@{ const unsigned int OFFSET_6581 = 0x380; const unsigned int OFFSET_8580 = 0x9c0; //@} /** * Bus value stays alive for some time after each operation. * Values differs between chip models, the timings used here * are taken from VICE [1]. * See also the discussion "How do I reliably detect 6581/8580 sid?" on CSDb [2]. * * Results from real C64 (testprogs/SID/bitfade/delayfrq0.prg): * * (new SID) (250469/8580R5) (250469/8580R5) * delayfrq0 ~7a000 ~108000 * * (old SID) (250407/6581) * delayfrq0 ~01d00 * * [1]: http://sourceforge.net/p/vice-emu/patches/99/ * [2]: http://noname.c64.org/csdb/forums/?roomid=11&topicid=29025&showallposts=1 */ //@{ const int BUS_TTL_6581 = 0x01d00; const int BUS_TTL_8580 = 0xa2000; //@} SID::SID() : filter6581(new Filter6581()), filter8580(new Filter8580()), externalFilter(new ExternalFilter()), resampler(nullptr), potX(new Potentiometer()), potY(new Potentiometer()) { voice[0].reset(new Voice()); voice[1].reset(new Voice()); voice[2].reset(new Voice()); muted[0] = muted[1] = muted[2] = false; reset(); setChipModel(MOS8580); } SID::~SID() { // Needed to delete auto_ptr with complete type } void SID::setFilter6581Curve(double filterCurve) { filter6581->setFilterCurve(filterCurve); } void SID::setFilter8580Curve(double filterCurve) { filter8580->setFilterCurve(filterCurve); } void SID::enableFilter(bool enable) { filter6581->enable(enable); filter8580->enable(enable); } void SID::voiceSync(bool sync) { if (sync) { // Synchronize the 3 waveform generators. for (int i = 0; i < 3; i++) { voice[i]->wave()->synchronize(voice[(i + 1) % 3]->wave(), voice[(i + 2) % 3]->wave()); } } // Calculate the time to next voice sync nextVoiceSync = std::numeric_limits::max(); for (int i = 0; i < 3; i++) { WaveformGenerator* const wave = voice[i]->wave(); const unsigned int freq = wave->readFreq(); if (wave->readTest() || freq == 0 || !voice[(i + 1) % 3]->wave()->readSync()) { continue; } const unsigned int accumulator = wave->readAccumulator(); const unsigned int thisVoiceSync = ((0x7fffff - accumulator) & 0xffffff) / freq + 1; if (thisVoiceSync < nextVoiceSync) { nextVoiceSync = thisVoiceSync; } } } void SID::setChipModel(ChipModel model) { switch (model) { case MOS6581: filter = filter6581.get(); scaleFactor = 3; modelTTL = BUS_TTL_6581; break; case MOS8580: filter = filter8580.get(); scaleFactor = 5; modelTTL = BUS_TTL_8580; break; default: throw SIDError("Unknown chip type"); } this->model = model; // calculate waveform-related tables matrix_t* wavetables = WaveformCalculator::getInstance()->getWaveTable(); matrix_t* pulldowntables = WaveformCalculator::getInstance()->buildPulldownTable(model); // calculate envelope DAC table { Dac dacBuilder(ENV_DAC_BITS); dacBuilder.kinkedDac(model); for (unsigned int i = 0; i < (1 << ENV_DAC_BITS); i++) { envDAC[i] = static_cast(dacBuilder.getOutput(i)); } } // calculate oscillator DAC table const bool is6581 = model == MOS6581; { Dac dacBuilder(OSC_DAC_BITS); dacBuilder.kinkedDac(model); const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : OFFSET_8580); for (unsigned int i = 0; i < (1 << OSC_DAC_BITS); i++) { const double dacValue = dacBuilder.getOutput(i); oscDAC[i] = static_cast(dacValue - offset); } } // set voice tables for (int i = 0; i < 3; i++) { voice[i]->setEnvDAC(envDAC); voice[i]->setWavDAC(oscDAC); voice[i]->wave()->setModel(is6581); voice[i]->wave()->setWaveformModels(wavetables); voice[i]->wave()->setPulldownModels(pulldowntables); } } void SID::reset() { for (int i = 0; i < 3; i++) { voice[i]->reset(); } filter6581->reset(); filter8580->reset(); externalFilter->reset(); if (resampler.get()) { resampler->reset(); } busValue = 0; busValueTtl = 0; voiceSync(false); } void SID::input(int value) { filter6581->input(value); filter8580->input(value); } unsigned char SID::read(int offset) { switch (offset) { case 0x19: // X value of paddle busValue = potX->readPOT(); busValueTtl = modelTTL; break; case 0x1a: // Y value of paddle busValue = potY->readPOT(); busValueTtl = modelTTL; break; case 0x1b: // Voice #3 waveform output busValue = voice[2]->wave()->readOSC(); busValueTtl = modelTTL; break; case 0x1c: // Voice #3 ADSR output busValue = voice[2]->envelope()->readENV(); busValueTtl = modelTTL; break; default: // Reading from a write-only or non-existing register // makes the bus discharge faster. // Emulate this by halving the residual TTL. busValueTtl /= 2; break; } return busValue; } void SID::write(int offset, unsigned char value) { busValue = value; busValueTtl = modelTTL; switch (offset) { case 0x00: // Voice #1 frequency (Low-byte) voice[0]->wave()->writeFREQ_LO(value); break; case 0x01: // Voice #1 frequency (High-byte) voice[0]->wave()->writeFREQ_HI(value); break; case 0x02: // Voice #1 pulse width (Low-byte) voice[0]->wave()->writePW_LO(value); break; case 0x03: // Voice #1 pulse width (bits #8-#15) voice[0]->wave()->writePW_HI(value); break; case 0x04: // Voice #1 control register voice[0]->writeCONTROL_REG(muted[0] ? 0 : value); break; case 0x05: // Voice #1 Attack and Decay length voice[0]->envelope()->writeATTACK_DECAY(value); break; case 0x06: // Voice #1 Sustain volume and Release length voice[0]->envelope()->writeSUSTAIN_RELEASE(value); break; case 0x07: // Voice #2 frequency (Low-byte) voice[1]->wave()->writeFREQ_LO(value); break; case 0x08: // Voice #2 frequency (High-byte) voice[1]->wave()->writeFREQ_HI(value); break; case 0x09: // Voice #2 pulse width (Low-byte) voice[1]->wave()->writePW_LO(value); break; case 0x0a: // Voice #2 pulse width (bits #8-#15) voice[1]->wave()->writePW_HI(value); break; case 0x0b: // Voice #2 control register voice[1]->writeCONTROL_REG(muted[1] ? 0 : value); break; case 0x0c: // Voice #2 Attack and Decay length voice[1]->envelope()->writeATTACK_DECAY(value); break; case 0x0d: // Voice #2 Sustain volume and Release length voice[1]->envelope()->writeSUSTAIN_RELEASE(value); break; case 0x0e: // Voice #3 frequency (Low-byte) voice[2]->wave()->writeFREQ_LO(value); break; case 0x0f: // Voice #3 frequency (High-byte) voice[2]->wave()->writeFREQ_HI(value); break; case 0x10: // Voice #3 pulse width (Low-byte) voice[2]->wave()->writePW_LO(value); break; case 0x11: // Voice #3 pulse width (bits #8-#15) voice[2]->wave()->writePW_HI(value); break; case 0x12: // Voice #3 control register voice[2]->writeCONTROL_REG(muted[2] ? 0 : value); break; case 0x13: // Voice #3 Attack and Decay length voice[2]->envelope()->writeATTACK_DECAY(value); break; case 0x14: // Voice #3 Sustain volume and Release length voice[2]->envelope()->writeSUSTAIN_RELEASE(value); break; case 0x15: // Filter cut off frequency (bits #0-#2) filter6581->writeFC_LO(value); filter8580->writeFC_LO(value); break; case 0x16: // Filter cut off frequency (bits #3-#10) filter6581->writeFC_HI(value); filter8580->writeFC_HI(value); break; case 0x17: // Filter control filter6581->writeRES_FILT(value); filter8580->writeRES_FILT(value); break; case 0x18: // Volume and filter modes filter6581->writeMODE_VOL(value); filter8580->writeMODE_VOL(value); break; default: break; } // Update voicesync just in case. voiceSync(false); } void SID::setSamplingParameters(double clockFrequency, SamplingMethod method, double samplingFrequency, double highestAccurateFrequency) { externalFilter->setClockFrequency(clockFrequency); switch (method) { case DECIMATE: resampler.reset(new ZeroOrderResampler(clockFrequency, samplingFrequency)); break; case RESAMPLE: resampler.reset(TwoPassSincResampler::create(clockFrequency, samplingFrequency, highestAccurateFrequency)); break; default: throw SIDError("Unknown sampling method"); } } void SID::clockSilent(unsigned int cycles) { ageBusValue(cycles); while (cycles != 0) { int delta_t = std::min(nextVoiceSync, cycles); if (delta_t > 0) { for (int i = 0; i < delta_t; i++) { // clock waveform generators (can affect OSC3) voice[0]->wave()->clock(); voice[1]->wave()->clock(); voice[2]->wave()->clock(); voice[0]->wave()->output(voice[2]->wave()); voice[1]->wave()->output(voice[0]->wave()); voice[2]->wave()->output(voice[1]->wave()); // clock ENV3 only voice[2]->envelope()->clock(); } cycles -= delta_t; nextVoiceSync -= delta_t; } if (nextVoiceSync == 0) { voiceSync(true); } } } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/OpAmp.cpp0000644000175100001770000000447214544470307022000 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #include "OpAmp.h" #include #include "siddefs-fp.h" namespace reSIDfp { const double EPSILON = 1e-8; double OpAmp::solve(double n, double vi) const { // Start off with an estimate of x and a root bracket [ak, bk]. // f is decreasing, so that f(ak) > 0 and f(bk) < 0. double ak = vmin; double bk = vmax; const double a = n + 1.; const double b = Vddt; const double b_vi = (b > vi) ? (b - vi) : 0.; const double c = n * (b_vi * b_vi); for (;;) { const double xk = x; // Calculate f and df. Spline::Point out = opamp->evaluate(x); const double vo = out.x; const double dvo = out.y; const double b_vx = (b > x) ? b - x : 0.; const double b_vo = (b > vo) ? b - vo : 0.; // f = a*(b - vx)^2 - c - (b - vo)^2 const double f = a * (b_vx * b_vx) - c - (b_vo * b_vo); // df = 2*((b - vo)*dvo - a*(b - vx)) const double df = 2. * (b_vo * dvo - a * b_vx); // Newton-Raphson step: xk1 = xk - f(xk)/f'(xk) x -= f / df; if (unlikely(fabs(x - xk) < EPSILON)) { out = opamp->evaluate(x); return out.x; } // Narrow down root bracket. (f < 0. ? bk : ak) = xk; if (unlikely(x <= ak) || unlikely(x >= bk)) { // Bisection step (ala Dekker's method). x = (ak + bk) * 0.5; } } } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/array.h0000644000175100001770000000372114544470307021543 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2011-2014 Leandro Nini * * 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 */ #ifndef ARRAY_H #define ARRAY_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_CXX11 # include #endif /** * Counter. */ class counter { private: #ifndef HAVE_CXX11 volatile unsigned int c; #else std::atomic c; #endif public: counter() : c(1) {} void increase() { ++c; } unsigned int decrease() { return --c; } }; /** * Reference counted pointer to matrix wrapper, for use with standard containers. */ template class matrix { private: T* data; counter* count; const unsigned int x, y; public: matrix(unsigned int x, unsigned int y) : data(new T[x * y]), count(new counter()), x(x), y(y) {} matrix(const matrix& p) : data(p.data), count(p.count), x(p.x), y(p.y) { count->increase(); } ~matrix() { if (count->decrease() == 0) { delete count; delete [] data; } } unsigned int length() const { return x * y; } T* operator[](unsigned int a) { return &data[a * y]; } T const* operator[](unsigned int a) const { return &data[a * y]; } }; typedef matrix matrix_t; #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Dac.cpp0000644000175100001770000000626314544470307021453 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2016 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #include "Dac.h" namespace reSIDfp { Dac::Dac(unsigned int bits) : dac(new double[bits]), dacLength(bits) {} Dac::~Dac() { delete [] dac; } double Dac::getOutput(unsigned int input) const { double dacValue = 0.; for (unsigned int i = 0; i < dacLength; i++) { if ((input & (1 << i)) != 0) { dacValue += dac[i]; } } return dacValue; } void Dac::kinkedDac(ChipModel chipModel) { const double R_INFINITY = 1e6; // Non-linearity parameter, 8580 DACs are perfectly linear const double _2R_div_R = chipModel == MOS6581 ? 2.20 : 2.00; // 6581 DACs are not terminated by a 2R resistor const bool term = chipModel == MOS8580; double Vsum = 0.; // Calculate voltage contribution by each individual bit in the R-2R ladder. for (unsigned int set_bit = 0; set_bit < dacLength; set_bit++) { double Vn = 1.; // Normalized bit voltage. double R = 1.; // Normalized R const double _2R = _2R_div_R * R; // 2R double Rn = term ? // Rn = 2R for correct termination, _2R : R_INFINITY; // INFINITY for missing termination. unsigned int bit; // Calculate DAC "tail" resistance by repeated parallel substitution. for (bit = 0; bit < set_bit; bit++) { Rn = (Rn == R_INFINITY) ? R + _2R : R + (_2R * Rn) / (_2R + Rn); // R + 2R || Rn } // Source transformation for bit voltage. if (Rn == R_INFINITY) { Rn = _2R; } else { Rn = (_2R * Rn) / (_2R + Rn); // 2R || Rn Vn = Vn * Rn / _2R; } // Calculate DAC output voltage by repeated source transformation from // the "tail". for (++bit; bit < dacLength; bit++) { Rn += R; const double I = Vn / Rn; Rn = (_2R * Rn) / (_2R + Rn); // 2R || Rn Vn = Rn * I; } dac[set_bit] = Vn; Vsum += Vn; } // Normalize to integerish behavior Vsum /= 1 << dacLength; for (unsigned int i = 0; i < dacLength; i++) { dac[i] /= Vsum; } } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Spline.cpp0000644000175100001770000000642614544470307022217 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #include "Spline.h" #include #include namespace reSIDfp { Spline::Spline(const std::vector &input) : params(input.size()), c(¶ms[0]) { assert(input.size() > 2); const size_t coeffLength = input.size() - 1; std::vector dxs(coeffLength); std::vector ms(coeffLength); // Get consecutive differences and slopes for (size_t i = 0; i < coeffLength; i++) { assert(input[i].x < input[i + 1].x); const double dx = input[i + 1].x - input[i].x; const double dy = input[i + 1].y - input[i].y; dxs[i] = dx; ms[i] = dy/dx; } // Get degree-1 coefficients params[0].c = ms[0]; for (size_t i = 1; i < coeffLength; i++) { const double m = ms[i - 1]; const double mNext = ms[i]; if (m * mNext <= 0) { params[i].c = 0.0; } else { const double dx = dxs[i - 1]; const double dxNext = dxs[i]; const double common = dx + dxNext; params[i].c = 3.0 * common / ((common + dxNext) / m + (common + dx) / mNext); } } params[coeffLength].c = ms[coeffLength - 1]; // Get degree-2 and degree-3 coefficients for (size_t i = 0; i < coeffLength; i++) { params[i].x1 = input[i].x; params[i].x2 = input[i + 1].x; params[i].d = input[i].y; const double c1 = params[i].c; const double m = ms[i]; const double invDx = 1.0 / dxs[i]; const double common = c1 + params[i + 1].c - m - m; params[i].b = (m - c1 - common) * invDx; params[i].a = common * invDx * invDx; } // Fix the upper range, because we interpolate outside original bounds if necessary. params[coeffLength - 1].x2 = std::numeric_limits::max(); } Spline::Point Spline::evaluate(double x) const { if ((x < c->x1) || (x > c->x2)) { for (size_t i = 0; i < params.size(); i++) { if (x <= params[i].x2) { c = ¶ms[i]; break; } } } // Interpolate const double diff = x - c->x1; Point out; // y = a*x^3 + b*x^2 + c*x + d out.x = ((c->a * diff + c->b) * diff + c->c) * diff + c->d; // dy = 3*a*x^2 + 2*b*x + c out.y = (3.0 * c->a * diff + 2.0 * c->b) * diff + c->c; return out; } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/WaveformGenerator.cpp0000644000175100001770000003757314544470307024431 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #define WAVEFORMGENERATOR_CPP #include "WaveformGenerator.h" namespace reSIDfp { /** * Number of cycles after which the waveform output fades to 0 when setting * the waveform register to 0. * Values measured on warm chips (6581R3/R4 and 8580R5) * checking OSC3. * Times vary wildly with temperature and may differ * from chip to chip so the numbers here represent * only the big difference between the old and new models. * * See [VICE Bug #290](http://sourceforge.net/p/vice-emu/bugs/290/) * and [VICE Bug #1128](http://sourceforge.net/p/vice-emu/bugs/1128/) */ // ~95ms const unsigned int FLOATING_OUTPUT_TTL_6581R3 = 54000; const unsigned int FLOATING_OUTPUT_FADE_6581R3 = 1400; // ~1s const unsigned int FLOATING_OUTPUT_TTL_6581R4 = 1000000; // ~1s const unsigned int FLOATING_OUTPUT_TTL_8580R5 = 800000; const unsigned int FLOATING_OUTPUT_FADE_8580R5 = 50000; /** * Number of cycles after which the shift register is reset * when the test bit is set. * Values measured on warm chips (6581R3/R4 and 8580R5) * checking OSC3. * Times vary wildly with temperature and may differ * from chip to chip so the numbers here represent * only the big difference between the old and new models. */ // ~210ms const unsigned int SHIFT_REGISTER_RESET_6581R3 = 50000; const unsigned int SHIFT_REGISTER_FADE_6581R3 = 15000; // ~2.15s const unsigned int SHIFT_REGISTER_RESET_6581R4 = 2150000; // ~2.8s const unsigned int SHIFT_REGISTER_RESET_8580R5 = 986000; const unsigned int SHIFT_REGISTER_FADE_8580R5 = 314300; const unsigned int shift_mask = ~( (1u << 2) | // Bit 20 (1u << 4) | // Bit 18 (1u << 8) | // Bit 14 (1u << 11) | // Bit 11 (1u << 13) | // Bit 9 (1u << 17) | // Bit 5 (1u << 20) | // Bit 2 (1u << 22) // Bit 0 ); /* * This is what happens when the lfsr is clocked: * * cycle 0: bit 19 of the accumulator goes from low to high, the noise register acts normally, * the output may pulldown a bit; * * cycle 1: first phase of the shift, the bits are interconnected and the output of each bit * is latched into the following. The output may overwrite the latched value. * * cycle 2: second phase of the shift, the latched value becomes active in the first * half of the clock and from the second half the register returns to normal operation. * * When the test or reset lines are active the first phase is executed at every cyle * until the signal is released triggering the second phase. * * | | bit n | bit n+1 * | bit19 | latch output | latch output * -----+-------+--------------+-------------- * phi1 | 0 | A <-> A | B <-> B * phi2 | 0 | A <-> A | B <-> B * -----+-------+--------------+-------------- * phi1 | 1 | A <-> A | B <-> B <- bit19 raises * phi2 | 1 | A <-> A | B <-> B * -----+-------+--------------+-------------- * phi1 | 1 | X A --|-> A B <- shift phase 1 * phi2 | 1 | X A --|-> A B * -----+-------+--------------+-------------- * phi1 | 1 | X --> X | A --> A <- shift phase 2 * phi2 | 1 | X <-> X | A <-> A * * * Normal cycles * ------------- * Normally, when noise is selected along with another waveform, * c1 and c2 are closed and the output bits pull down the corresponding * shift register bits. * * noi_out_x noi_out_x+1 * ^ ^ * | | * +-------------+ +-------------+ * | | | | * +---o<|---+ | +---o<|---+ | * | | | | | | * c2 | c1 | | c2 | c1 | | * | | | | | | * >---/---+---|>o---+ +---/---+---|>o---+ +---/---> * LC LC LC * * * Shift phase 1 * ------------- * During shift phase 1 c1 and c2 are open, the SR bits are floating * and will be driven by the output of combined waveforms, * or slowly turn high. * * noi_out_x noi_out_x+1 * ^ ^ * | | * +-------------+ +-------------+ * | | | | * +---o<|---+ | +---o<|---+ | * | | | | | | * c2 / c1 / | c2 / c1 / | * | | | | | | * >-------+---|>o---+ +-------+---|>o---+ +-------> * LC LC LC * * * Shift phase 2 (phi1) * -------------------- * During the first half cycle of shift phase 2 c1 is closed * so the value from of noi_out_x-1 enters the bit. * * noi_out_x noi_out_x+1 * ^ ^ * | | * +-------------+ +-------------+ * | | | | * +---o<|---+ | +---o<|---+ | * | | | | | | * c2 / c1 | | c2 / c1 | | * | | | | | | * >---/---+---|>o---+ +---/---+---|>o---+ +---/---> * LC LC LC * * * Shift phase 2 (phi2) * -------------------- * On the second half of shift phase 2 c2 closes and * we're back to normal cycles. */ inline bool do_writeback(unsigned int waveform_old, unsigned int waveform_new, bool is6581) { // no writeback without combined waveforms if (waveform_old <= 8) // fixes SID/noisewriteback/noise_writeback_test2-{old,new} return false; if (waveform_new < 8) return false; if ((waveform_new == 8) // breaks noise_writeback_check_F_to_8_old // but fixes simple and scan && (waveform_old != 0xf)) { // fixes // noise_writeback_check_9_to_8_old // noise_writeback_check_A_to_8_old // noise_writeback_check_B_to_8_old // noise_writeback_check_D_to_8_old // noise_writeback_check_E_to_8_old // noise_writeback_check_F_to_8_old // noise_writeback_check_9_to_8_new // noise_writeback_check_A_to_8_new // noise_writeback_check_D_to_8_new // noise_writeback_check_E_to_8_new // noise_writeback_test1-{old,new} return false; } // What's happening here? if (is6581 && ((((waveform_old & 0x3) == 0x1) && ((waveform_new & 0x3) == 0x2)) || (((waveform_old & 0x3) == 0x2) && ((waveform_new & 0x3) == 0x1)))) { // fixes // noise_writeback_check_9_to_A_old // noise_writeback_check_9_to_E_old // noise_writeback_check_A_to_9_old // noise_writeback_check_A_to_D_old // noise_writeback_check_D_to_A_old // noise_writeback_check_E_to_9_old return false; } if (waveform_old == 0xc) { // fixes // noise_writeback_check_C_to_A_new return false; } if (waveform_new == 0xc) { // fixes // noise_writeback_check_9_to_C_old // noise_writeback_check_A_to_C_old return false; } // ok do the writeback return true; } inline unsigned int get_noise_writeback(unsigned int waveform_output) { return ((waveform_output & (1u << 11)) >> 9) | // Bit 11 -> bit 20 ((waveform_output & (1u << 10)) >> 6) | // Bit 10 -> bit 18 ((waveform_output & (1u << 9)) >> 1) | // Bit 9 -> bit 14 ((waveform_output & (1u << 8)) << 3) | // Bit 8 -> bit 11 ((waveform_output & (1u << 7)) << 6) | // Bit 7 -> bit 9 ((waveform_output & (1u << 6)) << 11) | // Bit 6 -> bit 5 ((waveform_output & (1u << 5)) << 15) | // Bit 5 -> bit 2 ((waveform_output & (1u << 4)) << 18); // Bit 4 -> bit 0 } /* * Perform the actual shifting, moving the latched value into following bits. * The XORing for bit0 is done in this cycle using the test bit latched during * the previous phi2 cycle. */ void WaveformGenerator::shift_phase2(unsigned int waveform_old, unsigned int waveform_new) { if (do_writeback(waveform_old, waveform_new, is6581)) { // if noise is combined with another waveform the output drives the SR bits shift_latch = (shift_register & shift_mask) | get_noise_writeback(waveform_output); } // bit0 = (bit22 | test | reset) ^ bit17 = 1 ^ bit17 = ~bit17 const unsigned int bit22 = ((test_or_reset ? 1 : 0) | shift_latch) << 22; const unsigned int bit0 = (bit22 ^ (shift_latch << 17)) & (1 << 22); shift_register = (shift_latch >> 1) | bit0; #ifdef TRACE std::cout << std::hex << shift_latch << " -> " << shift_register << std::endl; #endif set_noise_output(); } void WaveformGenerator::write_shift_register() { if (unlikely(waveform > 0x8)) { #if 0 // FIXME this breaks SID/wf12nsr/wf12nsr if (waveform == 0xc) // fixes // noise_writeback_check_8_to_C_old // noise_writeback_check_9_to_C_old // noise_writeback_check_A_to_C_old // noise_writeback_check_C_to_C_old return; #endif // Write changes to the shift register output caused by combined waveforms // back into the shift register. if (likely(shift_pipeline != 1) && !test) { #ifdef TRACE std::cout << "write shift_register" << std::endl; #endif // the output pulls down the SR bits shift_register = shift_register & (shift_mask | get_noise_writeback(waveform_output)); noise_output &= waveform_output; } else { #ifdef TRACE std::cout << "write shift_latch" << std::endl; #endif // shift phase 1: the output drives the SR bits noise_output = waveform_output; } set_no_noise_or_noise_output(); } } void WaveformGenerator::set_noise_output() { noise_output = ((shift_register & (1u << 2)) << 9) | // Bit 20 -> bit 11 ((shift_register & (1u << 4)) << 6) | // Bit 18 -> bit 10 ((shift_register & (1u << 8)) << 1) | // Bit 14 -> bit 9 ((shift_register & (1u << 11)) >> 3) | // Bit 11 -> bit 8 ((shift_register & (1u << 13)) >> 6) | // Bit 9 -> bit 7 ((shift_register & (1u << 17)) >> 11) | // Bit 5 -> bit 6 ((shift_register & (1u << 20)) >> 15) | // Bit 2 -> bit 5 ((shift_register & (1u << 22)) >> 18); // Bit 0 -> bit 4 set_no_noise_or_noise_output(); } void WaveformGenerator::setWaveformModels(matrix_t* models) { model_wave = models; } void WaveformGenerator::setPulldownModels(matrix_t* models) { model_pulldown = models; } void WaveformGenerator::synchronize(WaveformGenerator* syncDest, const WaveformGenerator* syncSource) const { // A special case occurs when a sync source is synced itself on the same // cycle as when its MSB is set high. In this case the destination will // not be synced. This has been verified by sampling OSC3. if (unlikely(msb_rising) && syncDest->sync && !(sync && syncSource->msb_rising)) { syncDest->accumulator = 0; } } void WaveformGenerator::set_no_noise_or_noise_output() { no_noise_or_noise_output = no_noise | noise_output; } void WaveformGenerator::writeCONTROL_REG(unsigned char control) { const unsigned int waveform_prev = waveform; const bool test_prev = test; waveform = (control >> 4) & 0x0f; test = (control & 0x08) != 0; sync = (control & 0x02) != 0; // Substitution of accumulator MSB when sawtooth = 0, ring_mod = 1. ring_msb_mask = ((~control >> 5) & (control >> 2) & 0x1) << 23; if (waveform != waveform_prev) { // Set up waveform tables wave = (*model_wave)[waveform & 0x3]; // We assume tha combinations including noise // behave the same as without switch (waveform & 0x7) { case 3: pulldown = (*model_pulldown)[0]; break; case 4: pulldown = (waveform & 0x8) ? (*model_pulldown)[4] : nullptr; break; case 5: pulldown = (*model_pulldown)[1]; break; case 6: pulldown = (*model_pulldown)[2]; break; case 7: pulldown = (*model_pulldown)[3]; break; default: pulldown = nullptr; break; } // no_noise and no_pulse are used in set_waveform_output() as bitmasks to // only let the noise or pulse influence the output when the noise or pulse // waveforms are selected. no_noise = (waveform & 0x8) != 0 ? 0x000 : 0xfff; set_no_noise_or_noise_output(); no_pulse = (waveform & 0x4) != 0 ? 0x000 : 0xfff; if (waveform == 0) { // Change to floating DAC input. // Reset fading time for floating DAC input. floating_output_ttl = is6581 ? FLOATING_OUTPUT_TTL_6581R3 : FLOATING_OUTPUT_TTL_8580R5; } } if (test != test_prev) { if (test) { // Reset accumulator. accumulator = 0; // Flush shift pipeline. shift_pipeline = 0; // Latch the shift register value. shift_latch = shift_register; #ifdef TRACE std::cout << "shift phase 1 (test)" << std::endl; #endif // Set reset time for shift register. shift_register_reset = is6581 ? SHIFT_REGISTER_RESET_6581R3 : SHIFT_REGISTER_RESET_8580R5; } else { // When the test bit is falling, the second phase of the shift is // completed by enabling SRAM write. shift_phase2(waveform_prev, waveform); } } } void WaveformGenerator::waveBitfade() { waveform_output &= waveform_output >> 1; osc3 = waveform_output; if (waveform_output != 0) floating_output_ttl = is6581 ? FLOATING_OUTPUT_FADE_6581R3 : FLOATING_OUTPUT_FADE_8580R5; } void WaveformGenerator::shiftregBitfade() { shift_register |= shift_register >> 1; shift_register |= 0x400000; if (shift_register != 0x7fffff) shift_register_reset = is6581 ? SHIFT_REGISTER_FADE_6581R3 : SHIFT_REGISTER_FADE_8580R5; } void WaveformGenerator::reset() { // accumulator is not changed on reset freq = 0; pw = 0; msb_rising = false; waveform = 0; osc3 = 0; test = false; sync = false; wave = model_wave ? (*model_wave)[0] : nullptr; pulldown = nullptr; ring_msb_mask = 0; no_noise = 0xfff; no_pulse = 0xfff; pulse_output = 0xfff; shift_register_reset = 0; shift_register = 0x7fffff; // when reset is released the shift register is clocked once // so the lower bit is zeroed out // bit0 = (bit22 | test) ^ bit17 = 1 ^ 1 = 0 test_or_reset = true; shift_latch = shift_register; shift_phase2(0, 0); shift_pipeline = 0; waveform_output = 0; floating_output_ttl = 0; } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/SID.h0000644000175100001770000002320214544470307021040 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2016 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #ifndef SIDFP_H #define SIDFP_H #include #include "siddefs-fp.h" #include "sidcxx11.h" namespace reSIDfp { class Filter; class Filter6581; class Filter8580; class ExternalFilter; class Potentiometer; class Voice; class Resampler; /** * SID error exception. */ class SIDError { private: const char* message; public: SIDError(const char* msg) : message(msg) {} const char* getMessage() const { return message; } }; /** * MOS6581/MOS8580 emulation. */ class SID { private: /// Currently active filter Filter* filter; /// Filter used, if model is set to 6581 std::unique_ptr const filter6581; /// Filter used, if model is set to 8580 std::unique_ptr const filter8580; /** * External filter that provides high-pass and low-pass filtering * to adjust sound tone slightly. */ std::unique_ptr const externalFilter; /// Resampler used by audio generation code. std::unique_ptr resampler; /// Paddle X register support std::unique_ptr const potX; /// Paddle Y register support std::unique_ptr const potY; /// SID voices std::unique_ptr voice[3]; /// Used to amplify the output by x/2 to get an adequate playback volume int scaleFactor; /// Time to live for the last written value int busValueTtl; /// Current chip model's bus value TTL int modelTTL; /// Time until #voiceSync must be run. unsigned int nextVoiceSync; /// Currently active chip model. ChipModel model; /// Last written value unsigned char busValue; /// Flags for muted channels bool muted[3]; /** * Emulated nonlinearity of the envelope DAC. * * @See Dac */ float envDAC[256]; /** * Emulated nonlinearity of the oscillator DAC. * * @See Dac */ float oscDAC[4096]; private: /** * Age the bus value and zero it if it's TTL has expired. * * @param n the number of cycles */ void ageBusValue(unsigned int n); /** * Get output sample. * * @return the output sample */ int output() const; /** * Calculate the numebr of cycles according to current parameters * that it takes to reach sync. * * @param sync whether to do the actual voice synchronization */ void voiceSync(bool sync); public: SID(); ~SID(); /** * Set chip model. * * @param model chip model to use * @throw SIDError */ void setChipModel(ChipModel model); /** * Get currently emulated chip model. */ ChipModel getChipModel() const { return model; } /** * SID reset. */ void reset(); /** * 16-bit input (EXT IN). Write 16-bit sample to audio input. NB! The caller * is responsible for keeping the value within 16 bits. Note that to mix in * an external audio signal, the signal should be resampled to 1MHz first to * avoid sampling noise. * * @param value input level to set */ void input(int value); /** * Read registers. * * Reading a write only register returns the last char written to any SID register. * The individual bits in this value start to fade down towards zero after a few cycles. * All bits reach zero within approximately $2000 - $4000 cycles. * It has been claimed that this fading happens in an orderly fashion, * however sampling of write only registers reveals that this is not the case. * NOTE: This is not correctly modeled. * The actual use of write only registers has largely been made * in the belief that all SID registers are readable. * To support this belief the read would have to be done immediately * after a write to the same register (remember that an intermediate write * to another register would yield that value instead). * With this in mind we return the last value written to any SID register * for $2000 cycles without modeling the bit fading. * * @param offset SID register to read * @return value read from chip */ unsigned char read(int offset); /** * Write registers. * * @param offset chip register to write * @param value value to write */ void write(int offset, unsigned char value); /** * SID voice muting. * * @param channel channel to modify * @param enable is muted? */ void mute(int channel, bool enable) { muted[channel] = enable; } /** * Setting of SID sampling parameters. * * Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. * The default end of passband frequency is pass_freq = 0.9*sample_freq/2 * for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample frequencies. * * For resampling, the ratio between the clock frequency and the sample frequency * is limited as follows: 125*clock_freq/sample_freq < 16384 * E.g. provided a clock frequency of ~ 1MHz, the sample frequency can not be set * lower than ~ 8kHz. A lower sample frequency would make the resampling code * overfill its 16k sample ring buffer. * * The end of passband frequency is also limited: pass_freq <= 0.9*sample_freq/2 * * E.g. for a 44.1kHz sampling rate the end of passband frequency * is limited to slightly below 20kHz. * This constraint ensures that the FIR table is not overfilled. * * @param clockFrequency System clock frequency at Hz * @param method sampling method to use * @param samplingFrequency Desired output sampling rate * @param highestAccurateFrequency * @throw SIDError */ void setSamplingParameters(double clockFrequency, SamplingMethod method, double samplingFrequency, double highestAccurateFrequency); /** * Clock SID forward using chosen output sampling algorithm. * * @param cycles c64 clocks to clock * @param buf audio output buffer * @return number of samples produced */ int clock(unsigned int cycles, short* buf); /** * Clock SID forward with no audio production. * * _Warning_: * You can't mix this method of clocking with the audio-producing * clock() because components that don't affect OSC3/ENV3 are not * emulated. * * @param cycles c64 clocks to clock. */ void clockSilent(unsigned int cycles); /** * Set filter curve parameter for 6581 model. * * @see Filter6581::setFilterCurve(double) */ void setFilter6581Curve(double filterCurve); /** * Set filter curve parameter for 8580 model. * * @see Filter8580::setFilterCurve(double) */ void setFilter8580Curve(double filterCurve); /** * Enable filter emulation. * * @param enable false to turn off filter emulation */ void enableFilter(bool enable); }; } // namespace reSIDfp #if RESID_INLINING || defined(SID_CPP) #include #include "Filter.h" #include "ExternalFilter.h" #include "Voice.h" #include "resample/Resampler.h" namespace reSIDfp { RESID_INLINE void SID::ageBusValue(unsigned int n) { if (likely(busValueTtl != 0)) { busValueTtl -= n; if (unlikely(busValueTtl <= 0)) { busValue = 0; busValueTtl = 0; } } } RESID_INLINE int SID::output() const { const int v1 = voice[0]->output(voice[2]->wave()); const int v2 = voice[1]->output(voice[0]->wave()); const int v3 = voice[2]->output(voice[1]->wave()); const int input = (scaleFactor * static_cast(filter->clock(v1, v2, v3))) / 2; return externalFilter->clock(input); } RESID_INLINE int SID::clock(unsigned int cycles, short* buf) { ageBusValue(cycles); int s = 0; while (cycles != 0) { unsigned int delta_t = std::min(nextVoiceSync, cycles); if (likely(delta_t > 0)) { for (unsigned int i = 0; i < delta_t; i++) { // clock waveform generators voice[0]->wave()->clock(); voice[1]->wave()->clock(); voice[2]->wave()->clock(); // clock envelope generators voice[0]->envelope()->clock(); voice[1]->envelope()->clock(); voice[2]->envelope()->clock(); if (unlikely(resampler->input(output()))) { buf[s++] = resampler->getOutput(); } } cycles -= delta_t; nextVoiceSync -= delta_t; } if (unlikely(nextVoiceSync == 0)) { voiceSync(true); } } return s; } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/version.cc0000644000175100001770000000203614544470307022246 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 2004 Dag Lem // // 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. // --------------------------------------------------------------------------- #define __VERSION_CC__ #include "siddefs-fp.h" libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Filter.cpp0000644000175100001770000000410114544470307022176 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #include "Filter.h" namespace reSIDfp { void Filter::enable(bool enable) { enabled = enable; if (enabled) { writeRES_FILT(filt); } else { filt1 = filt2 = filt3 = filtE = false; } } void Filter::reset() { writeFC_LO(0); writeFC_HI(0); writeMODE_VOL(0); writeRES_FILT(0); } void Filter::writeFC_LO(unsigned char fc_lo) { fc = (fc & 0x7f8) | (fc_lo & 0x007); updatedCenterFrequency(); } void Filter::writeFC_HI(unsigned char fc_hi) { fc = (fc_hi << 3 & 0x7f8) | (fc & 0x007); updatedCenterFrequency(); } void Filter::writeRES_FILT(unsigned char res_filt) { filt = res_filt; updateResonance((res_filt >> 4) & 0x0f); if (enabled) { filt1 = (filt & 0x01) != 0; filt2 = (filt & 0x02) != 0; filt3 = (filt & 0x04) != 0; filtE = (filt & 0x08) != 0; } updatedMixing(); } void Filter::writeMODE_VOL(unsigned char mode_vol) { vol = mode_vol & 0x0f; lp = (mode_vol & 0x10) != 0; bp = (mode_vol & 0x20) != 0; hp = (mode_vol & 0x40) != 0; voice3off = (mode_vol & 0x80) != 0; updatedMixing(); } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/ExternalFilter.h0000644000175100001770000000663714544470307023366 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #ifndef EXTERNALFILTER_H #define EXTERNALFILTER_H #include "siddefs-fp.h" namespace reSIDfp { /** * The audio output stage in a Commodore 64 consists of two STC networks, a * low-pass RC filter with 3 dB frequency 16kHz followed by a DC-blocker which * acts as a high-pass filter with a cutoff dependent on the attached audio * equipment impedance. Here we suppose an impedance of 10kOhm resulting * in a 3 dB attenuation at 1.6Hz. * To operate properly the 6581 audio output needs a pull-down resistor * (1KOhm recommended, not needed on 8580) * * ~~~ * 9/12V * -----+ * audio| 10k | * +---o----R---o--------o-----(K) +----- * out | | | | | |audio * -----+ R 1k C 1000 | | 10 uF | * | | pF +-C----o-----C-----+ 10k * 470 | | * GND GND pF R 1K | amp * * * | +----- * * GND * ~~~ * * The STC networks are connected with a [BJT] based [common collector] * used as a voltage follower (featuring a 2SC1815 NPN transistor). * * The C64c board additionally includes a [bootstrap] condenser to increase * the input impedance of the common collector. * * [BJT]: https://en.wikipedia.org/wiki/Bipolar_junction_transistor * [common collector]: https://en.wikipedia.org/wiki/Common_collector * [bootstrap]: https://en.wikipedia.org/wiki/Bootstrapping_(electronics) */ class ExternalFilter { private: /// Lowpass filter voltage int Vlp; /// Highpass filter voltage int Vhp; int w0lp_1_s7; int w0hp_1_s17; public: /** * SID clocking. * * @param input */ int clock(int input); /** * Constructor. */ ExternalFilter(); /** * Setup of the external filter sampling parameters. * * @param frequency the main system clock frequency */ void setClockFrequency(double frequency); /** * SID reset. */ void reset(); }; } // namespace reSIDfp #if RESID_INLINING || defined(EXTERNALFILTER_CPP) namespace reSIDfp { RESID_INLINE int ExternalFilter::clock(int input) { const int Vi = (input<<11) - (1 << (11+15)); const int dVlp = (w0lp_1_s7 * (Vi - Vlp) >> 7); const int dVhp = (w0hp_1_s17 * (Vlp - Vhp) >> 17); Vlp += dVlp; Vhp += dVhp; return (Vlp - Vhp) >> 11; } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/WaveformGenerator.h0000644000175100001770000003111214544470307024055 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef WAVEFORMGENERATOR_H #define WAVEFORMGENERATOR_H #include "siddefs-fp.h" #include "array.h" #include "sidcxx11.h" // print SR debugging info //#define TRACE 1 #ifdef TRACE # include #endif namespace reSIDfp { /** * A 24 bit accumulator is the basis for waveform generation. * FREQ is added to the lower 16 bits of the accumulator each cycle. * The accumulator is set to zero when TEST is set, and starts counting * when TEST is cleared. * * Waveforms are generated as follows: * * - No waveform: * When no waveform is selected, the DAC input is floating. * * * - Triangle: * The upper 12 bits of the accumulator are used. * The MSB is used to create the falling edge of the triangle by inverting * the lower 11 bits. The MSB is thrown away and the lower 11 bits are * left-shifted (half the resolution, full amplitude). * Ring modulation substitutes the MSB with MSB EOR NOT sync_source MSB. * * * - Sawtooth: * The output is identical to the upper 12 bits of the accumulator. * * * - Pulse: * The upper 12 bits of the accumulator are used. * These bits are compared to the pulse width register by a 12 bit digital * comparator; output is either all one or all zero bits. * The pulse setting is delayed one cycle after the compare. * The test bit, when set to one, holds the pulse waveform output at 0xfff * regardless of the pulse width setting. * * * - Noise: * The noise output is taken from intermediate bits of a 23-bit shift register * which is clocked by bit 19 of the accumulator. * The shift is delayed 2 cycles after bit 19 is set high. * * Operation: Calculate EOR result, shift register, set bit 0 = result. * * reset +--------------------------------------------+ * | | | * test--OR-->EOR<--+ | * | | | * 2 2 2 1 1 1 1 1 1 1 1 1 1 | * Register bits: 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 <---+ * | | | | | | | | * Waveform bits: 1 1 9 8 7 6 5 4 * 1 0 * * The low 4 waveform bits are zero (grounded). */ class WaveformGenerator { private: matrix_t* model_wave; matrix_t* model_pulldown; short* wave; short* pulldown; // PWout = (PWn/40.95)% unsigned int pw; unsigned int shift_register; /// Shift register is latched when transitioning to shift phase 1. unsigned int shift_latch; /// Emulation of pipeline causing bit 19 to clock the shift register. int shift_pipeline; unsigned int ring_msb_mask; unsigned int no_noise; unsigned int noise_output; unsigned int no_noise_or_noise_output; unsigned int no_pulse; unsigned int pulse_output; /// The control register right-shifted 4 bits; used for output function table lookup. unsigned int waveform; unsigned int waveform_output; /// Current accumulator value. unsigned int accumulator; // Fout = (Fn*Fclk/16777216)Hz unsigned int freq; /// 8580 tri/saw pipeline unsigned int tri_saw_pipeline; /// The OSC3 value unsigned int osc3; /// Remaining time to fully reset shift register. unsigned int shift_register_reset; // The wave signal TTL when no waveform is selected. unsigned int floating_output_ttl; /// The control register bits. Gate is handled by EnvelopeGenerator. //@{ bool test; bool sync; //@} /// Test bit is latched at phi2 for the noise XOR. bool test_or_reset; /// Tell whether the accumulator MSB was set high on this cycle. bool msb_rising; bool is6581; //-V730_NOINIT this is initialized in the SID constructor private: void shift_phase2(unsigned int waveform_old, unsigned int waveform_new); void write_shift_register(); void set_noise_output(); void set_no_noise_or_noise_output(); void waveBitfade(); void shiftregBitfade(); public: void setWaveformModels(matrix_t* models); void setPulldownModels(matrix_t* models); /** * Set the chip model. * Must be called before any operation. * * @param is6581 true if MOS6581, false if CSG8580 */ void setModel(bool is6581) { this->is6581 = is6581; } /** * SID clocking. */ void clock(); /** * Synchronize oscillators. * This must be done after all the oscillators have been clock()'ed, * so that they are in the same state. * * @param syncDest The oscillator that will be synced * @param syncSource The sync source oscillator */ void synchronize(WaveformGenerator* syncDest, const WaveformGenerator* syncSource) const; /** * Constructor. */ WaveformGenerator() : model_wave(nullptr), model_pulldown(nullptr), wave(nullptr), pulldown(nullptr), pw(0), shift_register(0), shift_pipeline(0), ring_msb_mask(0), no_noise(0), noise_output(0), no_noise_or_noise_output(0), no_pulse(0), pulse_output(0), waveform(0), waveform_output(0), accumulator(0x555555), // Accumulator's even bits are high on powerup freq(0), tri_saw_pipeline(0x555), osc3(0), shift_register_reset(0), floating_output_ttl(0), test(false), sync(false), msb_rising(false) {} /** * Write FREQ LO register. * * @param freq_lo low 8 bits of frequency */ void writeFREQ_LO(unsigned char freq_lo) { freq = (freq & 0xff00) | (freq_lo & 0xff); } /** * Write FREQ HI register. * * @param freq_hi high 8 bits of frequency */ void writeFREQ_HI(unsigned char freq_hi) { freq = (freq_hi << 8 & 0xff00) | (freq & 0xff); } /** * Write PW LO register. * * @param pw_lo low 8 bits of pulse width */ void writePW_LO(unsigned char pw_lo) { pw = (pw & 0xf00) | (pw_lo & 0x0ff); } /** * Write PW HI register. * * @param pw_hi high 8 bits of pulse width */ void writePW_HI(unsigned char pw_hi) { pw = (pw_hi << 8 & 0xf00) | (pw & 0x0ff); } /** * Write CONTROL REGISTER register. * * @param control control register value */ void writeCONTROL_REG(unsigned char control); /** * SID reset. */ void reset(); /** * 12-bit waveform output. * * @param ringModulator The oscillator ring-modulating current one. * @return the waveform generator digital output */ unsigned int output(const WaveformGenerator* ringModulator); /** * Read OSC3 value. */ unsigned char readOSC() const { return static_cast(osc3 >> 4); } /** * Read accumulator value. */ unsigned int readAccumulator() const { return accumulator; } /** * Read freq value. */ unsigned int readFreq() const { return freq; } /** * Read test value. */ bool readTest() const { return test; } /** * Read sync value. */ bool readSync() const { return sync; } }; } // namespace reSIDfp #if RESID_INLINING || defined(WAVEFORMGENERATOR_CPP) namespace reSIDfp { RESID_INLINE void WaveformGenerator::clock() { if (unlikely(test)) { if (unlikely(shift_register_reset != 0) && unlikely(--shift_register_reset == 0)) { #ifdef TRACE std::cout << "shiftregBitfade" << std::endl; #endif shiftregBitfade(); shift_latch = shift_register; // New noise waveform output. set_noise_output(); } // Latch the test bit value for shift phase 2. test_or_reset = true; // The test bit sets pulse high. pulse_output = 0xfff; } else { // Calculate new accumulator value; const unsigned int accumulator_old = accumulator; accumulator = (accumulator + freq) & 0xffffff; // Check which bit have changed from low to high const unsigned int accumulator_bits_set = ~accumulator_old & accumulator; // Check whether the MSB is set high. This is used for synchronization. msb_rising = (accumulator_bits_set & 0x800000) != 0; // Shift noise register once for each time accumulator bit 19 is set high. // The shift is delayed 2 cycles. if (unlikely((accumulator_bits_set & 0x080000) != 0)) { // Pipeline: Detect rising bit, shift phase 1, shift phase 2. shift_pipeline = 2; } else if (unlikely(shift_pipeline != 0)) { switch (--shift_pipeline) { case 0: #ifdef TRACE std::cout << "shift phase 2" << std::endl; #endif shift_phase2(waveform, waveform); break; case 1: #ifdef TRACE std::cout << "shift phase 1" << std::endl; #endif // Start shift phase 1. test_or_reset = false; shift_latch = shift_register; break; } } } } RESID_INLINE unsigned int WaveformGenerator::output(const WaveformGenerator* ringModulator) { // Set output value. if (likely(waveform != 0)) { const unsigned int ix = (accumulator ^ (~ringModulator->accumulator & ring_msb_mask)) >> 12; // The bit masks no_pulse and no_noise are used to achieve branch-free // calculation of the output value. waveform_output = wave[ix] & (no_pulse | pulse_output) & no_noise_or_noise_output; if (pulldown != nullptr) waveform_output = pulldown[waveform_output]; // Triangle/Sawtooth output is delayed half cycle on 8580. // This will appear as a one cycle delay on OSC3 as it is latched // in the first phase of the clock. if ((waveform & 3) && !is6581) { osc3 = tri_saw_pipeline & (no_pulse | pulse_output) & no_noise_or_noise_output; if (pulldown != nullptr) osc3 = pulldown[osc3]; tri_saw_pipeline = wave[ix]; } else { osc3 = waveform_output; } // In the 6581 the top bit of the accumulator may be driven low by combined waveforms // when the sawtooth is selected if (is6581 && (waveform & 0x2) && ((waveform_output & 0x800) == 0)) accumulator &= 0x7fffff; write_shift_register(); } else { // Age floating DAC input. if (likely(floating_output_ttl != 0) && unlikely(--floating_output_ttl == 0)) { waveBitfade(); } } // The pulse level is defined as (accumulator >> 12) >= pw ? 0xfff : 0x000. // The expression -((accumulator >> 12) >= pw) & 0xfff yields the same // results without any branching (and thus without any pipeline stalls). // NB! This expression relies on that the result of a boolean expression // is either 0 or 1, and furthermore requires two's complement integer. // A few more cycles may be saved by storing the pulse width left shifted // 12 bits, and dropping the and with 0xfff (this is valid since pulse is // used as a bit mask on 12 bit values), yielding the expression // -(accumulator >= pw24). However this only results in negligible savings. // The result of the pulse width compare is delayed one cycle. // Push next pulse level into pulse level pipeline. pulse_output = ((accumulator >> 12) >= pw) ? 0xfff : 0x000; return waveform_output; } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/ExternalFilter.cpp0000644000175100001770000000373514544470307023715 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #define EXTERNALFILTER_CPP #include "ExternalFilter.h" namespace reSIDfp { /** * Get the 3 dB attenuation point. * * @param res the resistance value in Ohms * @param cap the capacitance value in Farads */ inline double getRC(double res, double cap) { return res * cap; } ExternalFilter::ExternalFilter() : w0lp_1_s7(0), w0hp_1_s17(0) { reset(); } void ExternalFilter::setClockFrequency(double frequency) { const double dt = 1. / frequency; // Low-pass: R = 10kOhm, C = 1000pF; w0l = dt/(dt+RC) = 1e-6/(1e-6+1e4*1e-9) = 0.091 // Cutoff 1/2*PI*RC = 1/2*PI*1e4*1e-9 = 15915.5 Hz w0lp_1_s7 = static_cast((dt / (dt + getRC(10e3, 1000e-12))) * (1 << 7) + 0.5); // High-pass: R = 10kOhm, C = 10uF; w0h = dt/(dt+RC) = 1e-6/(1e-6+1e4*1e-5) = 0.00000999 // Cutoff 1/2*PI*RC = 1/2*PI*1e4*1e-5 = 1.59155 Hz w0hp_1_s17 = static_cast((dt / (dt + getRC(10e3, 10e-6))) * (1 << 17) + 0.5); } void ExternalFilter::reset() { // State of filter. Vlp = 0; //1 << (15 + 11); Vhp = 0; } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Filter8580.cpp0000644000175100001770000000433114544470307022530 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #define FILTER8580_CPP #include "Filter8580.h" #include "Integrator8580.h" namespace reSIDfp { /** * W/L ratio of frequency DAC bit 0, * other bit are proportional. * When no bit are selected a resistance with half * W/L ratio is selected. */ const double DAC_WL0 = 0.00615; Filter8580::~Filter8580() {} void Filter8580::updatedCenterFrequency() { double wl; double dacWL = DAC_WL0; if (fc) { wl = 0.; for (unsigned int i = 0; i < 11; i++) { if (fc & (1 << i)) { wl += dacWL; } dacWL *= 2.; } } else { wl = dacWL/2.; } hpIntegrator->setFc(wl); bpIntegrator->setFc(wl); } void Filter8580::updatedMixing() { currentGain = gain_vol[vol]; unsigned int ni = 0; unsigned int no = 0; (filt1 ? ni : no)++; (filt2 ? ni : no)++; if (filt3) ni++; else if (!voice3off) no++; (filtE ? ni : no)++; currentSummer = summer[ni]; if (lp) no++; if (bp) no++; if (hp) no++; currentMixer = mixer[no]; } void Filter8580::setFilterCurve(double curvePosition) { // Adjust cp // 1.2 <= cp <= 1.8 cp = 1.8 - curvePosition * 3./5.; hpIntegrator->setV(cp); bpIntegrator->setV(cp); } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Spline.h0000644000175100001770000000355514544470307021664 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #ifndef SPLINE_H #define SPLINE_H #include #include namespace reSIDfp { /** * Fritsch-Carlson monotone cubic spline interpolation. * * Based on the implementation from the [Monotone cubic interpolation] wikipedia page. * * [Monotone cubic interpolation]: https://en.wikipedia.org/wiki/Monotone_cubic_interpolation */ class Spline { public: typedef struct { double x; double y; } Point; private: typedef struct { double x1; double x2; double a; double b; double c; double d; } Param; typedef std::vector ParamVector; private: /// Interpolation parameters ParamVector params; /// Last used parameters, cached for speed up mutable ParamVector::const_pointer c; public: Spline(const std::vector &input); /** * Evaluate y and its derivative at given point x. */ Point evaluate(double x) const; }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/FilterModelConfig8580.h0000644000175100001770000000344214544470307024306 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef FILTERMODELCONFIG8580_H #define FILTERMODELCONFIG8580_H #include "FilterModelConfig.h" #include #include "sidcxx11.h" namespace reSIDfp { class Integrator8580; /** * Calculate parameters for 8580 filter emulation. */ class FilterModelConfig8580 final : public FilterModelConfig { private: static std::unique_ptr instance; // This allows access to the private constructor #ifdef HAVE_CXX11 friend std::unique_ptr::deleter_type; #else friend class std::auto_ptr; #endif private: FilterModelConfig8580(); ~FilterModelConfig8580() DEFAULT; public: static FilterModelConfig8580* getInstance(); /** * Construct an integrator solver. * * @return the integrator */ std::unique_ptr buildIntegrator(); }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Voice.h0000644000175100001770000000713314544470307021473 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #ifndef VOICE_H #define VOICE_H #include #include "siddefs-fp.h" #include "WaveformGenerator.h" #include "EnvelopeGenerator.h" #include "sidcxx11.h" namespace reSIDfp { /** * Representation of SID voice block. */ class Voice { private: std::unique_ptr const waveformGenerator; std::unique_ptr const envelopeGenerator; /// The DAC LUT for analog waveform output float* wavDAC; //-V730_NOINIT this is initialized in the SID constructor /// The DAC LUT for analog envelope output float* envDAC; //-V730_NOINIT this is initialized in the SID constructor public: /** * Amplitude modulated waveform output. * * The waveform DAC generates a voltage between virtual ground and Vdd * (5-12 V for the 6581 and 4.75-9 V for the 8580) * corresponding to oscillator state 0 .. 4095. * * The envelope DAC generates a voltage between waveform gen output and * the virtual ground level, corresponding to envelope state 0 .. 255. * * Ideal range [-2048*255, 2047*255]. * * @param ringModulator Ring-modulator for waveform * @return the voice analog output */ RESID_INLINE int output(const WaveformGenerator* ringModulator) const { unsigned int const wav = waveformGenerator->output(ringModulator); unsigned int const env = envelopeGenerator->output(); // DAC imperfections are emulated by using the digital output // as an index into a DAC lookup table. return static_cast(wavDAC[wav] * envDAC[env]); } /** * Constructor. */ Voice() : waveformGenerator(new WaveformGenerator()), envelopeGenerator(new EnvelopeGenerator()) {} /** * Set the analog DAC emulation for waveform generator. * Must be called before any operation. * * @param dac */ void setWavDAC(float* dac) { wavDAC = dac; } /** * Set the analog DAC emulation for envelope. * Must be called before any operation. * * @param dac */ void setEnvDAC(float* dac) { envDAC = dac; } WaveformGenerator* wave() const { return waveformGenerator.get(); } EnvelopeGenerator* envelope() const { return envelopeGenerator.get(); } /** * Write control register. * * @param control Control register value. */ void writeCONTROL_REG(unsigned char control) { waveformGenerator->writeCONTROL_REG(control); envelopeGenerator->writeCONTROL_REG(control); } /** * SID reset. */ void reset() { waveformGenerator->reset(); envelopeGenerator->reset(); } }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/siddefs-fp.h.in0000644000175100001770000000363014544470307023055 00000000000000// --------------------------------------------------------------------------- // This file is part of reSID, a MOS6581 SID emulator engine. // Copyright (C) 1999 Dag Lem // // 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. // --------------------------------------------------------------------------- #ifndef SIDDEFS_FP_H #define SIDDEFS_FP_H // Compilation configuration. #define RESID_BRANCH_HINTS @RESID_BRANCH_HINTS@ // Compiler specifics. #define HAVE_BUILTIN_EXPECT @HAVE_BUILTIN_EXPECT@ #ifndef M_PI # define M_PI 3.14159265358979323846 #endif // Branch prediction macros, lifted off the Linux kernel. #if RESID_BRANCH_HINTS && HAVE_BUILTIN_EXPECT # define likely(x) __builtin_expect(!!(x), 1) # define unlikely(x) __builtin_expect(!!(x), 0) #else # define likely(x) (x) # define unlikely(x) (x) #endif namespace reSIDfp { typedef enum { MOS6581=1, MOS8580 } ChipModel; typedef enum { DECIMATE=1, RESAMPLE } SamplingMethod; } extern "C" { #ifndef __VERSION_CC__ extern const char* residfp_version_string; #else const char* residfp_version_string = "@PACKAGE_VERSION@"; #endif } // Inlining on/off. #define RESID_INLINING @RESID_INLINING@ #define RESID_INLINE @RESID_INLINE@ #endif // SIDDEFS_FP_H libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/WaveformCalculator.cpp0000644000175100001770000002012414544470307024554 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #include "WaveformCalculator.h" #include "sidcxx11.h" #include #ifdef HAVE_CXX11 # include #endif #include namespace reSIDfp { /** * Combined waveform model parameters. */ typedef float (*distance_t)(float, int); typedef struct { distance_t distFunc; float threshold; float topbit; float pulsestrength; float distance1; float distance2; } CombinedWaveformConfig; typedef std::map cw_cache_t; cw_cache_t PULLDOWN_CACHE; #ifdef HAVE_CXX11 std::mutex PULLDOWN_CACHE_Lock; #endif WaveformCalculator* WaveformCalculator::getInstance() { static WaveformCalculator instance; return &instance; } // Distance functions static float exponentialDistance(float distance, int i) { return pow(distance, -i); } MAYBE_UNUSED static float linearDistance(float distance, int i) { return 1.f / (1.f + i * distance); } static float quadraticDistance(float distance, int i) { return 1.f / (1.f + (i*i) * distance); } /** * Parameters derived with the Monte Carlo method based on * samplings from real machines. * Code and data available in the project repository [1]. * Sampling program made by Dag Lem [2]. * * The score here reported is the acoustic error * calculated XORing the estimated and the sampled values. * In parentheses the number of mispredicted bits. * * [1] https://github.com/libsidplayfp/combined-waveforms * [2] https://github.com/daglem/reDIP-SID/blob/master/research/combsample.d64 */ const CombinedWaveformConfig config[2][5] = { { /* 6581 R3 4785 sampled by Trurl */ // TS error 2298 (339/32768) { exponentialDistance, 0.776678205f, 1.18439901f, 0.f, 2.25732255f, 5.12803745f }, // PT error 582 (57/32768) { linearDistance, 1.01866758f, 1.f, 2.69177628f, 0.0233543925f, 0.0850229636f }, // PS error 9242 (679/32768) { linearDistance, 2.20329857f, 1.04501438f, 10.5146885f, 0.277294368f, 0.143747061f }, // PTS error 2799 (71/32768) { linearDistance, 1.35652959f, 1.09051275f, 3.21098137f, 0.16658926f, 0.370252877f }, // NP guessed { exponentialDistance, 0.96f, 1.f, 2.5f, 1.1f, 1.2f }, }, #if 0 // weak cw { /* 6581 R2 4383 sampled by ltx128 */ // TS error 1858 (204/32768) { exponentialDistance, 0.886832297f, 1.f, 0.f, 2.14438701f, 9.51839447f }, // PT error 612 (102/32768) { linearDistance, 1.01262534f, 1.f, 2.46070528f, 0.0537485816f, 0.0986242667f }, // PS error 8135 (575/32768) { linearDistance, 2.14896345f, 1.0216713f, 10.5400085f, 0.244498149f, 0.126134038f }, // PTS error 2505 (63/32768) { linearDistance, 1.29061747f, 0.9754318f, 3.15377498f, 0.0968349651f, 0.318573922f }, // NP guessed { exponentialDistance, 0.96f, 1.f, 2.5f, 1.1f, 1.2f }, }, // strong cw { /* 6581 R2 0384 sampled by Trurl */ // TS error 20337 (1579/32768) { exponentialDistance, 0.000637792516f, 1.56725872f, 0.f, 0.00036806846f, 1.51800942f }, // PT error 5194 (240/32768) { linearDistance, 0.924824238f, 1.f, 1.96749473f, 0.0891806409f, 0.234794483f }, // PS error 31015 (2181/32768) { linearDistance, 1.2328074f, 0.73079139f, 3.9719491f, 0.00156516861f, 0.314677745f }, // PTS error 9874 (201/32768) { linearDistance, 1.08558261f, 0.857638359f, 1.52781796f, 0.152927235f, 1.02657032f }, // NP guessed { exponentialDistance, 0.96f, 1.f, 2.5f, 1.1f, 1.2f }, }, #endif { /* 8580 R5 5092 25 sampled by reFX-Mike */ // TS error 1212 (183/32768) { exponentialDistance, 0.684999049f, 0.916620493f, 0.f, 1.14715648f, 2.02339816f }, // PT error 6153 (295/32768) { exponentialDistance, 0.940367579, 1.f, 1.26695442f, 0.976729453f, 1.57954705f }, // PS error 7620 (454/32768) { quadraticDistance, 0.963866293f, 1.22095084f, 1.01380754f, 0.0110885892f, 0.381492466f }, // PTS error 3701 (117/32768) { linearDistance, 0.976761818f, 0.202727556f, 0.988633931f, 0.939373314f, 9.37139416f }, // NP guessed { exponentialDistance, 0.95f, 1.f, 1.15f, 1.f, 1.45f }, }, }; /// Calculate triangle waveform static unsigned int triXor(unsigned int val) { return (((val & 0x800) == 0) ? val : (val ^ 0xfff)) << 1; } /** * Generate bitstate based on emulation of combined waves pulldown. * * @param distancetable * @param pulsestrength * @param threshold * @param accumulator the high bits of the accumulator value */ short calculatePulldown(float distancetable[], float topbit, float pulsestrength, float threshold, unsigned int accumulator) { unsigned char bit[12]; for (unsigned int i = 0; i < 12; i++) { bit[i] = (accumulator & (1u << i)) != 0 ? 1 : 0; } bit[11] *= topbit; float pulldown[12]; for (int sb = 0; sb < 12; sb++) { float avg = 0.f; float n = 0.f; for (int cb = 0; cb < 12; cb++) { if (cb == sb) continue; const float weight = distancetable[sb - cb + 12]; avg += static_cast(1 - bit[cb]) * weight; n += weight; } avg -= pulsestrength; pulldown[sb] = avg / n; } // Get the predicted value short value = 0; for (unsigned int i = 0; i < 12; i++) { const float bitValue = bit[i] != 0 ? 1.f - pulldown[i] : 0.f; if (bitValue > threshold) { value |= 1u << i; } } return value; } WaveformCalculator::WaveformCalculator() : wftable(4, 4096) { // Build waveform table. for (unsigned int idx = 0; idx < (1u << 12); idx++) { const short saw = static_cast(idx); const short tri = static_cast(triXor(idx)); wftable[0][idx] = 0xfff; wftable[1][idx] = tri; wftable[2][idx] = saw; wftable[3][idx] = saw & (saw << 1); } } matrix_t* WaveformCalculator::buildPulldownTable(ChipModel model) { #ifdef HAVE_CXX11 std::lock_guard lock(PULLDOWN_CACHE_Lock); #endif const CombinedWaveformConfig* cfgArray = config[model == MOS6581 ? 0 : 1]; cw_cache_t::iterator lb = PULLDOWN_CACHE.lower_bound(cfgArray); if (lb != PULLDOWN_CACHE.end() && !(PULLDOWN_CACHE.key_comp()(cfgArray, lb->first))) { return &(lb->second); } matrix_t pdTable(5, 4096); for (int wav = 0; wav < 5; wav++) { const CombinedWaveformConfig& cfg = cfgArray[wav]; const distance_t distFunc = cfg.distFunc; float distancetable[12 * 2 + 1]; distancetable[12] = 1.f; for (int i = 12; i > 0; i--) { distancetable[12-i] = distFunc(cfg.distance1, i); distancetable[12+i] = distFunc(cfg.distance2, i); } for (unsigned int idx = 0; idx < (1u << 12); idx++) { pdTable[wav][idx] = calculatePulldown(distancetable, cfg.topbit, cfg.pulsestrength, cfg.threshold, idx); } } #ifdef HAVE_CXX11 return &(PULLDOWN_CACHE.emplace_hint(lb, cw_cache_t::value_type(cfgArray, pdTable))->second); #else return &(PULLDOWN_CACHE.insert(lb, cw_cache_t::value_type(cfgArray, pdTable))->second); #endif } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/EnvelopeGenerator.cpp0000644000175100001770000000772214544470307024411 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2018 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #define ENVELOPEGENERATOR_CPP #include "EnvelopeGenerator.h" namespace reSIDfp { /** * Lookup table to convert from attack, decay, or release value to rate * counter period. * * The rate counter is a 15 bit register which is left shifted each cycle. * When the counter reaches a specific comparison value, * the envelope counter is incremented (attack) or decremented * (decay/release) and the rate counter is resetted. * * see [kevtris.org](http://blog.kevtris.org/?p=13) */ const unsigned int EnvelopeGenerator::adsrtable[16] = { 0x007f, 0x3000, 0x1e00, 0x0660, 0x0182, 0x5573, 0x000e, 0x3805, 0x2424, 0x2220, 0x090c, 0x0ecd, 0x010e, 0x23f7, 0x5237, 0x64a8 }; void EnvelopeGenerator::reset() { // counter is not changed on reset envelope_pipeline = 0; state_pipeline = 0; attack = 0; decay = 0; sustain = 0; release = 0; gate = false; resetLfsr = true; exponential_counter = 0; exponential_counter_period = 1; new_exponential_counter_period = 0; state = RELEASE; counter_enabled = true; rate = adsrtable[release]; } void EnvelopeGenerator::writeCONTROL_REG(unsigned char control) { const bool gate_next = (control & 0x01) != 0; if (gate_next != gate) { gate = gate_next; // The rate counter is never reset, thus there will be a delay before the // envelope counter starts counting up (attack) or down (release). if (gate_next) { // Gate bit on: Start attack, decay, sustain. next_state = ATTACK; state_pipeline = 2; if (resetLfsr || (exponential_pipeline == 2)) { envelope_pipeline = (exponential_counter_period == 1) || (exponential_pipeline == 2) ? 2 : 4; } else if (exponential_pipeline == 1) { state_pipeline = 3; } } else { // Gate bit off: Start release. next_state = RELEASE; state_pipeline = envelope_pipeline > 0 ? 3 : 2; } } } void EnvelopeGenerator::writeATTACK_DECAY(unsigned char attack_decay) { attack = (attack_decay >> 4) & 0x0f; decay = attack_decay & 0x0f; if (state == ATTACK) { rate = adsrtable[attack]; } else if (state == DECAY_SUSTAIN) { rate = adsrtable[decay]; } } void EnvelopeGenerator::writeSUSTAIN_RELEASE(unsigned char sustain_release) { // From the sustain levels it follows that both the low and high 4 bits // of the envelope counter are compared to the 4-bit sustain value. // This has been verified by sampling ENV3. // // For a detailed description see: // http://ploguechipsounds.blogspot.it/2010/11/new-research-on-sid-adsr.html sustain = (sustain_release & 0xf0) | ((sustain_release >> 4) & 0x0f); release = sustain_release & 0x0f; if (state == RELEASE) { rate = adsrtable[release]; } } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Filter6581.h0000644000175100001770000003530414544470307022200 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef FILTER6581_H #define FILTER6581_H #include "siddefs-fp.h" #include #include "Filter.h" #include "FilterModelConfig6581.h" #include "sidcxx11.h" namespace reSIDfp { class Integrator6581; /** * The SID filter is modeled with a two-integrator-loop biquadratic filter, * which has been confirmed by Bob Yannes to be the actual circuit used in * the SID chip. * * Measurements show that excellent emulation of the SID filter is achieved, * except when high resonance is combined with high sustain levels. * In this case the SID op-amps are performing less than ideally and are * causing some peculiar behavior of the SID filter. This however seems to * have more effect on the overall amplitude than on the color of the sound. * * The theory for the filter circuit can be found in "Microelectric Circuits" * by Adel S. Sedra and Kenneth C. Smith. * The circuit is modeled based on the explanation found there except that * an additional inverter is used in the feedback from the bandpass output, * allowing the summer op-amp to operate in single-ended mode. This yields * filter outputs with levels independent of Q, which corresponds with the * results obtained from a real SID. * * We have been able to model the summer and the two integrators of the circuit * to form components of an IIR filter. * Vhp is the output of the summer, Vbp is the output of the first integrator, * and Vlp is the output of the second integrator in the filter circuit. * * According to Bob Yannes, the active stages of the SID filter are not really * op-amps. Rather, simple NMOS inverters are used. By biasing an inverter * into its region of quasi-linear operation using a feedback resistor from * input to output, a MOS inverter can be made to act like an op-amp for * small signals centered around the switching threshold. * * In 2008, Michael Huth facilitated closer investigation of the SID 6581 * filter circuit by publishing high quality microscope photographs of the die. * Tommi Lempinen has done an impressive work on re-vectorizing and annotating * the die photographs, substantially simplifying further analysis of the * filter circuit. * * The filter schematics below are reverse engineered from these re-vectorized * and annotated die photographs. While the filter first depicted in reSID 0.9 * is a correct model of the basic filter, the schematics are now completed * with the audio mixer and output stage, including details on intended * relative resistor values. Also included are schematics for the NMOS FET * voltage controlled resistors (VCRs) used to control cutoff frequency, the * DAC which controls the VCRs, the NMOS op-amps, and the output buffer. * * * SID filter / mixer / output * --------------------------- * ~~~ * +---------------------------------------------------+ * | | * | +--1R1-- \--+ D7 | * | +---R1--+ | | | * | | | o--2R1-- \--o D6 | * | +---------o----o--Rw--o--[A>--o--Rw--o--[A>--o * ve (EXT IN) | | | | * D3 \ ---------------R8--o | | (CAP2A) | (CAP1A) * | v3 | | vhp | vbp | vlp * D2 | \ -----------R8--o +-----+ | | * | | v2 | | | | * D1 | | \ -------R8--o | +----------------+ | * | | | v1 | | | | * D0 | | | \ ---R8--+ | | +---------------------------+ * | | | | | | | * R6 R6 R6 R6 R6 R6 R6 * | | | | $18 | | | $18 * | \ | | D7: 1=open \ \ \ D6 - D4: 0=open * | | | | | | | * +---o---o---o-------------o---o---+ 12V * | * | D3 +--/ --1R2--+ | * | +---R8--+ | | +---R2--+ | * | | | D2 o--/ --2R2--o | | ||--+ * +---o--[A>--o------o o--o--[A>--o--|| * D1 o--/ --4R2--o (4.25R2) ||--+ * $18 | | | * 0=open D0 +--/ --8R2--+ (8.75R2) | * * vo (AUDIO * OUT) * * * v1 - voice 1 * v2 - voice 2 * v3 - voice 3 * ve - ext in * vhp - highpass output * vbp - bandpass output * vlp - lowpass output * vo - audio out * [A> - single ended inverting op-amp (self-biased NMOS inverter) * Rn - "resistors", implemented with custom NMOS FETs * Rw - cutoff frequency resistor (VCR) * C - capacitor * ~~~ * Notes: * * R2 ~ 2.0*R1 * R6 ~ 6.0*R1 * R8 ~ 8.0*R1 * R24 ~ 24.0*R1 * * The Rn "resistors" in the circuit are implemented with custom NMOS FETs, * probably because of space constraints on the SID die. The silicon substrate * is laid out in a narrow strip or "snake", with a strip length proportional * to the intended resistance. The polysilicon gate electrode covers the entire * silicon substrate and is fixed at 12V in order for the NMOS FET to operate * in triode mode (a.k.a. linear mode or ohmic mode). * * Even in "linear mode", an NMOS FET is only an approximation of a resistor, * as the apparant resistance increases with increasing drain-to-source * voltage. If the drain-to-source voltage should approach the gate voltage * of 12V, the NMOS FET will enter saturation mode (a.k.a. active mode), and * the NMOS FET will not operate anywhere like a resistor. * * * * NMOS FET voltage controlled resistor (VCR) * ------------------------------------------ * ~~~ * Vw * * | * | * R1 * | * +--R1--o * | __|__ * | ----- * | | | * vi -----o----+ +--o----- vo * | | * +----R24----+ * * * vi - input * vo - output * Rn - "resistors", implemented with custom NMOS FETs * Vw - voltage from 11-bit DAC (frequency cutoff control) * ~~~ * Notes: * * An approximate value for R24 can be found by using the formula for the * filter cutoff frequency: * * FCmin = 1/(2*pi*Rmax*C) * * Assuming that a the setting for minimum cutoff frequency in combination with * a low level input signal ensures that only negligible current will flow * through the transistor in the schematics above, values for FCmin and C can * be substituted in this formula to find Rmax. * Using C = 470pF and FCmin = 220Hz (measured value), we get: * * FCmin = 1/(2*pi*Rmax*C) * Rmax = 1/(2*pi*FCmin*C) = 1/(2*pi*220*470e-12) ~ 1.5MOhm * * From this it follows that: * R24 = Rmax ~ 1.5MOhm * R1 ~ R24/24 ~ 64kOhm * R2 ~ 2.0*R1 ~ 128kOhm * R6 ~ 6.0*R1 ~ 384kOhm * R8 ~ 8.0*R1 ~ 512kOhm * * Note that these are only approximate values for one particular SID chip, * due to process variations the values can be substantially different in * other chips. * * * * Filter frequency cutoff DAC * --------------------------- * * ~~~ * 12V 10 9 8 7 6 5 4 3 2 1 0 VGND * | | | | | | | | | | | | | Missing * 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R termination * | | | | | | | | | | | | | * Vw --o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o- -+ * * * Bit on: 12V * Bit off: 5V (VGND) * ~~~ * As is the case with all MOS 6581 DACs, the termination to (virtual) ground * at bit 0 is missing. * * Furthermore, the control of the two VCRs imposes a load on the DAC output * which varies with the input signals to the VCRs. This can be seen from the * VCR figure above. * * * * "Op-amp" (self-biased NMOS inverter) * ------------------------------------ * ~~~ * * 12V * * | * +-----------o * | | * | +------o * | | | * | | ||--+ * | +--|| * | ||--+ * ||--+ | * vi -----|| o---o----- vo * ||--+ | | * | ||--+ | * |-------|| | * | ||--+ | * ||--+ | | * +--|| | | * | ||--+ | | * | | | | * | +-----------o | * | | | * | | * | GND | * | | * +----------------------+ * * * vi - input * vo - output * ~~~ * Notes: * * The schematics above are laid out to show that the "op-amp" logically * consists of two building blocks; a saturated load NMOS inverter (on the * right hand side of the schematics) with a buffer / bias input stage * consisting of a variable saturated load NMOS inverter (on the left hand * side of the schematics). * * Provided a reasonably high input impedance and a reasonably low output * impedance, the "op-amp" can be modeled as a voltage transfer function * mapping input voltage to output voltage. * * * * Output buffer (NMOS voltage follower) * ------------------------------------- * ~~~ * * 12V * * | * | * ||--+ * vi -----|| * ||--+ * | * o------ vo * | (AUDIO * Rext OUT) * | * | * * GND * * vi - input * vo - output * Rext - external resistor, 1kOhm * ~~~ * Notes: * * The external resistor Rext is needed to complete the NMOS voltage follower, * this resistor has a recommended value of 1kOhm. * * Die photographs show that actually, two NMOS transistors are used in the * voltage follower. However the two transistors are coupled in parallel (all * terminals are pairwise common), which implies that we can model the two * transistors as one. */ class Filter6581 final : public Filter { private: const unsigned short* f0_dac; unsigned short** mixer; unsigned short** summer; unsigned short** gain_res; unsigned short** gain_vol; const int voiceScaleS11; const int voiceDC; /// VCR + associated capacitor connected to highpass output. std::unique_ptr const hpIntegrator; /// VCR + associated capacitor connected to bandpass output. std::unique_ptr const bpIntegrator; protected: /** * Set filter cutoff frequency. */ void updatedCenterFrequency() override; /** * Set filter resonance. * * In the MOS 6581, 1/Q is controlled linearly by res. */ void updateResonance(unsigned char res) override { currentResonance = gain_res[res]; } void updatedMixing() override; public: Filter6581() : f0_dac(FilterModelConfig6581::getInstance()->getDAC(0.5)), mixer(FilterModelConfig6581::getInstance()->getMixer()), summer(FilterModelConfig6581::getInstance()->getSummer()), gain_res(FilterModelConfig6581::getInstance()->getGainRes()), gain_vol(FilterModelConfig6581::getInstance()->getGainVol()), voiceScaleS11(FilterModelConfig6581::getInstance()->getVoiceScaleS11()), voiceDC(FilterModelConfig6581::getInstance()->getNormalizedVoiceDC()), hpIntegrator(FilterModelConfig6581::getInstance()->buildIntegrator()), bpIntegrator(FilterModelConfig6581::getInstance()->buildIntegrator()) { input(0); } ~Filter6581(); unsigned short clock(int voice1, int voice2, int voice3) override; void input(int sample) override { ve = (sample * voiceScaleS11 * 3 >> 11) + mixer[0][0]; } /** * Set filter curve type based on single parameter. * * @param curvePosition 0 .. 1, where 0 sets center frequency high ("light") and 1 sets it low ("dark"), default is 0.5 */ void setFilterCurve(double curvePosition); }; } // namespace reSIDfp #if RESID_INLINING || defined(FILTER6581_CPP) #include "Integrator6581.h" namespace reSIDfp { RESID_INLINE unsigned short Filter6581::clock(int voice1, int voice2, int voice3) { voice1 = (voice1 * voiceScaleS11 >> 15) + voiceDC; voice2 = (voice2 * voiceScaleS11 >> 15) + voiceDC; // Voice 3 is silenced by voice3off if it is not routed through the filter. voice3 = (filt3 || !voice3off) ? (voice3 * voiceScaleS11 >> 15) + voiceDC : 0; int Vi = 0; int Vo = 0; (filt1 ? Vi : Vo) += voice1; (filt2 ? Vi : Vo) += voice2; (filt3 ? Vi : Vo) += voice3; (filtE ? Vi : Vo) += ve; Vhp = currentSummer[currentResonance[Vbp] + Vlp + Vi]; Vbp = hpIntegrator->solve(Vhp); Vlp = bpIntegrator->solve(Vbp); if (lp) Vo += Vlp; if (bp) Vo += Vbp; if (hp) Vo += Vhp; return currentGain[currentMixer[Vo]]; } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Potentiometer.h0000644000175100001770000000256114544470307023264 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright (C) 2004 Dag Lem * * 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. */ #ifndef POTENTIOMETER_H #define POTENTIOMETER_H namespace reSIDfp { /** * Potentiometer representation. * * This class will probably never be implemented in any real way. * * @author Ken Händel * @author Dag Lem */ class Potentiometer { public: /** * Read paddle value. Not modeled. * * @return paddle value (always 0xff) */ unsigned char readPOT() const { return 0xff; } }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/FilterModelConfig.cpp0000644000175100001770000000465214544470307024320 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #include "FilterModelConfig.h" #include namespace reSIDfp { FilterModelConfig::FilterModelConfig( double vvr, double vdv, double c, double vdd, double vth, double ucox, const Spline::Point *opamp_voltage, int opamp_size ) : voice_voltage_range(vvr), voice_DC_voltage(vdv), C(c), Vdd(vdd), Vth(vth), Ut(26.0e-3), uCox(ucox), Vddt(Vdd - Vth), vmin(opamp_voltage[0].x), vmax(std::max(Vddt, opamp_voltage[0].y)), denorm(vmax - vmin), norm(1.0 / denorm), N16(norm * ((1 << 16) - 1)), currFactorCoeff(denorm * (uCox / 2. * 1.0e-6 / C)) { // Convert op-amp voltage transfer to 16 bit values. std::vector scaled_voltage(opamp_size); for (int i = 0; i < opamp_size; i++) { scaled_voltage[i].x = N16 * (opamp_voltage[i].x - opamp_voltage[i].y) / 2.; // We add 32768 to get a positive number in the range [0-65535] scaled_voltage[i].x += static_cast(1u << 15); scaled_voltage[i].y = N16 * (opamp_voltage[i].x - vmin); } // Create lookup table mapping capacitor voltage to op-amp input voltage: Spline s(scaled_voltage); for (int x = 0; x < (1 << 16); x++) { const Spline::Point out = s.evaluate(x); // When interpolating outside range the first elements may be negative double tmp = out.x > 0. ? out.x : 0.; assert(tmp < 65535.5); opamp_rev[x] = static_cast(tmp + 0.5); } } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/FilterModelConfig8580.cpp0000644000175100001770000002167414544470307024650 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2010 Dag Lem * * 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. */ #include "FilterModelConfig8580.h" #include "Integrator8580.h" #include "OpAmp.h" #include "sidcxx11.h" #ifdef HAVE_CXX11 # include #endif namespace reSIDfp { /* * R1 = 15.3*Ri * R2 = 7.3*Ri * R3 = 4.7*Ri * Rf = 1.4*Ri * R4 = 1.4*Ri * R8 = 2.0*Ri * RC = 2.8*Ri * * res feedback input * --- -------- ----- * 0 Rf Ri * 1 Rf|R1 Ri * 2 Rf|R2 Ri * 3 Rf|R3 Ri * 4 Rf R4 * 5 Rf|R1 R4 * 6 Rf|R2 R4 * 7 Rf|R3 R4 * 8 Rf R8 * 9 Rf|R1 R8 * A Rf|R2 R8 * B Rf|R3 R8 * C Rf RC * D Rf|R1 RC * E Rf|R2 RC * F Rf|R3 RC */ const double resGain[16] = { 1.4/1.0, // Rf/Ri 1.4 ((1.4*15.3)/(1.4+15.3))/1.0, // (Rf|R1)/Ri 1.28263 ((1.4*7.3)/(1.4+7.3))/1.0, // (Rf|R2)/Ri 1.17471 ((1.4*4.7)/(1.4+4.7))/1.0, // (Rf|R3)/Ri 1.07869 1.4/1.4, // Rf/R4 1 ((1.4*15.3)/(1.4+15.3))/1.4, // (Rf|R1)/R4 0.916168 ((1.4*7.3)/(1.4+7.3))/1.4, // (Rf|R2)/R4 0.83908 ((1.4*4.7)/(1.4+4.7))/1.4, // (Rf|R3)/R4 0.770492 1.4/2.0, // Rf/R8 0.7 ((1.4*15.3)/(1.4+15.3))/2.0, // (Rf|R1)/R8 0.641317 ((1.4*7.3)/(1.4+7.3))/2.0, // (Rf|R2)/R8 0.587356 ((1.4*4.7)/(1.4+4.7))/2.0, // (Rf|R3)/R8 0.539344 1.4/2.8, // Rf/RC 0.5 ((1.4*15.3)/(1.4+15.3))/2.8, // (Rf|R1)/RC 0.458084 ((1.4*7.3)/(1.4+7.3))/2.8, // (Rf|R2)/RC 0.41954 ((1.4*4.7)/(1.4+4.7))/2.8, // (Rf|R3)/RC 0.385246 }; const unsigned int OPAMP_SIZE = 21; /** * This is the SID 8580 op-amp voltage transfer function, measured on * CAP1B/CAP1A on a chip marked CSG 8580R5 1690 25. */ const Spline::Point opamp_voltage[OPAMP_SIZE] = { { 1.30, 8.91 }, // Approximate start of actual range { 4.76, 8.91 }, { 4.77, 8.90 }, { 4.78, 8.88 }, { 4.785, 8.86 }, { 4.79, 8.80 }, { 4.795, 8.60 }, { 4.80, 8.25 }, { 4.805, 7.50 }, { 4.81, 6.10 }, { 4.815, 4.05 }, // Change of curvature { 4.82, 2.27 }, { 4.825, 1.65 }, { 4.83, 1.55 }, { 4.84, 1.47 }, { 4.85, 1.43 }, { 4.87, 1.37 }, { 4.90, 1.34 }, { 5.00, 1.30 }, { 5.10, 1.30 }, { 8.91, 1.30 }, // Approximate end of actual range }; std::unique_ptr FilterModelConfig8580::instance(nullptr); #ifdef HAVE_CXX11 std::mutex Instance8580_Lock; #endif FilterModelConfig8580* FilterModelConfig8580::getInstance() { #ifdef HAVE_CXX11 std::lock_guard lock(Instance8580_Lock); #endif if (!instance.get()) { instance.reset(new FilterModelConfig8580()); } return instance.get(); } FilterModelConfig8580::FilterModelConfig8580() : FilterModelConfig( 0.24, // voice voltage range FIXME measure 4.84, // voice DC voltage FIXME measure 22e-9, // capacitor value 9.09, // Vdd 0.80, // Vth 100e-6, // uCox opamp_voltage, OPAMP_SIZE ) { // Create lookup tables for gains / summers. #ifndef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif #pragma omp parallel sections { #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // The filter summer operates at n ~ 1, and has 5 fundamentally different // input configurations (2 - 6 input "resistors"). // // Note that all "on" transistors are modeled as one. This is not // entirely accurate, since the input for each transistor is different, // and transistors are not linear components. However modeling all // transistors separately would be extremely costly. for (int i = 0; i < 5; i++) { const int idiv = 2 + i; // 2 - 6 input "resistors". const int size = idiv << 16; const double n = idiv; opampModel.reset(); summer[i] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ summer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); } } } #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // The audio mixer operates at n ~ 8/5, and has 8 fundamentally different // input configurations (0 - 7 input "resistors"). // // All "on", transistors are modeled as one - see comments above for // the filter summer. for (int i = 0; i < 8; i++) { const int idiv = (i == 0) ? 1 : i; const int size = (i == 0) ? 1 : i << 16; const double n = i * 8.0 / 5.0; opampModel.reset(); mixer[i] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ mixer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); } } } #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // 4 bit "resistor" ladders in the audio output gain // necessitate 16 gain tables. // From die photographs of the volume "resistor" ladders // it follows that gain ~ vol/16 (assuming ideal // op-amps and ideal "resistors"). for (int n8 = 0; n8 < 16; n8++) { const int size = 1 << 16; const double n = n8 / 16.0; opampModel.reset(); gain_vol[n8] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16; /* vmin .. vmax */ gain_vol[n8][vi] = getNormalizedValue(opampModel.solve(n, vin)); } } } #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // 4 bit "resistor" ladders in the bandpass resonance gain // necessitate 16 gain tables. // From die photographs of the bandpass "resistor" ladders // it follows that 1/Q ~ 2^((4 - res)/8) (assuming ideal // op-amps and ideal "resistors"). for (int n8 = 0; n8 < 16; n8++) { const int size = 1 << 16; opampModel.reset(); gain_res[n8] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16; /* vmin .. vmax */ gain_res[n8][vi] = getNormalizedValue(opampModel.solve(resGain[n8], vin)); } } } } } std::unique_ptr FilterModelConfig8580::buildIntegrator() { return MAKE_UNIQUE(Integrator8580, this); } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/WaveformCalculator.h0000644000175100001770000000753714544470307024236 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #ifndef WAVEFORMCALCULATOR_h #define WAVEFORMCALCULATOR_h #include "array.h" #include "siddefs-fp.h" namespace reSIDfp { /** * Combined waveform calculator for WaveformGenerator. * By combining waveforms, the bits of each waveform are effectively short * circuited, a zero bit in one waveform will result in a zero output bit, * thus the claim that the waveforms are AND'ed. * However, a zero bit in one waveform may also affect the neighboring bits * in the output. * * Example: * * 1 1 * Bit # 1 0 9 8 7 6 5 4 3 2 1 0 * ----------------------- * Sawtooth 0 0 0 1 1 1 1 1 1 0 0 0 * * Triangle 0 0 1 1 1 1 1 1 0 0 0 0 * * AND 0 0 0 1 1 1 1 1 0 0 0 0 * * Output 0 0 0 0 1 1 1 0 0 0 0 0 * * * Re-vectorized die photographs reveal the mechanism behind this behavior. * Each waveform selector bit acts as a switch, which directly connects * internal outputs into the waveform DAC inputs as follows: * * - Noise outputs the shift register bits to DAC inputs as described above. * Each output is also used as input to the next bit when the shift register * is shifted. Lower four bits are grounded. * - Pulse connects a single line to all DAC inputs. The line is connected to * either 5V (pulse on) or 0V (pulse off) at bit 11, and ends at bit 0. * - Triangle connects the upper 11 bits of the (MSB EOR'ed) accumulator to the * DAC inputs, so that DAC bit 0 = 0, DAC bit n = accumulator bit n - 1. * - Sawtooth connects the upper 12 bits of the accumulator to the DAC inputs, * so that DAC bit n = accumulator bit n. Sawtooth blocks out the MSB from * the EOR used to generate the triangle waveform. * * We can thus draw the following conclusions: * * - The shift register may be written to by combined waveforms. * - The pulse waveform interconnects all bits in combined waveforms via the * pulse line. * - The combination of triangle and sawtooth interconnects neighboring bits * of the sawtooth waveform. * * Also in the 6581 the MSB of the oscillator, used as input for the * triangle xor logic and the pulse adder's last bit, is connected directly * to the waveform selector, while in the 8580 it is latched at sid_clk2 * before being forwarded to the selector. Thus in the 6581 if the sawtooth MSB * is pulled down it might affect the oscillator's adder * driving the top bit low. * */ class WaveformCalculator { private: matrix_t wftable; private: WaveformCalculator(); public: /** * Get the singleton instance. */ static WaveformCalculator* getInstance(); /** * Get the waveform table for use by WaveformGenerator. * * @return Waveform table */ matrix_t* getWaveTable() { return &wftable; } /** * Build pulldown table for use by WaveformGenerator. * * @param model Chip model to use * @return Pulldown table */ matrix_t* buildPulldownTable(ChipModel model); }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/resample/0000755000175100001770000000000014544470322022136 500000000000000libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/resample/ZeroOrderResampler.h0000644000175100001770000000415514544470307026025 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #ifndef ZEROORDER_RESAMPLER_H #define ZEROORDER_RESAMPLER_H #include "Resampler.h" #include "sidcxx11.h" namespace reSIDfp { /** * Return sample with linear interpolation. * * @author Antti Lankila */ class ZeroOrderResampler final : public Resampler { private: /// Last sample int cachedSample; /// Number of cycles per sample const int cyclesPerSample; int sampleOffset; /// Calculated sample int outputValue; public: ZeroOrderResampler(double clockFrequency, double samplingFrequency) : cachedSample(0), cyclesPerSample(static_cast(clockFrequency / samplingFrequency * 1024.)), sampleOffset(0), outputValue(0) {} bool input(int sample) override { bool ready = false; if (sampleOffset < 1024) { outputValue = cachedSample + (sampleOffset * (sample - cachedSample) >> 10); ready = true; sampleOffset += cyclesPerSample; } sampleOffset -= 1024; cachedSample = sample; return ready; } int output() const override { return outputValue; } void reset() override { sampleOffset = 0; cachedSample = 0; } }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/resample/test.cpp0000644000175100001770000000533214544470307023547 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #include #include #include #include #include #include #include "siddefs-fp.h" #include "Resampler.h" #include "TwoPassSincResampler.h" #if __cplusplus < 201103L # define unique_ptr auto_ptr #endif /** * Simple sin waveform in, power output measurement function. * It would be far better to use FFT. */ int main(int, const char*[]) { const double RATE = 985248.4; const int RINGSIZE = 2048; std::unique_ptr r(reSIDfp::TwoPassSincResampler::create(RATE, 48000.0, 20000.0)); std::map results; clock_t start = clock(); for (double freq = 1000.; freq < RATE / 2.; freq *= 1.01) { /* prefill resampler buffer */ int k = 0; double omega = 2 * M_PI * freq / RATE; for (int j = 0; j < RINGSIZE; j ++) { int signal = static_cast(32768.0 * sin(k++ * omega) * sqrt(2)); r->input(signal); } int n = 0; float pwr = 0; /* Now, during measurement stage, put 100 cycles of waveform through filter. */ for (int j = 0; j < 100000; j ++) { int signal = static_cast(32768.0 * sin(k++ * omega) * sqrt(2)); if (r->input(signal)) { float out = r->output(); pwr += out * out; n += 1; } } results.insert(std::make_pair(freq, 10 * log10(pwr / n))); } clock_t end = clock(); for (std::map::iterator it = results.begin(); it != results.end(); ++it) { std::cout << std::fixed << std::setprecision(0) << std::setw(6) << (*it).first << " Hz " << (*it).second << " dB" << std::endl; } std::cout << "Filtering time " << (end - start) * 1000. / CLOCKS_PER_SEC << " ms" << std::endl; } libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/resample/SincResampler.h0000644000175100001770000000727714544470307025016 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #ifndef SINCRESAMPLER_H #define SINCRESAMPLER_H #include "Resampler.h" #include #include #include "../array.h" #include "sidcxx11.h" namespace reSIDfp { /** * This is the theoretically correct (and computationally intensive) audio sample generation. * The samples are generated by resampling to the specified sampling frequency. * The work rate is inversely proportional to the percentage of the bandwidth * allocated to the filter transition band. * * This implementation is based on the paper "A Flexible Sampling-Rate Conversion Method", * by J. O. Smith and P. Gosset, or rather on the expanded tutorial on the * [Digital Audio Resampling Home Page](http://www-ccrma.stanford.edu/~jos/resample/). * * By building shifted FIR tables with samples according to the sampling frequency, * this implementation dramatically reduces the computational effort in the * filter convolutions, without any loss of accuracy. * The filter convolutions are also vectorizable on current hardware. */ class SincResampler final : public Resampler { private: /// Size of the ring buffer, must be a power of 2 static const int RINGSIZE = 2048; private: /// Table of the fir filter coefficients matrix_t* firTable; int sampleIndex; /// Filter resolution int firRES; /// Filter length int firN; const int cyclesPerSample; int sampleOffset; int outputValue; short sample[RINGSIZE * 2]; private: int fir(int subcycle); public: /** * Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. * The default end of passband frequency is pass_freq = 0.9*sample_freq/2 * for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample frequencies. * * For resampling, the ratio between the clock frequency and the sample frequency * is limited as follows: 125*clock_freq/sample_freq < 16384 * E.g. provided a clock frequency of ~ 1MHz, the sample frequency * can not be set lower than ~ 8kHz. * A lower sample frequency would make the resampling code overfill its 16k sample ring buffer. * * The end of passband frequency is also limited: pass_freq <= 0.9*sample_freq/2 * * E.g. for a 44.1kHz sampling rate the end of passband frequency is limited * to slightly below 20kHz. This constraint ensures that the FIR table is not overfilled. * * @param clockFrequency System clock frequency at Hz * @param samplingFrequency Desired output sampling rate * @param highestAccurateFrequency */ SincResampler(double clockFrequency, double samplingFrequency, double highestAccurateFrequency); bool input(int input) override; int output() const override { return outputValue; } void reset() override; }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/resample/Resampler.h0000644000175100001770000000424314544470307024167 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #ifndef RESAMPLER_H #define RESAMPLER_H #include #include "sidcxx11.h" #include "siddefs-fp.h" namespace reSIDfp { /** * Abstraction of a resampling process. Given enough input, produces output. * Constructors take additional arguments that configure these objects. */ class Resampler { protected: inline short softClip(int x) const { constexpr int threshold = 28000; if (likely(x < threshold)) return x; constexpr double t = threshold / 32768.; constexpr double a = 1. - t; constexpr double b = 1. / a; double value = static_cast(x - threshold) / 32768.; value = t + a * tanh(b * value); return static_cast(value * 32768.); } virtual int output() const = 0; Resampler() {} public: virtual ~Resampler() {} /** * Input a sample into resampler. Output "true" when resampler is ready with new sample. * * @param sample input sample * @return true when a sample is ready */ virtual bool input(int sample) = 0; /** * Output a sample from resampler. * * @return resampled sample */ short getOutput() const { return softClip(output()); } virtual void reset() = 0; }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/resample/SincResampler.cpp0000755000175100001770000002665614544470307025356 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #include "SincResampler.h" #include #include #include #include #include #include "siddefs-fp.h" #include "sidcxx11.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_EMMINTRIN_H # include #elif defined HAVE_MMINTRIN_H # include #elif defined(HAVE_ARM_NEON_H) # include #endif #ifdef HAVE_CXX11 # include #endif namespace reSIDfp { typedef std::map fir_cache_t; /// Cache for the expensive FIR table computation results. fir_cache_t FIR_CACHE; #ifdef HAVE_CXX11 std::mutex FIR_CACHE_Lock; #endif /// Maximum error acceptable in I0 is 1e-6, or ~96 dB. const double I0E = 1e-6; const int BITS = 16; /** * Compute the 0th order modified Bessel function of the first kind. * This function is originally from resample-1.5/filterkit.c by J. O. Smith. * It is used to build the Kaiser window for resampling. * * @param x evaluate I0 at x * @return value of I0 at x. */ double I0(double x) { double sum = 1.; double u = 1.; double n = 1.; const double halfx = x / 2.; do { const double temp = halfx / n; u *= temp * temp; sum += u; n += 1.; } while (u >= I0E * sum); return sum; } /** * Calculate convolution with sample and sinc. * * @param a sample buffer input * @param b sinc buffer * @param bLength length of the sinc buffer * @return convolved result */ int convolve(const short* a, const short* b, int bLength) { #ifdef HAVE_EMMINTRIN_H int out = 0; const uintptr_t offset = (uintptr_t)(a) & 0x0f; // check for aligned accesses if (offset == ((uintptr_t)(b) & 0x0f)) { if (offset) { const int l = (0x10 - offset)/2; for (int i = 0; i < l; i++) { out += *a++ * *b++; } bLength -= offset; } __m128i acc = _mm_setzero_si128(); const int n = bLength / 8; for (int i = 0; i < n; i++) { const __m128i tmp = _mm_madd_epi16(*(__m128i*)a, *(__m128i*)b); acc = _mm_add_epi32(acc, tmp); a += 8; b += 8; } __m128i vsum = _mm_add_epi32(acc, _mm_srli_si128(acc, 8)); vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4)); out += _mm_cvtsi128_si32(vsum); bLength &= 7; } #elif defined HAVE_MMINTRIN_H __m64 acc = _mm_setzero_si64(); const int n = bLength / 4; for (int i = 0; i < n; i++) { const __m64 tmp = _mm_madd_pi16(*(__m64*)a, *(__m64*)b); acc = _mm_add_pi16(acc, tmp); a += 4; b += 4; } int out = _mm_cvtsi64_si32(acc) + _mm_cvtsi64_si32(_mm_srli_si64(acc, 32)); _mm_empty(); bLength &= 3; #elif defined(HAVE_ARM_NEON_H) #if (defined(__arm64__) && defined(__APPLE__)) || defined(__aarch64__) int32x4_t acc1Low = vdupq_n_s32(0); int32x4_t acc1High = vdupq_n_s32(0); int32x4_t acc2Low = vdupq_n_s32(0); int32x4_t acc2High = vdupq_n_s32(0); const int n = bLength / 16; for (int i = 0; i < n; i++) { int16x8_t v11 = vld1q_s16(a); int16x8_t v12 = vld1q_s16(a + 8); int16x8_t v21 = vld1q_s16(b); int16x8_t v22 = vld1q_s16(b + 8); acc1Low = vmlal_s16(acc1Low, vget_low_s16(v11), vget_low_s16(v21)); acc1High = vmlal_high_s16(acc1High, v11, v21); acc2Low = vmlal_s16(acc2Low, vget_low_s16(v12), vget_low_s16(v22)); acc2High = vmlal_high_s16(acc2High, v12, v22); a += 16; b += 16; } bLength &= 15; if (bLength >= 8) { int16x8_t v1 = vld1q_s16(a); int16x8_t v2 = vld1q_s16(b); acc1Low = vmlal_s16(acc1Low, vget_low_s16(v1), vget_low_s16(v2)); acc1High = vmlal_high_s16(acc1High, v1, v2); a += 8; b += 8; } bLength &= 7; if (bLength >= 4) { int16x4_t v1 = vld1_s16(a); int16x4_t v2 = vld1_s16(b); acc1Low = vmlal_s16(acc1Low, v1, v2); a += 4; b += 4; } int32x4_t accSumsNeon = vaddq_s32(acc1Low, acc1High); accSumsNeon = vaddq_s32(accSumsNeon, acc2Low); accSumsNeon = vaddq_s32(accSumsNeon, acc2High); int out = vaddvq_s32(accSumsNeon); bLength &= 3; #else int32x4_t acc = vdupq_n_s32(0); const int n = bLength / 4; for (int i = 0; i < n; i++) { const int16x4_t h_vec = vld1_s16(a); const int16x4_t x_vec = vld1_s16(b); acc = vmlal_s16(acc, h_vec, x_vec); a += 4; b += 4; } int out = vgetq_lane_s32(acc, 0) + vgetq_lane_s32(acc, 1) + vgetq_lane_s32(acc, 2) + vgetq_lane_s32(acc, 3); bLength &= 3; #endif #else int out = 0; #endif for (int i = 0; i < bLength; i++) { out += *a++ * *b++; } return (out + (1 << 14)) >> 15; } int SincResampler::fir(int subcycle) { // Find the first of the nearest fir tables close to the phase int firTableFirst = (subcycle * firRES >> 10); const int firTableOffset = (subcycle * firRES) & 0x3ff; // Find firN most recent samples, plus one extra in case the FIR wraps. int sampleStart = sampleIndex - firN + RINGSIZE - 1; const int v1 = convolve(sample + sampleStart, (*firTable)[firTableFirst], firN); // Use next FIR table, wrap around to first FIR table using // previous sample. if (unlikely(++firTableFirst == firRES)) { firTableFirst = 0; ++sampleStart; } const int v2 = convolve(sample + sampleStart, (*firTable)[firTableFirst], firN); // Linear interpolation between the sinc tables yields good // approximation for the exact value. return v1 + (firTableOffset * (v2 - v1) >> 10); } SincResampler::SincResampler(double clockFrequency, double samplingFrequency, double highestAccurateFrequency) : sampleIndex(0), cyclesPerSample(static_cast(clockFrequency / samplingFrequency * 1024.)), sampleOffset(0), outputValue(0) { // 16 bits -> -96dB stopband attenuation. const double A = -20. * log10(1.0 / (1 << BITS)); // A fraction of the bandwidth is allocated to the transition band, which we double // because we design the filter to transition halfway at nyquist. const double dw = (1. - 2.*highestAccurateFrequency / samplingFrequency) * M_PI * 2.; // For calculation of beta and N see the reference for the kaiserord // function in the MATLAB Signal Processing Toolbox: // http://www.mathworks.com/help/signal/ref/kaiserord.html const double beta = 0.1102 * (A - 8.7); const double I0beta = I0(beta); const double cyclesPerSampleD = clockFrequency / samplingFrequency; { // The filter order will maximally be 124 with the current constraints. // N >= (96.33 - 7.95)/(2 * pi * 2.285 * (maxfreq - passbandfreq) >= 123 // The filter order is equal to the number of zero crossings, i.e. // it should be an even number (sinc is symmetric with respect to x = 0). int N = static_cast((A - 7.95) / (2.285 * dw) + 0.5); N += N & 1; // The filter length is equal to the filter order + 1. // The filter length must be an odd number (sinc is symmetric with respect to // x = 0). firN = static_cast(N * cyclesPerSampleD) + 1; firN |= 1; // Check whether the sample ring buffer would overflow. assert(firN < RINGSIZE); // Error is bounded by err < 1.234 / L^2, so L = sqrt(1.234 / (2^-16)) = sqrt(1.234 * 2^16). firRES = static_cast(ceil(sqrt(1.234 * (1 << BITS)) / cyclesPerSampleD)); // firN*firRES represent the total resolution of the sinc sampling. JOS // recommends a length of 2^BITS, but we don't quite use that good a filter. // The filter test program indicates that the filter performs well, though. } // Create the map key std::ostringstream o; o << firN << "," << firRES << "," << cyclesPerSampleD; const std::string firKey = o.str(); #ifdef HAVE_CXX11 std::lock_guard lock(FIR_CACHE_Lock); #endif fir_cache_t::iterator lb = FIR_CACHE.lower_bound(firKey); // The FIR computation is expensive and we set sampling parameters often, but // from a very small set of choices. Thus, caching is used to speed initialization. if (lb != FIR_CACHE.end() && !(FIR_CACHE.key_comp()(firKey, lb->first))) { firTable = &(lb->second); } else { // Allocate memory for FIR tables. matrix_t tempTable(firRES, firN); #ifdef HAVE_CXX11 firTable = &(FIR_CACHE.emplace_hint(lb, fir_cache_t::value_type(firKey, tempTable))->second); #else firTable = &(FIR_CACHE.insert(lb, fir_cache_t::value_type(firKey, tempTable))->second); #endif // The cutoff frequency is midway through the transition band, in effect the same as nyquist. const double wc = M_PI; // Calculate the sinc tables. const double scale = 32768.0 * wc / cyclesPerSampleD / M_PI; // we're not interested in the fractional part // so use int division before converting to double const int tmp = firN / 2; const double firN_2 = static_cast(tmp); for (int i = 0; i < firRES; i++) { const double jPhase = (double) i / firRES + firN_2; for (int j = 0; j < firN; j++) { const double x = j - jPhase; const double xt = x / firN_2; const double kaiserXt = fabs(xt) < 1. ? I0(beta * sqrt(1. - xt * xt)) / I0beta : 0.; const double wt = wc * x / cyclesPerSampleD; const double sincWt = fabs(wt) >= 1e-8 ? sin(wt) / wt : 1.; (*firTable)[i][j] = static_cast(scale * sincWt * kaiserXt); } } } } bool SincResampler::input(int input) { bool ready = false; /* * Clip the input as it may overflow the 16 bit range. * * Approximate measured input ranges: * 6581: [-24262,+25080] (Kawasaki_Synthesizer_Demo) * 8580: [-21514,+35232] (64_Forever, Drum_Fool) */ sample[sampleIndex] = sample[sampleIndex + RINGSIZE] = softClip(input); sampleIndex = (sampleIndex + 1) & (RINGSIZE - 1); if (sampleOffset < 1024) { outputValue = fir(sampleOffset); ready = true; sampleOffset += cyclesPerSample; } sampleOffset -= 1024; return ready; } void SincResampler::reset() { memset(sample, 0, sizeof(sample)); sampleOffset = 0; } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/resample/TwoPassSincResampler.h0000644000175100001770000000517414544470307026331 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * * 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. */ #ifndef TWOPASSSINCRESAMPLER_H #define TWOPASSSINCRESAMPLER_H #include #include #include "Resampler.h" #include "SincResampler.h" #include "sidcxx11.h" namespace reSIDfp { /** * Compose a more efficient SINC from chaining two other SINCs. */ class TwoPassSincResampler final : public Resampler { private: std::unique_ptr const s1; std::unique_ptr const s2; private: TwoPassSincResampler(double clockFrequency, double samplingFrequency, double highestAccurateFrequency, double intermediateFrequency) : s1(new SincResampler(clockFrequency, intermediateFrequency, highestAccurateFrequency)), s2(new SincResampler(intermediateFrequency, samplingFrequency, highestAccurateFrequency)) {} public: // Named constructor static TwoPassSincResampler* create(double clockFrequency, double samplingFrequency, double highestAccurateFrequency) { // Calculation according to Laurent Ganier. It evaluates to about 120 kHz at typical settings. // Some testing around the chosen value seems to confirm that this does work. double const intermediateFrequency = 2. * highestAccurateFrequency + sqrt(2. * highestAccurateFrequency * clockFrequency * (samplingFrequency - 2. * highestAccurateFrequency) / samplingFrequency); return new TwoPassSincResampler(clockFrequency, samplingFrequency, highestAccurateFrequency, intermediateFrequency); } bool input(int sample) override { return s1->input(sample) && s2->input(s1->output()); } int output() const override { return s2->output(); } void reset() override { s1->reset(); s2->reset(); } }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/FilterModelConfig6581.cpp0000644000175100001770000002463014544470307024642 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2010 Dag Lem * * 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. */ #include "FilterModelConfig6581.h" #include "Integrator6581.h" #include "OpAmp.h" #include "sidcxx11.h" #ifdef HAVE_CXX11 # include #endif #include namespace reSIDfp { #ifndef HAVE_CXX11 /** * Compute log(1+x) without losing precision for small values of x * * @note when compiling with -ffastm-math the compiler will * optimize the expression away leaving a plain log(1. + x) */ inline double log1p(double x) { return log(1. + x) - (((1. + x) - 1.) - x) / (1. + x); } #endif const unsigned int OPAMP_SIZE = 33; /** * This is the SID 6581 op-amp voltage transfer function, measured on * CAP1B/CAP1A on a chip marked MOS 6581R4AR 0687 14. * All measured chips have op-amps with output voltages (and thus input * voltages) within the range of 0.81V - 10.31V. */ const Spline::Point opamp_voltage[OPAMP_SIZE] = { { 0.81, 10.31 }, // Approximate start of actual range { 2.40, 10.31 }, { 2.60, 10.30 }, { 2.70, 10.29 }, { 2.80, 10.26 }, { 2.90, 10.17 }, { 3.00, 10.04 }, { 3.10, 9.83 }, { 3.20, 9.58 }, { 3.30, 9.32 }, { 3.50, 8.69 }, { 3.70, 8.00 }, { 4.00, 6.89 }, { 4.40, 5.21 }, { 4.54, 4.54 }, // Working point (vi = vo) { 4.60, 4.19 }, { 4.80, 3.00 }, { 4.90, 2.30 }, // Change of curvature { 4.95, 2.03 }, { 5.00, 1.88 }, { 5.05, 1.77 }, { 5.10, 1.69 }, { 5.20, 1.58 }, { 5.40, 1.44 }, { 5.60, 1.33 }, { 5.80, 1.26 }, { 6.00, 1.21 }, { 6.40, 1.12 }, { 7.00, 1.02 }, { 7.50, 0.97 }, { 8.50, 0.89 }, { 10.00, 0.81 }, { 10.31, 0.81 }, // Approximate end of actual range }; std::unique_ptr FilterModelConfig6581::instance(nullptr); #ifdef HAVE_CXX11 std::mutex Instance6581_Lock; #endif FilterModelConfig6581* FilterModelConfig6581::getInstance() { #ifdef HAVE_CXX11 std::lock_guard lock(Instance6581_Lock); #endif if (!instance.get()) { instance.reset(new FilterModelConfig6581()); } return instance.get(); } FilterModelConfig6581::FilterModelConfig6581() : FilterModelConfig( 1.5, // voice voltage range 5.075, // voice DC voltage 470e-12, // capacitor value 12.18, // Vdd 1.31, // Vth 20e-6, // uCox opamp_voltage, OPAMP_SIZE ), WL_vcr(9.0 / 1.0), WL_snake(1.0 / 115.0), dac_zero(6.65), dac_scale(2.63), dac(DAC_BITS) { dac.kinkedDac(MOS6581); // Create lookup tables for gains / summers. #ifndef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif #pragma omp parallel sections { #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // The filter summer operates at n ~ 1, and has 5 fundamentally different // input configurations (2 - 6 input "resistors"). // // Note that all "on" transistors are modeled as one. This is not // entirely accurate, since the input for each transistor is different, // and transistors are not linear components. However modeling all // transistors separately would be extremely costly. for (int i = 0; i < 5; i++) { const int idiv = 2 + i; // 2 - 6 input "resistors". const int size = idiv << 16; const double n = idiv; opampModel.reset(); summer[i] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ summer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); } } } #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // The audio mixer operates at n ~ 8/6, and has 8 fundamentally different // input configurations (0 - 7 input "resistors"). // // All "on", transistors are modeled as one - see comments above for // the filter summer. for (int i = 0; i < 8; i++) { const int idiv = (i == 0) ? 1 : i; const int size = (i == 0) ? 1 : i << 16; const double n = i * 8.0 / 6.0; opampModel.reset(); mixer[i] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ mixer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); } } } #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // 4 bit "resistor" ladders in the audio output gain // necessitate 16 gain tables. // From die photographs of the volume "resistor" ladders // it follows that gain ~ vol/12 (assuming ideal // op-amps and ideal "resistors"). for (int n8 = 0; n8 < 16; n8++) { const int size = 1 << 16; const double n = n8 / 12.0; opampModel.reset(); gain_vol[n8] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16; /* vmin .. vmax */ gain_vol[n8][vi] = getNormalizedValue(opampModel.solve(n, vin)); } } } #pragma omp section { #ifdef _OPENMP OpAmp opampModel( std::vector( std::begin(opamp_voltage), std::end(opamp_voltage)), Vddt, vmin, vmax); #endif // 4 bit "resistor" ladders in the bandpass resonance gain // necessitate 16 gain tables. // From die photographs of the bandpass "resistor" ladders // it follows that 1/Q ~ ~res/8 (assuming ideal // op-amps and ideal "resistors"). for (int n8 = 0; n8 < 16; n8++) { const int size = 1 << 16; const double n = (~n8 & 0xf) / 8.0; opampModel.reset(); gain_res[n8] = new unsigned short[size]; for (int vi = 0; vi < size; vi++) { const double vin = vmin + vi / N16; /* vmin .. vmax */ gain_res[n8][vi] = getNormalizedValue(opampModel.solve(n, vin)); } } } #pragma omp section { const double nVddt = N16 * (Vddt - vmin); for (unsigned int i = 0; i < (1 << 16); i++) { // The table index is right-shifted 16 times in order to fit in // 16 bits; the argument to sqrt is thus multiplied by (1 << 16). const double tmp = nVddt - sqrt(static_cast(i << 16)); assert(tmp > -0.5 && tmp < 65535.5); vcr_nVg[i] = static_cast(tmp + 0.5); } } #pragma omp section { // EKV model: // // Ids = Is * (if - ir) // Is = (2 * u*Cox * Ut^2)/k * W/L // if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) // ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) // moderate inversion characteristic current const double Is = (2. * uCox * Ut * Ut) * WL_vcr; // Normalized current factor for 1 cycle at 1MHz. const double N15 = norm * ((1 << 15) - 1); const double n_Is = N15 * 1.0e-6 / C * Is; // kVgt_Vx = k*(Vg - Vt) - Vx // I.e. if k != 1.0, Vg must be scaled accordingly. for (int i = 0; i < (1 << 16); i++) { const int kVgt_Vx = i - (1 << 15); const double log_term = log1p(exp((kVgt_Vx / N16) / (2. * Ut))); // Scaled by m*2^15 const double tmp = n_Is * log_term * log_term; assert(tmp > -0.5 && tmp < 65535.5); vcr_n_Ids_term[i] = static_cast(tmp + 0.5); } } } } unsigned short* FilterModelConfig6581::getDAC(double adjustment) const { const double dac_zero = getDacZero(adjustment); unsigned short* f0_dac = new unsigned short[1 << DAC_BITS]; for (unsigned int i = 0; i < (1 << DAC_BITS); i++) { const double fcd = dac.getOutput(i); f0_dac[i] = getNormalizedValue(dac_zero + fcd * dac_scale / (1 << DAC_BITS)); } return f0_dac; } std::unique_ptr FilterModelConfig6581::buildIntegrator() { return MAKE_UNIQUE(Integrator6581, this, WL_snake); } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Integrator6581.h0000644000175100001770000002202514544470307023065 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004, 2010 Dag Lem * * 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. */ #ifndef INTEGRATOR6581_H #define INTEGRATOR6581_H #include "FilterModelConfig6581.h" #include #include // uncomment to enable use of the slope factor // in the EKV model // actually produces worse results, needs investigation //#define SLOPE_FACTOR #ifdef SLOPE_FACTOR # include #endif #include "siddefs-fp.h" namespace reSIDfp { /** * Find output voltage in inverting integrator SID op-amp circuits, using a * single fixpoint iteration step. * * A circuit diagram of a MOS 6581 integrator is shown below. * * +---C---+ * | | * vi --o--Rw--o-o--[A>--o-- vo * | | vx * +--Rs--+ * * From Kirchoff's current law it follows that * * IRw + IRs + ICr = 0 * * Using the formula for current through a capacitor, i = C*dv/dt, we get * * IRw + IRs + C*(vc - vc0)/dt = 0 * dt/C*(IRw + IRs) + vc - vc0 = 0 * vc = vc0 - n*(IRw(vi,vx) + IRs(vi,vx)) * * which may be rewritten as the following iterative fixpoint function: * * vc = vc0 - n*(IRw(vi,g(vc)) + IRs(vi,g(vc))) * * To accurately calculate the currents through Rs and Rw, we need to use * transistor models. Rs has a gate voltage of Vdd = 12V, and can be * assumed to always be in triode mode. For Rw, the situation is rather * more complex, as it turns out that this transistor will operate in * both subthreshold, triode, and saturation modes. * * The Shichman-Hodges transistor model routinely used in textbooks may * be written as follows: * * Ids = 0 , Vgst < 0 (subthreshold mode) * Ids = K*W/L*(2*Vgst - Vds)*Vds , Vgst >= 0, Vds < Vgst (triode mode) * Ids = K*W/L*Vgst^2 , Vgst >= 0, Vds >= Vgst (saturation mode) * * where * K = u*Cox/2 (transconductance coefficient) * W/L = ratio between substrate width and length * Vgst = Vg - Vs - Vt (overdrive voltage) * * This transistor model is also called the quadratic model. * * Note that the equation for the triode mode can be reformulated as * independent terms depending on Vgs and Vgd, respectively, by the * following substitution: * * Vds = Vgst - (Vgst - Vds) = Vgst - Vgdt * * Ids = K*W/L*(2*Vgst - Vds)*Vds * = K*W/L*(2*Vgst - (Vgst - Vgdt)*(Vgst - Vgdt) * = K*W/L*(Vgst + Vgdt)*(Vgst - Vgdt) * = K*W/L*(Vgst^2 - Vgdt^2) * * This turns out to be a general equation which covers both the triode * and saturation modes (where the second term is 0 in saturation mode). * The equation is also symmetrical, i.e. it can calculate negative * currents without any change of parameters (since the terms for drain * and source are identical except for the sign). * * FIXME: Subthreshold as function of Vgs, Vgd. * * Ids = I0*W/L*e^(Vgst/(Ut/k)) , Vgst < 0 (subthreshold mode) * * where * I0 = (2 * uCox * Ut^2) / k * * The remaining problem with the textbook model is that the transition * from subthreshold to triode/saturation is not continuous. * * Realizing that the subthreshold and triode/saturation modes may both * be defined by independent (and equal) terms of Vgs and Vds, * respectively, the corresponding terms can be blended into (equal) * continuous functions suitable for table lookup. * * The EKV model (Enz, Krummenacher and Vittoz) essentially performs this * blending using an elegant mathematical formulation: * * Ids = Is * (if - ir) * Is = ((2 * u*Cox * Ut^2)/k) * W/L * if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) * ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) * * For our purposes, the EKV model preserves two important properties * discussed above: * * - It consists of two independent terms, which can be represented by * the same lookup table. * - It is symmetrical, i.e. it calculates current in both directions, * facilitating a branch-free implementation. * * Rw in the circuit diagram above is a VCR (voltage controlled resistor), * as shown in the circuit diagram below. * * * Vdd * | * Vdd _|_ * | +---+ +---- Vw * _|_ | * +--+ +---o Vg * | __|__ * | ----- Rw * | | | * vi -----o------+ +-------- vo * * * In order to calculalate the current through the VCR, its gate voltage * must be determined. * * Assuming triode mode and applying Kirchoff's current law, we get the * following equation for Vg: * * u*Cox/2*W/L*((nVddt - Vg)^2 - (nVddt - vi)^2 + (nVddt - Vg)^2 - (nVddt - Vw)^2) = 0 * 2*(nVddt - Vg)^2 - (nVddt - vi)^2 - (nVddt - Vw)^2 = 0 * (nVddt - Vg) = sqrt(((nVddt - vi)^2 + (nVddt - Vw)^2)/2) * * Vg = nVddt - sqrt(((nVddt - vi)^2 + (nVddt - Vw)^2)/2) */ class Integrator6581 { private: unsigned int nVddt_Vw_2; mutable int vx; mutable int vc; #ifdef SLOPE_FACTOR // Slope factor n = 1/k // where k is the gate coupling coefficient // k = Cox/(Cox+Cdep) ~ 0.7 (depends on gate voltage) mutable double n; #endif const unsigned short nVddt; const unsigned short nVt; const unsigned short nVmin; const unsigned short nSnake; const FilterModelConfig6581* fmc; public: Integrator6581(const FilterModelConfig6581* fmc, double WL_snake) : nVddt_Vw_2(0), vx(0), vc(0), #ifdef SLOPE_FACTOR n(1.4), #endif nVddt(fmc->getNormalizedValue(fmc->getVddt())), nVt(fmc->getNormalizedValue(fmc->getVth())), nVmin(fmc->getNVmin()), nSnake(fmc->getNormalizedCurrentFactor(WL_snake)), fmc(fmc) {} void setVw(unsigned short Vw) { nVddt_Vw_2 = ((nVddt - Vw) * (nVddt - Vw)) >> 1; } int solve(int vi) const; }; } // namespace reSIDfp #if RESID_INLINING || defined(INTEGRATOR_CPP) namespace reSIDfp { RESID_INLINE int Integrator6581::solve(int vi) const { // Make sure Vgst>0 so we're not in subthreshold mode assert(vx < nVddt); // Check that transistor is actually in triode mode // Vds < Vgs - Vth assert(vi < nVddt); // "Snake" voltages for triode mode calculation. const unsigned int Vgst = nVddt - vx; const unsigned int Vgdt = nVddt - vi; const unsigned int Vgst_2 = Vgst * Vgst; const unsigned int Vgdt_2 = Vgdt * Vgdt; // "Snake" current, scaled by (1/m)*2^13*m*2^16*m*2^16*2^-15 = m*2^30 const int n_I_snake = nSnake * (static_cast(Vgst_2 - Vgdt_2) >> 15); // VCR gate voltage. // Scaled by m*2^16 // Vg = Vddt - sqrt(((Vddt - Vw)^2 + Vgdt^2)/2) const int nVg = static_cast(fmc->getVcr_nVg((nVddt_Vw_2 + (Vgdt_2 >> 1)) >> 16)); #ifdef SLOPE_FACTOR const double nVp = static_cast(nVg - nVt) / n; // Pinch-off voltage const int kVgt = static_cast(nVp + 0.5) - nVmin; #else const int kVgt = (nVg - nVt) - nVmin; #endif // VCR voltages for EKV model table lookup. const int kVgt_Vs = (kVgt - vx) + (1 << 15); assert((kVgt_Vs >= 0) && (kVgt_Vs < (1 << 16))); const int kVgt_Vd = (kVgt - vi) + (1 << 15); assert((kVgt_Vd >= 0) && (kVgt_Vd < (1 << 16))); // VCR current, scaled by m*2^15*2^15 = m*2^30 const unsigned int If = static_cast(fmc->getVcr_n_Ids_term(kVgt_Vs)) << 15; const unsigned int Ir = static_cast(fmc->getVcr_n_Ids_term(kVgt_Vd)) << 15; #ifdef SLOPE_FACTOR const double iVcr = static_cast(If - Ir); const int n_I_vcr = static_cast(iVcr * n); #else const int n_I_vcr = If - Ir; #endif #ifdef SLOPE_FACTOR // estimate new slope factor based on gate voltage const double gamma = 1.0; // body effect factor const double phi = 0.8; // bulk Fermi potential const double Vp = nVp / fmc->getN16(); n = 1. + (gamma / (2. * sqrt(Vp + phi + 4. * fmc->getUt()))); assert((n > 1.2) && (n < 1.8)); #endif // Change in capacitor charge. vc += n_I_snake + n_I_vcr; // vx = g(vc) const int tmp = (vc >> 15) + (1 << 15); assert(tmp < (1 << 16)); vx = fmc->getOpampRev(tmp); // Return vo. return vx - (vc >> 14); } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/README0000644000175100001770000000200014544470307021121 00000000000000reSIDfp is a fork of Dag Lem's reSID 0.16, a reverse engineered software emulation of the MOS6581/8580 SID (Sound Interface Device). The project was started by Antti S. Lankila in order to improve SID emulation with special focus on the 6581 filter. The codebase has been later on ported to java by Ken Händel within the jsidplay2 project and has seen further work by Antti Lankila. It was then ported back to c++ and integrated with improvements from reSID 1.0 by Leandro Nini. Main differences from reSID: * combined waveforms are emulated by a parametrized model based on samplings from Kevtris; * envelope generator is implemented like in the real machine with a shift register; * high quality resampling is done in two steps to allow computational savings using lower order filters; * part of the calculations are done with floats instead of fixed point; * interpolation is accomplished with Fritsch-Carlson method to preserve monotonicity. reSIDfp is free software. See the file COPYING for copying permission. libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/AUTHORS0000644000175100001770000000037314544470307021324 00000000000000Authors of reSIDfp. Dag Lem: Designed and programmed complete emulation engine. Antti S. Lankila: Distortion simulation and calculation of combined waveforms Ken Händel: source code conversion to Java Leandro Nini: port to c++, merge with reSID 1.0 libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/FilterModelConfig6581.h0000644000175100001770000000571314544470307024310 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef FILTERMODELCONFIG6581_H #define FILTERMODELCONFIG6581_H #include "FilterModelConfig.h" #include #include "Dac.h" #include "sidcxx11.h" namespace reSIDfp { class Integrator6581; /** * Calculate parameters for 6581 filter emulation. */ class FilterModelConfig6581 final : public FilterModelConfig { private: static const unsigned int DAC_BITS = 11; private: static std::unique_ptr instance; // This allows access to the private constructor #ifdef HAVE_CXX11 friend std::unique_ptr::deleter_type; #else friend class std::auto_ptr; #endif /// Transistor parameters. //@{ const double WL_vcr; ///< W/L for VCR const double WL_snake; ///< W/L for "snake" //@} /// DAC parameters. //@{ const double dac_zero; const double dac_scale; //@} /// DAC lookup table Dac dac; /// VCR - 6581 only. //@{ unsigned short vcr_nVg[1 << 16]; unsigned short vcr_n_Ids_term[1 << 16]; //@} private: double getDacZero(double adjustment) const { return dac_zero + (1. - adjustment); } FilterModelConfig6581(); ~FilterModelConfig6581() DEFAULT; public: static FilterModelConfig6581* getInstance(); /** * Construct an 11 bit cutoff frequency DAC output voltage table. * Ownership is transferred to the requester which becomes responsible * of freeing the object when done. * * @param adjustment * @return the DAC table */ unsigned short* getDAC(double adjustment) const; /** * Construct an integrator solver. * * @return the integrator */ std::unique_ptr buildIntegrator(); inline unsigned short getVcr_nVg(int i) const { return vcr_nVg[i]; } inline unsigned short getVcr_n_Ids_term(int i) const { return vcr_n_Ids_term[i]; } // only used if SLOPE_FACTOR is defined inline double getUt() const { return Ut; } inline double getN16() const { return N16; } }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Dac.h0000644000175100001770000000630014544470307021110 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2016 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef DAC_H #define DAC_H #include "siddefs-fp.h" namespace reSIDfp { /** * Estimate DAC nonlinearity. * The SID DACs are built up as R-2R ladder as follows: * * n n-1 2 1 0 VGND * | | | | | | Termination * 2R 2R 2R 2R 2R 2R only for * | | | | | | MOS 8580 * Vo -o-R-o-R-...-o-R-o-R-- --+ * * * All MOS 6581 DACs are missing a termination resistor at bit 0. This causes * pronounced errors for the lower 4 - 5 bits (e.g. the output for bit 0 is * actually equal to the output for bit 1), resulting in DAC discontinuities * for the lower bits. * In addition to this, the 6581 DACs exhibit further severe discontinuities * for higher bits, which may be explained by a less than perfect match between * the R and 2R resistors, or by output impedance in the NMOS transistors * providing the bit voltages. A good approximation of the actual DAC output is * achieved for 2R/R ~ 2.20. * * The MOS 8580 DACs, on the other hand, do not exhibit any discontinuities. * These DACs include the correct termination resistor, and also seem to have * very accurately matched R and 2R resistors (2R/R = 2.00). * * On the 6581 the output of the waveform and envelope DACs go through * a voltage follower built with two NMOS: * * Vdd * * | * |-+ * Vin -------| T1 (enhancement-mode) * |-+ * | * o-------- Vout * | * |-+ * +---| T2 (depletion-mode) * | |-+ * | | * * GND GND */ class Dac { private: /// analog values double * const dac; /// the dac array length const unsigned int dacLength; public: /** * Initialize DAC model. * * @param bits the number of input bits */ Dac(unsigned int bits); ~Dac(); /** * Build DAC model for specific chip. * * @param chipModel 6581 or 8580 */ void kinkedDac(ChipModel chipModel); /** * Get the Vo output for a given combination of input bits. * * @param input the digital input * @return the analog output value */ double getOutput(unsigned int input) const; }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Integrator8580.h0000644000175100001770000000671214544470307023073 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004, 2010 Dag Lem * * 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. */ #ifndef INTEGRATOR8580_H #define INTEGRATOR8580_H #include "FilterModelConfig8580.h" #include #include #include "siddefs-fp.h" namespace reSIDfp { /** * 8580 integrator * * +---C---+ * | | * vi -----Rfc---o--[A>--o-- vo * vx * * IRfc + ICr = 0 * IRfc + C*(vc - vc0)/dt = 0 * dt/C*(IRfc) + vc - vc0 = 0 * vc = vc0 - n*(IRfc(vi,vx)) * vc = vc0 - n*(IRfc(vi,g(vc))) * * IRfc = K*W/L*(Vgst^2 - Vgdt^2) = n*((Vddt - vx)^2 - (Vddt - vi)^2) * * Rfc gate voltage is generated by an OP Amp and depends on chip temperature. */ class Integrator8580 { private: mutable int vx; mutable int vc; unsigned short nVgt; unsigned short n_dac; const FilterModelConfig8580* fmc; public: Integrator8580(const FilterModelConfig8580* fmc) : vx(0), vc(0), fmc(fmc) { setV(1.5); } /** * Set Filter Cutoff resistor ratio. */ void setFc(double wl) { // Normalized current factor, 1 cycle at 1MHz. // Fit in 5 bits. n_dac = fmc->getNormalizedCurrentFactor(wl); } /** * Set FC gate voltage multiplier. */ void setV(double v) { // Gate voltage is controlled by the switched capacitor voltage divider // Ua = Ue * v = 4.76v 1 1.0 && v < 2.0); const double Vg = 4.76 * v; const double Vgt = Vg - fmc->getVth(); // Vg - Vth, normalized so that translated values can be subtracted: // Vgt - x = (Vgt - t) - (x - t) nVgt = fmc->getNormalizedValue(Vgt); } int solve(int vi) const; }; } // namespace reSIDfp #if RESID_INLINING || defined(INTEGRATOR8580_CPP) namespace reSIDfp { RESID_INLINE int Integrator8580::solve(int vi) const { // Make sure we're not in subthreshold mode assert(vx < nVgt); // DAC voltages const unsigned int Vgst = nVgt - vx; const unsigned int Vgdt = (vi < nVgt) ? nVgt - vi : 0; // triode/saturation mode const unsigned int Vgst_2 = Vgst * Vgst; const unsigned int Vgdt_2 = Vgdt * Vgdt; // DAC current, scaled by (1/m)*2^13*m*2^16*m*2^16*2^-15 = m*2^30 const int n_I_dac = n_dac * (static_cast(Vgst_2 - Vgdt_2) >> 15); // Change in capacitor charge. vc += n_I_dac; // vx = g(vc) const int tmp = (vc >> 15) + (1 << 15); assert(tmp < (1 << 16)); vx = fmc->getOpampRev(tmp); // Return vo. return vx - (vc >> 14); } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Filter8580.h0000644000175100001770000003200714544470307022176 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef FILTER8580_H #define FILTER8580_H #include "siddefs-fp.h" #include #include "Filter.h" #include "FilterModelConfig8580.h" #include "Integrator8580.h" #include "sidcxx11.h" namespace reSIDfp { class Integrator8580; /** * Filter for 8580 chip * -------------------- * The 8580 filter stage had been redesigned to be more linear and robust * against temperature change. It also features real op-amps and a * revisited resonance model. * The filter schematics below are reverse engineered from re-vectorized * and annotated die photographs. Credits to Michael Huth for the microscope * photographs of the die, Tommi Lempinen for re-vectorizating and annotating * the images and ttlworks from forum.6502.org for the circuit analysis. * * ~~~ * * +---------------------------------------------------+ * | $17 +----Rf-+ | * | | | | * | D4&!D5 o- \-R3-o | * | | | $17 | * | !D4&!D5 o- \-R2-o | * | | | +---R8-- \--+ !D6&D7 | * | D4&!D5 o- \-R1-o | | | * | | | o---RC-- \--o D6&D7 | * | +---------o----o--Rfc-o--[A>--o--Rfc-o--[A>--o * ve (EXT IN) | | | | * D3 \ --------------R12--o | | (CAP2A) | (CAP1A) * | v3 | | vhp | vbp | vlp * D2 | \ -----------R7--o +-----+ | | * | | v2 | | | | * D1 | | \ -------R7--o | +----------------+ | * | | | v1 | | | | * D0 | | | \ ---R7--+ | | +---------------------------+ * | | | | | | | * R9 R5 R5 R5 R5 R5 R5 * | | | | $18 | | | $18 * | \ | | D7: 1=open \ \ \ D6 - D4: 0=open * | | | | | | | * +---o---o---o-------------o---o---+ * | * | D3 +--/ --1R4--+ * | +---R8--+ | | +---R2--+ * | | | D2 o--/ --2R4--o | | * +---o--[A>--o------o o--o--[A>--o-- vo (AUDIO OUT) * D1 o--/ --4R4--o * $18 | | * 0=open D0 +--/ --8R4--+ * * * * Resonance * --------- * For resonance, we have two tiny DACs that controls both the input * and feedback resistances. * * The "resistors" are switched in as follows by bits in register $17: * * feedback: * R1: bit4&!bit5 * R2: !bit4&bit5 * R3: bit4&bit5 * Rf: always on * * input: * R4: bit6&!bit7 * R8: !bit6&bit7 * RC: bit6&bit7 * Ri: !(R4|R8|RC) = !(bit6|bit7) = !bit6&!bit7 * * * The relative "resistor" values are approximately (using channel length): * * R1 = 15.3*Ri * R2 = 7.3*Ri * R3 = 4.7*Ri * Rf = 1.4*Ri * R4 = 1.4*Ri * R8 = 2.0*Ri * RC = 2.8*Ri * * * Approximate values for 1/Q can now be found as follows (assuming an * ideal op-amp): * * res feedback input -gain (1/Q) * --- -------- ----- ---------- * 0 Rf Ri Rf/Ri = 1/(Ri*(1/Rf)) = 1/0.71 * 1 Rf|R1 Ri (Rf|R1)/Ri = 1/(Ri*(1/Rf+1/R1)) = 1/0.78 * 2 Rf|R2 Ri (Rf|R2)/Ri = 1/(Ri*(1/Rf+1/R2)) = 1/0.85 * 3 Rf|R3 Ri (Rf|R3)/Ri = 1/(Ri*(1/Rf+1/R3)) = 1/0.92 * 4 Rf R4 Rf/R4 = 1/(R4*(1/Rf)) = 1/1.00 * 5 Rf|R1 R4 (Rf|R1)/R4 = 1/(R4*(1/Rf+1/R1)) = 1/1.10 * 6 Rf|R2 R4 (Rf|R2)/R4 = 1/(R4*(1/Rf+1/R2)) = 1/1.20 * 7 Rf|R3 R4 (Rf|R3)/R4 = 1/(R4*(1/Rf+1/R3)) = 1/1.30 * 8 Rf R8 Rf/R8 = 1/(R8*(1/Rf)) = 1/1.43 * 9 Rf|R1 R8 (Rf|R1)/R8 = 1/(R8*(1/Rf+1/R1)) = 1/1.56 * A Rf|R2 R8 (Rf|R2)/R8 = 1/(R8*(1/Rf+1/R2)) = 1/1.70 * B Rf|R3 R8 (Rf|R3)/R8 = 1/(R8*(1/Rf+1/R3)) = 1/1.86 * C Rf RC Rf/RC = 1/(RC*(1/Rf)) = 1/2.00 * D Rf|R1 RC (Rf|R1)/RC = 1/(RC*(1/Rf+1/R1)) = 1/2.18 * E Rf|R2 RC (Rf|R2)/RC = 1/(RC*(1/Rf+1/R2)) = 1/2.38 * F Rf|R3 RC (Rf|R3)/RC = 1/(RC*(1/Rf+1/R3)) = 1/2.60 * * * These data indicate that the following function for 1/Q has been * modeled in the MOS 8580: * * 1/Q = 2^(1/2)*2^(-x/8) = 2^(1/2 - x/8) = 2^((4 - x)/8) * * * * Op-amps * ------- * Unlike the 6581, the 8580 has real OpAmps. * * Temperature compensated differential amplifier: * * 9V * * | * +-------o-o-o-------+ * | | | | * | R R | * +--|| | | ||--+ * ||---o o---|| * +--|| | | ||--+ * | | | | * o-----+ | | o--- Va * | | | | | * +--|| | | | ||--+ * ||-o-+---+---|| * +--|| | | ||--+ * | | | | * | | * GND | | GND * ||--+ +--|| * in- -----|| ||------ in+ * ||----o----|| * | * 8 Current sink * | * * GND * * Inverter + non-inverting output amplifier: * * Va ---o---||-------------------o--------------------+ * | | 9V | * | +----------+----------+ | | * | 9V | | 9V | ||--+ | * | | | 9V | | +-|| | * | R | | | ||--+ ||--+ | * | | | ||--+ +--|| o---o--- Vout * | o---o---|| ||--+ ||--+ * | | ||--+ o-----|| * | ||--+ | ||--+ ||--+ * +-----|| o-----|| | * ||--+ | ||--+ * | R | GND * | * GND GND * GND * * * * Virtual ground * -------------- * A PolySi resitive voltage divider provides the voltage * for the positive input of the filter op-amps. * * 5V * +----------+ * | | |\ | * R1 +---|-\ | * 5V | |A >---o--- Vref * o-------|+/ * | | |/ * R10 R4 * | | * o---+ * | * R10 * | * * GND * * Rn = n*R1 * * * * Rfc - freq control DAC resistance ladder * ---------------------------------------- * The 8580 has 11 bits for frequency control, but 12 bit DACs. * If those 11 bits would be '0', the impedance of the DACs would be "infinitely high". * To get around this, there is an 11 input NOR gate below the DACs sensing those 11 bits. * If all are 0, the NOR gate gives the gate control voltage to the 12 bit DAC LSB. * * ----o---o--...--o---o---o--- * | | | | | * Rb10 Rb9 ... Rb1 Rb0 R0 * | | | | | * ----o---o--...--o---o---o--- * * * * Crystal stabilized precision switched capacitor voltage divider * --------------------------------------------------------------- * There is a FET working as a temperature sensor close to the DACs which changes the gate voltage * of the frequency control DACs according to the temperature of the DACs, * to reduce the effects of temperature on the filter curve. * An asynchronous 3 bit binary counter, running at the speed of PHI2, drives two big capacitors * whose AC resistance is then used as a voltage divider. * This implicates that frequency difference between PAL and NTSC might shift the filter curve by 4% or such. * * |\ OpAmp has a smaller capacitor than the other OPs * Vref ---|+\ * |A >---o--- Vdac * +-------|-/ | * | |/ | * | | * C1 | C2 | * +---||---o---+ +---o-----||-------o * | | | | | | * o----+ | ----- | | * | | | ----- +----+ +-----o * | ----- | | | | * | ----- | ----- | * | | | ----- | * | +-----------+ | | * | /Q Q | +-------+ * GND +-----------+ FET close to DAC * | clk/8 | working as temperature sensor * +-----------+ */ class Filter8580 final : public Filter { private: unsigned short** mixer; unsigned short** summer; unsigned short** gain_res; unsigned short** gain_vol; const int voiceScaleS11; const int voiceDC; double cp; /// VCR + associated capacitor connected to highpass output. std::unique_ptr const hpIntegrator; /// VCR + associated capacitor connected to bandpass output. std::unique_ptr const bpIntegrator; protected: /** * Set filter cutoff frequency. */ void updatedCenterFrequency() override; /** * Set filter resonance. * * @param res the new resonance value */ void updateResonance(unsigned char res) override { currentResonance = gain_res[res]; } void updatedMixing() override; public: Filter8580() : mixer(FilterModelConfig8580::getInstance()->getMixer()), summer(FilterModelConfig8580::getInstance()->getSummer()), gain_res(FilterModelConfig8580::getInstance()->getGainRes()), gain_vol(FilterModelConfig8580::getInstance()->getGainVol()), voiceScaleS11(FilterModelConfig8580::getInstance()->getVoiceScaleS11()), voiceDC(FilterModelConfig8580::getInstance()->getNormalizedVoiceDC()), cp(0.5), hpIntegrator(FilterModelConfig8580::getInstance()->buildIntegrator()), bpIntegrator(FilterModelConfig8580::getInstance()->buildIntegrator()) { setFilterCurve(cp); input(0); } ~Filter8580(); unsigned short clock(int voice1, int voice2, int voice3) override; void input(int sample) override { ve = (sample * voiceScaleS11 * 3 >> 11) + mixer[0][0]; } /** * Set filter curve type based on single parameter. * * @param curvePosition 0 .. 1, where 0 sets center frequency high ("light") and 1 sets it low ("dark"), default is 0.5 */ void setFilterCurve(double curvePosition); }; } // namespace reSIDfp #if RESID_INLINING || defined(FILTER8580_CPP) namespace reSIDfp { RESID_INLINE unsigned short Filter8580::clock(int voice1, int voice2, int voice3) { voice1 = (voice1 * voiceScaleS11 >> 15) + voiceDC; voice2 = (voice2 * voiceScaleS11 >> 15) + voiceDC; // Voice 3 is silenced by voice3off if it is not routed through the filter. voice3 = (filt3 || !voice3off) ? (voice3 * voiceScaleS11 >> 15) + voiceDC : 0; int Vi = 0; int Vo = 0; (filt1 ? Vi : Vo) += voice1; (filt2 ? Vi : Vo) += voice2; (filt3 ? Vi : Vo) += voice3; (filtE ? Vi : Vo) += ve; Vhp = currentSummer[currentResonance[Vbp] + Vlp + Vi]; Vbp = hpIntegrator->solve(Vhp); Vlp = bpIntegrator->solve(Vbp); if (lp) Vo += Vlp; if (bp) Vo += Vbp; if (hp) Vo += Vhp; return currentGain[currentMixer[Vo]]; } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/FilterModelConfig.h0000644000175100001770000001163114544470307023760 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef FILTERMODELCONFIG_H #define FILTERMODELCONFIG_H #include #include #include "Spline.h" #include "sidcxx11.h" namespace reSIDfp { class FilterModelConfig { protected: const double voice_voltage_range; const double voice_DC_voltage; /// Capacitor value. const double C; /// Transistor parameters. //@{ const double Vdd; const double Vth; ///< Threshold voltage const double Ut; ///< Thermal voltage: Ut = kT/q = 8.61734315e-5*T ~ 26mV const double uCox; ///< Transconductance coefficient: u*Cox const double Vddt; ///< Vdd - Vth //@} // Derived stuff const double vmin, vmax; const double denorm, norm; /// Fixed point scaling for 16 bit op-amp output. const double N16; /// Current factor coefficient for op-amp integrators. const double currFactorCoeff; /// Lookup tables for gain and summer op-amps in output stage / filter. //@{ unsigned short* mixer[8]; //-V730_NOINIT this is initialized in the derived class constructor unsigned short* summer[5]; //-V730_NOINIT this is initialized in the derived class constructor unsigned short* gain_vol[16]; //-V730_NOINIT this is initialized in the derived class constructor unsigned short* gain_res[16]; //-V730_NOINIT this is initialized in the derived class constructor //@} /// Reverse op-amp transfer function. unsigned short opamp_rev[1 << 16]; //-V730_NOINIT this is initialized in the derived class constructor private: FilterModelConfig (const FilterModelConfig&) DELETE; FilterModelConfig& operator= (const FilterModelConfig&) DELETE; protected: /** * @param vvr voice voltage range * @param vdv voice DC voltage * @param c capacitor value * @param vdd Vdd * @param vth threshold voltage * @param ucox u*Cox * @param ominv opamp min voltage * @param omaxv opamp max voltage */ FilterModelConfig( double vvr, double vdv, double c, double vdd, double vth, double ucox, const Spline::Point *opamp_voltage, int opamp_size ); ~FilterModelConfig() { for (int i = 0; i < 8; i++) { delete [] mixer[i]; } for (int i = 0; i < 5; i++) { delete [] summer[i]; } for (int i = 0; i < 16; i++) { delete [] gain_vol[i]; delete [] gain_res[i]; } } public: unsigned short** getGainVol() { return gain_vol; } unsigned short** getGainRes() { return gain_res; } unsigned short** getSummer() { return summer; } unsigned short** getMixer() { return mixer; } /** * The digital range of one voice is 20 bits; create a scaling term * for multiplication which fits in 11 bits. */ int getVoiceScaleS11() const { return static_cast((norm * ((1 << 11) - 1)) * voice_voltage_range); } /** * The "zero" output level of the voices. */ int getNormalizedVoiceDC() const { return static_cast(N16 * (voice_DC_voltage - vmin)); } inline unsigned short getOpampRev(int i) const { return opamp_rev[i]; } inline double getVddt() const { return Vddt; } inline double getVth() const { return Vth; } // helper functions inline unsigned short getNormalizedValue(double value) const { const double tmp = N16 * (value - vmin); assert(tmp > -0.5 && tmp < 65535.5); return static_cast(tmp + 0.5); } inline unsigned short getNormalizedCurrentFactor(double wl) const { const double tmp = (1 << 13) * currFactorCoeff * wl; assert(tmp > -0.5 && tmp < 65535.5); return static_cast(tmp + 0.5); } inline unsigned short getNVmin() const { const double tmp = N16 * vmin; assert(tmp > -0.5 && tmp < 65535.5); return static_cast(tmp + 0.5); } }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Filter6581.cpp0000644000175100001770000000344214544470307022531 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #define FILTER6581_CPP #include "Filter6581.h" #include "Integrator6581.h" namespace reSIDfp { Filter6581::~Filter6581() { delete [] f0_dac; } void Filter6581::updatedCenterFrequency() { const unsigned short Vw = f0_dac[fc]; hpIntegrator->setVw(Vw); bpIntegrator->setVw(Vw); } void Filter6581::updatedMixing() { currentGain = gain_vol[vol]; unsigned int ni = 0; unsigned int no = 0; (filt1 ? ni : no)++; (filt2 ? ni : no)++; if (filt3) ni++; else if (!voice3off) no++; (filtE ? ni : no)++; currentSummer = summer[ni]; if (lp) no++; if (bp) no++; if (hp) no++; currentMixer = mixer[no]; } void Filter6581::setFilterCurve(double curvePosition) { delete [] f0_dac; f0_dac = FilterModelConfig6581::getInstance()->getDAC(curvePosition); updatedCenterFrequency(); } } // namespace reSIDfp libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Filter.h0000644000175100001770000000742514544470307021657 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2017 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004 Dag Lem * * 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. */ #ifndef FILTER_H #define FILTER_H namespace reSIDfp { /** * SID filter base class */ class Filter { protected: /// Current volume amplifier setting. unsigned short* currentGain; /// Current filter/voice mixer setting. unsigned short* currentMixer; /// Filter input summer setting. unsigned short* currentSummer; /// Filter resonance value. unsigned short* currentResonance; /// Filter highpass state. int Vhp; /// Filter bandpass state. int Vbp; /// Filter lowpass state. int Vlp; /// Filter external input. int ve; /// Filter cutoff frequency. unsigned int fc; /// Routing to filter or outside filter bool filt1, filt2, filt3, filtE; /// Switch voice 3 off. bool voice3off; /// Highpass, bandpass, and lowpass filter modes. bool hp, bp, lp; /// Current volume. unsigned char vol; private: /// Filter enabled. bool enabled; /// Selects which inputs to route through filter. unsigned char filt; protected: /** * Set filter cutoff frequency. */ virtual void updatedCenterFrequency() = 0; /** * Set filter resonance. */ virtual void updateResonance(unsigned char res) = 0; /** * Mixing configuration modified (offsets change) */ virtual void updatedMixing() = 0; public: Filter() : currentGain(nullptr), currentMixer(nullptr), currentSummer(nullptr), currentResonance(nullptr), Vhp(0), Vbp(0), Vlp(0), ve(0), fc(0), filt1(false), filt2(false), filt3(false), filtE(false), voice3off(false), hp(false), bp(false), lp(false), vol(0), enabled(true), filt(0) {} virtual ~Filter() {} /** * SID clocking - 1 cycle * * @param v1 voice 1 in * @param v2 voice 2 in * @param v3 voice 3 in * @return filtered output */ virtual unsigned short clock(int v1, int v2, int v3) = 0; /** * Enable filter. * * @param enable */ void enable(bool enable); /** * SID reset. */ void reset(); /** * Write Frequency Cutoff Low register. * * @param fc_lo Frequency Cutoff Low-Byte */ void writeFC_LO(unsigned char fc_lo); /** * Write Frequency Cutoff High register. * * @param fc_hi Frequency Cutoff High-Byte */ void writeFC_HI(unsigned char fc_hi); /** * Write Resonance/Filter register. * * @param res_filt Resonance/Filter */ void writeRES_FILT(unsigned char res_filt); /** * Write filter Mode/Volume register. * * @param mode_vol Filter Mode/Volume */ void writeMODE_VOL(unsigned char mode_vol); virtual void input(int input) = 0; }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/COPYING0000644000175100001770000004325414544470307021314 00000000000000 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. libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Integrator8580.cpp0000644000175100001770000000171614544470307023425 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014-2016 Leandro Nini * * 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. */ #define INTEGRATOR8580_CPP #include "Integrator8580.h" // This is needed when compiling with --disable-inline libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/OpAmp.h0000644000175100001770000000602514544470307021441 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef OPAMP_H #define OPAMP_H #include #include #include "Spline.h" #include "sidcxx11.h" namespace reSIDfp { /** * Find output voltage in inverting gain and inverting summer SID op-amp * circuits, using a combination of Newton-Raphson and bisection. * * +---R2--+ * | | * vi ---R1--o--[A>--o-- vo * vx * * From Kirchoff's current law it follows that * * IR1f + IR2r = 0 * * Substituting the triode mode transistor model K*W/L*(Vgst^2 - Vgdt^2) * for the currents, we get: * * n*((Vddt - vx)^2 - (Vddt - vi)^2) + (Vddt - vx)^2 - (Vddt - vo)^2 = 0 * * where n is the ratio between R1 and R2. * * Our root function f can thus be written as: * * f = (n + 1)*(Vddt - vx)^2 - n*(Vddt - vi)^2 - (Vddt - vo)^2 = 0 * * Using substitution constants * * a = n + 1 * b = Vddt * c = n*(Vddt - vi)^2 * * the equations for the root function and its derivative can be written as: * * f = a*(b - vx)^2 - c - (b - vo)^2 * df = 2*((b - vo)*dvo - a*(b - vx)) */ class OpAmp { private: /// Current root position (cached as guess to speed up next iteration) mutable double x; const double Vddt; const double vmin; const double vmax; std::unique_ptr const opamp; public: /** * Opamp input -> output voltage conversion * * @param opamp opamp mapping table as pairs of points (in -> out) * @param Vddt transistor dt parameter (in volts) * @param vmin * @param vmax */ OpAmp(const std::vector &opamp, double Vddt, double vmin, double vmax ) : x(0.), Vddt(Vddt), vmin(vmin), vmax(vmax), opamp(new Spline(opamp)) {} /** * Reset root position */ void reset() const { x = vmin; } /** * Solve the opamp equation for input vi in loading context n * * @param n the ratio of input/output loading * @param vi input voltage * @return vo output voltage */ double solve(double n, double vi) const; }; } // namespace reSIDfp #endif libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/Integrator6581.cpp0000644000175100001770000000170514544470307023422 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014 Leandro Nini * * 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. */ #define INTEGRATOR_CPP #include "Integrator6581.h" // This is needed when compiling with --disable-inline libsidplayfp-2.6.0/src/builders/residfp-builder/residfp/EnvelopeGenerator.h0000644000175100001770000002530314544470307024051 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2018 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2004,2010 Dag Lem * * 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. */ #ifndef ENVELOPEGENERATOR_H #define ENVELOPEGENERATOR_H #include "siddefs-fp.h" namespace reSIDfp { /** * A 15 bit [LFSR] is used to implement the envelope rates, in effect dividing * the clock to the envelope counter by the currently selected rate period. * * In addition, another 5 bit counter is used to implement the exponential envelope decay, * in effect further dividing the clock to the envelope counter. * The period of this counter is set to 1, 2, 4, 8, 16, 30 at the envelope counter * values 255, 93, 54, 26, 14, 6, respectively. * * [LFSR]: https://en.wikipedia.org/wiki/Linear_feedback_shift_register */ class EnvelopeGenerator { private: /** * The envelope state machine's distinct states. In addition to this, * envelope has a hold mode, which freezes envelope counter to zero. */ enum State { ATTACK, DECAY_SUSTAIN, RELEASE }; private: /// XOR shift register for ADSR prescaling. unsigned int lfsr; /// Comparison value (period) of the rate counter before next event. unsigned int rate; /** * During release mode, the SID approximates envelope decay via piecewise * linear decay rate. */ unsigned int exponential_counter; /** * Comparison value (period) of the exponential decay counter before next * decrement. */ unsigned int exponential_counter_period; unsigned int new_exponential_counter_period; unsigned int state_pipeline; /// unsigned int envelope_pipeline; unsigned int exponential_pipeline; /// Current envelope state State state; State next_state; /// Whether counter is enabled. Only switching to ATTACK can release envelope. bool counter_enabled; /// Gate bit bool gate; /// bool resetLfsr; /// The current digital value of envelope output. unsigned char envelope_counter; /// Attack register unsigned char attack; /// Decay register unsigned char decay; /// Sustain register unsigned char sustain; /// Release register unsigned char release; /// The ENV3 value, sampled at the first phase of the clock unsigned char env3; private: static const unsigned int adsrtable[16]; private: void set_exponential_counter(); void state_change(); public: /** * SID clocking. */ void clock(); /** * Get the Envelope Generator digital output. */ unsigned int output() const { return envelope_counter; } /** * Constructor. */ EnvelopeGenerator() : lfsr(0x7fff), rate(0), exponential_counter(0), exponential_counter_period(1), new_exponential_counter_period(0), state_pipeline(0), envelope_pipeline(0), exponential_pipeline(0), state(RELEASE), next_state(RELEASE), counter_enabled(true), gate(false), resetLfsr(false), envelope_counter(0xaa), attack(0), decay(0), sustain(0), release(0), env3(0) {} /** * SID reset. */ void reset(); /** * Write control register. * * @param control * control register value */ void writeCONTROL_REG(unsigned char control); /** * Write Attack/Decay register. * * @param attack_decay * attack/decay value */ void writeATTACK_DECAY(unsigned char attack_decay); /** * Write Sustain/Release register. * * @param sustain_release * sustain/release value */ void writeSUSTAIN_RELEASE(unsigned char sustain_release); /** * Return the envelope current value. * * @return envelope counter value */ unsigned char readENV() const { return env3; } }; } // namespace reSIDfp #if RESID_INLINING || defined(ENVELOPEGENERATOR_CPP) namespace reSIDfp { RESID_INLINE void EnvelopeGenerator::clock() { env3 = envelope_counter; if (unlikely(new_exponential_counter_period > 0)) { exponential_counter_period = new_exponential_counter_period; new_exponential_counter_period = 0; } if (unlikely(state_pipeline)) { state_change(); } if (unlikely(envelope_pipeline != 0) && (--envelope_pipeline == 0)) { if (likely(counter_enabled)) { if (state == ATTACK) { if (++envelope_counter==0xff) { next_state = DECAY_SUSTAIN; state_pipeline = 3; } } else if ((state == DECAY_SUSTAIN) || (state == RELEASE)) { if (--envelope_counter==0x00) { counter_enabled = false; } } set_exponential_counter(); } } else if (unlikely(exponential_pipeline != 0) && (--exponential_pipeline == 0)) { exponential_counter = 0; if (((state == DECAY_SUSTAIN) && (envelope_counter != sustain)) || (state == RELEASE)) { // The envelope counter can flip from 0x00 to 0xff by changing state to // attack, then to release. The envelope counter will then continue // counting down in the release state. // This has been verified by sampling ENV3. envelope_pipeline = 1; } } else if (unlikely(resetLfsr)) { lfsr = 0x7fff; resetLfsr = false; if (state == ATTACK) { // The first envelope step in the attack state also resets the exponential // counter. This has been verified by sampling ENV3. exponential_counter = 0; // NOTE this is actually delayed one cycle, not modeled // The envelope counter can flip from 0xff to 0x00 by changing state to // release, then to attack. The envelope counter is then frozen at // zero; to unlock this situation the state must be changed to release, // then to attack. This has been verified by sampling ENV3. envelope_pipeline = 2; } else { if (counter_enabled && (++exponential_counter == exponential_counter_period)) exponential_pipeline = exponential_counter_period != 1 ? 2 : 1; } } // ADSR delay bug. // If the rate counter comparison value is set below the current value of the // rate counter, the counter will continue counting up until it wraps around // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the // envelope can constly be stepped. // This has been verified by sampling ENV3. // check to see if LFSR matches table value if (likely(lfsr != rate)) { // it wasn't a match, clock the LFSR once // by performing XOR on last 2 bits const unsigned int feedback = ((lfsr << 14) ^ (lfsr << 13)) & 0x4000; lfsr = (lfsr >> 1) | feedback; } else { resetLfsr = true; } } /** * This is what happens on chip during state switching, * based on die reverse engineering and transistor level * emulation. * * Attack * * 0 - Gate on * 1 - Counting direction changes * During this cycle the decay rate is "accidentally" activated * 2 - Counter is being inverted * Now the attack rate is correctly activated * Counter is enabled * 3 - Counter will be counting upward from now on * * Decay * * 0 - Counter == $ff * 1 - Counting direction changes * The attack state is still active * 2 - Counter is being inverted * During this cycle the decay state is activated * 3 - Counter will be counting downward from now on * * Release * * 0 - Gate off * 1 - During this cycle the release state is activated if coming from sustain/decay * *2 - Counter is being inverted, the release state is activated * *3 - Counter will be counting downward from now on * * (* only if coming directly from Attack state) * * Freeze * * 0 - Counter == $00 * 1 - Nothing * 2 - Counter is disabled */ RESID_INLINE void EnvelopeGenerator::state_change() { state_pipeline--; switch (next_state) { case ATTACK: if (state_pipeline == 1) { // The decay rate is "accidentally" enabled during first cycle of attack phase rate = adsrtable[decay]; } else if (state_pipeline == 0) { state = ATTACK; // The attack rate is correctly enabled during second cycle of attack phase rate = adsrtable[attack]; counter_enabled = true; } break; case DECAY_SUSTAIN: if (state_pipeline == 0) { state = DECAY_SUSTAIN; rate = adsrtable[decay]; } break; case RELEASE: if (((state == ATTACK) && (state_pipeline == 0)) || ((state == DECAY_SUSTAIN) && (state_pipeline == 1))) { state = RELEASE; rate = adsrtable[release]; } break; } } RESID_INLINE void EnvelopeGenerator::set_exponential_counter() { // Check for change of exponential counter period. // // For a detailed description see: // http://ploguechipsounds.blogspot.it/2010/03/sid-6581r3-adsr-tables-up-close.html switch (envelope_counter) { case 0xff: case 0x00: new_exponential_counter_period = 1; break; case 0x5d: new_exponential_counter_period = 2; break; case 0x36: new_exponential_counter_period = 4; break; case 0x1a: new_exponential_counter_period = 8; break; case 0x0e: new_exponential_counter_period = 16; break; case 0x06: new_exponential_counter_period = 30; break; } } } // namespace reSIDfp #endif #endif libsidplayfp-2.6.0/src/builders/exsid-builder/0000755000175100001770000000000014544470322016352 500000000000000libsidplayfp-2.6.0/src/builders/exsid-builder/exsid-emu.h0000644000175100001770000000473314544470307020355 00000000000000/*************************************************************************** exsid-emu.h - exSID support interface. ------------------- Based on hardsid-emu.h (C) 2000-2002 Simon White, (C) 2001-2002 Jarno Paananen copyright : (C) 2015 Thibaut VARENE ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 as * * published by the Free Software Foundation. * * * ***************************************************************************/ #ifndef EXSID_EMU_H #define EXSID_EMU_H #include "sidemu.h" #include "Event.h" #include "EventScheduler.h" #include "sidplayfp/siddefs.h" #include "sidcxx11.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif namespace libsidplayfp { /*************************************************************************** * exSID SID Specialisation ***************************************************************************/ class exSID final : public sidemu { private: //friend class HardSIDBuilder; // exSID specific data static unsigned int sid; void * exsid; bool m_status; bool readflag; uint8_t busValue; bool muted[3]; SidConfig::sid_model_t runmodel; private: unsigned int delay(); public: static const char* getCredits(); public: exSID(sidbuilder *builder); ~exSID(); bool getStatus() const { return m_status; } uint8_t read(uint_least8_t addr) override; void write(uint_least8_t addr, uint8_t data) override; // c64sid functions void reset(uint8_t volume) override; // Standard SID functions void clock() override; void model(SidConfig::sid_model_t model, bool digiboost) override; void voice(unsigned int num, bool mute) override; void filter(bool) {} void sampling(float systemclock, float freq, SidConfig::sampling_method_t method, bool) override; // exSID specific void flush(); // Must lock the SID before using the standard functions. bool lock(EventScheduler *env) override; void unlock() override; }; } #endif // EXSID_EMU_H libsidplayfp-2.6.0/src/builders/exsid-builder/driver/0000755000175100001770000000000014544470322017645 500000000000000libsidplayfp-2.6.0/src/builders/exsid-builder/driver/exSID.h0000644000175100001770000000440614544470311020714 00000000000000// // exSID.h // A simple I/O library for exSID USB - interface header file // // (C) 2015-2017,2021 Thibaut VARENE // License: GPLv2 - http://www.gnu.org/licenses/gpl-2.0.html // /** * @file * libexsid interface header file. */ #ifndef exSID_h #define exSID_h #ifdef __cplusplus extern "C" { #endif #include #define EXSID_MAJOR_VERSION 2 #define EXSID_MINOR_VERSION 1 #define EXSID_REVISION 0 #define EXSID_VERSION _xxstr(EXSID_MAJOR_VERSION) "." _xxstr(EXSID_MINOR_VERSION) "." _xxstr(EXSID_REVISION) #define EXSID_VERSION_CHECK(maj, min) ((maj==EXSID_MAJOR_VERSION) && (min<=EXSID_MINOR_VERSION)) #define _xstr(x) #x #define _xxstr(x) _xstr(x) /** Chip selection values for exSID_chipselect() */ enum { XS_CS_CHIP0, ///< 6581 XS_CS_CHIP1, ///< 8580 XS_CS_BOTH, ///< Both chips. @warning Invalid for reads: undefined behaviour! }; /** Audio output operations for exSID_audio_op() */ enum { XS_AU_6581_8580, ///< mix: 6581 L / 8580 R XS_AU_8580_6581, ///< mix: 8580 L / 6581 R XS_AU_8580_8580, ///< mix: 8580 L and R XS_AU_6581_6581, ///< mix: 6581 L and R XS_AU_MUTE, ///< mute output XS_AU_UNMUTE, ///< unmute output }; /** Clock selection values for exSID_clockselect() */ enum { XS_CL_PAL, ///< select PAL clock XS_CL_NTSC, ///< select NTSC clock XS_CL_1MHZ, ///< select 1MHz clock }; /** Hardware model return values for exSID_hwmodel() */ enum { XS_MD_STD, ///< exSID USB XS_MD_PLUS, ///< exSID+ USB }; // public interface void * exSID_new(void); void exSID_free(void * exsid); int exSID_init(void * const exsid); int exSID_exit(void * const exsid); int exSID_reset(void * const exsid); int exSID_hwmodel(void * const exsid); uint16_t exSID_hwversion(void * const exsid); int exSID_clockselect(void * const exsid, int clock); int exSID_audio_op(void * const exsid, int operation); int exSID_chipselect(void * const exsid, int chip); int exSID_delay(void * const exsid, uint_fast32_t cycles); int exSID_clkdwrite(void * const exsid, uint_fast32_t cycles, uint_least8_t addr, uint8_t data); const char * exSID_error_str(void * const exsid); /* NB: read interface is only provided as proof of concept */ int exSID_clkdread(void * const exsid, uint_fast32_t cycles, uint_least8_t addr, uint8_t * data); #ifdef __cplusplus } #endif #endif /* exSID_h */ libsidplayfp-2.6.0/src/builders/exsid-builder/driver/exSID.c0000644000175100001770000006555714544470311020725 00000000000000// // exSID.c // A simple I/O library for exSID/exSID+ USB // // (C) 2015-2018,2021 Thibaut VARENE // License: GPLv2 - http://www.gnu.org/licenses/gpl-2.0.html /** * @file * exSID/exSID+ USB I/O library * @author Thibaut VARENE * @date 2015-2018,2021 * @version 2.1 * * This driver will control the first exSID device available. * All public API functions are only valid after a successful call to exSID_init(). * To release the device and resources, exSID_exit() and exSID_free() must be called. * * The return value for public routines returning an integer is 0 for successful execution * and !0 for error, unless otherwise noted. * * @warning Although it can internally make use of two separate threads, the driver * implementation is NOT thread safe (since it is not expected that a SID device may * be accessed concurrently), and some optimizations in the code are based on the * assumption that the code is run within a single-threaded environment. */ #include "exSID.h" #include "exSID_defs.h" #include "exSID_ftdiwrap.h" #include #include #include #include #include #include #ifdef EXSID_THREADED #if defined(HAVE_PTHREAD_H) #include #else #error "No thread model available" #endif #endif // EXSID_TRHREADED #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) #define XS_ERRORBUF 256 #define xserror(xs, format, ...) snprintf(xs->xSerrstr, XS_ERRORBUF, "(%s) ERROR " format, __func__, ## __VA_ARGS__) /** * cycles is uint_fast32_t. Technically, clkdrift should be int_fast64_t though * overflow should not happen under normal conditions. */ typedef int_fast32_t clkdrift_t; /** * This private structure holds hardware-dependent constants. */ struct xSconsts_s { unsigned int model; ///< exSID device model in use clkdrift_t write_cycles; ///< number of SID clocks spent in write ops clkdrift_t read_pre_cycles; ///< number of SID clocks spent in read op before data is actually read clkdrift_t read_post_cycles; ///< number of SID clocks spent in read op after data is actually read clkdrift_t read_offset_cycles; ///< read offset adjustment to align with writes (see function documentation) clkdrift_t csioctl_cycles; ///< number of SID clocks spent in chip select ioctl clkdrift_t mindel_cycles; ///< lowest number of SID clocks that can be accounted for in delay clkdrift_t max_adj; ///< maximum number of SID clocks that can be encoded in final delay for read()/write() size_t buff_size; ///< output buffer size }; /** Array of supported devices */ static const struct { const char * desc; ///< USB device description string const int pid; ///< USB PID const int vid; ///< USB VID const struct xSconsts_s xsc; ///< constants specific to the device } xSsupported[] = { { /* exSID USB */ .desc = XS_USBDSC, .pid = XS_USBPID, .vid = XS_USBVID, .xsc = (struct xSconsts_s){ .model = XS_MODEL_STD, .write_cycles = XS_CYCIO, .read_pre_cycles = XS_CYCCHR, .read_post_cycles = XS_CYCCHR, .read_offset_cycles = -2, // see exSID_clkdread() documentation .csioctl_cycles = XS_CYCCHR, .mindel_cycles = XS_MINDEL, .max_adj = XS_MAXADJ, .buff_size = XS_BUFFSZ, }, }, { /* exSID+ USB */ .desc = XSP_USBDSC, .pid = XSP_USBPID, .vid = XSP_USBVID, .xsc = (struct xSconsts_s){ .model = XS_MODEL_PLUS, .write_cycles = XSP_CYCIO, .read_pre_cycles = XSP_PRE_RD, .read_post_cycles = XSP_POSTRD, .read_offset_cycles = 0, .csioctl_cycles = XSP_CYCCS, .mindel_cycles = XSP_MINDEL, .max_adj = XSP_MAXADJ, .buff_size = XSP_BUFFSZ, }, } }; /** exSID private handle */ struct _exsid { /** negative values mean we're lagging, positive mean we're ahead. See it as a number of SID clocks queued to be spent. */ clkdrift_t clkdrift; const struct xSconsts_s * restrict cst; ///< Pointer to constants used by all the hardware access routines. void * ftdi; ///< FTDI device handle. #ifdef DEBUG long accdrift; unsigned long accioops; unsigned long accdelay; unsigned long acccycle; // ensures no overflow with exSID+ up to ~1h of continuous playback #endif int backbuf_idx; ///< current index for the back buffer unsigned char * restrict backbuf; ///< back buffer #ifdef EXSID_THREADED // Variables for flip buffering pthread_mutex_t flip_mtx; pthread_cond_t backbuf_full_cnd, backbuf_avail_cnd; unsigned char * restrict frontbuf; ///< front buffer _Bool backbuf_ready; ///< signals back buffer is ready to be flipped int postdelay; ///< post delay applied after writing frontbuf to device, before the next write is attempted pthread_t thread_output; #endif // EXSID_THREADED uint16_t hwvers; ///< hardware version char xSerrstr[XS_ERRORBUF+1]; ///< XS_ERRORBUF-byte max string for last error message }; /** * Signal-safe nanosleep() wrapper, can be used to wait for exSID. * Some operations stall the device and because we don't use flow control on exSID, we may need to wait. * exSID+ use full bidirectionnal flow control and does not require the wait. * @param usecs requested sleep time in microseconds. * @return return value of nanosleep(), with EINTR handled internally. */ static int _xSusleep(int usecs) { struct timespec tv; int ret; xsdbg("sleep: %d\n", usecs); tv.tv_sec = usecs / 1000000; tv.tv_nsec = (usecs % 1000000) * 1000; while (1) { ret = nanosleep(&tv, &tv); if (ret) { if (EINTR == errno) continue; } return ret; } } /** * Returns a string describing the last recorded error. * @param exsid exsid handle * @return error message (max 256 bytes long). */ const char * exSID_error_str(void * const exsid) { const struct _exsid * const xs = exsid; if (!exsid) return NULL; return (xs->xSerrstr); } /** * Write routine to send data to the device. * Calls USB wrapper. * @note BLOCKING. * @param xs exsid private pointer * @param buff pointer to a byte array of data to send * @param size number of bytes to send */ static inline void xSwrite(struct _exsid * const xs, const unsigned char * buff, int size) { int ret = xSfw_write_data(xs->ftdi, buff, size); #ifdef DEBUG if (unlikely(ret < 0)) { xsdbg("Error ftdi_write_data(%d): %s\n", ret, xSfw_get_error_string(xs->ftdi)); } if (unlikely(ret != size)) { xsdbg("ftdi_write_data only wrote %d (of %d) bytes\n", ret, size); } #endif } /** * Read routine to get data from the device. * Calls USB wrapper. * @warning if EXSID_THREADED is enabled, must not be called once the * output thread is writing to the device (no synchronization with output thread). * @note BLOCKING. * @param xs exsid private pointer * @param buff pointer to a byte array that will be filled with read data * @param size number of bytes to read */ static void xSread(struct _exsid * const xs, unsigned char * buff, int size) { int ret = 0; // libftdi implements a non-blocking read() call that returns 0 if no data was available do { ret += xSfw_read_data(xs->ftdi, buff+ret, size-ret); } while (ret != size); #ifdef DEBUG if (unlikely(ret < 0)) { xsdbg("Error ftdi_read_data(%d): %s\n", ret, xSfw_get_error_string(xs->ftdi)); } if (unlikely(ret != size)) { xsdbg("ftdi_read_data only read %d (of %d) bytes\n", ret, size); } #endif } #ifdef EXSID_THREADED /** * Writer thread. ** consumer ** * This thread consumes the buffer prepared in xSoutb(). * Since writes to the FTDI subsystem are blocking, this thread blocks when it's * writing to the chip, and also while it's waiting for the back buffer to be ready. * When the back buffer is ready, it is flipped with the front one and immediately * released for the next fill, while the front buffer is written to the device. * @note BLOCKING. * @param arg exsid handle * @return DOES NOT RETURN, exits when xs->postdelay is negative. */ static void * _exSID_thread_output(void * arg) { struct _exsid * const xs = arg; unsigned char * bufptr; int frontbuf_idx, delay; #ifdef _GNU_SOURCE pthread_setname_np(pthread_self(), "output"); #endif xsdbg("thread started\n"); while (1) { pthread_mutex_lock(&xs->flip_mtx); // wait for backbuf full while (!xs->backbuf_ready) pthread_cond_wait(&xs->backbuf_full_cnd, &xs->flip_mtx); // Keep the critical section fast and short: delay = xs->postdelay; // record postdelay bufptr = xs->frontbuf; frontbuf_idx = xs->backbuf_idx; xs->frontbuf = xs->backbuf; // flip back to front xs->backbuf = bufptr; xs->backbuf_idx = 0; xs->backbuf_ready = 0; // signal we're done and free mutex pthread_cond_signal(&xs->backbuf_avail_cnd); pthread_mutex_unlock(&xs->flip_mtx); // this blocks outside of mutex held xSwrite(xs, xs->frontbuf, frontbuf_idx); if (unlikely(delay)) { if (unlikely(delay < 0)) { // exit condition xsdbg("thread exiting!\n"); pthread_exit(NULL); } else if (XS_MODEL_STD == xs->cst->model) _xSusleep(delay); } } } #endif // EXSID_THREADED /** * Single byte output routine. ** producer ** * Fills a buffer with bytes to send to the device until the buffer is full or a forced write is triggered. * @note No drift compensation is performed on read operations. * @param xs exsid private pointer * @param byte byte to send * @param flush force write flush if positive (add usleep(flush) if >1), trigger thread exit if negative */ static void xSoutb(struct _exsid * const xs, uint8_t byte, int flush) { xs->backbuf[xs->backbuf_idx++] = (unsigned char)byte; if (likely((xs->backbuf_idx < xs->cst->buff_size) && !flush)) return; #ifdef EXSID_THREADED // buffer dance pthread_mutex_lock(&xs->flip_mtx); xs->postdelay = flush; // signal backbuff full xs->backbuf_ready = 1; pthread_cond_signal(&xs->backbuf_full_cnd); // wait for buffer flipped while (xs->backbuf_idx) pthread_cond_wait(&xs->backbuf_avail_cnd, &xs->flip_mtx); pthread_mutex_unlock(&xs->flip_mtx); #else // unthreaded xSwrite(xs, xs->backbuf, xs->backbuf_idx); xs->backbuf_idx = 0; if (unlikely((flush > 1) && (XS_MODEL_STD == xs->cst->model))) _xSusleep(flush); #endif } /** * Allocate an exSID handle. * @return allocated opaque handle, NULL if error. */ void * exSID_new(void) { struct _exsid * xs; xs = calloc(1, sizeof(*xs)); return xs; } /** * Deallocate an exSID handle. * Frees up all memory used by the exSID handle. * @param exsid exsid handle */ void exSID_free(void * exsid) { struct _exsid * xs = exsid; if (!xs) return; if (xSfw_free && xs->ftdi) xSfw_free(xs->ftdi); #ifdef EXSID_THREADED if (xs->frontbuf) free(xs->frontbuf); #endif if (xs->backbuf) free(xs->backbuf); free(xs); } /** * Device init routine. * Must be called once before any operation is attempted on the device. * Opens first available device, and sets various parameters: baudrate, parity, flow * control and USB latency. * @note If this function fails, exSID_free() must still be called. * @param exsid allocated exsid handle generated with exSID_new() * @return 0 on success, !0 otherwise. */ int exSID_init(void * const exsid) { struct _exsid * const xs = exsid; unsigned char buf[2]; int i, ret; xsdbg("libexsid v" EXSID_VERSION "\n"); if (!exsid) { fprintf(stderr, "ERROR: exSID_init: invalid handle\n"); return -1; } if (xSfw_dlopen()) { xserror(xs, "Failed to open dynamic loader"); return -1; } /* Attempt to open all supported devices until first success. * Cleanup ftdi after each try to avoid passing garbage around as we don't know what * the FTDI open routines do with the pointer. */ for (i = 0; i < ARRAY_SIZE(xSsupported); i++) { if (xSfw_new) { xs->ftdi = xSfw_new(); if (!xs->ftdi) { xserror(xs, "ftdi_new failed"); return -1; } } xsdbg("Trying %s...\n", xSsupported[i].desc); xs->cst = &xSsupported[i].xsc; // setting unconditionnally avoids segfaults if user code calls exit() after failure. ret = xSfw_usb_open_desc(&xs->ftdi, xSsupported[i].vid, xSsupported[i].pid, xSsupported[i].desc, NULL); if (ret >= 0) { xsdbg("Opened!\n"); break; } else { xsdbg("Failed: %d (%s)\n", ret, xSfw_get_error_string(xs->ftdi)); if (xSfw_free) xSfw_free(xs->ftdi); xs->ftdi = NULL; } } if (i >= ARRAY_SIZE(xSsupported)) { xserror(xs, "No device could be opened"); return -1; } ret = xSfw_usb_setup(xs->ftdi, XS_BDRATE, XSC_USBLAT); if (ret < 0) { xserror(xs, "Failed to setup device"); return -1; } // success - device is setup xsdbg("Device setup\n"); // Wait for device ready by trying to read hw version and wait for the answer buf[0] = XS_AD_IOCTHV; buf[1] = XS_AD_IOCTFV; // ok as we have a 2-byte RX buffer on PIC xSwrite(xs, buf, 2); xSread(xs, buf, 2); xs->hwvers = buf[0] << 8 | buf[1]; // ensure proper order regardless of endianness xsdbg("HV: %c, FV: %hhu\n", buf[0], buf[1]); xs->backbuf = malloc(xs->cst->buff_size); if (!xs->backbuf) { xserror(xs, "Out of memory!"); return -1; } #ifdef EXSID_THREADED xs->frontbuf = malloc(xs->cst->buff_size); if (!xs->frontbuf) { xserror(xs, "Out of memory!"); return -1; } ret = pthread_mutex_init(&xs->flip_mtx, NULL); ret |= pthread_cond_init(&xs->backbuf_avail_cnd, NULL); ret |= pthread_cond_init(&xs->backbuf_full_cnd, NULL); ret |= pthread_create(&xs->thread_output, NULL, _exSID_thread_output, xs); if (ret) { xserror(xs, "Thread setup failed"); return -1; } xsdbg("Thread setup\n"); #endif xsdbg("buffer size: %zu bytes\n", xs->cst->buff_size); xsdbg("Rock'n'roll!\n"); return 0; } /** * Device exit routine. * Must be called to release the device. * Resets the SIDs, frees buffers and closes FTDI device. * @param exsid exsid handle * @return execution status */ int exSID_exit(void * const exsid) { struct _exsid * const xs = exsid; int ret = 0; if (!xs) return -1; if (xs->ftdi) { exSID_reset(xs); #ifdef EXSID_THREADED xSoutb(xs, XS_AD_IOCTD1, -1); // signal end of thread pthread_join(xs->thread_output, NULL); pthread_cond_destroy(&xs->backbuf_full_cnd); pthread_cond_destroy(&xs->backbuf_avail_cnd); pthread_mutex_destroy(&xs->flip_mtx); if (xs->frontbuf) free(xs->frontbuf); xs->frontbuf = NULL; #endif if (xs->backbuf) free(xs->backbuf); xs->backbuf = NULL; ret = xSfw_usb_close(xs->ftdi); if (ret < 0) xserror(xs, "Unable to close ftdi device: %d (%s)", ret, xSfw_get_error_string(xs->ftdi)); if (xSfw_free) xSfw_free(xs->ftdi); xs->ftdi = NULL; #ifdef DEBUG xsdbg("mean jitter: %.2f cycle(s) over %lu I/O ops\n", ((float)xs->accdrift/xs->accioops), xs->accioops); xsdbg("bandwidth used for I/O ops: %lu%% (approx)\n", 100-(xs->accdelay*100/xs->acccycle)); xs->accdrift = xs->accioops = xs->accdelay = xs->acccycle = 0; #endif } xs->clkdrift = 0; xSfw_dlclose(); return ret; } /** * SID reset routine. * Performs a hardware reset on the SIDs. * This also resets the internal drift adjustment counter. * @note since the reset procedure in firmware will stall the device, * reset can wait before resuming execution. * @param exsid exsid handle * @return execution status */ int exSID_reset(void * const exsid) { struct _exsid * const xs = exsid; if (!xs) return -1; xsdbg("reset\n"); xSoutb(xs, XS_AD_IOCTRS, 100); // this will stall xs->clkdrift = 0; return 0; } /** * exSID+ clock selection routine. * Selects between PAL, NTSC and 1MHz clocks. Only implemented in exSID+ devices. * @note upon clock change the hardware resync itself and resets the SIDs, which * takes approximately 50us: this call introduces a stall in the stream * and resets the internal drift adjustment counter. Output should be muted before execution. * @param exsid exsid handle * @param clock clock selector value, see exSID.h. * @return execution status */ int exSID_clockselect(void * const exsid, int clock) { struct _exsid * const xs = exsid; if (!xs) return -1; xsdbg("clk: %d\n", clock); if (XS_MODEL_PLUS != xs->cst->model) return -1; switch (clock) { case XS_CL_PAL: xSoutb(xs, XSP_AD_IOCTCP, 100); break; case XS_CL_NTSC: xSoutb(xs, XSP_AD_IOCTCN, 100); break; case XS_CL_1MHZ: xSoutb(xs, XSP_AD_IOCTC1, 100); break; default: return -1; } xs->clkdrift = 0; // reset drift return 0; } /** * exSID+ audio operations routine. * Selects the audio mixing / muting option. Only implemented in exSID+ devices. * @warning all these operations (excepting unmuting obviously) will mute the * output by default. * @note no accounting for SID cycles consumed (not expected to be used during playback). * @param exsid exsid handle * @param operation audio operation value, see exSID.h. * @return execution status */ int exSID_audio_op(void * const exsid, int operation) { struct _exsid * const xs = exsid; if (!xs) return -1; xsdbg("auop: %d\n", operation); if (XS_MODEL_PLUS != xs->cst->model) return -1; switch (operation) { case XS_AU_6581_8580: xSoutb(xs, XSP_AD_IOCTA0, 0); break; case XS_AU_8580_6581: xSoutb(xs, XSP_AD_IOCTA1, 0); break; case XS_AU_8580_8580: xSoutb(xs, XSP_AD_IOCTA2, 0); break; case XS_AU_6581_6581: xSoutb(xs, XSP_AD_IOCTA3, 0); break; case XS_AU_MUTE: xSoutb(xs, XSP_AD_IOCTAM, 0); break; case XS_AU_UNMUTE: xSoutb(xs, XSP_AD_IOCTAU, 0); break; default: return -1; } return 0; } /** * SID chipselect routine. * Selects which SID will play the tunes. * @note Accounts for elapsed cycles. * @param exsid exsid handle * @param chip SID selector value, see exSID.h. * @return execution status */ int exSID_chipselect(void * const exsid, int chip) { struct _exsid * const xs = exsid; if (!xs) return -1; xs->clkdrift -= xs->cst->csioctl_cycles; xsdbg("cs: %d\n", chip); switch (chip) { case XS_CS_CHIP0: xSoutb(xs, XS_AD_IOCTS0, 0); break; case XS_CS_CHIP1: xSoutb(xs, XS_AD_IOCTS1, 0); break; case XS_CS_BOTH: xSoutb(xs, XS_AD_IOCTSB, 0); break; default: return -1; } return 0; } /** * Device hardware model. * Queries the driver for the hardware model currently identified. * @param exsid exsid handle * @return hardware model as enumerated in exSID.h, negative value on error. */ int exSID_hwmodel(void * const exsid) { struct _exsid * const xs = exsid; int model; if (!xs) return -1; switch (xs->cst->model) { case XS_MODEL_STD: model = XS_MD_STD; break; case XS_MODEL_PLUS: model = XS_MD_PLUS; break; default: model = -1; break; } xsdbg("HW model: %d\n", model); return model; } /** * Hardware and firmware version of the device. * Returns both in the form of a 16bit integer: MSB is an ASCII * character representing the hardware revision (e.g. 0x42 = "B"), and LSB * is a number representing the firmware version in decimal integer. * Does not reach the hardware (information is fetched once in exSID_init()). * @param exsid exsid handle * @return version information as described above, or 0xFFFF if error. */ uint16_t exSID_hwversion(void * const exsid) { struct _exsid * const xs = exsid; if (!xs) return 0xFFFF; return xs->hwvers; } /** * Private delay loop. * Introduces NOP requests to the device for the sole purpose of elapsing a number of SID clock cycles. * @param xs exsid private pointer * @param cycles how many SID clocks to loop for. */ static inline void xSdelay(struct _exsid * const xs, uint_fast32_t cycles) { #ifdef DEBUG xs->accdelay += cycles; #endif while (likely(cycles >= xs->cst->mindel_cycles)) { xSoutb(xs, XS_AD_IOCTD1, 0); cycles -= xs->cst->mindel_cycles; xs->clkdrift -= xs->cst->mindel_cycles; } #ifdef DEBUG xs->accdelay -= cycles; #endif } /** * Cycle accurate delay routine. * Delay for cycles SID clocks while leaving enough lead time for an I/O operation. * @param exsid exsid handle * @param cycles how many SID clocks to loop for. * @return 0 on success, -1 on error and 1 if the requested number of cycles is smaller than the feasible delay */ int exSID_delay(void * const exsid, uint_fast32_t cycles) { struct _exsid * const xs = exsid; uint_fast32_t delay; if (unlikely(!xs)) return -1; xs->clkdrift += cycles; #ifdef DEBUG xs->acccycle += cycles; #endif if (unlikely(xs->clkdrift <= xs->cst->write_cycles)) // never delay for less than a full write would need return 1; // too short delay = xs->clkdrift - xs->cst->write_cycles; xSdelay(xs, delay); return 0; } /** * Private write routine for a tuple address + data. * @param xs exsid private pointer * @param addr target address to write to. * @param data data to write at that address. * @param flush if non-zero, force immediate flush to device. */ static inline void _exSID_write(struct _exsid * const xs, uint_least8_t addr, uint8_t data, int flush) { xSoutb(xs, (unsigned char)addr, 0); xSoutb(xs, (unsigned char)data, flush); } /** * Timed write routine, attempts cycle-accurate writes. * This function will be cycle-accurate provided that no two consecutive writes * are less than write_cycles apart and the leftover delay is <= max_adj SID clock cycles. * @note this function accepts writes to invalid addresses (> 0x18). If DEBUG is enabled * it will not pass them to the hardware and return 1. Elapsed SID cycles will still be accounted for. * @param exsid exsid handle * @param cycles how many SID clocks to wait before the actual data write. * @param addr target address. * @param data data to write at that address. * @return -1 if error, 0 on success */ int exSID_clkdwrite(void * const exsid, uint_fast32_t cycles, uint_least8_t addr, uint8_t data) { struct _exsid * const xs = exsid; int adj; if (unlikely(!xs)) return -1; #ifdef DEBUG if (unlikely(addr > 0x18)) { xsdbg("Invalid write: %.2" PRIxLEAST8 "\n", addr); exSID_delay(xs, cycles); return 1; } #endif // actual write will cost write_cycles. Delay for cycles - write_cycles then account for the write xs->clkdrift += cycles; if (xs->clkdrift > xs->cst->write_cycles) xSdelay(xs, xs->clkdrift - xs->cst->write_cycles); xs->clkdrift -= xs->cst->write_cycles; // write is going to consume write_cycles clock ticks #ifdef DEBUG if (xs->clkdrift >= xs->cst->mindel_cycles) xsdbg("Impossible drift adjustment! %" PRIdFAST32 " cycles\n", xs->clkdrift); else if (xs->clkdrift < 0) xs->accdrift += xs->clkdrift; #endif /* if we are still going to be early, delay actual write by up to max_adj ticks At this point it is guaranted that clkdrift will be < mindel_cycles. */ if (likely(xs->clkdrift >= 0)) { adj = xs->clkdrift % (xs->cst->max_adj+1); /* if max_adj is >= clkdrift, modulo will give the same results as the correct test: adj = (clkdrift < max_adj ? clkdrift : max_adj) but without an extra conditional branch. If is is < max_adj, then it seems to provide better results by evening jitter accross writes. So it's the preferred solution for all cases. */ addr = (unsigned char)(addr | (adj << 5)); // final delay encoded in top 3 bits of address #ifdef DEBUG xs->accdrift += (xs->clkdrift - adj); #endif //xsdbg("drft: %d, adj: %d, addr: %.2hhx, data: %.2hhx\n", clkdrift, adj, (char)(addr | (adj << 5)), data); } #ifdef DEBUG xs->acccycle += cycles; xs->accioops++; #endif //xsdbg("delay: %d, clkdrift: %d\n", cycles, xs->clkdrift); _exSID_write(xs, addr, data, 0); return 0; } /** * BLOCKING Timed read routine, attempts cycle-accurate reads. * The following description is based on exSID (standard). * This function will be cycle-accurate provided that no two consecutive reads or writes * are less than XS_CYCIO apart and leftover delay is <= max_adj SID clock cycles. * Read result will only be available after a full XS_CYCIO, giving clkdread() the same * run time as clkdwrite(). There's a 2-cycle negative adjustment in the code because * that's the actual offset from the write calls ('/' denotes falling clock edge latch), * which the following ASCII tries to illustrate:
* Write looks like this in firmware: * > ...|_/_|... * ...end of data byte read | cycle during which write is enacted / next cycle | etc...
* Read looks like this in firmware: * > ...|_|_|_/_|_|... * ...end of address byte read | 2 cycles for address processing | cycle during which SID is read / * then half a cycle later the CYCCHR-long data TX starts, cycle completes | another cycle | etc...
* This explains why reads happen a relative 2-cycle later than then should with * respect to writes. * @warning this function is only valid if EXSID_THREADED is not defined. If it * is called when EXSID_THREADED is defined, no read will be performed, however * the requested cycles will still be clocked. * @note this function accepts reads from invalid addresses (addr < 0x19 or addr > 0x1c). * If DEBUG is enabled it will not pass them to the hardware and return 1. Elapsed SID * cycles will still be accounted for. * @note The actual time the read will take to complete depends * on the USB bus activity and settings. It *should* complete in XSC_USBLAT ms, but * not less, meaning that read operations are bound to introduce timing inaccuracy. * As such, this function is only really provided as a proof of concept but SHOULD * BETTER BE AVOIDED. * @param exsid exsid handle * @param cycles how many SID clocks to wait before the actual data read. * @param addr target address. * @param data pointer to store data read from address. * @return -1 if error, 0 on success */ int exSID_clkdread(void * const exsid, uint_fast32_t cycles, uint_least8_t addr, uint8_t * data) { struct _exsid * const xs = exsid; #ifndef EXSID_THREADED int adj; if (unlikely(!xs || !data)) return -1; #ifdef DEBUG if (unlikely((addr < 0x19) || (addr > 0x1C))) { xsdbg("Invalid read: %.2" PRIxLEAST8 "\n", addr); exSID_delay(xs, cycles); return 1; } #endif // actual read will happen after read_pre_cycles. Delay for cycles - read_pre_cycles then account for the read xs->clkdrift += xs->cst->read_offset_cycles; // 2-cycle offset adjustement, see function documentation. xs->clkdrift += cycles; if (xs->clkdrift > xs->cst->read_pre_cycles) xSdelay(xs, xs->clkdrift - xs->cst->read_pre_cycles); xs->clkdrift -= xs->cst->read_pre_cycles; // read request is going to consume read_pre_cycles clock ticks #ifdef DEBUG if (xs->clkdrift > xs->cst->mindel_cycles) xsdbg("Impossible drift adjustment! %" PRIdFAST32 " cycles", xs->clkdrift); else if (xs->clkdrift < 0) { xs->accdrift += xs->clkdrift; xsdbg("Late read request! %" PRIdFAST32 " cycles\n", xs->clkdrift); } #endif // if we are still going to be early, delay actual read by up to max_adj ticks if (likely(xs->clkdrift >= 0)) { adj = xs->clkdrift % (xs->cst->max_adj+1); // see clkdwrite() addr = (unsigned char)(addr | (adj << 5)); // final delay encoded in top 3 bits of address #ifdef DEBUG xs->accdrift += (xs->clkdrift - adj); #endif //xsdbg("drft: %d, adj: %d, addr: %.2hhx, data: %.2hhx\n", clkdrift, adj, (char)(addr | (adj << 5)), data); } #ifdef DEBUG xs->acccycle += cycles; xs->accioops++; #endif // after read has completed, at least another read_post_cycles will have been spent xs->clkdrift -= xs->cst->read_post_cycles; //xsdbg("delay: %d, clkdrift: %d\n", cycles, clkdrift); xSoutb(xs, addr, 1); xSread(xs, data, 1); // blocking return 0; #else // !EXSID_THREADED exSID_delay(xs, cycles); return -1; #endif } libsidplayfp-2.6.0/src/builders/exsid-builder/driver/exSID_ftdiwrap.h0000644000175100001770000000532714544470311022617 00000000000000// // exSID_ftdiwrap.h // A FTDI access wrapper for exSID USB - header file // // (C) 2016 Thibaut VARENE // License: GPLv2 - http://www.gnu.org/licenses/gpl-2.0.html // /** * @file * FTDI access wrapper header file. */ #ifndef exSID_ftdiwrap_h #define exSID_ftdiwrap_h /** Allocate new ftdi handle. */ typedef void * (* xSfw_new_p)(void); /** Free ftdi handle. */ typedef void (* xSfw_free_p)(void * ftdi); /** * Write data to FTDI. * @param ftdi ftdi handle. * @param buf write buffer. * @param size number of bytes to write. * @return number of bytes written or negative error value. * @note there are performance constrains on the size of the buffer, see documentation. */ typedef int (* xSfw_write_data_p)(void * ftdi, const unsigned char * buf, int size); /** * Read data from FTDI. * @param ftdi ftdi handle. * @param buf read buffer. * @param size number of bytes to read. * @return number of bytes read or negative error value. * @note there are performance constrains on the size of the buffer, see documentation. */ typedef int (* xSfw_read_data_p)(void * ftdi, unsigned char * buf, int size); /** * Open device by description. * @param ftdi pointer to ftdi handle. * @param vid target vendor id. Ignored by ftd2xx. * @param pid target product id. Ignored by ftd2xx. * @param desc Description string. * @param serial target product serial. Ignored by ftd2xx. * @return 0 on success or negative error value. * @warning This is the only function to use a pointer to ftdi handle, this is * rendered necessary because of libftd2xx silly way of doing things. */ typedef int (* xSfw_usb_open_desc_p)(void ** ftdi, int vid, int pid, const char * desc, const char * serial); /** Purge FTDI buffers. */ typedef int (* xSfw_usb_purge_buffers_p)(void * ftdi); /** Close FTDI device. */ typedef int (* xSfw_usb_close_p)(void * ftdi); /** * Get error string. * @param ftdi ftdi handle. * @return human-readable error string. * @note only supported with libftdi. */ typedef char * (* xSfw_get_error_string_p)(void * ftdi); #ifndef XSFW_WRAPDECL #define XSFW_EXTERN extern #else #define XSFW_EXTERN /* nothing */ #endif #define XSFW_PROTODEF(a) XSFW_EXTERN a ## _p a XSFW_PROTODEF(xSfw_new); ///< Handle allocation callback XSFW_PROTODEF(xSfw_free); ///< Handle deallocation callback XSFW_PROTODEF(xSfw_write_data); ///< Data write callback XSFW_PROTODEF(xSfw_read_data); ///< Data read callback XSFW_PROTODEF(xSfw_usb_open_desc); ///< Device open callback XSFW_PROTODEF(xSfw_usb_close); ///< Device close callback XSFW_PROTODEF(xSfw_get_error_string); ///< Human readable error string callback int xSfw_usb_setup(void *ftdi, int baudrate, int latency); int xSfw_dlopen(); void xSfw_dlclose(); #endif /* exSID_ftdiwrap_h */ libsidplayfp-2.6.0/src/builders/exsid-builder/driver/m4/0000755000175100001770000000000014544470322020165 500000000000000libsidplayfp-2.6.0/src/builders/exsid-builder/driver/m4/ax_pthread.m40000644000175100001770000005272214544470311022474 00000000000000# =========================================================================== # https://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS # # AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) # # DESCRIPTION # # This macro figures out how to build C programs using POSIX threads. It # sets the PTHREAD_LIBS output variable to the threads library and linker # flags, and the PTHREAD_CFLAGS output variable to any special C compiler # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # # Also sets PTHREAD_CC to any special C compiler that is needed for # multi-threaded programs (defaults to the value of CC otherwise). (This # is necessary on AIX to use the special cc_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, # but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # # If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant # has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to # that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with # PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it # is not found. If ACTION-IF-FOUND is not specified, the default action # will define HAVE_PTHREAD. # # Please let the authors know if this macro fails on any platform, or if # you have any other suggestions or comments. This macro was based on work # by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help # from M. Frigo), as well as ac_pthread and hb_pthread macros posted by # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # # Updated for Autoconf 2.68 by Daniel Richard G. # # LICENSE # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. # Copyright (c) 2019 Marc Stevens # # 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 3 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, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure # scripts that are the output of Autoconf when processing the Macro. You # need not follow the terms of the GNU General Public License when using # or distributing such scripts, even though portions of the text of the # Macro appear in them. The GNU General Public License (GPL) does govern # all other use of the material that constitutes the Autoconf Macro. # # This special exception to the GPL applies to versions of the Autoconf # Macro released by the Autoconf Archive. When you make and distribute a # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. #serial 27 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h # requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then ax_pthread_save_CC="$CC" ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi CC="$ax_pthread_save_CC" CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different # names; the ordering is very important because some systems # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). # Create a list of thread flags to try. Items with a "," contain both # C compiler flags (before ",") and linker flags (after ","). Other items # starting with a "-" are C compiler flags, and remaining items are # library names, except for "none" which indicates that we try without # any flags at all, and "pthread-config" which is a program returning # the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: # pthreads: AIX (must check this before -lpthread) # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) # -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 # (Note: HP C rejects this with "bad form for `-t' option") # -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it # doesn't hurt to check since this sometimes defines pthreads and # -D_REENTRANT too), HP C (must be checked before -lpthread, which # is present but should not be used directly; and before -mthreads, # because the compiler interprets this as "-mt" + "-hreads") # -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) case $host_os in freebsd*) # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) ax_pthread_flags="-kthread lthread $ax_pthread_flags" ;; hpux*) # From the cc(1) man page: "[-mt] Sets various -D flags to enable # multi-threading and also sets -lpthread." ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" ;; openedition*) # IBM z/OS requires a feature-test macro to be defined in order to # enable POSIX threads at all, so give the user a hint if this is # not set. (We don't define these ourselves, as they can affect # other portions of the system API in unpredictable ways.) AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], [ # if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) AX_PTHREAD_ZOS_MISSING # endif ], [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) ;; solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based # tests will erroneously succeed. (N.B.: The stubs are missing # pthread_cleanup_push, or rather a function called by this macro, # so we could check for that, but who knows whether they'll stub # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac # Are we compiling with Clang? AC_CACHE_CHECK([whether $CC is Clang], [ax_cv_PTHREAD_CLANG], [ax_cv_PTHREAD_CLANG=no # Note that Autoconf sets GCC=yes for Clang as well as GCC if test "x$GCC" = "xyes"; then AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ # if defined(__clang__) && defined(__llvm__) AX_PTHREAD_CC_IS_CLANG # endif ], [ax_cv_PTHREAD_CLANG=yes]) fi ]) ax_pthread_clang="$ax_cv_PTHREAD_CLANG" # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) # Note that for GCC and Clang -pthread generally implies -lpthread, # except when -nostdlib is passed. # This is problematic using libtool to build C++ shared libraries with pthread: # [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 # [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 # [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 # To solve this, first try -pthread together with -lpthread for GCC AS_IF([test "x$GCC" = "xyes"], [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) # Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first AS_IF([test "x$ax_pthread_clang" = "xyes"], [ax_pthread_flags="-pthread,-lpthread -pthread"]) # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is # correctly enabled case $host_os in darwin* | hpux* | linux* | osf* | solaris*) ax_pthread_check_macro="_REENTRANT" ;; aix*) ax_pthread_check_macro="_THREAD_SAFE" ;; *) ax_pthread_check_macro="--" ;; esac AS_IF([test "x$ax_pthread_check_macro" = "x--"], [ax_pthread_check_cond=0], [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; *,*) PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) ;; -*) AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; pthread-config) AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) PTHREAD_CFLAGS="`pthread-config --cflags`" PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" ;; *) AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we # need a special flag -Kthread to make this header compile.) # We check for pthread_join because it is in -lpthread on IRIX # while pthread_create is in libc. We check for pthread_attr_init # due to DEC craziness with -lpthreads. We check for # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. AC_LINK_IFELSE([AC_LANG_PROGRAM([#include # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif static void *some_global = NULL; static void routine(void *a) { /* To avoid any unused-parameter or unused-but-set-parameter warning. */ some_global = a; } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); pthread_join(th, 0); pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], [ax_pthread_ok=yes], []) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way if test "x$ax_pthread_clang" = "xyes"; then # Clang takes -pthread; it has never supported any other flag # (Note 1: This will need to be revisited if a system that Clang # supports has POSIX threads in a separate library. This tends not # to be the way of modern systems, but it's conceivable.) # (Note 2: On some systems, notably Darwin, -pthread is not needed # to get POSIX threads support; the API is always present and # active. We could reasonably leave PTHREAD_CFLAGS empty. But # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused # during compilation"). They expect -pthread to be passed in only # when source code is being compiled. # # Problem is, this is at odds with the way Automake and most other # C build frameworks function, which is that the same flags used in # compilation (CFLAGS) are also used in linking. Many systems # supported by AX_PTHREAD require exactly this for POSIX threads # support, and in fact it is often not straightforward to specify a # flag that is used only in the compilation phase and not in # linking. Such a scenario is extremely rare in practice. # # Even though use of the -pthread flag in linking would only print # a warning, this can be a nuisance for well-run software projects # that build with -Werror. So if the active version of Clang has # this misfeature, we search for an option to squash it. AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown # Create an alternate version of $ac_link that compiles and # links in two steps (.c -> .o, .o -> exe) instead of one # (.c -> exe), because the warning occurs only in the second # step ax_pthread_save_ac_link="$ac_link" ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" ax_pthread_save_CFLAGS="$CFLAGS" for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" ac_link="$ax_pthread_save_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [ac_link="$ax_pthread_2step_ac_link" AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], [break]) ]) done ac_link="$ax_pthread_save_ac_link" CFLAGS="$ax_pthread_save_CFLAGS" AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" ]) case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in no | unknown) ;; *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; esac fi # $ax_pthread_clang = yes # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. AC_CACHE_CHECK([for joinable pthread attribute], [ax_cv_PTHREAD_JOINABLE_ATTR], [ax_cv_PTHREAD_JOINABLE_ATTR=unknown for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [int attr = $ax_pthread_attr; return attr /* ; */])], [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], []) done ]) AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ test "x$ax_pthread_joinable_attr_defined" != "xyes"], [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$ax_cv_PTHREAD_JOINABLE_ATTR], [Define to necessary symbol if this constant uses a non-standard name on your system.]) ax_pthread_joinable_attr_defined=yes ]) AC_CACHE_CHECK([whether more special flags are required for pthreads], [ax_cv_PTHREAD_SPECIAL_FLAGS], [ax_cv_PTHREAD_SPECIAL_FLAGS=no case $host_os in solaris*) ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" ;; esac ]) AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ test "x$ax_pthread_special_flags_added" != "xyes"], [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], [ax_cv_PTHREAD_PRIO_INHERIT], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], [[int i = PTHREAD_PRIO_INHERIT; return i;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ test "x$ax_pthread_prio_inherit_defined" != "xyes"], [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) ax_pthread_prio_inherit_defined=yes ]) CFLAGS="$ax_pthread_save_CFLAGS" LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant if test "x$GCC" != "xyes"; then case $host_os in aix*) AS_CASE(["x/$CC"], [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], [#handle absolute path differently from PATH based program lookup AS_CASE(["x$CC"], [x/*], [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) ;; esac fi fi test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" AC_SUBST([PTHREAD_LIBS]) AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: if test "x$ax_pthread_ok" = "xyes"; then ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else ax_pthread_ok=no $2 fi AC_LANG_POP ])dnl AX_PTHREAD libsidplayfp-2.6.0/src/builders/exsid-builder/driver/exSID_defs.h0000644000175100001770000001111214544470311021705 00000000000000// // exSID_defs.h // A simple I/O library for exSID USB - private header file // // (C) 2015-2017 Thibaut VARENE // License: GPLv2 - http://www.gnu.org/licenses/gpl-2.0.html // /** * @file * libexsid private definitions header file. * @note These defines are closely related to the exSID firmware. * Any modification that does not correspond to a related change in firmware * will cause the device to operate unpredictably or not at all. */ #ifndef exSID_defs_h #define exSID_defs_h #ifdef HAVE_CONFIG_H # include "config.h" #endif // CLOCK_FREQ_NTSC = 1022727.14; // CLOCK_FREQ_PAL = 985248.4; /* common definition for all hardware platforms */ /** * USB buffer multiple. * Each 64-byte USB packet contains 62 user bytes. 4k buffers (the default) thus contain 3968 data bytes. * For optimal throughput performance, data should be sent in chunks that are multiples of this value. * See http://www.ftdichip.com/Support/Documents/AppNotes/AN232B-03_D2XXDataThroughput.pdf section 1.4 */ #define XSC_USBMOD (4096/64*62) #define XSC_USBLAT 1 ///< FTDI latency: 1-255ms in 1ms increments #define XSC_BUFFMS 40 ///< write buffer size in milliseconds of playback (high water mark). /* exSID hardware definitions */ #define XS_BDRATE 2000000 ///< 2Mpbs #define XS_SIDCLK 1000000 ///< 1MHz (for computation only, currently hardcoded in firmware) #define XS_RSBCLK (XS_BDRATE/10) ///< RS232 byte clock. Each RS232 byte is 10 bits long due to start and stop bits #define XS_CYCCHR (XS_SIDCLK/XS_RSBCLK) ///< SID cycles between two consecutive chars //#define XS_CYCCHR ((XS_SIDCLK+XS_RSBCLK-1)/XS_RSBCLK) // ceiling #define XS_BUFFSZ ((((XS_RSBCLK/1000)*XSC_BUFFMS)/XSC_USBMOD)*XSC_USBMOD) ///< Must be multiple of user data transfer size or USB won't be happy. This floors XSC_BUFFMS. #define XS_LDMULT 501 ///< long delay SID cycle loop multiplier #define XS_MINDEL (XS_CYCCHR) ///< Smallest possible delay (with IOCTD1). #define XS_CYCIO (2*XS_CYCCHR) ///< minimum cycles between two consecutive I/Os (addr + data) #define XS_MAXADJ 7 ///< maximum encodable value for post write clock adjustment: must fit on 3 bits #define XS_LDOFFS (3*XS_CYCCHR) ///< long delay loop SID cycles offset /* exSID+ hardware definitions */ #define XSP_RSBCLK 666667 ///< maximum byte clock at 32MHz base clock is approx 666.6kHz (1 byte every 1.5us) #define XSP_BUFFSZ ((((XSP_RSBCLK/1000)*XSC_BUFFMS)/XSC_USBMOD)*XSC_USBMOD) ///< Must be multiple of user data transfer size or USB won't be happy. This floors XSC_BUFFMS. #define XSP_MINDEL 2 ///< Smallest possible delay (with IOCTD1). #define XSP_CYCIO 3 ///< minimum cycles between two consecutive I/Os (addr + data) #define XSP_PRE_RD 2 #define XSP_POSTRD 2 #define XSP_MAXADJ 4 ///< maximum encodable value for post write clock adjustment: must fit on 3 bits #define XSP_LDOFFS 3 ///< long delay loop SID cycles offset #define XSP_CYCCS 2 ///< cycles lost in chipselect() /* IOCTLS */ /* IO controls 0x3D to 0x7F are only implemented on exSID+ */ #define XSP_AD_IOCTCP 0x3D ///< Select PAL clock #define XSP_AD_IOCTCN 0x3E ///< Select NTSC clock #define XSP_AD_IOCTC1 0x3F ///< Select 1MHz clock #define XSP_AD_IOCTA0 0x5D ///< Audio Mix: 6581 L / 8580 R #define XSP_AD_IOCTA1 0x5E ///< Audio Mix: 8580 L / 6581 R #define XSP_AD_IOCTA2 0x5F ///< Audio Mix: 8580 L / 8580 R #define XSP_AD_IOCTA3 0x7D ///< Audio Mix: 6581 L / 6581 R #define XSP_AD_IOCTAM 0x7E ///< Audio Mute #define XSP_AD_IOCTAU 0x7F ///< Audio Unmute #define XS_AD_IOCTD1 0x9D ///< shortest delay (XS_MINDEL SID cycles) #define XS_AD_IOCTLD 0x9E ///< polled delay, amount of SID cycles to wait must be given in data #define XS_AD_IOCTS0 0xBD ///< select chip 0 #define XS_AD_IOCTS1 0xBE ///< select chip 1 #define XS_AD_IOCTSB 0xBF ///< select both chips. @warning Invalid for reads: unknown behaviour! #define XS_AD_IOCTFV 0xFD ///< Firmware version query #define XS_AD_IOCTHV 0xFE ///< Hardware version query #define XS_AD_IOCTRS 0xFF ///< SID reset #define XS_USBVID 0x0403 ///< Default FTDI VID #define XS_USBPID 0x6001 ///< Default FTDI PID #define XS_USBDSC "exSID USB" #define XSP_USBVID 0x0403 ///< Default FTDI VID #define XSP_USBPID 0x6015 ///< Default FTDI PID #define XSP_USBDSC "exSID+ USB" #define XS_MODEL_STD 0 #define XS_MODEL_PLUS 1 #ifdef DEBUG #define xsdbg(format, ...) printf("(%s) " format, __func__, ## __VA_ARGS__) #else #define xsdbg(format, ...) /* nothing */ #endif #ifdef HAVE_BUILTIN_EXPECT #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else #define likely(x) (x) #define unlikely(x) (x) #endif #endif /* exSID_defs_h */ libsidplayfp-2.6.0/src/builders/exsid-builder/driver/exSID_ftdiwrap.c0000644000175100001770000002076414544470311022614 00000000000000// // exSID_ftdiwrap.c // An FTDI access wrapper for exSID USB // // (C) 2016 Thibaut VARENE // License: GPLv2 - http://www.gnu.org/licenses/gpl-2.0.html // // Coding style is somewhat unorthodox ;P /** * @file * exSID USB FTDI access wrapper * @author Thibaut VARENE * @date 2016 * @note Primary target is libftdi (cleaner API), adaptations are made for others. */ #include "exSID_defs.h" #include #ifdef HAVE_DLFCN_H #include #define TEXT(x) x #elif defined (_WIN32) #include #include // missing include in libftdi on WIN32 #else #error dl not supported #endif #ifdef HAVE_FTD2XX #include #ifndef XSFW_SUPPORT #define XSFW_SUPPORT #endif #else #warning libftd2xx support disabled. #endif #ifdef HAVE_FTDI #include #ifndef XSFW_SUPPORT #define XSFW_SUPPORT #endif #else #warning libftdi support disabled. #endif #ifndef XSFW_SUPPORT #error No known method to access FTDI chip #endif #define XSFW_WRAPDECL #include "exSID_ftdiwrap.h" #define EXSID_INTERFACES "libftdi, libftd2xx" // XXX TODO Should be set by configure #ifdef _WIN32 static HMODULE dlhandle = NULL; static char *_xSfw_dlerror() { DWORD dwError = GetLastError(); char* lpMsgBuf = NULL; FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ALLOCATE_BUFFER, 0, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&lpMsgBuf, 0, NULL); return lpMsgBuf; } #define _xSfw_dlopen(libName) LoadLibrary(libName) #define _xSfw_dlsym(hModule, lpProcName) GetProcAddress(hModule, lpProcName) #define _xSfw_dlclose(hModule) FreeLibrary(hModule) #define _xSfw_clear_dlerror() SetLastError(0) #define _xSfw_free_errstr(str) LocalFree(str) #else // ! _WIN32 static void * dlhandle = NULL; #define _xSfw_dlopen(filename) dlopen(filename, RTLD_NOW|RTLD_LOCAL) #define _xSfw_dlsym(handle, symbol) dlsym(handle, symbol) #define _xSfw_dlclose(handle) dlclose(handle) #define _xSfw_dlerror() dlerror() #define _xSfw_clear_dlerror() dlerror() #define _xSfw_free_errstr(str) /* nothing */ #endif // _WIN32 /** Flag to signal which of the supported libraries is in use */ typedef enum { XS_LIBNONE, XS_LIBFTDI, XS_LIBFTD2XX, } libtype_t; static libtype_t libtype = XS_LIBNONE; // private functions static int (* _xSfw_set_baudrate)(void * ftdi, int baudrate); static int (* _xSfw_set_line_property)(void * ftdi, int bits, int sbit, int parity); static int (* _xSfw_setflowctrl)(void * ftdi, int flowctrl); static int (* _xSfw_set_latency_timer)(void * ftdi, unsigned char latency); // callbacks for ftdi #ifdef HAVE_FTDI static int (* _ftdi_usb_open_desc)(void *, int, int, const char *, const char *); #endif // callbacks for FTD2XX #ifdef HAVE_FTD2XX static int (*_FT_Write)(void *, LPVOID, int, unsigned int *); static int (*_FT_Read)(void *, LPVOID, int, unsigned int *); static int (*_FT_OpenEx)(const char *, int, void **); static int (*_FT_ResetDevice)(void *); static int (*_FT_SetBaudRate)(void *, int); static int (*_FT_SetDataCharacteristics)(void *, int, int, int); static int (*_FT_SetFlowControl)(void *, int, int, int); static int (*_FT_SetLatencyTimer)(void *, unsigned char); static int (*_FT_Close)(void *); #endif // wrappers for ftdi #ifdef HAVE_FTDI static int _xSfwftdi_usb_open_desc(void ** ftdi, int vid, int pid, const char * desc, const char * serial) { return _ftdi_usb_open_desc(*ftdi, vid, pid, desc, serial); } #endif // wrappers for FTD2XX #ifdef HAVE_FTD2XX static int _xSfwFT_write_data(void * restrict ftdi, const unsigned char * restrict buf, int size) { DWORD dummysize; // DWORD in unsigned int int rval; if(unlikely(rval = _FT_Write(ftdi, (LPVOID)buf, size, &dummysize))) return -rval; else return dummysize; } static int _xSfwFT_read_data(void * restrict ftdi, unsigned char * restrict buf, int size) { DWORD dummysize; // DWORD in unsigned int int rval; if (unlikely(rval = _FT_Read(ftdi, (LPVOID)buf, size, &dummysize))) return -rval; else return dummysize; } static int _xSfwFT_usb_open_desc(void ** ftdi, int vid, int pid, const char * desc, const char * serial) { return -_FT_OpenEx(desc, FT_OPEN_BY_DESCRIPTION, ftdi); } static int _xSfwFT_usb_close(void * ftdi) { return -_FT_Close(ftdi); } static char * _xSfwFT_get_error_string(void * ftdi) { return "FTD2XX error"; } #endif /** * Attempt to dlopen a known working library to access FTDI chip. * Will try libftd2xx first, then libftdi. * @return 0 on success, -1 on error. */ int xSfw_dlopen() { #define XSFW_DLSYM(a, b) \ *(void **)(&a) = _xSfw_dlsym(dlhandle, b); \ if (a == NULL) { \ dlerrorstr = _xSfw_dlerror(); \ goto dlfail; \ } char * dlerrorstr = NULL; if (dlhandle) { xsdbg("recursive dlopen()!\n"); return 0; } #ifdef HAVE_FTDI // try libftdi1 first - XXX TODO version check if ((dlhandle = _xSfw_dlopen(TEXT("libftdi1" SHLIBEXT)))) { _xSfw_clear_dlerror(); // clear dlerror XSFW_DLSYM(xSfw_new, "ftdi_new"); XSFW_DLSYM(xSfw_free, "ftdi_free"); XSFW_DLSYM(xSfw_write_data, "ftdi_write_data"); XSFW_DLSYM(xSfw_read_data, "ftdi_read_data"); XSFW_DLSYM(_ftdi_usb_open_desc, "ftdi_usb_open_desc"); xSfw_usb_open_desc = _xSfwftdi_usb_open_desc; XSFW_DLSYM(_xSfw_set_baudrate, "ftdi_set_baudrate"); XSFW_DLSYM(_xSfw_set_line_property, "ftdi_set_line_property"); XSFW_DLSYM(_xSfw_setflowctrl, "ftdi_setflowctrl"); XSFW_DLSYM(_xSfw_set_latency_timer, "ftdi_set_latency_timer"); XSFW_DLSYM(xSfw_usb_close, "ftdi_usb_close"); XSFW_DLSYM(xSfw_get_error_string, "ftdi_get_error_string"); libtype = XS_LIBFTDI; xsdbg("Using libftdi\n"); } else #endif #ifdef HAVE_FTD2XX #ifdef _WIN32 # define LIBFTD2XX "ftd2xx" #else # define LIBFTD2XX "libftd2xx" #endif // otherwise try libftd2xx - XXX TODO version check if ((dlhandle = _xSfw_dlopen(TEXT(LIBFTD2XX SHLIBEXT)))) { _xSfw_clear_dlerror(); // clear dlerror xSfw_new = NULL; xSfw_free = NULL; XSFW_DLSYM(_FT_Write, "FT_Write"); xSfw_write_data = _xSfwFT_write_data; XSFW_DLSYM(_FT_Read, "FT_Read"); xSfw_read_data = _xSfwFT_read_data; XSFW_DLSYM(_FT_OpenEx, "FT_OpenEx"); xSfw_usb_open_desc = _xSfwFT_usb_open_desc; XSFW_DLSYM(_FT_ResetDevice, "FT_ResetDevice"); XSFW_DLSYM(_FT_SetBaudRate, "FT_SetBaudRate"); XSFW_DLSYM(_FT_SetDataCharacteristics, "FT_SetDataCharacteristics"); XSFW_DLSYM(_FT_SetFlowControl, "FT_SetFlowControl"); XSFW_DLSYM(_FT_SetLatencyTimer, "FT_SetLatencyTimer"); XSFW_DLSYM(_FT_Close, "FT_Close"); xSfw_usb_close = _xSfwFT_usb_close; xSfw_get_error_string = _xSfwFT_get_error_string; libtype = XS_LIBFTD2XX; xsdbg("Using libftd2xx\n"); } else #endif // if none worked, fail. { xsdbg("No method found to access FTDI interface.\n" "Are any of the following libraries installed?\n" "\t" EXSID_INTERFACES); return -1; } return 0; dlfail: xsdbg("dlsym error: %s", dlerrorstr); _xSfw_free_errstr(dlerrorstr); xSfw_dlclose(dlhandle); return -1; } /** * Setup FTDI chip to match exSID firmware. * Defaults to 8N1, no flow control. * @param ftdi ftdi handle * @param baudrate Target baudrate * @param latency Target latency * @return 0 on success, rval on error. */ int xSfw_usb_setup(void * ftdi, int baudrate, int latency) { int rval = 0; #ifdef HAVE_FTDI if (XS_LIBFTDI == libtype) { // ftdi_usb_open_desc() performs device reset rval = _xSfw_set_baudrate(ftdi, baudrate); if (rval < 0) { xsdbg("SBR error"); goto setupfail; } rval = _xSfw_set_line_property(ftdi, BITS_8 , STOP_BIT_1, NONE); if (rval < 0) { xsdbg("SLP error"); goto setupfail; } rval = _xSfw_setflowctrl(ftdi, SIO_DISABLE_FLOW_CTRL); if (rval < 0) { xsdbg("SFC error"); goto setupfail; } rval = _xSfw_set_latency_timer(ftdi, latency); if (rval < 0) { xsdbg("SLT error"); goto setupfail; } } else #endif #ifdef HAVE_FTD2XX if (XS_LIBFTD2XX == libtype) { rval = -_FT_ResetDevice(ftdi); if (rval < 0) { xsdbg("RSD error"); goto setupfail; } rval = -_FT_SetBaudRate(ftdi, baudrate); if (rval < 0) { xsdbg("SBR error"); goto setupfail; } rval = -_FT_SetDataCharacteristics(ftdi, FT_BITS_8, FT_STOP_BITS_1, FT_PARITY_NONE); if (rval < 0) { xsdbg("SLP error"); goto setupfail; } rval = -_FT_SetFlowControl(ftdi, FT_FLOW_NONE, 0, 0); if (rval < 0) { xsdbg("SFC error"); goto setupfail; } rval = -_FT_SetLatencyTimer(ftdi, latency); if (rval < 0) { xsdbg("SLT error"); goto setupfail; } } else #endif xsdbg("Unkown access method\n"); setupfail: return rval; } /** * Release dlopen'd library. */ void xSfw_dlclose() { if (dlhandle != NULL) { _xSfw_dlclose(dlhandle); dlhandle = NULL; } } libsidplayfp-2.6.0/src/builders/exsid-builder/exsid-emu.cpp0000644000175100001770000001057414544470307020710 00000000000000/*************************************************************************** exsid.cpp - exSID support interface. ------------------- Based on hardsid.cpp (C) 2001 Jarno Paananen copyright : (C) 2015-2017,2021 Thibaut VARENE ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 as * * published by the Free Software Foundation. * * * ***************************************************************************/ #include "exsid-emu.h" #include #include #include #include #ifdef HAVE_EXSID # include #else # include "driver/exSID.h" #endif #include "sidcxx11.h" namespace libsidplayfp { unsigned int exSID::sid = 0; const char* exSID::getCredits() { return "exSID V" VERSION " Engine:\n" "\t(C) 2015-2017,2021 Thibaut VARENE\n"; } exSID::exSID(sidbuilder *builder) : sidemu(builder), m_status(false), readflag(false), busValue(0) { exsid = exSID_new(); if (!exsid) { m_error = "out of memory"; return; } if (exSID_init(exsid) < 0) { m_error = exSID_error_str(exsid); return; } m_status = true; sid++; muted[0] = muted[1] = muted[2] = false; } exSID::~exSID() { sid--; if (m_status) exSID_audio_op(exsid, XS_AU_MUTE); exSID_exit(exsid); exSID_free(exsid); } void exSID::reset(uint8_t volume) { exSID_reset(exsid); exSID_clkdwrite(exsid, 0, 0x18, volume); // this will offset the internal clock m_accessClk = 0; readflag = false; } unsigned int exSID::delay() { event_clock_t cycles = eventScheduler->getTime(EVENT_CLOCK_PHI1) - m_accessClk; m_accessClk += cycles; while (cycles > 0xffff) { exSID_delay(exsid, 0xffff); cycles -= 0xffff; } return static_cast(cycles); } void exSID::clock() { const unsigned int cycles = delay(); if (cycles) exSID_delay(exsid, cycles); } uint8_t exSID::read(uint_least8_t addr) { if ((addr < 0x19) || (addr > 0x1C)) { return busValue; } if (!readflag) { #ifdef DEBUG printf("WARNING: Read support is limited. This file may not play correctly!\n"); #endif readflag = true; // Here we implement the "safe" detection routine return values if (0x1b == addr) { // we could implement a commandline-chosen return byte here return (SidConfig::MOS8580 == runmodel) ? 0x02 : 0x03; } } const unsigned int cycles = delay(); exSID_clkdread(exsid, cycles, addr, &busValue); // busValue is updated on valid reads return busValue; } void exSID::write(uint_least8_t addr, uint8_t data) { busValue = data; if (addr > 0x18) return; const unsigned int cycles = delay(); if (addr % 7 == 4 && muted[addr / 7]) data = 0; exSID_clkdwrite(exsid, cycles, addr, data); } void exSID::voice(unsigned int num, bool mute) { muted[num] = mute; } void exSID::model(SidConfig::sid_model_t model, MAYBE_UNUSED bool digiboost) { runmodel = model; // currently no support for stereo mode: output the selected SID to both L and R channels exSID_audio_op(exsid, model == SidConfig::MOS8580 ? XS_AU_8580_8580 : XS_AU_6581_6581); // mutes output //exSID_audio_op(exsid, XS_AU_UNMUTE); // sampling is set after model, no need to unmute here and cause pops exSID_chipselect(exsid, model == SidConfig::MOS8580 ? XS_CS_CHIP1 : XS_CS_CHIP0); } void exSID::flush() {} bool exSID::lock(EventScheduler* env) { return sidemu::lock(env); } void exSID::unlock() { sidemu::unlock(); } void exSID::sampling(float systemclock, MAYBE_UNUSED float freq, MAYBE_UNUSED SidConfig::sampling_method_t method, bool) { exSID_audio_op(exsid, XS_AU_MUTE); if (systemclock < 1000000.0F) exSID_clockselect(exsid, XS_CL_PAL); else exSID_clockselect(exsid, XS_CL_NTSC); exSID_audio_op(exsid, XS_AU_UNMUTE); } } libsidplayfp-2.6.0/src/builders/exsid-builder/exsid-builder.cpp0000644000175100001770000000603314544470307021543 00000000000000/*************************************************************************** exsid-builder.cpp - exSID builder class for creating/controlling exSIDs. ------------------- Based on hardsid-builder.cpp (C) 2001 Simon White copyright : (C) 2015 Thibaut VARENE ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 as * * published by the Free Software Foundation. * * * ***************************************************************************/ #include #include #include #include #include #include #include #include "exsid.h" #include "exsid-emu.h" bool exSIDBuilder::m_initialised = false; unsigned int exSIDBuilder::m_count = 0; exSIDBuilder::exSIDBuilder(const char * const name) : sidbuilder(name) { if (!m_initialised) { m_count = 1; m_initialised = true; } } exSIDBuilder::~exSIDBuilder() { // Remove all SID emulations remove(); } // Create a new sid emulation. Called by libsidplay2 only unsigned int exSIDBuilder::create(unsigned int sids) { m_status = true; // Check available devices unsigned int count = availDevices(); if (count == 0) { m_errorBuffer.assign(name()).append(" ERROR: No devices found"); goto exSIDBuilder_create_error; } if (count < sids) sids = count; for (count = 0; count < sids; count++) { try { std::unique_ptr sid(new libsidplayfp::exSID(this)); // SID init failed? if (!sid->getStatus()) { m_errorBuffer = sid->error(); goto exSIDBuilder_create_error; } sidobjs.insert(sid.release()); } // Memory alloc failed? catch (std::bad_alloc const &) { m_errorBuffer.assign(name()).append(" ERROR: Unable to create exSID object"); goto exSIDBuilder_create_error; } } exSIDBuilder_create_error: if (count == 0) m_status = false; return count; } unsigned int exSIDBuilder::availDevices() const { return m_count; } const char *exSIDBuilder::credits() const { return libsidplayfp::exSID::getCredits(); } void exSIDBuilder::flush() { for (emuset_t::iterator it=sidobjs.begin(); it != sidobjs.end(); ++it) static_cast(*it)->flush(); } void exSIDBuilder::filter (bool enable) { std::for_each(sidobjs.begin(), sidobjs.end(), applyParameter(&libsidplayfp::exSID::filter, enable)); } libsidplayfp-2.6.0/src/builders/exsid-builder/exsid.h0000644000175100001770000000314514544470307017565 00000000000000/*************************************************************************** exsid.h - exSID support interface. ------------------- Based on hardsid.h (C) 2000-2002 Simon White copyright : (C) 2015 Thibaut VARENE ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License version 2 as * * published by the Free Software Foundation. * * * ***************************************************************************/ #ifndef EXSID_H #define EXSID_H #include "sidplayfp/sidbuilder.h" #include "sidplayfp/siddefs.h" class SID_EXTERN exSIDBuilder : public sidbuilder { private: static bool m_initialised; static unsigned int m_count; public: exSIDBuilder(const char * const name); ~exSIDBuilder(); /** * Available sids. * * @return the number of available sids, 0 = endless. */ unsigned int availDevices() const; const char *credits() const; void flush(); /** * enable/disable filter. */ void filter(bool enable); /** * Create the sid emu. * * @param sids the number of required sid emu */ unsigned int create(unsigned int sids); }; #endif // EXSID_H libsidplayfp-2.6.0/src/EventScheduler.h0000644000175100001770000001141314544470307015015 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2011-2015 Leandro Nini * Copyright (C) 2009 Antti S. Lankila * Copyright (C) 2001 Simon White * * 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 */ #ifndef EVENTSCHEDULER_H #define EVENTSCHEDULER_H #include "Event.h" #include "sidcxx11.h" namespace libsidplayfp { /** * C64 system runs actions at system clock high and low * states. The PHI1 corresponds to the auxiliary chip activity * and PHI2 to CPU activity. For any clock, PHI1s are before * PHI2s. */ typedef enum { EVENT_CLOCK_PHI1 = 0, EVENT_CLOCK_PHI2 = 1 } event_phase_t; /** * Fast EventScheduler, which maintains a linked list of Events. * This scheduler takes neglible time even when it is used to * schedule events for nearly every clock. * * Events occur on an internal clock which is 2x the visible clock. * The visible clock is divided to two phases called phi1 and phi2. * * The phi1 clocks are used by VIC and CIA chips, phi2 clocks by CPU. * * Scheduling an event for a phi1 clock when system is in phi2 causes the * event to be moved to the next phi1 cycle. Correspondingly, requesting * a phi1 time when system is in phi2 returns the value of the next phi1. */ class EventScheduler { private: /// The first event of the chain. Event *firstEvent; /// EventScheduler's current clock. event_clock_t currentTime; private: /** * Scan the event queue and schedule event for execution. * * @param event The event to add */ void schedule(Event &event) { // find the right spot where to tuck this new event Event **scan = &firstEvent; for (;;) { if ((*scan == nullptr) || ((*scan)->triggerTime > event.triggerTime)) { event.next = *scan; *scan = &event; break; } scan = &((*scan)->next); } } public: EventScheduler() : firstEvent(nullptr), currentTime(0) {} /** * Add event to pending queue. * * At PHI2, specify cycles=0 and Phase=PHI1 to fire on the very next PHI1. * * @param event the event to add * @param cycles how many cycles from now to fire * @param phase the phase when to fire the event */ void schedule(Event &event, unsigned int cycles, event_phase_t phase) { // this strange formulation always selects the next available slot regardless of specified phase. event.triggerTime = currentTime + ((currentTime & 1) ^ phase) + (cycles << 1); schedule(event); } /** * Add event to pending queue in the same phase as current event. * * @param event the event to add * @param cycles how many cycles from now to fire */ void schedule(Event &event, unsigned int cycles) { event.triggerTime = currentTime + (cycles << 1); schedule(event); } /** * Cancel event if pending. * * @param event the event to cancel */ void cancel(Event &event); /** * Cancel all pending events and reset time. */ void reset(); /** * Fire next event, advance system time to that event. */ void clock() { Event &event = *firstEvent; firstEvent = firstEvent->next; currentTime = event.triggerTime; event.event(); } /** * Check if an event is in the queue. * * @param event the event * @return true when pending */ bool isPending(Event &event) const; /** * Get time with respect to a specific clock phase. * * @param phase the phase * @return the time according to specified phase. */ event_clock_t getTime(event_phase_t phase) const { return (currentTime + (phase ^ 1)) >> 1; } /** * Return current clock phase. * * @return The current phase */ event_phase_t phase() const { return static_cast(currentTime & 1); } event_clock_t remaining(Event &event) const { return event.triggerTime - currentTime; } }; } #endif // EVENTSCHEDULER_H libsidplayfp-2.6.0/src/reloc65.cpp0000644000175100001770000001203314544470307013706 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2013-2016 Leandro Nini * Copyright (C) 2001 Dag Lem * Copyright (C) 1989-1997 André Fachat (a.fachat@physik.tu-chemnitz.de) * * 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. */ #include "reloc65.h" #include #include "sidplayfp/siddefs.h" /// 16 bit header const int HEADER_SIZE = (8 + 9 * 2); /// Magic number const unsigned char o65hdr[] = {1, 0, 'o', '6', '5'}; /** * Read a 16 bit word from a buffer at specific location. * * @param buffer * @param idx */ inline int getWord(unsigned char *buffer, int idx) { return buffer[idx] | (buffer[idx+1] << 8); } /** * Write a 16 bit word into a buffer at specific location. * * @param buffer * @param idx * @param value */ inline void setWord(unsigned char *buffer, int idx, int value) { buffer[idx] = value & 0xff; buffer[idx+1] = (value >> 8) & 0xff; } /** * Get the size of header options section. * * @param buf */ inline int read_options(unsigned char *buf) { int l = 0; unsigned char c = buf[0]; while (c) { l += c; c = buf[l]; } return ++l; } /** * Get the size of undefined references list. * * @param buf */ inline int read_undef(unsigned char *buf) { int l = 2; int n = getWord(buf, 0); while (n) { n--; while (!buf[l++]) {} } return l; } reloc65::reloc65(int addr) : m_tbase(addr) {} bool reloc65::reloc(unsigned char **buf, int *fsize) { unsigned char *tmpBuf = *buf; if (memcmp(tmpBuf, o65hdr, 5) != 0) { return false; } const int mode = getWord(tmpBuf, 6); if ((mode & 0x2000) // 32 bit size not supported || (mode & 0x4000)) // pagewise relocation not supported { return false; } const int hlen = HEADER_SIZE + read_options(tmpBuf + HEADER_SIZE); const int tbase = getWord(tmpBuf, 8); const int tlen = getWord(tmpBuf, 10); m_tdiff = m_tbase - tbase; const int dlen = getWord(tmpBuf, 14); unsigned char *segt = tmpBuf + hlen; // Text segment unsigned char *segd = segt + tlen; // Data segment unsigned char *utab = segd + dlen; // Undefined references list unsigned char *rttab = utab + read_undef(utab); // Text relocation table unsigned char *rdtab = reloc_seg(segt, tlen, rttab); // Data relocation table unsigned char *extab = reloc_seg(segd, dlen, rdtab); // Exported globals list reloc_globals(extab); setWord(tmpBuf, 8, m_tbase); *buf = segt; *fsize = tlen; return true; } int reloc65::reldiff(unsigned char s) { return s==2 ? m_tdiff : 0; } unsigned char* reloc65::reloc_seg(unsigned char *buf, int len, unsigned char *rtab) { int adr = -1; while (*rtab) { if ((*rtab & 255) == 255) { adr += 254; rtab++; } else { adr += *rtab & 255; rtab++; const unsigned char type = *rtab & 0xe0; unsigned char seg = *rtab & 0x07; rtab++; switch(type) { case 0x80: { const int oldVal = getWord(buf, adr); const int newVal = oldVal + reldiff(seg); setWord(buf, adr, newVal); break; } case 0x40: { const int oldVal = buf[adr] * 256 + *rtab; const int newVal = oldVal + reldiff(seg); buf[adr] = (newVal >> 8) & 255; *rtab = newVal & 255; rtab++; break; } case 0x20: { const int oldVal = buf[adr]; const int newVal = oldVal + reldiff(seg); buf[adr] = newVal & 255; break; } } if (seg == 0) { rtab += 2; } } if (adr > len) { // Warning: relocation table entries past segment end! } } return ++rtab; } unsigned char *reloc65::reloc_globals(unsigned char *buf) { int n = getWord(buf, 0); buf +=2; while (n) { while (*(buf++)) {} unsigned char seg = *buf; const int oldVal = getWord(buf, 1); const int newVal = oldVal + reldiff(seg); setWord(buf, 1, newVal); buf +=3; n--; } return buf; } libsidplayfp-2.6.0/src/Event.h0000644000175100001770000000360714544470307013164 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef EVENT_H #define EVENT_H #include namespace libsidplayfp { typedef int_fast64_t event_clock_t; /** * An Event object that can be inserted in the Event Scheduler. */ class Event { friend class EventScheduler; private: /// The next event in sequence. Event *next; /// The clock this event fires. event_clock_t triggerTime; /// Describe event for humans. const char * const m_name; public: /** * Events are used for delayed execution. * * @param name Descriptive string of the event. */ Event(const char * const name) : m_name(name) {} /** * Event code to be executed. Events are allowed to safely * reschedule themselves with the EventScheduler during * invocations. */ virtual void event() = 0; /** * Get the event name. * Only for debugging purposes. */ const char* name() const { return m_name; } protected: ~Event() {} }; } #endif // EVENT_H libsidplayfp-2.6.0/src/sidcxx11.h0000644000175100001770000000267514544470307013553 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014-2022 Leandro Nini * * 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 */ #ifndef SIDCXX_H #define SIDCXX_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_CXX17 # define HAVE_CXX14 # define MAYBE_UNUSED [[ maybe_unused ]] #else # define MAYBE_UNUSED #endif #ifdef HAVE_CXX14 # define HAVE_CXX11 # define MAKE_UNIQUE(type, ...) std::make_unique(__VA_ARGS__) #else # define MAKE_UNIQUE(type, ...) std::unique_ptr(new type(__VA_ARGS__)) #endif #ifndef HAVE_CXX11 # define nullptr 0 # define override # define final # define unique_ptr auto_ptr # define DEFAULT {} # define DELETE {} #else # define DEFAULT = default # define DELETE = delete #endif #endif libsidplayfp-2.6.0/src/sidmemory.h0000644000175100001770000000632714544470307014115 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2021 Leandro Nini * * 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. */ #ifndef SIDMEMORY_H #define SIDMEMORY_H #include namespace libsidplayfp { /** * An interface that allows access to c64 memory * for loading tunes and apply sid specific hacks. */ class sidmemory { public: /** * Read one byte from memory. * * @param addr the memory location from which to read from */ virtual uint8_t readMemByte(uint_least16_t addr) =0; /** * Read two contiguous bytes from memory. * * @param addr the memory location from which to read from */ virtual uint_least16_t readMemWord(uint_least16_t addr) =0; /** * Write one byte to memory. * * @param addr the memory location where to write * @param value the value to write */ virtual void writeMemByte(uint_least16_t addr, uint8_t value) =0; /** * Write two contiguous bytes to memory. * * @param addr the memory location where to write * @param value the value to write */ virtual void writeMemWord(uint_least16_t addr, uint_least16_t value) =0; /** * Fill ram area with a constant value. * * @param start the start of memory location where to write * @param value the value to write * @param size the number of bytes to fill */ virtual void fillRam(uint_least16_t start, uint8_t value, unsigned int size) =0; /** * Copy a buffer into a ram area. * * @param start the start of memory location where to write * @param source the source buffer * @param size the number of bytes to copy */ virtual void fillRam(uint_least16_t start, const uint8_t* source, unsigned int size) =0; /** * Change the RESET vector. * * @param addr the new addres to point to */ virtual void installResetHook(uint_least16_t addr) =0; /** * Set BASIC Warm Start address. * * @param addr the new addres to point to */ virtual void installBasicTrap(uint_least16_t addr) =0; /** * Set the start tune. * * @param tune the tune number */ virtual void setBasicSubtune(uint8_t tune) =0; /** * Set the ROM banks. * * @param rom the ROM data */ //@{ virtual void setKernal(const uint8_t* rom) =0; virtual void setBasic(const uint8_t* rom) =0; virtual void setChargen(const uint8_t* rom) =0; //@} protected: ~sidmemory() {} }; } #endif libsidplayfp-2.6.0/src/romCheck.h0000644000175100001770000001377014544470307013640 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2013 Leandro Nini * * 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. */ #ifndef ROMCHECK_H #define ROMCHECK_H #include #include #include #include #include "sidmd5.h" namespace libsidplayfp { /** * Utility class to identify known ROM images through their md5 checksum. */ class romCheck { private: typedef std::map md5map; private: /** * Maps checksums to respective ROM description. * Must be filled by derived class. */ md5map m_checksums; /** * Pointer to the ROM buffer */ const uint8_t* m_rom; /** * Size of the ROM buffer. */ unsigned int m_size; private: romCheck(); /** * Calculate the md5 digest. */ std::string checksum() const { try { sidmd5 md5; md5.append(m_rom, m_size); md5.finish(); return md5.getDigest(); } catch (md5Error const &) { return std::string(); } } protected: /** * Construct the class. * * @param rom pointer to the ROM buffer * @param size size of the ROM buffer */ romCheck(const uint8_t* rom, int size) : m_rom(rom), m_size(size) {} void add(const char* md5, const char* desc) { m_checksums.insert(std::make_pair(md5, desc)); } public: /** * Get ROM description. * * @return the ROM description or "Unknown Rom". */ const char* info() const { md5map::const_iterator res = m_checksums.find(checksum()); return (res != m_checksums.end()) ? res->second : "Unknown Rom"; } }; /** * romCheck implementation specific for kernal ROM. */ class kernalCheck : public romCheck { public: kernalCheck(const uint8_t* kernal) : romCheck(kernal, 0x2000) { add("1ae0ea224f2b291dafa2c20b990bb7d4", "C64 KERNAL first revision"); add("7360b296d64e18b88f6cf52289fd99a1", "C64 KERNAL second revision"); add("479553fd53346ec84054f0b1c6237397", "C64 KERNAL second revision (Japanese)"); add("39065497630802346bce17963f13c092", "C64 KERNAL third revision"); add("27e26dbb267c8ebf1cd47105a6ca71e7", "C64 KERNAL third revision (Swedish)"); add("27e26dbb267c8ebf1cd47105a6ca71e7", "C64 KERNAL third revision (Swedish C2G007)"); add("e4aa56240fe13d8ad8d7d1dc8fec2395", "C64 KERNAL third revision (Danish)"); add("174546cf655e874546af4eac5f5bf61b", "C64 KERNAL third revision (Turkish)"); add("187b8c713b51931e070872bd390b472a", "Commodore SX-64 KERNAL"); add("b7b1a42e11ff8efab4e49afc4faedeee", "Commodore SX-64 KERNAL (Swedish)"); add("3abc938cac3d622e1a7041c15b928707", "Cockroach Turbo-ROM"); add("631ea2ca0dcda414a90aeefeaf77fe45", "Cockroach Turbo-ROM (SX-64)"); add("a9de1832e9be1a8c60f4f979df585681", "Datel DOS-ROM 1.2"); add("da43563f218b46ece925f221ef1f4bc2", "Datel Mercury 3 (NTSC)"); add("b7dc8ed82170c81773d4f5dc8069a000", "Datel Turbo ROM II (PAL)"); add("6b309c76473dcf555c52c598c6a51011", "Dolphin DOS v1.0"); add("c3c93b9a46f116acbfe7ee147c338c60", "Dolphin DOS v2.0-1 AU"); add("2a441f4abd272d50f94b43c7ff3cc629", "Dolphin DOS v2.0-1"); add("c7a175217e67dcb425feca5fcf2a01cc", "Dolphin DOS v2.0-2"); add("7a9b1040cfbe769525bb9cdc28427be6", "Dolphin DOS v2.0-3"); add("fc8fb5ec89b34ae41c8dc20907447e06", "Dolphin DOS v3.0"); add("9a6e1c4b99c6f65323aa96940c7eb7f7", "ExOS v3 fertig"); add("3241a4fcf2ba28ba3fc79826bc023814", "ExOS v3"); add("cffd2616312801da56bcc6728f0e39ca", "ExOS v4"); add("e6e2bb24a0fa414182b0fd149bde689d", "TurboAccess"); add("c5c5990f0826fcbd372901e761fab1b7", "TurboTrans v3.0-1"); add("042ffc11383849bdf0e600474cefaaaf", "TurboTrans v3.0-2"); add("9d62852013fc2c29c3111c765698664b", "Turbo-Process US"); add("f9c9838e8d6752dc6066a8c9e6c2e880", "Turbo-Process"); } }; /** * romCheck implementation specific for basic ROM. */ class basicCheck : public romCheck { public: basicCheck(const uint8_t* basic) : romCheck(basic, 0x2000) { add("57af4ae21d4b705c2991d98ed5c1f7b8", "C64 BASIC V2"); } }; /** * romCheck implementation specific for character generator ROM. */ class chargenCheck : public romCheck { public: chargenCheck(const uint8_t* chargen) : romCheck(chargen, 0x1000) { add("12a4202f5331d45af846af6c58fba946", "C64 character generator"); add("cf32a93c0a693ed359a4f483ef6db53d", "C64 character generator (Japanese)"); add("7a1906cd3993ad17a0a0b2b68da9c114", "C64 character generator (Swedish)"); add("5973267e85b7b2b574e780874843180b", "C64 character generator (Swedish C2G007)"); add("81a1a8e6e334caeadd1b8468bb7728d3", "C64 character generator (Spanish)"); add("b3ad62b41b5f919fc56c3a40e636ec29", "C64 character generator (Danish)"); add("7d82b1f8f750665b5879c16b03c617d9", "C64 character generator (Turkish)"); } }; } #endif // ROMCHECK_H libsidplayfp-2.6.0/src/config.h.in0000644000175100001770000000717214544470315013755 00000000000000/* src/config.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Define for threaded driver */ #undef EXSID_THREADED /* Define to 1 if you have the header file. */ #undef HAVE_ARM_NEON_H /* define if the compiler supports basic C++11 syntax */ #undef HAVE_CXX11 /* define if the compiler supports basic C++14 syntax */ #undef HAVE_CXX14 /* define if the compiler supports basic C++17 syntax */ #undef HAVE_CXX17 /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you have the header file. */ #undef HAVE_EMMINTRIN_H /* Define to 1 if you have libexsid (-lexsid). */ #undef HAVE_EXSID /* Define to 1 if you have ftd2xx.h */ #undef HAVE_FTD2XX /* Define to 1 if you have the header file. */ #undef HAVE_FTD2XX_H /* Define to 1 if you have ftdi.h */ #undef HAVE_FTDI /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have libgcrypt (-lgcrypt). */ #undef HAVE_LIBGCRYPT /* Define to 1 if you have the header file. */ #undef HAVE_MMINTRIN_H /* Define to 1 if you have pthread.h */ #undef HAVE_PTHREAD_H /* Have PTHREAD_PRIO_INHERIT. */ #undef HAVE_PTHREAD_PRIO_INHERIT /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDIO_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strncasecmp' function. */ #undef HAVE_STRNCASECMP /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to necessary symbol if this constant uses a non-standard name on your system. */ #undef PTHREAD_CREATE_JOINABLE /* Shared library extension */ #undef SHLIBEXT /* The size of `int', as computed by sizeof. */ #undef SIZEOF_INT /* The size of `short', as computed by sizeof. */ #undef SIZEOF_SHORT /* Define to 1 if all of the C90 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS /* Version number of package */ #undef VERSION /* Path to VICE testsuite. */ #undef VICE_TESTSUITE /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif libsidplayfp-2.6.0/src/psiddrv.cpp0000644000175100001770000002046514544470307014112 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ // -------------------------------------------------------- // The code here is use to support the PSID Version 2NG // (proposal B) file format for player relocation support. // -------------------------------------------------------- #include "psiddrv.h" #include "sidplayfp/SidTuneInfo.h" #include "sidendian.h" #include "sidmemory.h" #include "reloc65.h" #include "c64/CPU/mos6510.h" namespace libsidplayfp { // Error Strings const char ERR_PSIDDRV_NO_SPACE[] = "ERROR: No space to install psid driver in C64 ram"; const char ERR_PSIDDRV_RELOC[] = "ERROR: Failed whilst relocating psid driver"; uint8_t psid_driver[] = { # include "psiddrv.bin" }; const uint8_t POWERON[] = { # include "poweron.bin" }; /** * Copy in power on settings. These were created by running * the kernel reset routine and storing the useful values * from $0000-$03ff. Format is: * - offset byte (bit 7 indicates presence rle byte) * - rle count byte (bit 7 indicates compression used) * - data (single byte) or quantity represented by uncompressed count * all counts and offsets are 1 less than they should be */ void copyPoweronPattern(sidmemory& mem) { uint_least16_t addr = 0; for (unsigned int i = 0; i < sizeof(POWERON);) { uint8_t off = POWERON[i++]; uint8_t count = 0; bool compressed = false; // Determine data count/compression if (off & 0x80) { // fixup offset off &= 0x7f; count = POWERON[i++]; if (count & 0x80) { // fixup count count &= 0x7f; compressed = true; } } // Fix count off by ones (see format details) count++; addr += off; if (compressed) { // Extract compressed data const uint8_t data = POWERON[i++]; while (count-- > 0) { mem.writeMemByte(addr++, data); } } else { // Extract uncompressed data while (count-- > 0) { mem.writeMemByte(addr++, POWERON[i++]); } } } } uint8_t psiddrv::iomap(uint_least16_t addr) const { // Force Real C64 Compatibility if (m_tuneInfo->compatibility() == SidTuneInfo::COMPATIBILITY_R64 || m_tuneInfo->compatibility() == SidTuneInfo::COMPATIBILITY_BASIC || addr == 0) { // Special case, set to 0x37 by the psid driver return 0; } /* * $34 for init/play in $d000 - $dfff * $35 for init/play in $e000 - $ffff * $36 for load end/play in $a000 - $ffff * $37 for the rest */ if (addr < 0xa000) return 0x37; // Basic-ROM, Kernal-ROM, I/O if (addr < 0xd000) return 0x36; // Kernal-ROM, I/O if (addr >= 0xe000) return 0x35; // I/O only return 0x34; // RAM only } bool psiddrv::drvReloc() { const int startlp = m_tuneInfo->loadAddr() >> 8; const int endlp = (m_tuneInfo->loadAddr() + (m_tuneInfo->c64dataLen() - 1)) >> 8; uint_least8_t relocStartPage = m_tuneInfo->relocStartPage(); uint_least8_t relocPages = m_tuneInfo->relocPages(); if (m_tuneInfo->compatibility() == SidTuneInfo::COMPATIBILITY_BASIC) { // The psiddrv is only used for initialisation and to // autorun basic tunes as running the kernel falls // into a manual load/run mode relocStartPage = 0x04; relocPages = 0x03; } // Check for free space in tune if (relocStartPage == 0xff) relocPages = 0; // Check if we need to find the reloc addr else if (relocStartPage == 0) { relocPages = 0; // find area where to dump the driver in. // It's only 1 block long, so any free block we can find // between $0400 and $d000 will do. for (int i = 4; i < 0xd0; i ++) { if (i >= startlp && i <= endlp) continue; if (i >= 0xa0 && i <= 0xbf) continue; relocStartPage = i; relocPages = 1; break; } } if (relocPages < 1) { m_errorString = ERR_PSIDDRV_NO_SPACE; return false; } // Place psid driver into ram const uint_least16_t relocAddr = relocStartPage << 8; reloc_driver = psid_driver; reloc_size = sizeof(psid_driver); reloc65 relocator(relocAddr - 10); if (!relocator.reloc(&reloc_driver, &reloc_size)) { m_errorString = ERR_PSIDDRV_RELOC; return false; } // Adjust size to not include initialisation data. reloc_size -= 10; m_driverAddr = relocAddr; m_driverLength = static_cast(reloc_size); // Round length to end of page m_driverLength += 0xff; m_driverLength &= 0xff00; return true; } void psiddrv::install(sidmemory& mem, uint8_t video) const { mem.fillRam(0, static_cast(0), 0x3ff); if (m_tuneInfo->compatibility() >= SidTuneInfo::COMPATIBILITY_R64) { copyPoweronPattern(mem); } // Set PAL/NTSC switch mem.writeMemByte(0x02a6, video); mem.installResetHook(endian_little16(reloc_driver)); // If not a basic tune then the psiddrv must install // interrupt hooks and trap programs trying to restart basic if (m_tuneInfo->compatibility() == SidTuneInfo::COMPATIBILITY_BASIC) { // Install hook to set subtune number for basic mem.setBasicSubtune((uint8_t)(m_tuneInfo->currentSong() - 1)); mem.installBasicTrap(0xbf53); } else { // Only install irq handle for RSID tunes mem.fillRam(0x0314, &reloc_driver[2], m_tuneInfo->compatibility() == SidTuneInfo::COMPATIBILITY_R64 ? 2 : 6); // Experimental restart basic trap const uint_least16_t addr = endian_little16(&reloc_driver[8]); mem.installBasicTrap(0xffe1); mem.writeMemWord(0x0328, addr); } int pos = m_driverAddr; // Install driver to ram mem.fillRam(pos, &reloc_driver[10], reloc_size); // Set song number mem.writeMemByte(pos, (uint8_t) (m_tuneInfo->currentSong() - 1)); pos++; // Set tunes speed (VIC/CIA) mem.writeMemByte(pos, m_tuneInfo->songSpeed() == SidTuneInfo::SPEED_VBI ? 0 : 1); pos++; // Set init address mem.writeMemWord(pos, m_tuneInfo->compatibility() == SidTuneInfo::COMPATIBILITY_BASIC ? 0xbf55 : m_tuneInfo->initAddr()); pos += 2; // Set play address mem.writeMemWord(pos, m_tuneInfo->playAddr()); pos += 2; mem.writeMemWord(pos, m_powerOnDelay); pos += 2; // Set init address io bank value mem.writeMemByte(pos, iomap(m_tuneInfo->initAddr())); pos++; // Set play address io bank value mem.writeMemByte(pos, iomap(m_tuneInfo->playAddr())); pos++; // Set PAL/NTSC flag mem.writeMemByte(pos, video); pos++; // Set the required tune clock speed uint8_t clockSpeed; switch (m_tuneInfo->clockSpeed()) { case SidTuneInfo::CLOCK_PAL: clockSpeed = 1; break; case SidTuneInfo::CLOCK_NTSC: clockSpeed = 0; break; default: // UNKNOWN or ANY clockSpeed = video; break; } mem.writeMemByte(pos, clockSpeed); pos++; // Set default processor register flags on calling init mem.writeMemByte(pos, m_tuneInfo->compatibility() >= SidTuneInfo::COMPATIBILITY_R64 ? 0 : 1 << MOS6510::SR_INTERRUPT); } } libsidplayfp-2.6.0/src/psiddrv.h0000644000175100001770000000464114544470307013555 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2015 Leandro Nini * * 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. */ #ifndef PSIDDRV_H #define PSIDDRV_H #include class SidTuneInfo; namespace libsidplayfp { class sidmemory; class psiddrv { private: const SidTuneInfo *m_tuneInfo; const char *m_errorString; uint8_t *reloc_driver; int reloc_size; uint_least16_t m_driverAddr; uint_least16_t m_driverLength; uint_least16_t m_powerOnDelay; private: /** * Get required I/O map to reach address * * @param addr a 16-bit effective address * @return a default bank-select value for $01 */ uint8_t iomap(uint_least16_t addr) const; public: psiddrv(const SidTuneInfo *tuneInfo) : m_tuneInfo(tuneInfo), m_powerOnDelay(0) {} /** * Set the power on delay cycles. * * @param delay the delay */ void powerOnDelay(uint_least16_t delay) { m_powerOnDelay = delay; } /** * Relocate the driver. * * @return false if something's wrong, check #errorString for error details */ bool drvReloc(); /** * Install the driver. * Must be called after the tune has been placed in memory. * * @param mem the c64 memory interface * @param video the PAL/NTSC switch value, 0: NTSC, 1: PAL */ void install(sidmemory& mem, uint8_t video) const; /** * Get a detailed error message. * * @return a pointer to the string */ const char* errorString() const { return m_errorString; } uint_least16_t driverAddr() const { return m_driverAddr; } uint_least16_t driverLength() const { return m_driverLength; } }; } #endif libsidplayfp-2.6.0/src/utils/0000755000175100001770000000000014544470322013141 500000000000000libsidplayfp-2.6.0/src/utils/SidDatabase.cpp0000644000175100001770000001144514544470307015741 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include #include #include "SidDatabase.h" #include "sidplayfp/SidTune.h" #include "sidplayfp/SidTuneInfo.h" #include "iniParser.h" #include "sidcxx11.h" const char ERR_DATABASE_CORRUPT[] = "SID DATABASE ERROR: Database seems to be corrupt."; const char ERR_NO_DATABASE_LOADED[] = "SID DATABASE ERROR: Songlength database not loaded."; const char ERR_NO_SELECTED_SONG[] = "SID DATABASE ERROR: No song selected for retrieving song length."; const char ERR_UNABLE_TO_LOAD_DATABASE[] = "SID DATABASE ERROR: Unable to load the songlength database."; class parseError {}; SidDatabase::SidDatabase() : m_parser(nullptr), errorString(ERR_NO_DATABASE_LOADED) {} SidDatabase::~SidDatabase() { delete m_parser; } // mm:ss[.SSS] // // Examples of song length values: // // 1:02 // // 1:02.5 // // 1:02.500 // const char *parseTime(const char *str, int_least32_t &result) { char *end; const long minutes = strtol(str, &end, 10); if (*end != ':') { throw parseError(); } end++; const long seconds = strtol(end, &end, 10); result = ((minutes * 60) + seconds) * 1000; if (*end == '.') { char *start = end + 1; long milliseconds = strtol(start, &end, 10); switch (end - start) { case 1: milliseconds *= 100; break; case 2: milliseconds *= 10; break; case 3: break; default: throw parseError(); } if (milliseconds<0 || milliseconds>=1000) throw parseError(); result += milliseconds; } while ((*end != 0) && !isspace(*end)) { end++; } return end; } bool SidDatabase::open(const char *filename) { delete m_parser; m_parser = new libsidplayfp::iniParser(); if (!m_parser->open(filename)) { close(); errorString = ERR_UNABLE_TO_LOAD_DATABASE; return false; } return true; } #ifdef _WIN32 bool SidDatabase::open(const wchar_t* filename) { delete m_parser; m_parser = new libsidplayfp::iniParser(); if (!m_parser->open(filename)) { close(); errorString = ERR_UNABLE_TO_LOAD_DATABASE; return false; } return true; } #endif void SidDatabase::close() { delete m_parser; m_parser = nullptr; } int_least32_t SidDatabase::length(SidTune &tune) { const unsigned int song = tune.getInfo()->currentSong(); if (!song) { errorString = ERR_NO_SELECTED_SONG; return -1; } char md5[SidTune::MD5_LENGTH + 1]; tune.createMD5(md5); return lengthMs(md5, song) / 1000; } int_least32_t SidDatabase::lengthMs(SidTune &tune) { const unsigned int song = tune.getInfo()->currentSong(); if (!song) { errorString = ERR_NO_SELECTED_SONG; return -1; } char md5[SidTune::MD5_LENGTH + 1]; tune.createMD5New(md5); return lengthMs(md5, song); } int_least32_t SidDatabase::length(const char *md5, unsigned int song) { return lengthMs(md5, song) / 1000; } int_least32_t SidDatabase::lengthMs(const char *md5, unsigned int song) { if (m_parser == nullptr) { errorString = ERR_NO_DATABASE_LOADED; return -1; } // Read Time (and check times before hand) if (!m_parser->setSection("Database")) { errorString = ERR_DATABASE_CORRUPT; return -1; } const char *timeStamp = m_parser->getValue(md5); // If return is null then no entry found in database if (!timeStamp) { errorString = ERR_DATABASE_CORRUPT; return -1; } const char *str = timeStamp; int_least32_t time = 0; for (unsigned int i = 0; i < song; i++) { // Validate Time try { str = parseTime(str, time); } catch (parseError const &) { errorString = ERR_DATABASE_CORRUPT; return -1; } } return time; } libsidplayfp-2.6.0/src/utils/STILview/0000755000175100001770000000000014544470322014607 500000000000000libsidplayfp-2.6.0/src/utils/STILview/stil.h0000644000175100001770000003511214544470307015660 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 1998, 2002 by LaLa * Copyright 2012-2013 Leandro Nini * * 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. */ #ifndef STIL_H #define STIL_H #include #include #include #include #include "stildefs.h" /** * STIL class * * @author LaLa * @copyright 1998, 2002 by LaLa * * * Given the location of HVSC this class can extract STIL information for a * given tune of a given SID file. (Sounds simple, huh?) * * PLEASE, READ THE ACCOMPANYING README.TXT FILE BEFORE PROCEEDING!!!! */ class STIL_EXTERN STIL { public: /// Enum to use for asking for specific fields. enum STILField { all, name, author, title, artist, comment }; /// Enum that describes the possible errors this class may encounter. enum STILerror { NO_STIL_ERROR = 0, BUG_OPEN, ///< INFO ONLY: failed to open BUGlist.txt. WRONG_DIR, ///< INFO ONLY: path was not within HVSC base dir. NOT_IN_STIL, ///< INFO ONLY: requested entry was not found in STIL.txt. NOT_IN_BUG, ///< INFO ONLY: requested entry was not found in BUGlist.txt. WRONG_ENTRY, ///< INFO ONLY: section-global comment was asked for with get*Entry(). CRITICAL_STIL_ERROR = 10, BASE_DIR_LENGTH, ///< The length of the HVSC base dir was wrong (empty string?) STIL_OPEN, ///< Failed to open STIL.txt. NO_EOL, ///< Failed to determine EOL char(s). NO_STIL_DIRS, ///< Failed to get sections (subdirs) when parsing STIL.txt. NO_BUG_DIRS ///< Failed to get sections (subdirs) when parsing BUGlist.txt. }; /// To turn debug output on bool STIL_DEBUG; //----// /** * Allocates necessary memory. * * @param stilPath relative path to STIL file * @param bugsPath relative path to BUG file */ STIL(const char *stilPath = DEFAULT_PATH_TO_STIL, const char *bugsPath = DEFAULT_PATH_TO_BUGLIST); /** * Returns a formatted string telling what the version * number is for the STIL class and other info. * If it is called after setBaseDir(), the string also * has the STIL.txt file's version number in it. * * @return * printable formatted string with version and copyright * info * (It's kinda dangerous to return a pointer that points * to an internal structure, but I trust you. :) */ const char *getVersion(); /** * Returns a floating number telling what the version * number is of this STIL class. * * @return * version number */ float getVersionNo(); /** * Tell the object where the HVSC base directory is - it * figures that the STIL should be in /DOCUMENTS/STIL.txt * and that the BUGlist should be in /DOCUMENTS/BUGlist.txt. * It should not matter whether the path is given in UNIX, * WinDOS, or Mac format (ie. '\' vs. '/' vs. ':') * * @param pathToHVSC = HVSC base directory in your machine's format * @return * - false - Problem opening or parsing STIL/BUGlist * - true - All okay */ bool setBaseDir(const char *pathToHVSC); /** * Returns a floating number telling what the version * number is of the STIL.txt file. * To be called only after setBaseDir()! * * @return * version number (0.0 if setBaseDir() was not called, yet) */ float getSTILVersionNo(); /** * Given an HVSC pathname, a tune number and a * field designation, it returns a formatted string that * contains the STIL field for the tune number (if exists). * If it doesn't exist, returns a NULL. * * @param relPathToEntry = relative to the HVSC base dir, starting with * a slash * @param tuneNo = song number within the song (default=0). * @param field = which field to retrieve (default=all). * * What the possible combinations of tuneNo and field represent: * * - tuneNo = 0, field = all : all of the STIL entry is returned. * - tuneNo = 0, field = comment : the file-global comment is returned. * (For single-tune entries, this returns nothing!) * - tuneNo = 0, field = : INVALID! (NULL is returned) * - tuneNo != 0, field = all : all fields of the STIL entry for the * given tune number are returned. (For single-tune entries, this is * equivalent to saying tuneNo = 0, field = all.) * However, the file-global comment is *NOT* returned with it any * more! (Unlike in versions before v2.00.) It led to confusions: * eg. when a comment was asked for tune #3, it returned the * file-global comment even if there was no specific entry for tune #3! * - tuneNo != 0, field = : the specific field of the specific * tune number is returned. If the tune number doesn't exist (eg. if * tuneNo=2 for single-tune entries, or if tuneNo=2 when there's no * STIL entry for tune #2 in a multitune entry), returns NULL. * * NOTE: For older versions of STIL (older than v2.59) the tuneNo and * field parameters are ignored and are assumed to be tuneNo=0 and * field=all to maintain backwards compatibility. * * @return * - pointer to a printable formatted string containing * the STIL entry * (It's kinda dangerous to return a pointer that points * to an internal structure, but I trust you. :) * - NULL if there's absolutely no STIL entry for the tune */ const char *getEntry(const char *relPathToEntry, int tuneNo = 0, STILField field = all); /** * Same as #getEntry, but with an absolute path given * given in your machine's format. */ const char *getAbsEntry(const char *absPathToEntry, int tuneNo = 0, STILField field = all); /** * Given an HVSC pathname and tune number it returns a * formatted string that contains the section-global * comment for the tune number (if it exists). If it * doesn't exist, returns a NULL. * * @param relPathToEntry = relative to the HVSC base dir starting with * a slash * @return * - pointer to a printable formatted string containing * the section-global comment * (It's kinda dangerous to return a pointer that points * to an internal structure, but I trust you. :) * - NULL if there's absolutely no section-global comment * for the tune */ const char *getGlobalComment(const char *relPathToEntry); /** * Same as #getGlobalComment, but with an absolute path * given in your machine's format. */ const char *getAbsGlobalComment(const char *absPathToEntry); /** * Given an HVSC pathname and tune number it returns a * formatted string that contains the BUG entry for the * tune number (if exists). If it doesn't exist, returns * a NULL. * * @param relPathToEntry = relative to the HVSC base dir starting with * a slash * @param tuneNo = song number within the song (default=0) * If tuneNo=0, returns all of the BUG entry. * * NOTE: For older versions of STIL (older than v2.59) tuneNo is * ignored and is assumed to be 0 to maintain backwards * compatibility. * * @return * - pointer to a printable formatted string containing * the BUG entry * (It's kinda dangerous to return a pointer that points * to an internal structure, but I trust you. :) * - NULL if there's absolutely no BUG entry for the tune */ const char *getBug(const char *relPathToEntry, int tuneNo = 0); /** * Same as #getBug, but with an absolute path * given in your machine's format. */ const char *getAbsBug(const char *absPathToEntry, int tuneNo = 0); /** * Returns a specific error number identifying the problem * that happened at the last invoked public method. * * @return * STILerror - an enumerated error value */ inline STILerror getError() const {return (lastError);} /** * Returns true if the last error encountered was critical * (ie. not one that the STIL class can recover from). * * @return * true if the last error encountered was critical */ inline bool hasCriticalError() const { return ((lastError >= CRITICAL_STIL_ERROR) ? true : false); } /** * Returns an ASCII error string containing the * description of the error that happened at the last * invoked public method. * * @return * pointer to string with the error description */ inline const char *getErrorStr() const {return (STIL_ERROR_STR[lastError]);} private: typedef std::map dirList; /// Path to STIL. const char *PATH_TO_STIL; /// Path to BUGlist. const char *PATH_TO_BUGLIST; /// Version number/copyright string std::string versionString; /// STIL.txt's version number float STILVersion; /// Base dir std::string baseDir; /// Maps of sections (subdirs) for easier positioning. //@{ dirList stilDirs; dirList bugDirs; //@} /** * This tells us what the line delimiter is in STIL.txt. * (It may be two chars!) */ char STIL_EOL; char STIL_EOL2; /// Error number of the last error that happened. STILerror lastError; /// Error strings containing the description of the possible errors in STIL. static const char *STIL_ERROR_STR[]; //////////////// /// The last retrieved entry std::string entrybuf; /// The last retrieved section-global comment std::string globalbuf; /// The last retrieved BUGentry std::string bugbuf; /// Buffers to hold the resulting strings std::string resultEntry; std::string resultBug; //////////////// void setVersionString(); /** * Determines what the EOL char is (or are) from STIL.txt. * It is assumed that BUGlist.txt will use the same EOL. * * @return * - false - something went wrong * - true - everything is okay */ bool determineEOL(std::ifstream &stilFile); /** * Populates the given dirList array with the directories * obtained from 'inFile' for faster positioning within * 'inFile'. * * @param inFile - where to read the directories from * @param dirs - the dirList array that should be populated with the * directory list * @param isSTILFile - is this the STIL or the BUGlist we are parsing * @return * - false - No entries were found or otherwise failed to process * inFile * - true - everything is okay */ bool getDirs(std::ifstream &inFile, dirList &dirs, bool isSTILFile); /** * Positions the file pointer to the given entry in 'inFile' * using the 'dirs' dirList for faster positioning. * * @param entryStr - the entry to position to * @param inFile - position the file pointer in this file * @param dirs - the list of dirs in inFile for easier positioning * @return * - true - if successful * - false - otherwise */ bool positionToEntry(const char *entryStr, std::ifstream &inFile, dirList &dirs); /** * Reads the entry from 'inFile' into 'buffer'. 'inFile' should * already be positioned to the entry to be read. * * @param inFile - filehandle of file to read from * @param entryStr - the entry needed to be read * @param buffer - where to put the result to */ void readEntry(std::ifstream &inFile, std::string &buffer); /** * Given a STIL formatted entry in 'buffer', a tune number, * and a field designation, it returns the requested * STIL field into 'result'. * If field=all, it also puts the file-global comment (if it exists) * as the first field into 'result'. * * @param result - where to put the resulting string to (if any) * @param buffer - pointer to the first char of what to search for * the field. Should be a buffer in standard STIL * format. * @param tuneNo - song number within the song (default=0) * @param field - which field to retrieve (default=all). * @return * - false - if nothing was put into 'result' * - true - 'result' has the resulting field */ bool getField(std::string &result, const char *buffer, int tuneNo = 0, STILField field = all); /** * @param result - where to put the resulting string to (if any) * @param start - pointer to the first char of what to search for * the field. Should be a buffer in standard STIL * format. * @param end - pointer to the last+1 char of what to search for * the field. ('end-1' should be a '\n'!) * @param field - which specific field to retrieve * @return * - false - if nothing was put into 'result' * - true - 'result' has the resulting field */ bool getOneField(std::string &result, const char *start, const char *end, STILField field); /** * Extracts one line from 'infile' to 'line[]'. The end of * the line is marked by endOfLineChar. Also eats up * additional EOL-like chars. * * @param infile - filehandle (streampos should already be positioned * to the start of the desired line) * @param line - char array to put the line into */ void getStilLine(std::ifstream &infile, std::string &line); }; #endif // STIL_H libsidplayfp-2.6.0/src/utils/STILview/stil.cpp0000644000175100001770000010105214544470307016210 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 1998, 2002 by LaLa * Copyright 2012-2015 Leandro Nini * * 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. */ // // STIL class - Implementation file // // AUTHOR: LaLa // Email : LaLa@C64.org // Copyright (C) 1998, 2002 by LaLa // #include "stil.h" #include #include #include // For snprintf() and NULL #include #include #include #include #include #include "stringutils.h" using namespace std; const ios_base::openmode STILopenFlags = ios::in | ios::binary; const float VERSION_NO = 3.0f; #define CERR_STIL_DEBUG if (STIL_DEBUG) cerr << "Line #" << __LINE__ << " STIL::" // These are the hardcoded STIL/BUG field names. const char _NAME_STR[] = " NAME: "; const char _AUTHOR_STR[] = " AUTHOR: "; const char _TITLE_STR[] = " TITLE: "; const char _ARTIST_STR[] = " ARTIST: "; const char _COMMENT_STR[] = "COMMENT: "; //const char _BUG_STR[] = "BUG: "; const char *STIL::STIL_ERROR_STR[] = { "No error.", "Failed to open BUGlist.txt.", "Base dir path is not the HVSC base dir path.", "The entry was not found in STIL.txt.", "The entry was not found in BUGlist.txt.", "A section-global comment was asked for in the wrong way.", "", "", "", "", "CRITICAL ERROR", "Incorrect HVSC base dir length!", "Failed to open STIL.txt!", "Failed to determine EOL from STIL.txt!", "No STIL sections were found in STIL.txt!", "No STIL sections were found in BUGlist.txt!" }; /** * Converts slashes to the one the OS uses to access files. * * @param * str - what to convert */ void convertSlashes(std::string &str) { std::replace(str.begin(), str.end(), '/', SLASH); } /** * Converts OS specific dir separators to slashes. * * @param * str - what to convert */ void convertToSlashes(std::string &str) { std::replace(str.begin(), str.end(), SLASH, '/'); } // CONSTRUCTOR STIL::STIL(const char *stilPath, const char *bugsPath) : STIL_DEBUG(false), PATH_TO_STIL(stilPath), PATH_TO_BUGLIST(bugsPath), STILVersion(0.0f), STIL_EOL('\n'), STIL_EOL2('\0'), lastError(NO_STIL_ERROR) { setVersionString(); } void STIL::setVersionString() { ostringstream ss; ss << fixed << setw(4) << setprecision(2); ss << "STILView v" << VERSION_NO << endl; ss << "\tCopyright (C) 1998, 2002 by LaLa (LaLa@C64.org)" << endl; ss << "\tCopyright (C) 2012-2015 by Leandro Nini " << endl; versionString = ss.str(); } const char * STIL::getVersion() { lastError = NO_STIL_ERROR; return versionString.c_str(); } float STIL::getVersionNo() { lastError = NO_STIL_ERROR; return VERSION_NO; } float STIL::getSTILVersionNo() { lastError = NO_STIL_ERROR; return STILVersion; } bool STIL::setBaseDir(const char *pathToHVSC) { // Temporary placeholder for STIL.txt's version number. const float tempSTILVersion = STILVersion; // Temporary placeholders for lists of sections. dirList tempStilDirs; dirList tempBugDirs; lastError = NO_STIL_ERROR; CERR_STIL_DEBUG << "setBaseDir() called, pathToHVSC=" << pathToHVSC << endl; string tempBaseDir(pathToHVSC); // Sanity check the length. if (tempBaseDir.empty()) { CERR_STIL_DEBUG << "setBaseDir() has problem with the size of pathToHVSC" << endl; lastError = BASE_DIR_LENGTH; return false; } // Chop the trailing slash const string::iterator lastChar = tempBaseDir.end() - 1; if (*lastChar == SLASH) { tempBaseDir.erase(lastChar); } // Attempt to open STIL // Create the full path+filename string tempName = tempBaseDir; tempName.append(PATH_TO_STIL); convertSlashes(tempName); ifstream stilFile(tempName.c_str(), STILopenFlags); if (stilFile.fail()) { CERR_STIL_DEBUG << "setBaseDir() open failed for " << tempName << endl; lastError = STIL_OPEN; return false; } CERR_STIL_DEBUG << "setBaseDir(): open succeeded for " << tempName << endl; // Attempt to open BUGlist // Create the full path+filename tempName = tempBaseDir; tempName.append(PATH_TO_BUGLIST); convertSlashes(tempName); ifstream bugFile(tempName.c_str(), STILopenFlags); if (bugFile.fail()) { // This is not a critical error - some earlier versions of HVSC did // not have a BUGlist.txt file at all. CERR_STIL_DEBUG << "setBaseDir() open failed for " << tempName << endl; lastError = BUG_OPEN; } else { CERR_STIL_DEBUG << "setBaseDir(): open succeeded for " << tempName << endl; } // Find out what the EOL really is if (determineEOL(stilFile) != true) { CERR_STIL_DEBUG << "determinEOL() failed" << endl; lastError = NO_EOL; return false; } // Save away the current string so we can restore it if needed. const string tempVersionString(versionString); setVersionString(); // This is necessary so the version number gets scanned in from the new // file, too. STILVersion = 0.0; // These will populate the tempStilDirs and tempBugDirs maps (or not :) if (getDirs(stilFile, tempStilDirs, true) != true) { CERR_STIL_DEBUG << "getDirs() failed for stilFile" << endl; lastError = NO_STIL_DIRS; // Clean up and restore things. STILVersion = tempSTILVersion; versionString = tempVersionString; return false; } if (bugFile.good()) { if (getDirs(bugFile, tempBugDirs, false) != true) { // This is not a critical error - it is possible that the // BUGlist.txt file has no entries in it at all (in fact, that's // good!). CERR_STIL_DEBUG << "getDirs() failed for bugFile" << endl; lastError = BUG_OPEN; } } // Now we can copy the stuff into private data. // NOTE: At this point, STILVersion and the versionString should contain // the new info! // Copy. baseDir = tempBaseDir; stilDirs = tempStilDirs; bugDirs = tempBugDirs; // Clear the buffers (caches). entrybuf.clear(); globalbuf.clear(); bugbuf.clear(); CERR_STIL_DEBUG << "setBaseDir() succeeded" << endl; return true; } const char * STIL::getAbsEntry(const char *absPathToEntry, int tuneNo, STILField field) { lastError = NO_STIL_ERROR; CERR_STIL_DEBUG << "getAbsEntry() called, absPathToEntry=" << absPathToEntry << endl; if (baseDir.empty()) { CERR_STIL_DEBUG << "HVSC baseDir is not yet set!" << endl; lastError = STIL_OPEN; return NULL; } // Determine if the baseDir is in the given pathname. if (!stringutils::equal(absPathToEntry, baseDir.data(), baseDir.size())) { CERR_STIL_DEBUG << "getAbsEntry() failed: baseDir=" << baseDir << ", absPath=" << absPathToEntry << endl; lastError = WRONG_DIR; return NULL; } string tempDir(absPathToEntry + baseDir.size()); convertToSlashes(tempDir); return getEntry(tempDir.c_str(), tuneNo, field); } const char * STIL::getEntry(const char *relPathToEntry, int tuneNo, STILField field) { lastError = NO_STIL_ERROR; CERR_STIL_DEBUG << "getEntry() called, relPath=" << relPathToEntry << ", rest=" << tuneNo << "," << field << endl; if (baseDir.empty()) { CERR_STIL_DEBUG << "HVSC baseDir is not yet set!" << endl; lastError = STIL_OPEN; return NULL; } const size_t relPathToEntryLen = strlen(relPathToEntry); // Fail if a section-global comment was asked for. if (*(relPathToEntry + relPathToEntryLen - 1) == '/') { CERR_STIL_DEBUG << "getEntry() section-global comment was asked for - failed" << endl; lastError = WRONG_ENTRY; return NULL; } if (STILVersion < 2.59f) { // Older version of STIL is detected. tuneNo = 0; field = all; } // Find out whether we have this entry in the buffer. if ((!stringutils::equal(entrybuf.data(), relPathToEntry, relPathToEntryLen)) || ((entrybuf.find_first_of('\n') != relPathToEntryLen) && (STILVersion > 2.59f))) { // The relative pathnames don't match or they're not the same length: // we don't have it in the buffer, so pull it in. CERR_STIL_DEBUG << "getEntry(): entry not in buffer" << endl; // Create the full path+filename string tempName(baseDir); tempName.append(PATH_TO_STIL); convertSlashes(tempName); ifstream stilFile(tempName.c_str(), STILopenFlags); if (stilFile.fail()) { CERR_STIL_DEBUG << "getEntry() open failed for stilFile" << endl; lastError = STIL_OPEN; return NULL; } CERR_STIL_DEBUG << "getEntry() open succeeded for stilFile" << endl; if (positionToEntry(relPathToEntry, stilFile, stilDirs) == false) { // Copy the entry's name to the buffer. entrybuf.assign(relPathToEntry).append("\n"); CERR_STIL_DEBUG << "getEntry() posToEntry() failed" << endl; lastError = NOT_IN_STIL; } else { entrybuf.clear(); readEntry(stilFile, entrybuf); CERR_STIL_DEBUG << "getEntry() entry read" << endl; } } // Put the requested field into the result string. return getField(resultEntry, entrybuf.c_str(), tuneNo, field) ? resultEntry.c_str() : NULL; } const char * STIL::getAbsBug(const char *absPathToEntry, int tuneNo) { lastError = NO_STIL_ERROR; CERR_STIL_DEBUG << "getAbsBug() called, absPathToEntry=" << absPathToEntry << endl; if (baseDir.empty()) { CERR_STIL_DEBUG << "HVSC baseDir is not yet set!" << endl; lastError = BUG_OPEN; return NULL; } // Determine if the baseDir is in the given pathname. if (!stringutils::equal(absPathToEntry, baseDir.data(), baseDir.size())) { CERR_STIL_DEBUG << "getAbsBug() failed: baseDir=" << baseDir << ", absPath=" << absPathToEntry << endl; lastError = WRONG_DIR; return NULL; } string tempDir(absPathToEntry + baseDir.size()); convertToSlashes(tempDir); return getBug(tempDir.c_str(), tuneNo); } const char * STIL::getBug(const char *relPathToEntry, int tuneNo) { lastError = NO_STIL_ERROR; CERR_STIL_DEBUG << "getBug() called, relPath=" << relPathToEntry << ", rest=" << tuneNo << endl; if (baseDir.empty()) { CERR_STIL_DEBUG << "HVSC baseDir is not yet set!" << endl; lastError = BUG_OPEN; return NULL; } // Older version of STIL is detected. if (STILVersion < 2.59f) { tuneNo = 0; } // Find out whether we have this bug entry in the buffer. // If the baseDir was changed, we'll have to read it in again, // even if it might be in the buffer already. const size_t relPathToEntryLen = strlen(relPathToEntry); if ((!stringutils::equal(bugbuf.data(), relPathToEntry, relPathToEntryLen)) || ((bugbuf.find_first_of('\n') != relPathToEntryLen) && (STILVersion > 2.59f))) { // The relative pathnames don't match or they're not the same length: // we don't have it in the buffer, so pull it in. CERR_STIL_DEBUG << "getBug(): entry not in buffer" << endl; // Create the full path+filename string tempName(baseDir); tempName.append(PATH_TO_BUGLIST); convertSlashes(tempName); ifstream bugFile(tempName.c_str(), STILopenFlags); if (bugFile.fail()) { CERR_STIL_DEBUG << "getBug() open failed for bugFile" << endl; lastError = BUG_OPEN; return NULL; } CERR_STIL_DEBUG << "getBug() open succeeded for bugFile" << endl; if (positionToEntry(relPathToEntry, bugFile, bugDirs) == false) { // Copy the entry's name to the buffer. bugbuf.assign(relPathToEntry).append("\n"); CERR_STIL_DEBUG << "getBug() posToEntry() failed" << endl; lastError = NOT_IN_BUG; } else { bugbuf.clear(); readEntry(bugFile, bugbuf); CERR_STIL_DEBUG << "getBug() entry read" << endl; } } // Put the requested field into the result string. return getField(resultBug, bugbuf.c_str(), tuneNo) ? resultBug.c_str() : NULL; } const char * STIL::getAbsGlobalComment(const char *absPathToEntry) { lastError = NO_STIL_ERROR; CERR_STIL_DEBUG << "getAbsGC() called, absPathToEntry=" << absPathToEntry << endl; if (baseDir.empty()) { CERR_STIL_DEBUG << "HVSC baseDir is not yet set!" << endl; lastError = STIL_OPEN; return NULL; } // Determine if the baseDir is in the given pathname. if (!stringutils::equal(absPathToEntry, baseDir.data(), baseDir.size())) { CERR_STIL_DEBUG << "getAbsGC() failed: baseDir=" << baseDir << ", absPath=" << absPathToEntry << endl; lastError = WRONG_DIR; return NULL; } string tempDir(absPathToEntry + baseDir.size()); convertToSlashes(tempDir); return getGlobalComment(tempDir.c_str()); } const char * STIL::getGlobalComment(const char *relPathToEntry) { lastError = NO_STIL_ERROR; CERR_STIL_DEBUG << "getGC() called, relPath=" << relPathToEntry << endl; if (baseDir.empty()) { CERR_STIL_DEBUG << "HVSC baseDir is not yet set!" << endl; lastError = STIL_OPEN; return NULL; } // Save the dirpath. const char *lastSlash = strrchr(relPathToEntry, '/'); if (lastSlash == NULL) { lastError = WRONG_DIR; return NULL; } const size_t pathLen = lastSlash - relPathToEntry + 1; const string dir(relPathToEntry, pathLen); // Find out whether we have this global comment in the buffer. // If the baseDir was changed, we'll have to read it in again, // even if it might be in the buffer already. if ((!stringutils::equal(globalbuf.data(), dir.data(), pathLen)) || ((globalbuf.find_first_of('\n') != pathLen) && (STILVersion > 2.59f))) { // The relative pathnames don't match or they're not the same length: // we don't have it in the buffer, so pull it in. CERR_STIL_DEBUG << "getGC(): entry not in buffer" << endl; // Create the full path+filename string tempName(baseDir); tempName.append(PATH_TO_STIL); convertSlashes(tempName); ifstream stilFile(tempName.c_str(), STILopenFlags); if (stilFile.fail()) { CERR_STIL_DEBUG << "getGC() open failed for stilFile" << endl; lastError = STIL_OPEN; return NULL; } if (positionToEntry(dir.c_str(), stilFile, stilDirs) == false) { // Copy the dirname to the buffer. globalbuf.assign(dir).append("\n"); CERR_STIL_DEBUG << "getGC() posToEntry() failed" << endl; lastError = NOT_IN_STIL; } else { globalbuf.clear(); readEntry(stilFile, globalbuf); CERR_STIL_DEBUG << "getGC() entry read" << endl; } } CERR_STIL_DEBUG << "getGC() globalbuf=" << globalbuf << endl; CERR_STIL_DEBUG << "-=END=-" << endl; // Position pointer to the global comment field. const size_t temp = globalbuf.find_first_of('\n') + 1; // Check whether this is a NULL entry or not. return temp != globalbuf.size() ? globalbuf.c_str() + temp : NULL; } //////// PRIVATE bool STIL::determineEOL(ifstream &stilFile) { CERR_STIL_DEBUG << "detEOL() called" << endl; if (stilFile.fail()) { CERR_STIL_DEBUG << "detEOL() open failed" << endl; return false; } stilFile.seekg(0); STIL_EOL = '\0'; STIL_EOL2 = '\0'; // Determine what the EOL character is // (it can be different from OS to OS). istream::sentry se(stilFile, true); if (se) { streambuf *sb = stilFile.rdbuf(); const int eof = char_traits::eof(); while (sb->sgetc() != eof) { const int c = sb->sbumpc(); if ((c == '\n') || (c == '\r')) { STIL_EOL = c; if (c == '\r') { if (sb->sgetc() == '\n') STIL_EOL2 = '\n'; } break; } } } if (STIL_EOL == '\0') { // Something is wrong - no EOL-like char was found. CERR_STIL_DEBUG << "detEOL() no EOL found" << endl; return false; } CERR_STIL_DEBUG << "detEOL() EOL1=0x" << hex << static_cast(STIL_EOL) << " EOL2=0x" << hex << static_cast(STIL_EOL2) << dec << endl; return true; } bool STIL::getDirs(ifstream &inFile, dirList &dirs, bool isSTILFile) { bool newDir = !isSTILFile; CERR_STIL_DEBUG << "getDirs() called" << endl; inFile.seekg(0); while (inFile.good()) { string line; getStilLine(inFile, line); if (!isSTILFile) { CERR_STIL_DEBUG << line << '\n'; } // Try to extract STIL's version number if it's not done, yet. if (isSTILFile && (STILVersion == 0.0f)) { if (strncmp(line.data(), "# STIL v", 9) == 0) { // Get the version number STILVersion = atof(line.c_str() + 9); // Put it into the string, too. ostringstream ss; ss << fixed << setw(4) << setprecision(2); ss << "SID Tune Information List (STIL) v" << STILVersion << endl; versionString.append(ss.str()); CERR_STIL_DEBUG << "getDirs() STILVersion=" << STILVersion << endl; continue; } } // Search for the start of a dir separator first. if (isSTILFile && !newDir && stringutils::equal(line.data(), "### ", 4)) { newDir = true; continue; } // Is this the start of an entry immediately following a dir separator? if (newDir && (line[0] == '/')) { // Get the directory only const string dirName(line, 0, line.find_last_of('/') + 1); if (!isSTILFile) { // Compare it to the stored dirnames newDir = (dirs.count(dirName) == 0); } // Store the info if (newDir) { const streampos position = inFile.tellg() - (streampos)line.size() - 1L; CERR_STIL_DEBUG << "getDirs() dirName=" << dirName << ", pos=" << position << endl; dirs.insert(make_pair(dirName, position)); } newDir = !isSTILFile; } } if (dirs.empty()) { // No entries found - something is wrong. // NOTE: It's perfectly valid to have a BUGlist.txt file with no // entries in it! CERR_STIL_DEBUG << "getDirs() no dirs found" << endl; return false; } CERR_STIL_DEBUG << "getDirs() successful" << endl; return true; } bool STIL::positionToEntry(const char *entryStr, ifstream &inFile, dirList &dirs) { CERR_STIL_DEBUG << "pos2Entry() called, entryStr=" << entryStr << endl; inFile.seekg(0); // Get the dirpath. char *chrptr = strrchr((char *)entryStr, '/'); // If no slash was found, something is screwed up in the entryStr. if (chrptr == NULL) { return false; } const size_t pathLen = chrptr - entryStr + 1; // Determine whether a section-global comment is asked for. const size_t entryStrLen = strlen(entryStr); const bool globComm = (pathLen == entryStrLen); // Find it in the table. const string entry(entryStr, pathLen); dirList::iterator elem = dirs.find(entry); if (elem == dirs.end()) { // The directory was not found. CERR_STIL_DEBUG << "pos2Entry() did not find the dir" << endl; return false; } // Jump to the first entry of this section. inFile.seekg(elem->second); bool foundIt = false; // Now find the desired entry string line; do { getStilLine(inFile, line); if (inFile.eof()) { break; } // Check if it is the start of an entry if (line[0] == '/') { if (!stringutils::equal(elem->first.data(), line.data(), pathLen)) { // We are outside the section - get out of the loop, // which will fail the search. break; } // Check whether we need to find a section-global comment or // a specific entry. if (globComm || (STILVersion > 2.59f)) { foundIt = stringutils::equal(line.c_str(), entryStr); } else { // To be compatible with older versions of STIL, which may have // the tune designation on the first line of a STIL entry // together with the pathname. foundIt = stringutils::equal(line.data(), entryStr, entryStrLen); } CERR_STIL_DEBUG << "pos2Entry() line=" << line << endl; } } while (!foundIt); if (foundIt) { // Reposition the file pointer back to the start of the entry. inFile.seekg(inFile.tellg() - (streampos)line.size() - 1L); CERR_STIL_DEBUG << "pos2Entry() entry found" << endl; return true; } else { CERR_STIL_DEBUG << "pos2Entry() entry not found" << endl; return false; } } void STIL::readEntry(ifstream &inFile, string &buffer) { string line; for (;;) { getStilLine(inFile, line); if (line.size() == 0) break; buffer.append(line); buffer.append("\n"); } } bool STIL::getField(string &result, const char *buffer, int tuneNo, STILField field) { CERR_STIL_DEBUG << "getField() called, buffer=" << buffer << ", rest=" << tuneNo << "," << field << endl; // Clean out the result buffer first. result.clear(); // Position pointer to the first char beyond the file designation. const char *start = strchr(buffer, '\n') + 1; // Check whether this is a NULL entry or not. if (*start == '\0') { CERR_STIL_DEBUG << "getField() null entry" << endl; return false; } // Is this a multitune entry? const char *firstTuneNo = strstr(start, "(#"); // This is a tune designation only if the previous char was // a newline (ie. if the "(#" is on the beginning of a line). if ((firstTuneNo != NULL) && (*(firstTuneNo - 1) != '\n')) { firstTuneNo = NULL; } if (firstTuneNo == NULL) { //-------------------// // SINGLE TUNE ENTRY // //-------------------// // Is the first thing in this STIL entry the COMMENT? const char *temp = strstr(start, _COMMENT_STR); const char *temp2 = NULL; // Search for other potential fields beyond the COMMENT. if (temp == start) { temp2 = strstr(start, _NAME_STR); if (temp2 == NULL) { temp2 = strstr(start, _AUTHOR_STR); if (temp2 == NULL) { temp2 = strstr(start, _TITLE_STR); if (temp2 == NULL) { temp2 = strstr(start, _ARTIST_STR); } } } } if (temp == start) { // Yes. So it's assumed to be a file-global comment. CERR_STIL_DEBUG << "getField() single-tune entry, COMMENT only" << endl; if ((tuneNo == 0) && ((field == all) || ((field == comment) && (temp2 == NULL)))) { // Simply copy the stuff in. result.append(start); CERR_STIL_DEBUG << "getField() copied to resultbuf" << endl; return true; } else if ((tuneNo == 0) && (field == comment)) { // Copy just the comment. result.append(start, temp2 - start); CERR_STIL_DEBUG << "getField() copied to just the COMMENT to resultbuf" << endl; return true; } else if ((tuneNo == 1) && (temp2 != NULL)) { // A specific field was asked for. CERR_STIL_DEBUG << "getField() copying COMMENT to resultbuf" << endl; return getOneField(result, temp2, temp2 + strlen(temp2), field); } else { // Anything else is invalid as of v2.00. CERR_STIL_DEBUG << "getField() invalid parameter combo: single tune, tuneNo=" << tuneNo << ", field=" << field << endl; return false; } } else { // No. Handle it as a regular entry. CERR_STIL_DEBUG << "getField() single-tune regular entry" << endl; if ((field == all) && ((tuneNo == 0) || (tuneNo == 1))) { // The complete entry was asked for. Simply copy the stuff in. result.append(start); CERR_STIL_DEBUG << "getField() copied to resultbuf" << endl; return true; } else if (tuneNo == 1) { // A specific field was asked for. CERR_STIL_DEBUG << "getField() copying COMMENT to resultbuf" << endl; return getOneField(result, start, start + strlen(start), field); } else { // Anything else is invalid as of v2.00. CERR_STIL_DEBUG << "getField() invalid parameter combo: single tune, tuneNo=" << tuneNo << ", field=" << field << endl; return false; } } } else { //-------------------// // MULTITUNE ENTRY //-------------------// CERR_STIL_DEBUG << "getField() multitune entry" << endl; // Was the complete entry asked for? if (tuneNo == 0) { switch (field) { case all: // Yes. Simply copy the stuff in. result.append(start); CERR_STIL_DEBUG << "getField() copied all to resultbuf" << endl; return true; case comment: // Only the file-global comment field was asked for. if (firstTuneNo != start) { CERR_STIL_DEBUG << "getField() copying file-global comment to resultbuf" << endl; return getOneField(result, start, firstTuneNo, comment); } else { CERR_STIL_DEBUG << "getField() no file-global comment" << endl; return false; } break; default: // If a specific field other than a comment is // asked for tuneNo=0, this is illegal. CERR_STIL_DEBUG << "getField() invalid parameter combo: multitune, tuneNo=" << tuneNo << ", field=" << field << endl; return false; } } char tuneNoStr[8]; // Search for the requested tune number. snprintf(tuneNoStr, 7, "(#%d)", tuneNo); tuneNoStr[7] = '\0'; const char *myTuneNo = strstr(start, tuneNoStr); if (myTuneNo != NULL) { // We found the requested tune number. // Set the pointer beyond it. myTuneNo = strchr(myTuneNo, '\n') + 1; // Where is the next one? const char *nextTuneNo = strstr(myTuneNo, "\n(#"); if (nextTuneNo == NULL) { // There is no next one - set pointer to end of entry. nextTuneNo = start + strlen(start); } else { // The search included the \n - go beyond it. nextTuneNo++; } // Put the desired fields into the result (which may be 'all'). CERR_STIL_DEBUG << "getField() myTuneNo=" << myTuneNo << ", nextTuneNo=" << nextTuneNo << endl; return getOneField(result, myTuneNo, nextTuneNo, field); } else { CERR_STIL_DEBUG << "getField() nothing found" << endl; return false; } } } bool STIL::getOneField(string &result, const char *start, const char *end, STILField field) { // Sanity checking if ((end < start) || (*(end - 1) != '\n')) { CERR_STIL_DEBUG << "getOneField() illegal parameters" << endl; return false; } CERR_STIL_DEBUG << "getOneField() called, start=" << start << ", rest=" << field << endl; const char *temp = NULL; switch (field) { case all: result.append(start, end - start); return true; case name: temp = strstr(start, _NAME_STR); break; case author: temp = strstr(start, _AUTHOR_STR); break; case title: temp = strstr(start, _TITLE_STR); break; case artist: temp = strstr(start, _ARTIST_STR); break; case comment: temp = strstr(start, _COMMENT_STR); break; default: break; } // If the field was not found or it is not in between 'start' // and 'end', it is declared a failure. if ((temp == NULL) || (temp < start) || (temp > end)) { return false; } // Search for the end of this field. This is done by finding // where the next field starts. const char *nextName = strstr(temp + 1, _NAME_STR); const char *nextAuthor = strstr(temp + 1, _AUTHOR_STR); const char *nextTitle = strstr(temp + 1, _TITLE_STR); const char *nextArtist = strstr(temp + 1, _ARTIST_STR); const char *nextComment = strstr(temp + 1, _COMMENT_STR); // If any of these fields is beyond 'end', they are ignored. if ((nextName != NULL) && (nextName >= end)) { nextName = NULL; } if ((nextAuthor != NULL) && (nextAuthor >= end)) { nextAuthor = NULL; } if ((nextTitle != NULL) && (nextTitle >= end)) { nextTitle = NULL; } if ((nextArtist != NULL) && (nextArtist >= end)) { nextArtist = NULL; } if ((nextComment != NULL) && (nextComment >= end)) { nextComment = NULL; } // Now determine which one is the closest to our field - that one // will mark the end of the required field. const char *nextField = nextName; if (nextField == NULL) { nextField = nextAuthor; } else if ((nextAuthor != NULL) && (nextAuthor < nextField)) { nextField = nextAuthor; } if (nextField == NULL) { nextField = nextTitle; } else if ((nextTitle != NULL) && (nextTitle < nextField)) { nextField = nextTitle; } if (nextField == NULL) { nextField = nextArtist; } else if ((nextArtist != NULL) && (nextArtist < nextField)) { nextField = nextArtist; } if (nextField == NULL) { nextField = nextComment; } else if ((nextComment != NULL) && (nextComment < nextField)) { nextField = nextComment; } if (nextField == NULL) { nextField = end; } // Now nextField points to the last+1 char that should be copied to // result. Do that. result.append(temp, nextField - temp); return true; } void STIL::getStilLine(ifstream &infile, string &line) { if (STIL_EOL2 != '\0') { // If there was a remaining EOL char from the previous read, eat it up. char temp = infile.peek(); if ((temp == 0x0d) || (temp == 0x0a)) { infile.get(temp); } } getline(infile, line, STIL_EOL); } libsidplayfp-2.6.0/src/utils/STILview/stildefs.h0000644000175100001770000000504714544470307016526 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 1998, 2002 by LaLa * Copyright 2012-2015 Leandro Nini * * 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. */ // // STIL - Common defines // #ifndef STILDEFS_H #define STILDEFS_H /* DLL building support on win32 hosts */ #ifndef STIL_EXTERN # ifdef DLL_EXPORT /* defined by libtool (if required) */ # define STIL_EXTERN __declspec(dllexport) # endif # ifdef STIL_DLL_IMPORT /* define if linking with this dll */ # define STIL_EXTERN __declspec(dllimport) # endif # ifndef STIL_EXTERN /* static linking or !_WIN32 */ # if defined(__GNUC__) && (__GNUC__ >= 4) # define STIL_EXTERN __attribute__ ((visibility("default"))) # else # define STIL_EXTERN # endif # endif #endif /* Deprecated attributes */ #if defined(_MSCVER) # define STIL_DEPRECATED __declspec(deprecated) #elif defined(__GNUC__) # define STIL_DEPRECATED __attribute__ ((deprecated)) #else # define STIL_DEPRECATED #endif #if defined(__linux__) || defined(__FreeBSD__) || defined(solaris2) || defined(sun) || defined(sparc) || defined(sgi) # define UNIX #endif #if defined(__MACOS__) # define MAC #endif #if defined(__amigaos__) # define AMIGA #endif // // Here you should define: // - what the pathname separator is on your system (attempted to be defined // automatically), // - what function compares strings case-insensitively, // - what function compares portions of strings case-insensitively. // #ifdef UNIX # define SLASH '/' #elif defined MAC # define SLASH ':' #elif defined AMIGA # define SLASH '/' #else // WinDoze # define SLASH '\\' #endif // Default HVSC path to STIL. const char DEFAULT_PATH_TO_STIL[]="/DOCUMENTS/STIL.txt"; // Default HVSC path to BUGlist. const char DEFAULT_PATH_TO_BUGLIST[]="/DOCUMENTS/BUGlist.txt"; #endif // STILDEFS_H libsidplayfp-2.6.0/src/utils/iMd5.h0000644000175100001770000000222014544470307014027 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014 Leandro Nini * * 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. */ #ifndef IMD5_H #define IMD5_H namespace libsidplayfp { class iMd5 { public: virtual void append(const void* data, int nbytes) =0; virtual void finish() =0; virtual void reset() =0; virtual const unsigned char* getDigest() =0; virtual ~iMd5() {} }; class md5Error {}; } #endif // IMD5_H libsidplayfp-2.6.0/src/utils/md5Factory.cpp0000644000175100001770000000233414544470307015607 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014-2015 Leandro Nini * * 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. */ #include "md5Factory.h" #include "iMd5.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_LIBGCRYPT # include "md5Gcrypt.h" #else # include "md5Internal.h" #endif namespace libsidplayfp { std::unique_ptr md5Factory::get() { return std::unique_ptr( #ifdef HAVE_LIBGCRYPT new md5Gcrypt() #else new md5Internal() #endif ); } } libsidplayfp-2.6.0/src/utils/SidDatabase.h0000644000175100001770000000554114544470307015406 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #ifndef SIDDATABASE_H #define SIDDATABASE_H #include #include "sidplayfp/siddefs.h" class SidTune; namespace libsidplayfp { class iniParser; } /** * SidDatabase * An utility class to deal with the songlength DataBase. */ class SID_EXTERN SidDatabase { private: libsidplayfp::iniParser* m_parser; const char *errorString; public: SidDatabase(); ~SidDatabase(); /** * Open the songlength DataBase. * * @param filename songlengthDB file name with full path. * @return false in case of errors, true otherwise. */ bool open(const char *filename); #ifdef _WIN32 bool open(const wchar_t* filename); #endif /** * Close the songlength DataBase. */ void close(); /** * Get the length of the current subtune. * The hash is obtained with a specific MD5 calculation (old format). * * @param tune the SID tune * @return tune length in seconds, -1 in case of errors. */ int_least32_t length(SidTune &tune); /** * Get the length of the selected subtune. * * @param md5 the md5 hash of the tune. * @param song the subtune. * @return tune length in seconds, -1 in case of errors. */ int_least32_t length(const char *md5, unsigned int song); /** * Get the length of the current subtune. * The hash is based on the full content (new format). * * @param tune the SID tune * @return tune length in milliseconds, -1 in case of errors. */ int_least32_t lengthMs(SidTune &tune); /** * Get the length of the selected subtune. * * @param md5 the md5 hash of the tune. * @param song the subtune. * @return tune length in milliseconds, -1 in case of errors. */ int_least32_t lengthMs(const char *md5, unsigned int song); /** * Get descriptive error message. */ const char *error() const { return errorString; } }; #endif // SIDDATABASE_H libsidplayfp-2.6.0/src/utils/md5Factory.h0000644000175100001770000000206114544470307015251 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014-2015 Leandro Nini * * 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. */ #ifndef MD5_FACTORY_H #define MD5_FACTORY_H #include #include "sidcxx11.h" namespace libsidplayfp { class iMd5; namespace md5Factory { std::unique_ptr get(); } } #endif // MD5_FACTORY_H libsidplayfp-2.6.0/src/utils/iniParser.h0000644000175100001770000000301214544470307015165 00000000000000/* * Copyright (C) 2010-2015 Leandro Nini * * 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 */ #ifndef INIPARSER_H #define INIPARSER_H #include #include #include #include namespace libsidplayfp { class iniParser { private: typedef std::map keys_t; typedef std::map sections_t; private: sections_t sections; sections_t::const_iterator curSection; private: std::string parseSection(const std::string &buffer); keys_t::value_type parseKey(const std::string &buffer); bool open_internal(std::ifstream& iniFile); public: bool open(const char *fName); #ifdef _WIN32 bool open(const wchar_t* fName); #endif void close(); bool setSection(const char *section); const char *getValue(const char *key); }; } #endif // INIPARSER_H libsidplayfp-2.6.0/src/utils/md5Gcrypt.h0000644000175100001770000000361114544470307015114 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2013 Leandro Nini * * 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. */ #ifndef MD5_GCRYPT_H #define MD5_GCRYPT_H #define GCRYPT_NO_MPI_MACROS #define GCRYPT_NO_DEPRECATED #include "iMd5.h" #include "sidcxx11.h" #include namespace libsidplayfp { class md5Gcrypt final : public iMd5 { private: gcry_md_hd_t hd; public: md5Gcrypt() { if (gcry_check_version(GCRYPT_VERSION) == 0) throw md5Error(); // Disable secure memory. if (gcry_control(GCRYCTL_DISABLE_SECMEM, 0) != 0) throw md5Error(); // Tell Libgcrypt that initialization has completed. if (gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0) != 0) throw md5Error(); if (gcry_md_open(&hd, GCRY_MD_MD5, 0) != 0) throw md5Error(); } ~md5Gcrypt() { gcry_md_close(hd); } void append(const void* data, int nbytes) override { gcry_md_write(hd, data, nbytes); } void finish() override { gcry_md_final(hd); } const unsigned char* getDigest() override { return gcry_md_read(hd, 0); } void reset() override { gcry_md_reset(hd); } }; } #endif libsidplayfp-2.6.0/src/utils/md5Internal.h0000644000175100001770000000245414544470307015424 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014 Leandro Nini * * 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. */ #ifndef MD5_INTERNAL_H #define MD5_INTERNAL_H #include "iMd5.h" #include "MD5/MD5.h" #include "sidcxx11.h" namespace libsidplayfp { class md5Internal final : public iMd5 { private: MD5 hd; public: void append(const void* data, int nbytes) override { hd.append(data, nbytes); } void finish() override { hd.finish(); } const unsigned char* getDigest() override { return hd.getDigest(); } void reset() override { hd.reset(); } }; } #endif libsidplayfp-2.6.0/src/utils/MD5/0000755000175100001770000000000014544470322013526 500000000000000libsidplayfp-2.6.0/src/utils/MD5/MD5_Defs.h0000644000175100001770000000022514544470307015147 00000000000000#ifndef MD5_DEFS_H #define MD5_DEFS_H #include "sidendian.h" #ifdef WORDS_BIGENDIAN # define MD5_WORDS_BIG_ENDIAN #endif #endif /* MD5_DEFS_H */ libsidplayfp-2.6.0/src/utils/MD5/MD5.h0000644000175100001770000000700314544470307014207 00000000000000/* * This code has been derived by Michael Schwendt * from original work by L. Peter Deutsch . * * The original C code (md5.c, md5.h) is available here: * ftp://ftp.cs.wisc.edu/ghost/packages/md5.tar.gz */ /* Copyright (C) 1999 Aladdin Enterprises. All rights reserved. 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. L. Peter Deutsch ghost@aladdin.com */ #ifndef MD5_H #define MD5_H #include #include "MD5_Defs.h" typedef uint8_t md5_byte_t; typedef uint32_t md5_word_t; class MD5 { public: // Initialize the algorithm. Reset starting values. MD5(); // Append a string to the message. void append(const void* data, int nbytes); // Finish the message. void finish(); // Return pointer to 16-byte fingerprint. const md5_byte_t* getDigest(); // Initialize the algorithm. Reset starting values. void reset(); private: /* Define the state of the MD5 Algorithm. */ md5_word_t count[2]; /* message length in bits, lsw first */ md5_word_t abcd[4]; /* digest buffer */ md5_byte_t buf[64]; /* accumulate block */ md5_byte_t digest[16]; md5_word_t tmpBuf[16]; const md5_word_t* X; void process(const md5_byte_t data[64]); md5_word_t ROTATE_LEFT(const md5_word_t x, const int n); md5_word_t F(const md5_word_t x, const md5_word_t y, const md5_word_t z); md5_word_t G(const md5_word_t x, const md5_word_t y, const md5_word_t z); md5_word_t H(const md5_word_t x, const md5_word_t y, const md5_word_t z); md5_word_t I(const md5_word_t x, const md5_word_t y, const md5_word_t z); typedef md5_word_t (MD5::*md5func)(const md5_word_t x, const md5_word_t y, const md5_word_t z); void SET(md5func func, md5_word_t& a, md5_word_t& b, md5_word_t& c, md5_word_t& d, const int k, const int s, const md5_word_t Ti); }; inline md5_word_t MD5::ROTATE_LEFT(const md5_word_t x, const int n) { return ( (x<>(32-n)) ); } inline md5_word_t MD5::F(const md5_word_t x, const md5_word_t y, const md5_word_t z) { return ( (x&y) | (~x&z) ); } inline md5_word_t MD5::G(const md5_word_t x, const md5_word_t y, const md5_word_t z) { return ( (x&z) | (y&~z) ); } inline md5_word_t MD5::H(const md5_word_t x, const md5_word_t y, const md5_word_t z) { return ( x^y^z ); } inline md5_word_t MD5::I(const md5_word_t x, const md5_word_t y, const md5_word_t z) { return ( y ^ (x|~z) ); } inline void MD5::SET(md5func func, md5_word_t& a, md5_word_t& b, md5_word_t& c, md5_word_t& d, const int k, const int s, const md5_word_t Ti) { md5_word_t t = a + (this->*func)(b,c,d) + X[k] + Ti; a = ROTATE_LEFT(t, s) + b; } #endif /* MD5_H */ libsidplayfp-2.6.0/src/utils/MD5/MD5.cpp0000644000175100001770000002450414544470307014547 00000000000000/* * This code has been derived by Michael Schwendt * from original work by L. Peter Deutsch . * * The original C code (md5.c, md5.h) is available here: * ftp://ftp.cs.wisc.edu/ghost/packages/md5.tar.gz */ /* * The original code is: Copyright (C) 1999 Aladdin Enterprises. All rights reserved. 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. L. Peter Deutsch ghost@aladdin.com */ #include "MD5.h" #include #ifdef HAVE_CONFIG_H # include "config.h" #endif #if defined(HAVE_MSWINDOWS) || defined(DLL_EXPORT) // Support for DLLs # define MD5_EXPORT __declspec(dllexport) #endif /* * Compile with -DMD5_TEST to create a self-contained executable test program. * The test program should print out the same values as given in section * A.5 of RFC 1321, reproduced below. */ #ifdef MD5_TEST #include #include #include main() { static const char *const test[7] = { "", /*d41d8cd98f00b204e9800998ecf8427e*/ "a", /*0cc175b9c0f1b6a831c399e269772661*/ "abc", /*900150983cd24fb0d6963f7d28e17f72*/ "message digest", /*f96b697d7cb7938d525a2f31aaf161d0*/ "abcdefghijklmnopqrstuvwxyz", /*c3fcd3d76192e4007dfb496cca67e13b*/ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", /*d174ab98d277d9f5a5611c2c9f419d9f*/ "12345678901234567890123456789012345678901234567890123456789012345678901234567890" /*57edf4a22be3c955ac49da2e2107b67a*/ }; for (int i = 0; i < 7; ++i) { MD5 myMD5; myMD5.append((const md5_byte_t *)test[i], strlen(test[i])); myMD5.finish(); cout << "MD5 (\"" << test[i] << "\") = "; for (int di = 0; di < 16; ++di) cout << hex << setw(2) << setfill('0') << static_cast(myMD5.getDigest()[di]); cout << endl; } return 0; } #endif /* MD5_TEST */ #define T1 0xd76aa478 #define T2 0xe8c7b756 #define T3 0x242070db #define T4 0xc1bdceee #define T5 0xf57c0faf #define T6 0x4787c62a #define T7 0xa8304613 #define T8 0xfd469501 #define T9 0x698098d8 #define T10 0x8b44f7af #define T11 0xffff5bb1 #define T12 0x895cd7be #define T13 0x6b901122 #define T14 0xfd987193 #define T15 0xa679438e #define T16 0x49b40821 #define T17 0xf61e2562 #define T18 0xc040b340 #define T19 0x265e5a51 #define T20 0xe9b6c7aa #define T21 0xd62f105d #define T22 0x02441453 #define T23 0xd8a1e681 #define T24 0xe7d3fbc8 #define T25 0x21e1cde6 #define T26 0xc33707d6 #define T27 0xf4d50d87 #define T28 0x455a14ed #define T29 0xa9e3e905 #define T30 0xfcefa3f8 #define T31 0x676f02d9 #define T32 0x8d2a4c8a #define T33 0xfffa3942 #define T34 0x8771f681 #define T35 0x6d9d6122 #define T36 0xfde5380c #define T37 0xa4beea44 #define T38 0x4bdecfa9 #define T39 0xf6bb4b60 #define T40 0xbebfbc70 #define T41 0x289b7ec6 #define T42 0xeaa127fa #define T43 0xd4ef3085 #define T44 0x04881d05 #define T45 0xd9d4d039 #define T46 0xe6db99e5 #define T47 0x1fa27cf8 #define T48 0xc4ac5665 #define T49 0xf4292244 #define T50 0x432aff97 #define T51 0xab9423a7 #define T52 0xfc93a039 #define T53 0x655b59c3 #define T54 0x8f0ccc92 #define T55 0xffeff47d #define T56 0x85845dd1 #define T57 0x6fa87e4f #define T58 0xfe2ce6e0 #define T59 0xa3014314 #define T60 0x4e0811a1 #define T61 0xf7537e82 #define T62 0xbd3af235 #define T63 0x2ad7d2bb #define T64 0xeb86d391 MD5::MD5() { reset(); } void MD5::reset() { count[0] = count[1] = 0; abcd[0] = 0x67452301; abcd[1] = 0xefcdab89; abcd[2] = 0x98badcfe; abcd[3] = 0x10325476; memset(digest,0,16); memset(buf,0,64); } void MD5::process(const md5_byte_t data[64]) { md5_word_t a = abcd[0], b = abcd[1], c = abcd[2], d = abcd[3]; #ifdef MD5_WORDS_BIG_ENDIAN /* * On big-endian machines, we must arrange the bytes in the right * order. (This also works on machines of unknown byte order.) */ const md5_byte_t *xp = data; for (int i = 0; i < 16; ++i, xp += 4) { tmpBuf[i] = (xp[0]&0xFF) + ((xp[1]&0xFF)<<8) + ((xp[2]&0xFF)<<16) + ((xp[3]&0xFF)<<24); } X = tmpBuf; #else /* !MD5_IS_BIG_ENDIAN */ /* * On little-endian machines, we can process properly aligned data * without copying it. */ if (!((uintptr_t)data & 3)) { /* data are properly aligned */ X = (const md5_word_t *)data; } else { /* not aligned */ memcpy(tmpBuf, data, 64); X = tmpBuf; } #endif /* MD5_IS_BIG_ENDIAN */ /* Round 1. */ /* Let [abcd k s i] denote the operation a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ /* Do the following 16 operations. */ SET(&MD5::F, a, b, c, d, 0, 7, T1); SET(&MD5::F, d, a, b, c, 1, 12, T2); SET(&MD5::F, c, d, a, b, 2, 17, T3); SET(&MD5::F, b, c, d, a, 3, 22, T4); SET(&MD5::F, a, b, c, d, 4, 7, T5); SET(&MD5::F, d, a, b, c, 5, 12, T6); SET(&MD5::F, c, d, a, b, 6, 17, T7); SET(&MD5::F, b, c, d, a, 7, 22, T8); SET(&MD5::F, a, b, c, d, 8, 7, T9); SET(&MD5::F, d, a, b, c, 9, 12, T10); SET(&MD5::F, c, d, a, b, 10, 17, T11); SET(&MD5::F, b, c, d, a, 11, 22, T12); SET(&MD5::F, a, b, c, d, 12, 7, T13); SET(&MD5::F, d, a, b, c, 13, 12, T14); SET(&MD5::F, c, d, a, b, 14, 17, T15); SET(&MD5::F, b, c, d, a, 15, 22, T16); /* Round 2. */ /* Let [abcd k s i] denote the operation a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ /* Do the following 16 operations. */ SET(&MD5::G, a, b, c, d, 1, 5, T17); SET(&MD5::G, d, a, b, c, 6, 9, T18); SET(&MD5::G, c, d, a, b, 11, 14, T19); SET(&MD5::G, b, c, d, a, 0, 20, T20); SET(&MD5::G, a, b, c, d, 5, 5, T21); SET(&MD5::G, d, a, b, c, 10, 9, T22); SET(&MD5::G, c, d, a, b, 15, 14, T23); SET(&MD5::G, b, c, d, a, 4, 20, T24); SET(&MD5::G, a, b, c, d, 9, 5, T25); SET(&MD5::G, d, a, b, c, 14, 9, T26); SET(&MD5::G, c, d, a, b, 3, 14, T27); SET(&MD5::G, b, c, d, a, 8, 20, T28); SET(&MD5::G, a, b, c, d, 13, 5, T29); SET(&MD5::G, d, a, b, c, 2, 9, T30); SET(&MD5::G, c, d, a, b, 7, 14, T31); SET(&MD5::G, b, c, d, a, 12, 20, T32); /* Round 3. */ /* Let [abcd k s t] denote the operation a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ /* Do the following 16 operations. */ SET(&MD5::H, a, b, c, d, 5, 4, T33); SET(&MD5::H, d, a, b, c, 8, 11, T34); SET(&MD5::H, c, d, a, b, 11, 16, T35); SET(&MD5::H, b, c, d, a, 14, 23, T36); SET(&MD5::H, a, b, c, d, 1, 4, T37); SET(&MD5::H, d, a, b, c, 4, 11, T38); SET(&MD5::H, c, d, a, b, 7, 16, T39); SET(&MD5::H, b, c, d, a, 10, 23, T40); SET(&MD5::H, a, b, c, d, 13, 4, T41); SET(&MD5::H, d, a, b, c, 0, 11, T42); SET(&MD5::H, c, d, a, b, 3, 16, T43); SET(&MD5::H, b, c, d, a, 6, 23, T44); SET(&MD5::H, a, b, c, d, 9, 4, T45); SET(&MD5::H, d, a, b, c, 12, 11, T46); SET(&MD5::H, c, d, a, b, 15, 16, T47); SET(&MD5::H, b, c, d, a, 2, 23, T48); /* Round 4. */ /* Let [abcd k s t] denote the operation a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ /* Do the following 16 operations. */ SET(&MD5::I, a, b, c, d, 0, 6, T49); SET(&MD5::I, d, a, b, c, 7, 10, T50); SET(&MD5::I, c, d, a, b, 14, 15, T51); SET(&MD5::I, b, c, d, a, 5, 21, T52); SET(&MD5::I, a, b, c, d, 12, 6, T53); SET(&MD5::I, d, a, b, c, 3, 10, T54); SET(&MD5::I, c, d, a, b, 10, 15, T55); SET(&MD5::I, b, c, d, a, 1, 21, T56); SET(&MD5::I, a, b, c, d, 8, 6, T57); SET(&MD5::I, d, a, b, c, 15, 10, T58); SET(&MD5::I, c, d, a, b, 6, 15, T59); SET(&MD5::I, b, c, d, a, 13, 21, T60); SET(&MD5::I, a, b, c, d, 4, 6, T61); SET(&MD5::I, d, a, b, c, 11, 10, T62); SET(&MD5::I, c, d, a, b, 2, 15, T63); SET(&MD5::I, b, c, d, a, 9, 21, T64); /* Then perform the following additions. (That is increment each of the four registers by the value it had before this block was started.) */ abcd[0] += a; abcd[1] += b; abcd[2] += c; abcd[3] += d; } void MD5::append(const void* data, int nbytes) { const md5_byte_t* p = (const md5_byte_t*)data; int left = nbytes; int offset = (count[0]>>3) & 63; md5_word_t nbits = (md5_word_t)(nbytes<<3); if (nbytes <= 0) return; /* Update the message length. */ count[1] += nbytes >> 29; count[0] += nbits; if (count[0] < nbits) count[1]++; /* Process an initial partial block. */ if (offset) { int copy = (offset + nbytes > 64) ? (64 - offset) : nbytes; memcpy(buf + offset, p, copy); if (offset + copy < 64) return; p += copy; left -= copy; process(buf); } /* Process full blocks. */ for (; left >= 64; p += 64, left -= 64) process(p); /* Process a final partial block. */ if (left) memcpy(buf, p, left); } void MD5::finish() { static const md5_byte_t pad[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 }; md5_byte_t data[8]; int i; /* Save the length before padding. */ for (i = 0; i < 8; ++i) data[i] = (md5_byte_t)(count[i>>2] >> ((i&3)<<3)); /* Pad to 56 bytes mod 64. */ append(pad, ((55 - (count[0] >> 3)) & 63) + 1); /* Append the length. */ append(data, 8); for (i = 0; i < 16; ++i) digest[i] = (md5_byte_t)(abcd[i>>2] >> ((i&3)<<3)); } const md5_byte_t* MD5::getDigest() { return digest; } libsidplayfp-2.6.0/src/utils/iniParser.cpp0000644000175100001770000000612714544470307015532 00000000000000/* * Copyright (C) 2010-2015 Leandro Nini * * 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 */ #include "iniParser.h" #include "sidcxx11.h" #include namespace libsidplayfp { class parseError {}; std::string iniParser::parseSection(const std::string &buffer) { const size_t pos = buffer.find(']'); if (pos == std::string::npos) { throw parseError(); } return buffer.substr(1, pos-1); } iniParser::keys_t::value_type iniParser::parseKey(const std::string &buffer) { const size_t pos = buffer.find('='); if (pos == std::string::npos) { throw parseError(); } const std::string key = buffer.substr(0, buffer.find_last_not_of(' ', pos-1) + 1); const std::string value = buffer.substr(pos + 1); return make_pair(key, value); } bool iniParser::open(const char *fName) { std::ifstream iniFile(fName); return open_internal(iniFile); } #ifdef _WIN32 bool iniParser::open(const wchar_t *fName) { std::ifstream iniFile(fName); return open_internal(iniFile); } #endif bool iniParser::open_internal(std::ifstream & iniFile) { if (iniFile.fail()) { return false; } sections_t::iterator mIt; while (iniFile.good()) { std::string buffer; getline(iniFile, buffer); if (buffer.empty()) continue; switch (buffer.at(0)) { case ';': case '#': // skip comments break; case '[': try { const std::string section = parseSection(buffer); const keys_t keys; std::pair it = sections.insert(make_pair(section, keys)); mIt = it.first; } catch (parseError const &) {}; break; default: try { (*mIt).second.insert(parseKey(buffer)); } catch (parseError const &) {}; break; } } return true; } void iniParser::close() { sections.clear(); } bool iniParser::setSection(const char *section) { curSection = sections.find(std::string(section)); return (curSection != sections.end()); } const char *iniParser::getValue(const char *key) { keys_t::const_iterator keyIt = (*curSection).second.find(std::string(key)); return (keyIt != (*curSection).second.end()) ? keyIt->second.c_str() : nullptr; } } libsidplayfp-2.6.0/src/sidendian.h0000644000175100001770000001524314544470307014040 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2000 Simon White * * 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. */ #ifndef SIDENDIAN_H #define SIDENDIAN_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #include /* Labeling: 0 - LO 1 - HI 2 - HILO 3 - HIHI */ /////////////////////////////////////////////////////////////////// // INT16 FUNCTIONS /////////////////////////////////////////////////////////////////// /// Set the lo byte (8 bit) in a word (16 bit) inline void endian_16lo8 (uint_least16_t &word, uint8_t byte) { word &= 0xff00; word |= byte; } /// Get the lo byte (8 bit) in a word (16 bit) inline uint8_t endian_16lo8 (uint_least16_t word) { return (uint8_t) word; } /// Set the hi byte (8 bit) in a word (16 bit) inline void endian_16hi8 (uint_least16_t &word, uint8_t byte) { word &= 0x00ff; word |= (uint_least16_t) byte << 8; } /// Set the hi byte (8 bit) in a word (16 bit) inline uint8_t endian_16hi8 (uint_least16_t word) { return (uint8_t) (word >> 8); } /// Swap word endian. inline void endian_16swap8 (uint_least16_t &word) { uint8_t lo = endian_16lo8 (word); uint8_t hi = endian_16hi8 (word); endian_16lo8 (word, hi); endian_16hi8 (word, lo); } /// Convert high-byte and low-byte to 16-bit word. inline uint_least16_t endian_16 (uint8_t hi, uint8_t lo) { uint_least16_t word = 0; endian_16lo8 (word, lo); endian_16hi8 (word, hi); return word; } /// Convert high-byte and low-byte to 16-bit little endian word. inline void endian_16 (uint8_t ptr[2], uint_least16_t word) { #if defined(WORDS_BIGENDIAN) ptr[0] = endian_16hi8 (word); ptr[1] = endian_16lo8 (word); #else ptr[0] = endian_16lo8 (word); ptr[1] = endian_16hi8 (word); #endif } inline void endian_16 (char ptr[2], uint_least16_t word) { endian_16 ((uint8_t *) ptr, word); } /// Convert high-byte and low-byte to 16-bit little endian word. inline uint_least16_t endian_little16 (const uint8_t ptr[2]) { return endian_16 (ptr[1], ptr[0]); } /// Write a little-endian 16-bit word to two bytes in memory. inline void endian_little16 (uint8_t ptr[2], uint_least16_t word) { ptr[0] = endian_16lo8 (word); ptr[1] = endian_16hi8 (word); } /// Convert high-byte and low-byte to 16-bit big endian word. inline uint_least16_t endian_big16 (const uint8_t ptr[2]) { return endian_16 (ptr[0], ptr[1]); } /// Write a little-big 16-bit word to two bytes in memory. inline void endian_big16 (uint8_t ptr[2], uint_least16_t word) { ptr[0] = endian_16hi8 (word); ptr[1] = endian_16lo8 (word); } /////////////////////////////////////////////////////////////////// // INT32 FUNCTIONS /////////////////////////////////////////////////////////////////// /// Set the lo word (16bit) in a dword (32 bit) inline void endian_32lo16 (uint_least32_t &dword, uint_least16_t word) { dword &= (uint_least32_t) 0xffff0000; dword |= word; } /// Get the lo word (16bit) in a dword (32 bit) inline uint_least16_t endian_32lo16 (uint_least32_t dword) { return (uint_least16_t) dword & 0xffff; } /// Set the hi word (16bit) in a dword (32 bit) inline void endian_32hi16 (uint_least32_t &dword, uint_least16_t word) { dword &= (uint_least32_t) 0x0000ffff; dword |= (uint_least32_t) word << 16; } /// Get the hi word (16bit) in a dword (32 bit) inline uint_least16_t endian_32hi16 (uint_least32_t dword) { return (uint_least16_t) (dword >> 16); } /// Set the lo byte (8 bit) in a dword (32 bit) inline void endian_32lo8 (uint_least32_t &dword, uint8_t byte) { dword &= (uint_least32_t) 0xffffff00; dword |= (uint_least32_t) byte; } /// Get the lo byte (8 bit) in a dword (32 bit) inline uint8_t endian_32lo8 (uint_least32_t dword) { return (uint8_t) dword; } /// Set the hi byte (8 bit) in a dword (32 bit) inline void endian_32hi8 (uint_least32_t &dword, uint8_t byte) { dword &= (uint_least32_t) 0xffff00ff; dword |= (uint_least32_t) byte << 8; } /// Get the hi byte (8 bit) in a dword (32 bit) inline uint8_t endian_32hi8 (uint_least32_t dword) { return (uint8_t) (dword >> 8); } /// Swap hi and lo words endian in 32 bit dword. inline void endian_32swap16 (uint_least32_t &dword) { uint_least16_t lo = endian_32lo16 (dword); uint_least16_t hi = endian_32hi16 (dword); endian_32lo16 (dword, hi); endian_32hi16 (dword, lo); } /// Swap word endian. inline void endian_32swap8 (uint_least32_t &dword) { uint_least16_t lo = 0, hi = 0; lo = endian_32lo16 (dword); hi = endian_32hi16 (dword); endian_16swap8 (lo); endian_16swap8 (hi); endian_32lo16 (dword, hi); endian_32hi16 (dword, lo); } /// Convert high-byte and low-byte to 32-bit word. inline uint_least32_t endian_32 (uint8_t hihi, uint8_t hilo, uint8_t hi, uint8_t lo) { uint_least32_t dword = 0; uint_least16_t word = 0; endian_32lo8 (dword, lo); endian_32hi8 (dword, hi); endian_16lo8 (word, hilo); endian_16hi8 (word, hihi); endian_32hi16 (dword, word); return dword; } /// Convert high-byte and low-byte to 32-bit little endian word. inline uint_least32_t endian_little32 (const uint8_t ptr[4]) { return endian_32 (ptr[3], ptr[2], ptr[1], ptr[0]); } /// Write a little-endian 32-bit word to four bytes in memory. inline void endian_little32 (uint8_t ptr[4], uint_least32_t dword) { uint_least16_t word = 0; ptr[0] = endian_32lo8 (dword); ptr[1] = endian_32hi8 (dword); word = endian_32hi16 (dword); ptr[2] = endian_16lo8 (word); ptr[3] = endian_16hi8 (word); } /// Convert high-byte and low-byte to 32-bit big endian word. inline uint_least32_t endian_big32 (const uint8_t ptr[4]) { return endian_32 (ptr[0], ptr[1], ptr[2], ptr[3]); } /// Write a big-endian 32-bit word to four bytes in memory. inline void endian_big32 (uint8_t ptr[4], uint_least32_t dword) { uint_least16_t word = 0; word = endian_32hi16 (dword); ptr[1] = endian_16lo8 (word); ptr[0] = endian_16hi8 (word); ptr[2] = endian_32hi8 (dword); ptr[3] = endian_32lo8 (dword); } #endif // SIDENDIAN_H libsidplayfp-2.6.0/src/mixer.h0000644000175100001770000001545414544470307013232 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright (C) 2000 Simon White * * 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 */ #ifndef MIXER_H #define MIXER_H #include "sidcxx11.h" #include #include namespace libsidplayfp { class sidemu; /** * This class implements the mixer. */ class Mixer { private: // random number generator for dithering template class randomLCG { #ifdef HAVE_CXX11 static_assert((MAX_VAL != 0) && ((MAX_VAL & (MAX_VAL - 1)) == 0), "MAX_VAL must be a power of two"); #endif private: uint32_t rand_seed; public: randomLCG(uint32_t seed) : rand_seed(seed) {} int get() { rand_seed = (214013 * rand_seed + 2531011); return static_cast((rand_seed >> 16) & (MAX_VAL-1)); } }; public: class badBufferSize {}; public: /// Maximum number of supported SIDs static const unsigned int MAX_SIDS = 3; static const int_least32_t SCALE_FACTOR = 1 << 16; #ifdef HAVE_CXX11 static constexpr double SQRT_0_5 = 0.70710678118654746; #else # define SQRT_0_5 0.70710678118654746 #endif static const int_least32_t C1 = static_cast(1.0 / (1.0 + SQRT_0_5) * SCALE_FACTOR); static const int_least32_t C2 = static_cast(SQRT_0_5 / (1.0 + SQRT_0_5) * SCALE_FACTOR); private: typedef int_least32_t (Mixer::*mixer_func_t)() const; typedef int (Mixer::*scale_func_t)(unsigned int); public: /// Maximum allowed volume, must be a power of 2. static const int_least32_t VOLUME_MAX = 1024; private: std::vector m_chips; std::vector m_buffers; std::vector m_iSamples; std::vector m_volume; std::vector m_mix; std::vector m_scale; int m_oldRandomValue; int m_fastForwardFactor; // Mixer settings short *m_sampleBuffer; uint_least32_t m_sampleCount; uint_least32_t m_sampleIndex; uint_least32_t m_sampleRate; bool m_stereo; randomLCG m_rand; private: void updateParams(); int triangularDithering() { const int prevValue = m_oldRandomValue; m_oldRandomValue = m_rand.get(); return m_oldRandomValue - prevValue; } int scale(unsigned int ch) { const int_least32_t sample = (this->*(m_mix[ch]))(); return (sample * m_volume[ch] + triangularDithering()) / VOLUME_MAX; } int noScale(unsigned int ch) { return (this->*(m_mix[ch]))(); } /* * Channel matrix * * C1 * L 1.0 * R 1.0 * * C1 C2 * L 1.0 0.0 * R 0.0 1.0 * * C1 C2 C3 * L 1/1.707 0.707/1.707 0.0 * R 0.0 0.707/1.707 1/1.707 * * FIXME * it seems that scaling down the summed signals is not the correct way of mixing, see: * http://dsp.stackexchange.com/questions/3581/algorithms-to-mix-audio-signals-without-clipping * maybe we should consider some form of soft/hard clipping instead to avoid possible overflows */ // Mono mixing template int_least32_t mono() const { int_least32_t res = 0; for (int i = 0; i < Chips; i++) res += m_iSamples[i]; return res / Chips; } // Stereo mixing int_least32_t stereo_OneChip() const { return m_iSamples[0]; } int_least32_t stereo_ch1_TwoChips() const { return m_iSamples[0]; } int_least32_t stereo_ch2_TwoChips() const { return m_iSamples[1]; } int_least32_t stereo_ch1_ThreeChips() const { return (C1*m_iSamples[0] + C2*m_iSamples[1]) / SCALE_FACTOR; } int_least32_t stereo_ch2_ThreeChips() const { return (C2*m_iSamples[1] + C1*m_iSamples[2]) / SCALE_FACTOR; } public: /** * Create a new mixer. */ Mixer() : m_oldRandomValue(0), m_fastForwardFactor(1), m_sampleCount(0), m_sampleRate(0), m_stereo(false), m_rand(257254) { m_mix.push_back(&Mixer::mono<1>); } /** * Do the mixing. */ void doMix(); /** * This clocks the SID chips to the present moment, if they aren't already. */ void clockChips(); /** * Reset sidemu buffer position discarding produced samples. */ void resetBufs(); /** * Prepare for mixing cycle. * * @param buffer output buffer * @param count size of the buffer in samples * * @throws badBufferSize */ void begin(short *buffer, uint_least32_t count); /** * Remove all SIDs from the mixer. */ void clearSids(); /** * Add a SID to the mixer. * * @param chip the sid emu to add */ void addSid(sidemu *chip); /** * Get a SID from the mixer. * * @param i the number of the SID to get * @return a pointer to the requested sid emu or 0 if not found */ sidemu* getSid(unsigned int i) const { return (i < m_chips.size()) ? m_chips[i] : nullptr; } /** * Set the fast forward ratio. * * @param ff the fast forward ratio, from 1 to 32 * @return true if parameter is valid, false otherwise */ bool setFastForward(int ff); /** * Set mixing volumes, from 0 to #VOLUME_MAX. * * @param left volume for left or mono channel * @param right volume for right channel in stereo mode */ void setVolume(int_least32_t left, int_least32_t right); /** * Set mixing mode. * * @param stereo true for stereo mode, false for mono */ void setStereo(bool stereo); /** * Set sample rate. * * @param rate sample rate in Hertz */ void setSamplerate(uint_least32_t rate); /** * Check if the buffer have been filled. */ bool notFinished() const { return m_sampleIndex != m_sampleCount; } /** * Get the number of samples generated up to now. */ uint_least32_t samplesGenerated() const { return m_sampleIndex; } }; } #endif // MIXER_H libsidplayfp-2.6.0/src/c64/0000755000175100001770000000000014544470322012375 500000000000000libsidplayfp-2.6.0/src/c64/c64cia.h0000644000175100001770000000572214544470307013550 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef C64CIA_H #define C64CIA_H // The CIA emulations are very generic and here we need to effectively // wire them into the computer (like adding a chip to a PCB). #include "Banks/Bank.h" #include "c64/c64env.h" #include "sidendian.h" #include "CIA/mos652x.h" #include "sidcxx11.h" namespace libsidplayfp { /** * CIA 1 * * Generates IRQs * * Located at $DC00-$DCFF */ class c64cia1 final : public MOS652X, public Bank { private: c64env &m_env; uint_least16_t last_ta; protected: void interrupt(bool state) override { m_env.interruptIRQ(state); } void portB() override { const uint8_t pb = prb | ~ddrb; // We should call adjustDataPort here // but we're only interested in bit 4 m_env.lightpen(pb & 0x10); } public: c64cia1(c64env &env) : MOS652X(env.scheduler()), m_env(env) {} void poke(uint_least16_t address, uint8_t value) override { const uint8_t addr = endian_16lo8(address); write(addr, value); // Save the value written to Timer A if ((addr == 0x04) || (addr == 0x05)) { if (timerA.getTimer() != 0) last_ta = timerA.getTimer(); } } uint8_t peek(uint_least16_t address) override { return read(endian_16lo8(address)); } void reset() override { last_ta = 0; MOS652X::reset(); } uint_least16_t getTimerA() const { return last_ta; } }; /** * CIA 2 * * Generates NMIs * * Located at $DD00-$DDFF */ class c64cia2 : public MOS652X, public Bank { private: c64env &m_env; protected: void interrupt(bool state) override { if (state) m_env.interruptNMI(); } public: c64cia2(c64env &env) : MOS652X(env.scheduler()), m_env(env) {} void poke(uint_least16_t address, uint8_t value) override { write(endian_16lo8(address), value); } uint8_t peek(uint_least16_t address) override { return read(endian_16lo8(address)); } }; } #endif // C64CIA_H libsidplayfp-2.6.0/src/c64/c64vic.h0000644000175100001770000000354114544470307013572 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef C64VIC_H #define C64VIC_H // The VIC emulation is very generic and here we need to effectively // wire it into the computer (like adding a chip to a PCB). #include "Banks/Bank.h" #include "c64/c64env.h" #include "sidendian.h" #include "VIC_II/mos656x.h" #include "sidcxx11.h" namespace libsidplayfp { /** * VIC-II * * Located at $D000-$D3FF */ class c64vic final : public MOS656X, public Bank { private: c64env &m_env; protected: void interrupt(bool state) override { m_env.interruptIRQ(state); } void setBA(bool state) override { m_env.setBA(state); } public: c64vic(c64env &env) : MOS656X(env.scheduler()), m_env(env) {} void poke(uint_least16_t address, uint8_t value) override { write(endian_16lo8(address), value); } uint8_t peek(uint_least16_t address) override { return read(endian_16lo8(address)); } }; } #endif // C64VIC_H libsidplayfp-2.6.0/src/c64/c64env.h0000644000175100001770000000351114544470307013576 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef C64ENV_H #define C64ENV_H #include "EventScheduler.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif namespace libsidplayfp { /** * An implementation of of this class can be created to perform the C64 * specifics. A pointer to this child class can then be passed to * each of the components so they can interact with it. */ class c64env { private: EventScheduler &eventScheduler; public: c64env(EventScheduler &scheduler) : eventScheduler(scheduler) {} EventScheduler &scheduler() const { return eventScheduler; } virtual uint8_t cpuRead(uint_least16_t addr) =0; virtual void cpuWrite(uint_least16_t addr, uint8_t data) =0; virtual void interruptIRQ(bool state) = 0; virtual void interruptNMI() = 0; virtual void interruptRST() = 0; virtual void setBA(bool state) = 0; virtual void lightpen(bool state) = 0; protected: ~c64env() {} }; } #endif // C64ENV_H libsidplayfp-2.6.0/src/c64/mmu.h0000644000175100001770000000772714544470307013304 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef MMU_H #define MMU_H #include #include "sidendian.h" #include "sidmemory.h" #include "EventScheduler.h" #include "Banks/pla.h" #include "Banks/SystemRAMBank.h" #include "Banks/SystemROMBanks.h" #include "Banks/ZeroRAMBank.h" #include "sidcxx11.h" #include namespace libsidplayfp { class Bank; class IOBank; /** * The C64 MMU chip. */ class MMU final : public PLA, public sidmemory { private: EventScheduler &eventScheduler; /// CPU port signals bool loram, hiram, charen; /// CPU read memory mapping in 4k chunks Bank* cpuReadMap[16]; /// CPU write memory mapping in 4k chunks Bank* cpuWriteMap[16]; /// IO region handler IOBank* ioBank; /// Kernal ROM KernalRomBank kernalRomBank; /// BASIC ROM BasicRomBank basicRomBank; /// Character ROM CharacterRomBank characterRomBank; /// RAM SystemRAMBank ramBank; /// RAM bank 0 ZeroRAMBank zeroRAMBank; /// random seed mutable unsigned int seed; private: void setCpuPort(uint8_t state) override; uint8_t getLastReadByte() const override; event_clock_t getPhi2Time() const override { return eventScheduler.getTime(EVENT_CLOCK_PHI2); } void updateMappingPHI2(); public: MMU(EventScheduler &eventScheduler, IOBank* ioBank); void reset(); // ROM banks methods void setKernal(const uint8_t* rom) override { kernalRomBank.set(rom); } void setBasic(const uint8_t* rom) override { basicRomBank.set(rom); } void setChargen(const uint8_t* rom) override { characterRomBank.set(rom); } // RAM access methods uint8_t readMemByte(uint_least16_t addr) override { return ramBank.peek(addr); } uint_least16_t readMemWord(uint_least16_t addr) override { return endian_little16(ramBank.ram+addr); } void writeMemByte(uint_least16_t addr, uint8_t value) override { ramBank.poke(addr, value); } void writeMemWord(uint_least16_t addr, uint_least16_t value) override { endian_little16(ramBank.ram+addr, value); } void fillRam(uint_least16_t start, uint8_t value, unsigned int size) override { memset(ramBank.ram+start, value, size); } void fillRam(uint_least16_t start, const uint8_t* source, unsigned int size) override { memcpy(ramBank.ram+start, source, size); } // SID specific hacks void installResetHook(uint_least16_t addr) override { kernalRomBank.installResetHook(addr); } void installBasicTrap(uint_least16_t addr) override { basicRomBank.installTrap(addr); } void setBasicSubtune(uint8_t tune) override { basicRomBank.setSubtune(tune); } /** * Access memory as seen by CPU. * * @param addr the address where to read from * @return value at address */ uint8_t cpuRead(uint_least16_t addr) const { return cpuReadMap[addr >> 12]->peek(addr); } /** * Access memory as seen by CPU. * * @param addr the address where to write * @param data the value to write */ void cpuWrite(uint_least16_t addr, uint8_t data) { cpuWriteMap[addr >> 12]->poke(addr, data); } }; } #endif libsidplayfp-2.6.0/src/c64/CPU/0000755000175100001770000000000014544470322013024 500000000000000libsidplayfp-2.6.0/src/c64/CPU/opcodes.h0000644000175100001770000001462214544470307014561 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef OPCODES_H #define OPCODES_H #define OPCODE_MAX 0x100 /* HLT case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52: case 0x62: case 0x72: case 0x92: case 0xb2: case 0xd2: case 0xf2: */ #define BRKn 0x00 #define JSRw 0x20 #define RTIn 0x40 #define RTSn 0x60 #define NOPb 0x80 #define NOPb_ NOPb: case 0x82: case 0xC2: case 0xE2: case 0x89 #define LDYb 0xA0 #define CPYb 0xC0 #define CPXb 0xE0 #define ORAix 0x01 #define ANDix 0x21 #define EORix 0x41 #define ADCix 0x61 #define STAix 0x81 #define LDAix 0xA1 #define CMPix 0xC1 #define SBCix 0xE1 #define LDXb 0xA2 #define SLOix 0x03 #define RLAix 0x23 #define SREix 0x43 #define RRAix 0x63 #define SAXix 0x83 #define LAXix 0xA3 #define DCPix 0xC3 #define ISBix 0xE3 #define NOPz 0x04 #define NOPz_ NOPz: case 0x44: case 0x64 #define BITz 0x24 #define STYz 0x84 #define LDYz 0xA4 #define CPYz 0xC4 #define CPXz 0xE4 #define ORAz 0x05 #define ANDz 0x25 #define EORz 0x45 #define ADCz 0x65 #define STAz 0x85 #define LDAz 0xA5 #define CMPz 0xC5 #define SBCz 0xE5 #define ASLz 0x06 #define ROLz 0x26 #define LSRz 0x46 #define RORz 0x66 #define STXz 0x86 #define LDXz 0xA6 #define DECz 0xC6 #define INCz 0xE6 #define SLOz 0x07 #define RLAz 0x27 #define SREz 0x47 #define RRAz 0x67 #define SAXz 0x87 #define LAXz 0xA7 #define DCPz 0xC7 #define ISBz 0xE7 #define PHPn 0x08 #define PLPn 0x28 #define PHAn 0x48 #define PLAn 0x68 #define DEYn 0x88 #define TAYn 0xA8 #define INYn 0xC8 #define INXn 0xE8 #define ORAb 0x09 #define ANDb 0x29 #define EORb 0x49 #define ADCb 0x69 #define LDAb 0xA9 #define CMPb 0xC9 #define SBCb 0xE9 #define SBCb_ SBCb: case 0xEB #define ASLn 0x0A #define ROLn 0x2A #define LSRn 0x4A #define RORn 0x6A #define TXAn 0x8A #define TAXn 0xAA #define DEXn 0xCA #define NOPn 0xEA #define NOPn_ NOPn: case 0x1A: case 0x3A: case 0x5A: case 0x7A: case 0xDA: case 0xFA #define ANCb 0x0B #define ANCb_ ANCb: case 0x2B #define ASRb 0x4B #define ARRb 0x6B #define ANEb 0x8B #define XAAb 0x8B #define LXAb 0xAB #define SBXb 0xCB #define NOPa 0x0C #define BITa 0x2C #define JMPw 0x4C #define JMPi 0x6C #define STYa 0x8C #define LDYa 0xAC #define CPYa 0xCC #define CPXa 0xEC #define ORAa 0x0D #define ANDa 0x2D #define EORa 0x4D #define ADCa 0x6D #define STAa 0x8D #define LDAa 0xAD #define CMPa 0xCD #define SBCa 0xED #define ASLa 0x0E #define ROLa 0x2E #define LSRa 0x4E #define RORa 0x6E #define STXa 0x8E #define LDXa 0xAE #define DECa 0xCE #define INCa 0xEE #define SLOa 0x0F #define RLAa 0x2F #define SREa 0x4F #define RRAa 0x6F #define SAXa 0x8F #define LAXa 0xAF #define DCPa 0xCF #define ISBa 0xEF #define BPLr 0x10 #define BMIr 0x30 #define BVCr 0x50 #define BVSr 0x70 #define BCCr 0x90 #define BCSr 0xB0 #define BNEr 0xD0 #define BEQr 0xF0 #define ORAiy 0x11 #define ANDiy 0x31 #define EORiy 0x51 #define ADCiy 0x71 #define STAiy 0x91 #define LDAiy 0xB1 #define CMPiy 0xD1 #define SBCiy 0xF1 #define SLOiy 0x13 #define RLAiy 0x33 #define SREiy 0x53 #define RRAiy 0x73 #define SHAiy 0x93 #define LAXiy 0xB3 #define DCPiy 0xD3 #define ISBiy 0xF3 #define NOPzx 0x14 #define NOPzx_ NOPzx: case 0x34: case 0x54: case 0x74: case 0xD4: case 0xF4 #define STYzx 0x94 #define LDYzx 0xB4 #define ORAzx 0x15 #define ANDzx 0x35 #define EORzx 0x55 #define ADCzx 0x75 #define STAzx 0x95 #define LDAzx 0xB5 #define CMPzx 0xD5 #define SBCzx 0xF5 #define ASLzx 0x16 #define ROLzx 0x36 #define LSRzx 0x56 #define RORzx 0x76 #define STXzy 0x96 #define LDXzy 0xB6 #define DECzx 0xD6 #define INCzx 0xF6 #define SLOzx 0x17 #define RLAzx 0x37 #define SREzx 0x57 #define RRAzx 0x77 #define SAXzy 0x97 #define LAXzy 0xB7 #define DCPzx 0xD7 #define ISBzx 0xF7 #define CLCn 0x18 #define SECn 0x38 #define CLIn 0x58 #define SEIn 0x78 #define TYAn 0x98 #define CLVn 0xB8 #define CLDn 0xD8 #define SEDn 0xF8 #define ORAay 0x19 #define ANDay 0x39 #define EORay 0x59 #define ADCay 0x79 #define STAay 0x99 #define LDAay 0xB9 #define CMPay 0xD9 #define SBCay 0xF9 #define TXSn 0x9A #define TSXn 0xBA #define SLOay 0x1B #define RLAay 0x3B #define SREay 0x5B #define RRAay 0x7B #define SHSay 0x9B #define TASay 0x9B #define LASay 0xBB #define DCPay 0xDB #define ISBay 0xFB #define NOPax 0x1C #define NOPax_ NOPax: case 0x3C: case 0x5C: case 0x7C: case 0xDC: case 0xFC #define SHYax 0x9C #define LDYax 0xBC #define ORAax 0x1D #define ANDax 0x3D #define EORax 0x5D #define ADCax 0x7D #define STAax 0x9D #define LDAax 0xBD #define CMPax 0xDD #define SBCax 0xFD #define ASLax 0x1E #define ROLax 0x3E #define LSRax 0x5E #define RORax 0x7E #define SHXay 0x9E #define LDXay 0xBE #define DECax 0xDE #define INCax 0xFE #define SLOax 0x1F #define RLAax 0x3F #define SREax 0x5F #define RRAax 0x7F #define SHAay 0x9F #define LAXay 0xBF #define DCPax 0xDF #define ISBax 0xFF // Instruction Aliases #define ASOix SLOix #define LSEix SREix #define AXSix SAXix #define DCMix DCPix #define INSix ISBix #define ASOz SLOz #define LSEz SREz #define AXSz SAXz #define DCMz DCPz #define INSz ISBz #define ALRb ASRb #define OALb LXAb #define ASOa SLOa #define LSEa SREa #define AXSa SAXa #define DCMa DCPa #define INSa ISBa #define ASOiy SLOiy #define LSEiy SREiy #define AXAiy SHAiy #define DCMiy DCPiy #define INSiy ISBiy #define ASOzx SLOzx #define LSEzx SREzx #define AXSzy SAXzy #define DCMzx DCPzx #define INSzx ISBzx #define ASOay SLOay #define LSEay SREay #define DCMay DCPay #define INSay ISBay #define SAYax SHYax #define XASay SHXay #define ASOax SLOax #define LSEax SREax #define AXAay SHAay #define DCMax DCPax #define INSax ISBax #define SKBn NOPb #define SKWn NOPa #endif // OPCODES_H libsidplayfp-2.6.0/src/c64/CPU/mos6510debug.cpp0000644000175100001770000004763414544470307015612 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "mos6510debug.h" #ifdef DEBUG #include #include #include "mos6510.h" #include "sidendian.h" #include "opcodes.h" namespace libsidplayfp { void MOS6510Debug::DumpState (event_clock_t time, MOS6510 &cpu) { fprintf(cpu.m_fdbg, " PC I A X Y SP DR PR NV-BDIZC Instruction (%d)\n", static_cast(time)); fprintf(cpu.m_fdbg, "%04x ", cpu.instrStartPC < 0 ? 0 : cpu.instrStartPC); fprintf(cpu.m_fdbg, cpu.irqAssertedOnPin ? "t " : "f "); fprintf(cpu.m_fdbg, "%02x ", cpu.Register_Accumulator); fprintf(cpu.m_fdbg, "%02x ", cpu.Register_X); fprintf(cpu.m_fdbg, "%02x ", cpu.Register_Y); fprintf(cpu.m_fdbg, "01%02x ", endian_16lo8(cpu.Register_StackPointer)); fprintf(cpu.m_fdbg, "%02x ", cpu.cpuRead (0)); fprintf(cpu.m_fdbg, "%02x ", cpu.cpuRead (1)); fprintf(cpu.m_fdbg, cpu.flags.getN() ? "1" : "0"); fprintf(cpu.m_fdbg, cpu.flags.getV() ? "1" : "0"); fprintf(cpu.m_fdbg, "1"); fprintf(cpu.m_fdbg, cpu.d1x1 ? "0" : "1"); fprintf(cpu.m_fdbg, cpu.flags.getD() ? "1" : "0"); fprintf(cpu.m_fdbg, cpu.flags.getI() ? "1" : "0"); fprintf(cpu.m_fdbg, cpu.flags.getZ() ? "1" : "0"); fprintf(cpu.m_fdbg, cpu.flags.getC() ? "1" : "0"); const int opcode = cpu.instrStartPC < 0 ? BRKn : cpu.cpuRead(cpu.instrStartPC); fprintf(cpu.m_fdbg, " %02x ", opcode); switch(opcode) { // Accumulator or Implied cpu.Cycle_EffectiveAddressing case ASLn: case LSRn: case ROLn: case RORn: fprintf(cpu.m_fdbg, " "); break; // Zero Page Addressing Mode Handler case ADCz: case ANDz: case ASLz: case BITz: case CMPz: case CPXz: case CPYz: case DCPz: case DECz: case EORz: case INCz: case ISBz: case LAXz: case LDAz: case LDXz: case LDYz: case LSRz: case NOPz_: case ORAz: case ROLz: case RORz: case SAXz: case SBCz: case SREz: case STAz: case STXz: case STYz: case SLOz: case RLAz: case RRAz: // ASOz AXSz DCMz INSz LSEz - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x ", endian_16lo8(cpu.instrOperand)); break; // Zero Page with X Offset Addressing Mode Handler case ADCzx: case ANDzx: case ASLzx: case CMPzx: case DCPzx: case DECzx: case EORzx: case INCzx: case ISBzx: case LDAzx: case LDYzx: case LSRzx: case NOPzx_: case ORAzx: case RLAzx: case ROLzx: case RORzx: case RRAzx: case SBCzx: case SLOzx: case SREzx: case STAzx: case STYzx: // ASOzx DCMzx INSzx LSEzx - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x ", endian_16lo8(cpu.instrOperand)); break; // Zero Page with Y Offset Addressing Mode Handler case LDXzy: case STXzy: case SAXzy: case LAXzy: // AXSzx - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x ", endian_16lo8(cpu.instrOperand)); break; // Absolute Addressing Mode Handler case ADCa: case ANDa: case ASLa: case BITa: case CMPa: case CPXa: case CPYa: case DCPa: case DECa: case EORa: case INCa: case ISBa: case JMPw: case JSRw: case LAXa: case LDAa: case LDXa: case LDYa: case LSRa: case NOPa: case ORAa: case ROLa: case RORa: case SAXa: case SBCa: case SLOa: case SREa: case STAa: case STXa: case STYa: case RLAa: case RRAa: // ASOa AXSa DCMa INSa LSEa - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x %02x ", endian_16lo8(cpu.instrOperand), endian_16hi8 (cpu.instrOperand)); break; // Absolute With X Offset Addresing Mode Handler case ADCax: case ANDax: case ASLax: case CMPax: case DCPax: case DECax: case EORax: case INCax: case ISBax: case LDAax: case LDYax: case LSRax: case NOPax_: case ORAax: case RLAax: case ROLax: case RORax: case RRAax: case SBCax: case SHYax: case SLOax: case SREax: case STAax: // ASOax DCMax INSax LSEax SAYax - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x %02x ", endian_16lo8(cpu.instrOperand), endian_16hi8 (cpu.instrOperand)); break; // Absolute With Y Offset Addresing Mode Handler case ADCay: case ANDay: case CMPay: case DCPay: case EORay: case ISBay: case LASay: case LAXay: case LDAay: case LDXay: case ORAay: case RLAay: case RRAay: case SBCay: case SHAay: case SHSay: case SHXay: case SLOay: case SREay: case STAay: // ASOay AXAay DCMay INSax LSEay TASay XASay - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x %02x ", endian_16lo8(cpu.instrOperand), endian_16hi8 (cpu.instrOperand)); break; // Immediate and Relative Addressing Mode Handler case ADCb: case ANDb: case ANCb_: case ANEb: case ASRb: case ARRb: case BCCr: case BCSr: case BEQr: case BMIr: case BNEr: case BPLr: case BVCr: case BVSr: case CMPb: case CPXb: case CPYb: case EORb: case LDAb: case LDXb: case LDYb: case LXAb: case NOPb_: case ORAb: case SBCb_: case SBXb: // OALb ALRb XAAb - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x ", endian_16lo8(cpu.Cycle_Data)); break; // Indirect Addressing Mode Handler case JMPi: fprintf(cpu.m_fdbg, "%02x %02x ", endian_16lo8(cpu.instrOperand), endian_16hi8 (cpu.instrOperand)); break; // Indexed with X Preinc Addressing Mode Handler case ADCix: case ANDix: case CMPix: case DCPix: case EORix: case ISBix: case LAXix: case LDAix: case ORAix: case SAXix: case SBCix: case SLOix: case SREix: case STAix: case RLAix: case RRAix: // ASOix AXSix DCMix INSix LSEix - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x ", endian_16lo8(cpu.instrOperand)); break; // Indexed with Y Postinc Addressing Mode Handler case ADCiy: case ANDiy: case CMPiy: case DCPiy: case EORiy: case ISBiy: case LAXiy: case LDAiy: case ORAiy: case RLAiy: case RRAiy: case SBCiy: case SHAiy: case SLOiy: case SREiy: case STAiy: // AXAiy ASOiy LSEiy DCMiy INSiy - Optional Opcode Names fprintf(cpu.m_fdbg, "%02x ", endian_16lo8(cpu.instrOperand)); break; default: fprintf(cpu.m_fdbg, " "); break; } switch(opcode) { case ADCb: case ADCz: case ADCzx: case ADCa: case ADCax: case ADCay: case ADCix: case ADCiy: fprintf(cpu.m_fdbg, " ADC"); break; case ANCb_: fprintf(cpu.m_fdbg, "*ANC"); break; case ANDb: case ANDz: case ANDzx: case ANDa: case ANDax: case ANDay: case ANDix: case ANDiy: fprintf(cpu.m_fdbg, " AND"); break; case ANEb: // Also known as XAA fprintf(cpu.m_fdbg, "*ANE"); break; case ARRb: fprintf(cpu.m_fdbg, "*ARR"); break; case ASLn: case ASLz: case ASLzx: case ASLa: case ASLax: fprintf(cpu.m_fdbg, " ASL"); break; case ASRb: // Also known as ALR fprintf(cpu.m_fdbg, "*ASR"); break; case BCCr: fprintf(cpu.m_fdbg, " BCC"); break; case BCSr: fprintf(cpu.m_fdbg, " BCS"); break; case BEQr: fprintf(cpu.m_fdbg, " BEQ"); break; case BITz: case BITa: fprintf(cpu.m_fdbg, " BIT"); break; case BMIr: fprintf(cpu.m_fdbg, " BMI"); break; case BNEr: fprintf(cpu.m_fdbg, " BNE"); break; case BPLr: fprintf(cpu.m_fdbg, " BPL"); break; case BRKn: fprintf(cpu.m_fdbg, " BRK"); break; case BVCr: fprintf(cpu.m_fdbg, " BVC"); break; case BVSr: fprintf(cpu.m_fdbg, " BVS"); break; case CLCn: fprintf(cpu.m_fdbg, " CLC"); break; case CLDn: fprintf(cpu.m_fdbg, " CLD"); break; case CLIn: fprintf(cpu.m_fdbg, " CLI"); break; case CLVn: fprintf(cpu.m_fdbg, " CLV"); break; case CMPb: case CMPz: case CMPzx: case CMPa: case CMPax: case CMPay: case CMPix: case CMPiy: fprintf(cpu.m_fdbg, " CMP"); break; case CPXb: case CPXz: case CPXa: fprintf(cpu.m_fdbg, " CPX"); break; case CPYb: case CPYz: case CPYa: fprintf(cpu.m_fdbg, " CPY"); break; case DCPz: case DCPzx: case DCPa: case DCPax: case DCPay: case DCPix: case DCPiy: // Also known as DCM fprintf(cpu.m_fdbg, "*DCP"); break; case DECz: case DECzx: case DECa: case DECax: fprintf(cpu.m_fdbg, " DEC"); break; case DEXn: fprintf(cpu.m_fdbg, " DEX"); break; case DEYn: fprintf(cpu.m_fdbg, " DEY"); break; case EORb: case EORz: case EORzx: case EORa: case EORax: case EORay: case EORix: case EORiy: fprintf(cpu.m_fdbg, " EOR"); break; case INCz: case INCzx: case INCa: case INCax: fprintf(cpu.m_fdbg, " INC"); break; case INXn: fprintf(cpu.m_fdbg, " INX"); break; case INYn: fprintf(cpu.m_fdbg, " INY"); break; case ISBz: case ISBzx: case ISBa: case ISBax: case ISBay: case ISBix: case ISBiy: // Also known as INS fprintf(cpu.m_fdbg, "*ISB"); break; case JMPw: case JMPi: fprintf(cpu.m_fdbg, " JMP"); break; case JSRw: fprintf(cpu.m_fdbg, " JSR"); break; case LASay: fprintf(cpu.m_fdbg, "*LAS"); break; case LAXz: case LAXzy: case LAXa: case LAXay: case LAXix: case LAXiy: fprintf(cpu.m_fdbg, "*LAX"); break; case LDAb: case LDAz: case LDAzx: case LDAa: case LDAax: case LDAay: case LDAix: case LDAiy: fprintf(cpu.m_fdbg, " LDA"); break; case LDXb: case LDXz: case LDXzy: case LDXa: case LDXay: fprintf(cpu.m_fdbg, " LDX"); break; case LDYb: case LDYz: case LDYzx: case LDYa: case LDYax: fprintf(cpu.m_fdbg, " LDY"); break; case LSRz: case LSRzx: case LSRa: case LSRax: case LSRn: fprintf(cpu.m_fdbg, " LSR"); break; case NOPn_: case NOPb_: case NOPz_: case NOPzx_: case NOPa: case NOPax_: if(opcode != NOPn) fprintf(cpu.m_fdbg, "*"); else fprintf(cpu.m_fdbg, " "); fprintf(cpu.m_fdbg, "NOP"); break; case LXAb: // Also known as OAL fprintf(cpu.m_fdbg, "*LXA"); break; case ORAb: case ORAz: case ORAzx: case ORAa: case ORAax: case ORAay: case ORAix: case ORAiy: fprintf(cpu.m_fdbg, " ORA"); break; case PHAn: fprintf(cpu.m_fdbg, " PHA"); break; case PHPn: fprintf(cpu.m_fdbg, " PHP"); break; case PLAn: fprintf(cpu.m_fdbg, " PLA"); break; case PLPn: fprintf(cpu.m_fdbg, " PLP"); break; case RLAz: case RLAzx: case RLAix: case RLAa: case RLAax: case RLAay: case RLAiy: fprintf(cpu.m_fdbg, "*RLA"); break; case ROLz: case ROLzx: case ROLa: case ROLax: case ROLn: fprintf(cpu.m_fdbg, " ROL"); break; case RORz: case RORzx: case RORa: case RORax: case RORn: fprintf(cpu.m_fdbg, " ROR"); break; case RRAa: case RRAax: case RRAay: case RRAz: case RRAzx: case RRAix: case RRAiy: fprintf(cpu.m_fdbg, "*RRA"); break; case RTIn: fprintf(cpu.m_fdbg, " RTI"); break; case RTSn: fprintf(cpu.m_fdbg, " RTS"); break; case SAXz: case SAXzy: case SAXa: case SAXix: // Also known as AXS fprintf(cpu.m_fdbg, "*SAX"); break; case SBCb_: if(opcode != SBCb) fprintf(cpu.m_fdbg, "*"); else fprintf(cpu.m_fdbg, " "); fprintf(cpu.m_fdbg, "SBC"); break; case SBCz: case SBCzx: case SBCa: case SBCax: case SBCay: case SBCix: case SBCiy: fprintf(cpu.m_fdbg, " SBC"); break; case SBXb: fprintf(cpu.m_fdbg, "*SBX"); break; case SECn: fprintf(cpu.m_fdbg, " SEC"); break; case SEDn: fprintf(cpu.m_fdbg, " SED"); break; case SEIn: fprintf(cpu.m_fdbg, " SEI"); break; case SHAay: case SHAiy: // Also known as AXA fprintf(cpu.m_fdbg, "*SHA"); break; case SHSay: // Also known as TAS fprintf(cpu.m_fdbg, "*SHS"); break; case SHXay: // Also known as XAS fprintf(cpu.m_fdbg, "*SHX"); break; case SHYax: // Also known as SAY fprintf(cpu.m_fdbg, "*SHY"); break; case SLOz: case SLOzx: case SLOa: case SLOax: case SLOay: case SLOix: case SLOiy: // Also known as ASO fprintf(cpu.m_fdbg, "*SLO"); break; case SREz: case SREzx: case SREa: case SREax: case SREay: case SREix: case SREiy: // Also known as LSE fprintf(cpu.m_fdbg, "*SRE"); break; case STAz: case STAzx: case STAa: case STAax: case STAay: case STAix: case STAiy: fprintf(cpu.m_fdbg, " STA"); break; case STXz: case STXzy: case STXa: fprintf(cpu.m_fdbg, " STX"); break; case STYz: case STYzx: case STYa: fprintf(cpu.m_fdbg, " STY"); break; case TAXn: fprintf(cpu.m_fdbg, " TAX"); break; case TAYn: fprintf(cpu.m_fdbg, " TAY"); break; case TSXn: fprintf(cpu.m_fdbg, " TSX"); break; case TXAn: fprintf(cpu.m_fdbg, " TXA"); break; case TXSn: fprintf(cpu.m_fdbg, " TXS"); break; case TYAn: fprintf(cpu.m_fdbg, " TYA"); break; default: fprintf(cpu.m_fdbg, "*HLT"); break; } switch(opcode) { // Accumulator or Implied cpu.Cycle_EffectiveAddressing case ASLn: case LSRn: case ROLn: case RORn: fprintf(cpu.m_fdbg, "n A"); break; // Zero Page Addressing Mode Handler case ADCz: case ANDz: case ASLz: case BITz: case CMPz: case CPXz: case CPYz: case DCPz: case DECz: case EORz: case INCz: case ISBz: case LAXz: case LDAz: case LDXz: case LDYz: case LSRz: case ORAz: case ROLz: case RORz: case SBCz: case SREz: case SLOz: case RLAz: case RRAz: // ASOz AXSz DCMz INSz LSEz - Optional Opcode Names fprintf(cpu.m_fdbg, "z %02x {%02x}", endian_16lo8(cpu.instrOperand), cpu.Cycle_Data); break; case SAXz: case STAz: case STXz: case STYz: #ifdef DEBUG case NOPz_: #endif fprintf(cpu.m_fdbg, "z %02x", endian_16lo8(cpu.instrOperand)); break; // Zero Page with X Offset Addressing Mode Handler case ADCzx: case ANDzx: case ASLzx: case CMPzx: case DCPzx: case DECzx: case EORzx: case INCzx: case ISBzx: case LDAzx: case LDYzx: case LSRzx: case ORAzx: case RLAzx: case ROLzx: case RORzx: case RRAzx: case SBCzx: case SLOzx: case SREzx: // ASOzx DCMzx INSzx LSEzx - Optional Opcode Names fprintf(cpu.m_fdbg, "zx %02x,X", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]{%02x}", cpu.Cycle_EffectiveAddress, cpu.Cycle_Data); break; case STAzx: case STYzx: #ifdef DEBUG case NOPzx_: #endif fprintf(cpu.m_fdbg, "zx %02x,X", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; // Zero Page with Y Offset Addressing Mode Handler case LAXzy: case LDXzy: // AXSzx - Optional Opcode Names fprintf(cpu.m_fdbg, "zy %02x,Y", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]{%02x}", cpu.Cycle_EffectiveAddress, cpu.Cycle_Data); break; case STXzy: case SAXzy: fprintf(cpu.m_fdbg, "zy %02x,Y", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; // Absolute Addressing Mode Handler case ADCa: case ANDa: case ASLa: case BITa: case CMPa: case CPXa: case CPYa: case DCPa: case DECa: case EORa: case INCa: case ISBa: case LAXa: case LDAa: case LDXa: case LDYa: case LSRa: case ORAa: case ROLa: case RORa: case SBCa: case SLOa: case SREa: case RLAa: case RRAa: // ASOa AXSa DCMa INSa LSEa - Optional Opcode Names fprintf(cpu.m_fdbg, "a %04x {%02x}", cpu.instrOperand, cpu.Cycle_Data); break; case SAXa: case STAa: case STXa: case STYa: #ifdef DEBUG case NOPa: #endif fprintf(cpu.m_fdbg, "a %04x", cpu.instrOperand); break; case JMPw: case JSRw: fprintf(cpu.m_fdbg, "w %04x", cpu.instrOperand); break; // Absolute With X Offset Addresing Mode Handler case ADCax: case ANDax: case ASLax: case CMPax: case DCPax: case DECax: case EORax: case INCax: case ISBax: case LDAax: case LDYax: case LSRax: case ORAax: case RLAax: case ROLax: case RORax: case RRAax: case SBCax: case SLOax: case SREax: // ASOax DCMax INSax LSEax SAYax - Optional Opcode Names fprintf(cpu.m_fdbg, "ax %04x,X", cpu.instrOperand); fprintf(cpu.m_fdbg, " [%04x]{%02x}", cpu.Cycle_EffectiveAddress, cpu.Cycle_Data); break; case SHYax: case STAax: #ifdef DEBUG case NOPax_: #endif fprintf(cpu.m_fdbg, "ax %04x,X", cpu.instrOperand); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; // Absolute With Y Offset Addresing Mode Handler case ADCay: case ANDay: case CMPay: case DCPay: case EORay: case ISBay: case LASay: case LAXay: case LDAay: case LDXay: case ORAay: case RLAay: case RRAay: case SBCay: case SHSay: case SLOay: case SREay: // ASOay AXAay DCMay INSax LSEay TASay XASay - Optional Opcode Names fprintf(cpu.m_fdbg, "ay %04x,Y", cpu.instrOperand); fprintf(cpu.m_fdbg, " [%04x]{%02x}", cpu.Cycle_EffectiveAddress, cpu.Cycle_Data); break; case SHAay: case SHXay: case STAay: fprintf(cpu.m_fdbg, "ay %04x,Y", cpu.instrOperand); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; // Immediate Addressing Mode Handler case ADCb: case ANDb: case ANCb_: case ANEb: case ASRb: case ARRb: case CMPb: case CPXb: case CPYb: case EORb: case LDAb: case LDXb: case LDYb: case LXAb: case ORAb: case SBCb_: case SBXb: // OALb ALRb XAAb - Optional Opcode Names #ifdef DEBUG case NOPb_: #endif fprintf(cpu.m_fdbg, "b #%02x", endian_16lo8(cpu.instrOperand)); break; // Relative Addressing Mode Handler case BCCr: case BCSr: case BEQr: case BMIr: case BNEr: case BPLr: case BVCr: case BVSr: fprintf(cpu.m_fdbg, "r #%02x", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; // Indirect Addressing Mode Handler case JMPi: fprintf(cpu.m_fdbg, "i (%04x)", cpu.instrOperand); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; // Indexed with X Preinc Addressing Mode Handler case ADCix: case ANDix: case CMPix: case DCPix: case EORix: case ISBix: case LAXix: case LDAix: case ORAix: case SBCix: case SLOix: case SREix: case RLAix: case RRAix: // ASOix AXSix DCMix INSix LSEix - Optional Opcode Names fprintf(cpu.m_fdbg, "ix (%02x,X)", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]{%02x}", cpu.Cycle_EffectiveAddress, cpu.Cycle_Data); break; case SAXix: case STAix: fprintf(cpu.m_fdbg, "ix (%02x,X)", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; // Indexed with Y Postinc Addressing Mode Handler case ADCiy: case ANDiy: case CMPiy: case DCPiy: case EORiy: case ISBiy: case LAXiy: case LDAiy: case ORAiy: case RLAiy: case RRAiy: case SBCiy: case SLOiy: case SREiy: // AXAiy ASOiy LSEiy DCMiy INSiy - Optional Opcode Names fprintf(cpu.m_fdbg, "iy (%02x),Y", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]{%02x}", cpu.Cycle_EffectiveAddress, cpu.Cycle_Data); break; case SHAiy: case STAiy: fprintf(cpu.m_fdbg, "iy (%02x),Y", endian_16lo8(cpu.instrOperand)); fprintf(cpu.m_fdbg, " [%04x]", cpu.Cycle_EffectiveAddress); break; default: break; } fprintf(cpu.m_fdbg, "\n\n"); fflush(cpu.m_fdbg); } } #endif libsidplayfp-2.6.0/src/c64/CPU/mos6510.cpp0000644000175100001770000017127314544470307014600 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "mos6510.h" #include "Event.h" #include "sidendian.h" #include "opcodes.h" #ifdef DEBUG # include # include "mos6510debug.h" #endif #include "sidcxx11.h" namespace libsidplayfp { /** * Magic values for lxa and ane undocumented instructions. * Magic may be EE, EF, FE or FF, but most emulators seem to use EE. * The constants here defined are based on VICE testsuite which * refers to some real case usage of the opcodes. */ const uint8_t lxa_magic = 0xee; const uint8_t ane_magic = 0xef; const int interruptDelay = 2; //-------------------------------------------------------------------------// /** * When AEC signal is high, no stealing is possible. */ void MOS6510::eventWithoutSteals() { const ProcessorCycle &instr = instrTable[cycleCount++]; (this->*(instr.func)) (); eventScheduler.schedule(m_nosteal, 1); } /** * When AEC signal is low, steals permitted. */ void MOS6510::eventWithSteals() { if (instrTable[cycleCount].nosteal) { const ProcessorCycle &instr = instrTable[cycleCount++]; (this->*(instr.func)) (); eventScheduler.schedule(m_steal, 1); } else { switch (cycleCount) { case (CLIn << 3): flags.setI(false); if (irqAssertedOnPin && (interruptCycle == MAX)) interruptCycle = -MAX; break; case (SEIn << 3): flags.setI(true); if (!rstFlag && !nmiFlag && (cycleCount <= interruptCycle + interruptDelay)) interruptCycle = MAX; break; case (SHAiy << 3) + 3: case (SHSay << 3) + 2: case (SHYax << 3) + 2: case (SHXay << 3) + 2: case (SHAay << 3) + 2: // Save rdy state for SH* instructions rdyOnThrowAwayRead = true; break; default: break; } // Even while stalled, the CPU can still process first clock of // interrupt delay, but only the first one. if (interruptCycle == cycleCount) { interruptCycle--; } } } void MOS6510::removeIRQ() { if (!rstFlag && !nmiFlag && (interruptCycle != MAX)) interruptCycle = MAX; } /** * Handle bus access signals. When RDY line is asserted, the CPU * will pause when executing the next read operation. * * @param newRDY new state for RDY signal */ void MOS6510::setRDY(bool newRDY) { rdy = newRDY; if (rdy) { eventScheduler.cancel(m_steal); eventScheduler.schedule(m_nosteal, 0, EVENT_CLOCK_PHI2); } else { eventScheduler.cancel(m_nosteal); eventScheduler.schedule(m_steal, 0, EVENT_CLOCK_PHI2); } } /** * Push P on stack, decrement S. */ void MOS6510::PushSR() { // Set the B flag, 0 for hardware interrupts // and 1 for BRK and PHP. Bit 5 is always 1 // https://wiki.nesdev.org/w/index.php?title=Status_flags#The_B_flag Push(flags.get() | (d1x1 ? 0x20 : 0x30)); } /** * increment S, Pop P off stack. */ void MOS6510::PopSR() { flags.set(Pop()); calculateInterruptTriggerCycle(); } //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// // Interrupt Routines // //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// /** * This forces the CPU to abort whatever it is doing and immediately * enter the RST interrupt handling sequence. The implementation is * not compatible: instructions actually get aborted mid-execution. * However, there is no possible way to trigger this signal from * programs, so it's OK. */ void MOS6510::triggerRST() { Initialise(); cycleCount = BRKn << 3; rstFlag = true; calculateInterruptTriggerCycle(); } /** * Trigger NMI interrupt on the CPU. Calling this method * flags that CPU must enter the NMI routine at earliest * opportunity. There is no way to cancel NMI request once * given. */ void MOS6510::triggerNMI() { nmiFlag = true; calculateInterruptTriggerCycle(); /* maybe process 1 clock of interrupt delay. */ if (!rdy) { eventScheduler.cancel(m_steal); eventScheduler.schedule(m_steal, 0, EVENT_CLOCK_PHI2); } } /** * Pull IRQ line low on CPU. */ void MOS6510::triggerIRQ() { irqAssertedOnPin = true; calculateInterruptTriggerCycle(); /* maybe process 1 clock of interrupt delay. */ if (!rdy && interruptCycle == cycleCount) { eventScheduler.cancel(m_steal); eventScheduler.schedule(m_steal, 0, EVENT_CLOCK_PHI2); } } /** * Inform CPU that IRQ is no longer pulled low. */ void MOS6510::clearIRQ() { irqAssertedOnPin = false; eventScheduler.schedule(clearInt, interruptDelay, EVENT_CLOCK_PHI1); } void MOS6510::interruptsAndNextOpcode() { if (cycleCount > interruptCycle + interruptDelay) { #ifdef DEBUG if (dodump) { const event_clock_t cycles = eventScheduler.getTime(EVENT_CLOCK_PHI2); MOS6510Debug::DumpState(cycles, *this); fprintf(m_fdbg, "****************************************************\n"); fprintf(m_fdbg, " interrupt (%d)\n", static_cast(cycles)); fprintf(m_fdbg, "****************************************************\n"); } instrStartPC = -1; #endif cpuRead(Register_ProgramCounter); cycleCount = BRKn << 3; d1x1 = true; interruptCycle = MAX; } else { fetchNextOpcode(); } } void MOS6510::fetchNextOpcode() { #ifdef DEBUG if (dodump) { MOS6510Debug::DumpState(eventScheduler.getTime(EVENT_CLOCK_PHI2), *this); } instrStartPC = Register_ProgramCounter; #endif rdyOnThrowAwayRead = false; cycleCount = cpuRead(Register_ProgramCounter) << 3; Register_ProgramCounter++; if (!checkInterrupts()) { interruptCycle = MAX; } else if (interruptCycle != MAX) { interruptCycle = -MAX; } } /** * Evaluate when to execute an interrupt. Calling this method can also * result in the decision that no interrupt at all needs to be scheduled. */ void MOS6510::calculateInterruptTriggerCycle() { /* Interrupt cycle not going to trigger? */ if (interruptCycle == MAX) { if (checkInterrupts()) { interruptCycle = cycleCount; } } } void MOS6510::IRQLoRequest() { endian_16lo8(Register_ProgramCounter, cpuRead(Cycle_EffectiveAddress)); d1x1 = false; } void MOS6510::IRQHiRequest() { endian_16hi8(Register_ProgramCounter, cpuRead(Cycle_EffectiveAddress + 1)); flags.setI(true); } /** * Read the next opcode byte from memory (and throw it away) */ void MOS6510::throwAwayFetch() { cpuRead(Register_ProgramCounter); } /** * Issue throw-away read and fix address. * Some people use these to ACK CIA IRQs. */ void MOS6510::throwAwayRead() { cpuRead(Cycle_EffectiveAddress); if (adl_carry) Cycle_EffectiveAddress += 0x100; } /** * Fetch value, increment PC. * * Addressing Modes: * - Immediate * - Relative */ void MOS6510::FetchDataByte() { Cycle_Data = cpuRead(Register_ProgramCounter); if (!d1x1) { Register_ProgramCounter++; } #ifdef DEBUG instrOperand = Cycle_Data; #endif } /** * Fetch low address byte, increment PC. * * Addressing Modes: * - Stack Manipulation * - Absolute * - Zero Page * - Zero Page Indexed * - Absolute Indexed * - Absolute Indirect */ void MOS6510::FetchLowAddr() { Cycle_EffectiveAddress = cpuRead(Register_ProgramCounter); Register_ProgramCounter++; #ifdef DEBUG instrOperand = Cycle_EffectiveAddress; #endif } /** * Read from address, add index register X to it. * * Addressing Modes: * - Zero Page Indexed */ void MOS6510::FetchLowAddrX() { FetchLowAddr(); Cycle_EffectiveAddress = (Cycle_EffectiveAddress + Register_X) & 0xff; } /** * Read from address, add index register Y to it. * * Addressing Modes: * - Zero Page Indexed */ void MOS6510::FetchLowAddrY() { FetchLowAddr(); Cycle_EffectiveAddress = (Cycle_EffectiveAddress + Register_Y) & 0xff; } /** * Fetch high address byte, increment PC (Absolute Addressing). * Low byte must have been obtained first! * * Addressing Modes: * - Absolute */ void MOS6510::FetchHighAddr() { // Get the high byte of an address from memory endian_16hi8(Cycle_EffectiveAddress, cpuRead(Register_ProgramCounter)); Register_ProgramCounter++; #ifdef DEBUG endian_16hi8(instrOperand, endian_16hi8(Cycle_EffectiveAddress)); #endif } /** * Fetch high byte of address, add index register X to low address byte, * increment PC. * * Addressing Modes: * - Absolute Indexed */ void MOS6510::FetchHighAddrX() { Cycle_EffectiveAddress += Register_X; adl_carry = Cycle_EffectiveAddress > 0xff; FetchHighAddr(); } /** * Same as #FetchHighAddrX except doesn't worry about page crossing. */ void MOS6510::FetchHighAddrX2() { FetchHighAddrX(); if (!adl_carry) cycleCount++; } /** * Fetch high byte of address, add index register Y to low address byte, * increment PC. * * Addressing Modes: * - Absolute Indexed */ void MOS6510::FetchHighAddrY() { Cycle_EffectiveAddress += Register_Y; adl_carry = Cycle_EffectiveAddress > 0xff; FetchHighAddr(); } /** * Same as #FetchHighAddrY except doesn't worry about page crossing. */ void MOS6510::FetchHighAddrY2() { FetchHighAddrY(); if (!adl_carry) cycleCount++; } /** * Fetch pointer address low, increment PC. * * Addressing Modes: * - Absolute Indirect * - Indirect indexed (post Y) */ void MOS6510::FetchLowPointer() { Cycle_Pointer = cpuRead(Register_ProgramCounter); Register_ProgramCounter++; #ifdef DEBUG instrOperand = Cycle_Pointer; #endif } /** * Add X to it. * * Addressing Modes: * - Indexed Indirect (pre X) */ void MOS6510::FetchLowPointerX() { endian_16lo8(Cycle_Pointer, (Cycle_Pointer + Register_X) & 0xff); } /** * Fetch pointer address high, increment PC. * * Addressing Modes: * - Absolute Indirect */ void MOS6510::FetchHighPointer() { endian_16hi8(Cycle_Pointer, cpuRead(Register_ProgramCounter)); Register_ProgramCounter++; #ifdef DEBUG endian_16hi8(instrOperand, endian_16hi8(Cycle_Pointer)); #endif } /** * Fetch effective address low. * * Addressing Modes: * - Indirect * - Indexed Indirect (pre X) * - Indirect indexed (post Y) */ void MOS6510::FetchLowEffAddr() { Cycle_EffectiveAddress = cpuRead(Cycle_Pointer); } /** * Fetch effective address high. * * Addressing Modes: * - Indirect * - Indexed Indirect (pre X) */ void MOS6510::FetchHighEffAddr() { endian_16lo8(Cycle_Pointer, (Cycle_Pointer + 1) & 0xff); endian_16hi8(Cycle_EffectiveAddress, cpuRead(Cycle_Pointer)); } /** * Fetch effective address high, add Y to low byte of effective address. * * Addressing Modes: * - Indirect indexed (post Y) */ void MOS6510::FetchHighEffAddrY() { Cycle_EffectiveAddress += Register_Y; adl_carry = Cycle_EffectiveAddress > 0xff; FetchHighEffAddr(); } /** * Same as #FetchHighEffAddrY except doesn't worry about page crossing. */ void MOS6510::FetchHighEffAddrY2() { FetchHighEffAddrY(); if (!adl_carry) cycleCount++; } //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// // Common Data Accessing Routines // // Data Accessing operations as described in 64doc by John West and // // Marko Makela // //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// void MOS6510::FetchEffAddrDataByte() { Cycle_Data = cpuRead(Cycle_EffectiveAddress); } /** * Write Cycle_Data to effective address. */ void MOS6510::PutEffAddrDataByte() { cpuWrite(Cycle_EffectiveAddress, Cycle_Data); } /** * Push data on the stack */ void MOS6510::Push(uint8_t data) { const uint_least16_t addr = endian_16(SP_PAGE, Register_StackPointer); cpuWrite(addr, data); Register_StackPointer--; } /** * Pop data from the stack */ uint8_t MOS6510::Pop() { Register_StackPointer++; const uint_least16_t addr = endian_16(SP_PAGE, Register_StackPointer); return cpuRead(addr); } /** * Push Program Counter Low Byte on stack, decrement S. */ void MOS6510::PushLowPC() { Push(endian_16lo8(Register_ProgramCounter)); } /** * Push Program Counter High Byte on stack, decrement S. */ void MOS6510::PushHighPC() { Push(endian_16hi8(Register_ProgramCounter)); } /** * Increment stack and pull program counter low byte from stack. */ void MOS6510::PopLowPC() { endian_16lo8(Cycle_EffectiveAddress, Pop()); } /** * Increment stack and pull program counter high byte from stack. */ void MOS6510::PopHighPC() { endian_16hi8(Cycle_EffectiveAddress, Pop()); } void MOS6510::WasteCycle() {} void MOS6510::brkPushLowPC() { PushLowPC(); if (rstFlag) { /* rst = %10x */ Cycle_EffectiveAddress = 0xfffc; } else if (nmiFlag) { /* nmi = %01x */ Cycle_EffectiveAddress = 0xfffa; } else { /* irq = %11x */ Cycle_EffectiveAddress = 0xfffe; } rstFlag = false; nmiFlag = false; calculateInterruptTriggerCycle(); } //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// // Common Instruction Opcodes // // See and 6510 Assembly Book for more information on these instructions // //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// void MOS6510::cld_instr() { flags.setD(false); interruptsAndNextOpcode(); } void MOS6510::cli_instr() { flags.setI(false); calculateInterruptTriggerCycle(); interruptsAndNextOpcode(); } void MOS6510::jmp_instr() { Register_ProgramCounter = Cycle_EffectiveAddress; interruptsAndNextOpcode(); } void MOS6510::pha_instr() { Push(Register_Accumulator); } /** * RTI does not delay the IRQ I flag change as it is set 3 cycles before * the end of the opcode, and thus the 6510 has enough time to call the * interrupt routine as soon as the opcode ends, if necessary. */ void MOS6510::rti_instr() { Register_ProgramCounter = Cycle_EffectiveAddress; interruptsAndNextOpcode(); #ifdef DEBUG if (dodump) fprintf(m_fdbg, "****************************************************\n\n"); #endif } void MOS6510::rts_instr() { cpuRead(Cycle_EffectiveAddress); Register_ProgramCounter = Cycle_EffectiveAddress; Register_ProgramCounter++; } void MOS6510::sed_instr() { flags.setD(true); interruptsAndNextOpcode(); } void MOS6510::sei_instr() { flags.setI(true); interruptsAndNextOpcode(); if (!rstFlag && !nmiFlag && interruptCycle != MAX) interruptCycle = MAX; } void MOS6510::sta_instr() { Cycle_Data = Register_Accumulator; PutEffAddrDataByte(); } void MOS6510::stx_instr() { Cycle_Data = Register_X; PutEffAddrDataByte(); } void MOS6510::sty_instr() { Cycle_Data = Register_Y; PutEffAddrDataByte(); } //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// // Common Instruction Undocumented Opcodes // // See documented 6502-nmo.opc by Adam Vardy for more details // //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// #if 0 // Not required - Operation performed By another method // // Undocumented - HLT crashes the microprocessor. When this opcode is executed, program // execution ceases. No hardware interrupts will execute either. The author // has characterized this instruction as a halt instruction since this is the // most straightforward explanation for this opcode's behaviour. Only a reset // will restart execution. This opcode leaves no trace of any operation // performed! No registers affected. void MOS6510::hlt_instr() {} #endif /** * Perform the SH* instructions. */ void MOS6510::sh_instr() { uint8_t tmp = endian_16hi8(Cycle_EffectiveAddress); /* * When the addressing/indexing causes a page boundary crossing * the highbyte of the target address is ANDed with the value stored. */ if (adl_carry) { endian_16hi8(Cycle_EffectiveAddress, tmp & Cycle_Data); } else tmp++; /* * When a DMA is going on (the CPU is halted by the VIC-II) * while the instruction sha/shx/shy executes then the last * term of the ANDing (ADH+1) drops off. * * http://sourceforge.net/p/vice-emu/bugs/578/ */ if (!rdyOnThrowAwayRead) { Cycle_Data &= tmp; } PutEffAddrDataByte(); } /** * Undocumented - This opcode stores the result of A AND X AND ADH+1 in memory. */ void MOS6510::axa_instr() { Cycle_Data = Register_X & Register_Accumulator; sh_instr(); } /** * Undocumented - This opcode ANDs the contents of the Y register with ADH+1 and stores the * result in memory. */ void MOS6510::say_instr() { Cycle_Data = Register_Y; sh_instr(); } /** * Undocumented - This opcode ANDs the contents of the X register with ADH+1 and stores the * result in memory. */ void MOS6510::xas_instr() { Cycle_Data = Register_X; sh_instr(); } /** * Undocumented - AXS ANDs the contents of the A and X registers (without changing the * contents of either register) and stores the result in memory. * AXS does not affect any flags in the processor status register. */ void MOS6510::axs_instr() { Cycle_Data = Register_Accumulator & Register_X; PutEffAddrDataByte(); } /** * BCD adding. */ void MOS6510::doADC() { const unsigned int C = flags.getC() ? 1 : 0; const unsigned int A = Register_Accumulator; const unsigned int s = Cycle_Data; const unsigned int regAC2 = A + s + C; if (flags.getD()) { // BCD mode unsigned int lo = (A & 0x0f) + (s & 0x0f) + C; unsigned int hi = (A & 0xf0) + (s & 0xf0); if (lo > 0x09) lo += 0x06; if (lo > 0x0f) hi += 0x10; flags.setZ(!(regAC2 & 0xff)); flags.setN(hi & 0x80); flags.setV(((hi ^ A) & 0x80) && !((A ^ s) & 0x80)); if (hi > 0x90) hi += 0x60; flags.setC(hi > 0xff); Register_Accumulator = (hi | (lo & 0x0f)); } else { // Binary mode flags.setC(regAC2 > 0xff); flags.setV(((regAC2 ^ A) & 0x80) && !((A ^ s) & 0x80)); flags.setNZ(Register_Accumulator = regAC2 & 0xff); } } /** * BCD subtracting. */ void MOS6510::doSBC() { const unsigned int C = flags.getC() ? 0 : 1; const unsigned int A = Register_Accumulator; const unsigned int s = Cycle_Data; const unsigned int regAC2 = A - s - C; flags.setC(regAC2 < 0x100); flags.setV(((regAC2 ^ A) & 0x80) && ((A ^ s) & 0x80)); flags.setNZ(regAC2); if (flags.getD()) { // BCD mode unsigned int lo = (A & 0x0f) - (s & 0x0f) - C; unsigned int hi = (A & 0xf0) - (s & 0xf0); if (lo & 0x10) { lo -= 0x06; hi -= 0x10; } if (hi & 0x100) hi -= 0x60; Register_Accumulator = (hi | (lo & 0x0f)); } else { // Binary mode Register_Accumulator = regAC2 & 0xff; } } //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// // Generic Instruction Addressing Routines // //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// // Generic Instruction Opcodes // // See and 6510 Assembly Book for more information on these instructions // //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// void MOS6510::adc_instr() { doADC(); interruptsAndNextOpcode(); } void MOS6510::and_instr() { flags.setNZ(Register_Accumulator &= Cycle_Data); interruptsAndNextOpcode(); } /** * Undocumented - For a detailed explanation of this opcode look at: * http://visual6502.org/wiki/index.php?title=6502_Opcode_8B_(XAA,_ANE) */ void MOS6510::ane_instr() { flags.setNZ(Register_Accumulator = (Register_Accumulator | ane_magic) & Register_X & Cycle_Data); interruptsAndNextOpcode(); } void MOS6510::asl_instr() { PutEffAddrDataByte(); flags.setC(Cycle_Data & 0x80); flags.setNZ(Cycle_Data <<= 1); } void MOS6510::asla_instr() { flags.setC(Register_Accumulator & 0x80); flags.setNZ(Register_Accumulator <<= 1); interruptsAndNextOpcode(); } void MOS6510::fix_branch() { // Throw away read cpuRead(Cycle_EffectiveAddress); // Fix address Register_ProgramCounter += Cycle_Data < 0x80 ? 0x0100 : 0xff00; } void MOS6510::branch_instr(bool condition) { // 2 cycles spent before arriving here. spend 0 - 2 cycles here; // - condition false: Continue immediately to FetchNextInstr. // // Otherwise read the byte following the opcode (which is already scheduled to occur on this cycle). // This effort is wasted. Then calculate address of the branch target. If branch is on same page, // then continue at that insn on next cycle (this delays IRQs by 1 clock for some reason, allegedly). // // If the branch is on different memory page, issue a spurious read with wrong high byte before // continuing at the correct address. if (condition) { // issue the spurious read for next insn here. cpuRead(Register_ProgramCounter); Cycle_EffectiveAddress = endian_16lo8(Register_ProgramCounter); Cycle_EffectiveAddress += Cycle_Data; adl_carry = (Cycle_EffectiveAddress > 0xff) != (Cycle_Data > 0x7f); endian_16hi8(Cycle_EffectiveAddress, endian_16hi8(Register_ProgramCounter)); Register_ProgramCounter = Cycle_EffectiveAddress; // Check for page boundary crossing if (!adl_carry) { // Skip next throw away read cycleCount++; // Hack: delay the interrupt past this instruction. if (interruptCycle >> 3 == cycleCount >> 3) interruptCycle += 2; } } else { // branch not taken: skip the following spurious read insn and go to FetchNextInstr immediately. interruptsAndNextOpcode(); } } void MOS6510::bcc_instr() { branch_instr(!flags.getC()); } void MOS6510::bcs_instr() { branch_instr(flags.getC()); } void MOS6510::beq_instr() { branch_instr(flags.getZ()); } void MOS6510::bit_instr() { flags.setZ((Register_Accumulator & Cycle_Data) == 0); flags.setN(Cycle_Data & 0x80); flags.setV(Cycle_Data & 0x40); interruptsAndNextOpcode(); } void MOS6510::bmi_instr() { branch_instr(flags.getN()); } void MOS6510::bne_instr() { branch_instr(!flags.getZ()); } void MOS6510::bpl_instr() { branch_instr(!flags.getN()); } void MOS6510::bvc_instr() { branch_instr(!flags.getV()); } void MOS6510::bvs_instr() { branch_instr(flags.getV()); } void MOS6510::clc_instr() { flags.setC(false); interruptsAndNextOpcode(); } void MOS6510::clv_instr() { flags.setV(false); interruptsAndNextOpcode(); } void MOS6510::compare(uint8_t data) { const uint_least16_t tmp = static_cast(data) - Cycle_Data; flags.setNZ(tmp); flags.setC(tmp < 0x100); interruptsAndNextOpcode(); } void MOS6510::cmp_instr() { compare(Register_Accumulator); } void MOS6510::cpx_instr() { compare(Register_X); } void MOS6510::cpy_instr() { compare(Register_Y); } void MOS6510::dec_instr() { PutEffAddrDataByte(); flags.setNZ(--Cycle_Data); } void MOS6510::dex_instr() { flags.setNZ(--Register_X); interruptsAndNextOpcode(); } void MOS6510::dey_instr() { flags.setNZ(--Register_Y); interruptsAndNextOpcode(); } void MOS6510::eor_instr() { flags.setNZ(Register_Accumulator ^= Cycle_Data); interruptsAndNextOpcode(); } void MOS6510::inc_instr() { PutEffAddrDataByte(); flags.setNZ(++Cycle_Data); } void MOS6510::inx_instr() { flags.setNZ(++Register_X); interruptsAndNextOpcode(); } void MOS6510::iny_instr() { flags.setNZ(++Register_Y); interruptsAndNextOpcode(); } void MOS6510::lda_instr() { flags.setNZ(Register_Accumulator = Cycle_Data); interruptsAndNextOpcode(); } void MOS6510::ldx_instr() { flags.setNZ(Register_X = Cycle_Data); interruptsAndNextOpcode(); } void MOS6510::ldy_instr() { flags.setNZ(Register_Y = Cycle_Data); interruptsAndNextOpcode(); } void MOS6510::lsr_instr() { PutEffAddrDataByte(); flags.setC(Cycle_Data & 0x01); flags.setNZ(Cycle_Data >>= 1); } void MOS6510::lsra_instr() { flags.setC(Register_Accumulator & 0x01); flags.setNZ(Register_Accumulator >>= 1); interruptsAndNextOpcode(); } void MOS6510::ora_instr() { flags.setNZ(Register_Accumulator |= Cycle_Data); interruptsAndNextOpcode(); } void MOS6510::pla_instr() { flags.setNZ(Register_Accumulator = Pop()); } void MOS6510::rol_instr() { const uint8_t newC = Cycle_Data & 0x80; PutEffAddrDataByte(); Cycle_Data <<= 1; if (flags.getC()) Cycle_Data |= 0x01; flags.setNZ(Cycle_Data); flags.setC(newC); } void MOS6510::rola_instr() { const uint8_t newC = Register_Accumulator & 0x80; Register_Accumulator <<= 1; if (flags.getC()) Register_Accumulator |= 0x01; flags.setNZ(Register_Accumulator); flags.setC(newC); interruptsAndNextOpcode(); } void MOS6510::ror_instr() { const uint8_t newC = Cycle_Data & 0x01; PutEffAddrDataByte(); Cycle_Data >>= 1; if (flags.getC()) Cycle_Data |= 0x80; flags.setNZ(Cycle_Data); flags.setC(newC); } void MOS6510::rora_instr() { const uint8_t newC = Register_Accumulator & 0x01; Register_Accumulator >>= 1; if (flags.getC()) Register_Accumulator |= 0x80; flags.setNZ(Register_Accumulator); flags.setC(newC); interruptsAndNextOpcode(); } void MOS6510::sbx_instr() { const unsigned int tmp = (Register_X & Register_Accumulator) - Cycle_Data; flags.setNZ(Register_X = tmp & 0xff); flags.setC(tmp < 0x100); interruptsAndNextOpcode(); } void MOS6510::sbc_instr() { doSBC(); interruptsAndNextOpcode(); } void MOS6510::sec_instr() { flags.setC(true); interruptsAndNextOpcode(); } void MOS6510::shs_instr() { Register_StackPointer = Register_Accumulator & Register_X; Cycle_Data = Register_StackPointer; sh_instr(); } void MOS6510::tax_instr() { flags.setNZ(Register_X = Register_Accumulator); interruptsAndNextOpcode(); } void MOS6510::tay_instr() { flags.setNZ(Register_Y = Register_Accumulator); interruptsAndNextOpcode(); } void MOS6510::tsx_instr() { flags.setNZ(Register_X = Register_StackPointer); interruptsAndNextOpcode(); } void MOS6510::txa_instr() { flags.setNZ(Register_Accumulator = Register_X); interruptsAndNextOpcode(); } void MOS6510::txs_instr() { Register_StackPointer = Register_X; interruptsAndNextOpcode(); } void MOS6510::tya_instr() { flags.setNZ(Register_Accumulator = Register_Y); interruptsAndNextOpcode(); } void MOS6510::invalidOpcode() { throw haltInstruction(); } //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// // Generic Instruction Undocumented Opcodes // // See documented 6502-nmo.opc by Adam Vardy for more details // //-------------------------------------------------------------------------// //-------------------------------------------------------------------------// /** * Undocumented - This opcode ANDs the contents of the A register with an immediate value and * then LSRs the result. */ void MOS6510::alr_instr() { Register_Accumulator &= Cycle_Data; flags.setC(Register_Accumulator & 0x01); flags.setNZ(Register_Accumulator >>= 1); interruptsAndNextOpcode(); } /** * Undocumented - ANC ANDs the contents of the A register with an immediate value and then * moves bit 7 of A into the Carry flag. This opcode works basically * identically to AND #immed. except that the Carry flag is set to the same * state that the Negative flag is set to. */ void MOS6510::anc_instr() { flags.setNZ(Register_Accumulator &= Cycle_Data); flags.setC(flags.getN()); interruptsAndNextOpcode(); } /** * Undocumented - This opcode ANDs the contents of the A register with an immediate value and * then RORs the result. (Implementation based on that of Frodo C64 Emulator) */ void MOS6510::arr_instr() { const uint8_t data = Cycle_Data & Register_Accumulator; Register_Accumulator = data >> 1; if (flags.getC()) Register_Accumulator |= 0x80; if (flags.getD()) { flags.setN(flags.getC()); flags.setZ(Register_Accumulator == 0); flags.setV((data ^ Register_Accumulator) & 0x40); if ((data & 0x0f) + (data & 0x01) > 5) Register_Accumulator = (Register_Accumulator & 0xf0) | ((Register_Accumulator + 6) & 0x0f); flags.setC(((data + (data & 0x10)) & 0x1f0) > 0x50); if (flags.getC()) Register_Accumulator += 0x60; } else { flags.setNZ(Register_Accumulator); flags.setC(Register_Accumulator & 0x40); flags.setV((Register_Accumulator & 0x40) ^ ((Register_Accumulator & 0x20) << 1)); } interruptsAndNextOpcode(); } /** * Undocumented - This opcode ASLs the contents of a memory location and then ORs the result * with the accumulator. */ void MOS6510::aso_instr() { PutEffAddrDataByte(); flags.setC(Cycle_Data & 0x80); Cycle_Data <<= 1; flags.setNZ(Register_Accumulator |= Cycle_Data); } /** * Undocumented - This opcode DECs the contents of a memory location and then CMPs the result * with the A register. */ void MOS6510::dcm_instr() { PutEffAddrDataByte(); Cycle_Data--; const uint_least16_t tmp = static_cast(Register_Accumulator) - Cycle_Data; flags.setNZ(tmp); flags.setC(tmp < 0x100); } /** * Undocumented - This opcode INCs the contents of a memory location and then SBCs the result * from the A register. */ void MOS6510::ins_instr() { PutEffAddrDataByte(); Cycle_Data++; doSBC(); } /** * Undocumented - This opcode ANDs the contents of a memory location with the contents of the * stack pointer register and stores the result in the accumulator, the X * register, and the stack pointer. Affected flags: N Z. */ void MOS6510::las_instr() { flags.setNZ(Cycle_Data &= Register_StackPointer); Register_Accumulator = Cycle_Data; Register_X = Cycle_Data; Register_StackPointer = Cycle_Data; interruptsAndNextOpcode(); } /** * Undocumented - This opcode loads both the accumulator and the X register with the contents * of a memory location. */ void MOS6510::lax_instr() { flags.setNZ(Register_Accumulator = Register_X = Cycle_Data); interruptsAndNextOpcode(); } /** * Undocumented - LSE LSRs the contents of a memory location and then EORs the result with * the accumulator. */ void MOS6510::lse_instr() { PutEffAddrDataByte(); flags.setC(Cycle_Data & 0x01); Cycle_Data >>= 1; flags.setNZ(Register_Accumulator ^= Cycle_Data); } /** * Undocumented - This opcode ORs the A register with #xx (the "magic" value), * ANDs the result with an immediate value, and then stores the result in both A and X. */ void MOS6510::oal_instr() { flags.setNZ(Register_X = (Register_Accumulator = (Cycle_Data & (Register_Accumulator | lxa_magic)))); interruptsAndNextOpcode(); } /** * Undocumented - RLA ROLs the contents of a memory location and then ANDs the result with * the accumulator. */ void MOS6510::rla_instr() { const uint8_t newC = Cycle_Data & 0x80; PutEffAddrDataByte(); Cycle_Data = Cycle_Data << 1; if (flags.getC()) Cycle_Data |= 0x01; flags.setC(newC); flags.setNZ(Register_Accumulator &= Cycle_Data); } /** * Undocumented - RRA RORs the contents of a memory location and then ADCs the result with * the accumulator. */ void MOS6510::rra_instr() { const uint8_t newC = Cycle_Data & 0x01; PutEffAddrDataByte(); Cycle_Data >>= 1; if (flags.getC()) Cycle_Data |= 0x80; flags.setC(newC); doADC(); } //-------------------------------------------------------------------------// /** * Create new CPU emu. * * @param context * The Event Context */ MOS6510::MOS6510(EventScheduler &scheduler) : eventScheduler(scheduler), #ifdef DEBUG m_fdbg(stdout), #endif m_nosteal("CPU-nosteal", *this, &MOS6510::eventWithoutSteals), m_steal("CPU-steal", *this, &MOS6510::eventWithSteals), clearInt("Remove IRQ", *this, &MOS6510::removeIRQ) { buildInstructionTable(); // Intialise Processor Registers Register_Accumulator = 0; Register_X = 0; Register_Y = 0; Cycle_EffectiveAddress = 0; Cycle_Data = 0; #ifdef DEBUG dodump = false; #endif Initialise(); } /** * Build up the processor instruction table. */ void MOS6510::buildInstructionTable() { for (unsigned int i = 0; i < 0x100; i++) { #if DEBUG > 1 printf("Building Command %d[%02x]... ", i, i); #endif /* * So: what cycles are marked as stealable? Rules are: * * - CPU performs either read or write at every cycle. Reads are * always stealable. Writes are rare. * * - Every instruction begins with a sequence of reads. Writes, * if any, are at the end for most instructions. */ unsigned int buildCycle = i << 3; typedef enum { WRITE, READ } AccessMode; AccessMode access = WRITE; bool legalMode = true; bool legalInstr = true; switch (i) { // Accumulator or Implied addressing case ASLn: case CLCn: case CLDn: case CLIn: case CLVn: case DEXn: case DEYn: case INXn: case INYn: case LSRn: case NOPn_: case PHAn: case PHPn: case PLAn: case PLPn: case ROLn: case RORn: case SECn: case SEDn: case SEIn: case TAXn: case TAYn: case TSXn: case TXAn: case TXSn: case TYAn: instrTable[buildCycle++].func = &MOS6510::throwAwayFetch; break; // Immediate and Relative Addressing Mode Handler case ADCb: case ANDb: case ANCb_: case ANEb: case ASRb: case ARRb: case BCCr: case BCSr: case BEQr: case BMIr: case BNEr: case BPLr: case BRKn: case BVCr: case BVSr: case CMPb: case CPXb: case CPYb: case EORb: case LDAb: case LDXb: case LDYb: case LXAb: case NOPb_: case ORAb: case SBCb_: case SBXb: case RTIn: case RTSn: instrTable[buildCycle++].func = &MOS6510::FetchDataByte; break; // Zero Page Addressing Mode Handler - Read & RMW case ADCz: case ANDz: case BITz: case CMPz: case CPXz: case CPYz: case EORz: case LAXz: case LDAz: case LDXz: case LDYz: case ORAz: case NOPz_: case SBCz: case ASLz: case DCPz: case DECz: case INCz: case ISBz: case LSRz: case ROLz: case RORz: case SREz: case SLOz: case RLAz: case RRAz: access = READ; // fallthrough case SAXz: case STAz: case STXz: case STYz: instrTable[buildCycle++].func = &MOS6510::FetchLowAddr; break; // Zero Page with X Offset Addressing Mode Handler // these issue extra reads on the 0 page, but we don't care about it // because there are no detectable effects from them. These reads // occur during the "wasted" cycle. case ADCzx: case ANDzx: case CMPzx: case EORzx: case LDAzx: case LDYzx: case NOPzx_: case ORAzx: case SBCzx: case ASLzx: case DCPzx: case DECzx: case INCzx: case ISBzx: case LSRzx: case RLAzx: case ROLzx: case RORzx: case RRAzx: case SLOzx: case SREzx: access = READ; // fallthrough case STAzx: case STYzx: instrTable[buildCycle++].func = &MOS6510::FetchLowAddrX; // operates on 0 page in read mode. Truly side-effect free. instrTable[buildCycle++].func = &MOS6510::WasteCycle; break; // Zero Page with Y Offset Addressing Mode Handler case LDXzy: case LAXzy: access = READ; // fallthrough case STXzy: case SAXzy: instrTable[buildCycle++].func = &MOS6510::FetchLowAddrY; // operates on 0 page in read mode. Truly side-effect free. instrTable[buildCycle++].func = &MOS6510::WasteCycle; break; // Absolute Addressing Mode Handler case ADCa: case ANDa: case BITa: case CMPa: case CPXa: case CPYa: case EORa: case LAXa: case LDAa: case LDXa: case LDYa: case NOPa: case ORAa: case SBCa: case ASLa: case DCPa: case DECa: case INCa: case ISBa: case LSRa: case ROLa: case RORa: case SLOa: case SREa: case RLAa: case RRAa: access = READ; // fallthrough case JMPw: case SAXa: case STAa: case STXa: case STYa: instrTable[buildCycle++].func = &MOS6510::FetchLowAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighAddr; break; case JSRw: instrTable[buildCycle++].func = &MOS6510::FetchLowAddr; break; // Absolute With X Offset Addressing Mode Handler (Read) case ADCax: case ANDax: case CMPax: case EORax: case LDAax: case LDYax: case NOPax_: case ORAax: case SBCax: access = READ; instrTable[buildCycle++].func = &MOS6510::FetchLowAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighAddrX2; // this cycle is skipped if the address is already correct. // otherwise, it will be read and ignored. instrTable[buildCycle++].func = &MOS6510::throwAwayRead; break; // Absolute X (RMW; no page crossing handled, always reads before writing) case ASLax: case DCPax: case DECax: case INCax: case ISBax: case LSRax: case RLAax: case ROLax: case RORax: case RRAax: case SLOax: case SREax: access = READ; // fallthrough case SHYax: case STAax: instrTable[buildCycle++].func = &MOS6510::FetchLowAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighAddrX; instrTable[buildCycle++].func = &MOS6510::throwAwayRead; break; // Absolute With Y Offset Addresing Mode Handler (Read) case ADCay: case ANDay: case CMPay: case EORay: case LASay: case LAXay: case LDAay: case LDXay: case ORAay: case SBCay: access = READ; // fallthrough instrTable[buildCycle++].func = &MOS6510::FetchLowAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighAddrY2; instrTable[buildCycle++].func = &MOS6510::throwAwayRead; break; // Absolute Y (No page crossing handled) case DCPay: case ISBay: case RLAay: case RRAay: case SLOay: case SREay: access = READ; // fallthrough case SHAay: case SHSay: case SHXay: case STAay: instrTable[buildCycle++].func = &MOS6510::FetchLowAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighAddrY; instrTable[buildCycle++].func = &MOS6510::throwAwayRead; break; // Absolute Indirect Addressing Mode Handler case JMPi: instrTable[buildCycle++].func = &MOS6510::FetchLowPointer; instrTable[buildCycle++].func = &MOS6510::FetchHighPointer; instrTable[buildCycle++].func = &MOS6510::FetchLowEffAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighEffAddr; break; // Indexed with X Preinc Addressing Mode Handler case ADCix: case ANDix: case CMPix: case EORix: case LAXix: case LDAix: case ORAix: case SBCix: case DCPix: case ISBix: case SLOix: case SREix: case RLAix: case RRAix: access = READ; // fallthrough case SAXix: case STAix: instrTable[buildCycle++].func = &MOS6510::FetchLowPointer; instrTable[buildCycle++].func = &MOS6510::FetchLowPointerX; instrTable[buildCycle++].func = &MOS6510::FetchLowEffAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighEffAddr; break; // Indexed with Y Postinc Addressing Mode Handler (Read) case ADCiy: case ANDiy: case CMPiy: case EORiy: case LAXiy: case LDAiy: case ORAiy: case SBCiy: access = READ; instrTable[buildCycle++].func = &MOS6510::FetchLowPointer; instrTable[buildCycle++].func = &MOS6510::FetchLowEffAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighEffAddrY2; instrTable[buildCycle++].func = &MOS6510::throwAwayRead; break; // Indexed Y (No page crossing handled) case DCPiy: case ISBiy: case RLAiy: case RRAiy: case SLOiy: case SREiy: access = READ; // fallthrough case SHAiy: case STAiy: instrTable[buildCycle++].func = &MOS6510::FetchLowPointer; instrTable[buildCycle++].func = &MOS6510::FetchLowEffAddr; instrTable[buildCycle++].func = &MOS6510::FetchHighEffAddrY; instrTable[buildCycle++].func = &MOS6510::throwAwayRead; break; default: legalMode = false; break; } if (access == READ) { instrTable[buildCycle++].func = &MOS6510::FetchEffAddrDataByte; } //--------------------------------------------------------------------------------------- // Addressing Modes Finished, other cycles are instruction dependent //--------------------------------------------------------------------------------------- switch(i) { case ADCz: case ADCzx: case ADCa: case ADCax: case ADCay: case ADCix: case ADCiy: case ADCb: instrTable[buildCycle++].func = &MOS6510::adc_instr; break; case ANCb_: instrTable[buildCycle++].func = &MOS6510::anc_instr; break; case ANDz: case ANDzx: case ANDa: case ANDax: case ANDay: case ANDix: case ANDiy: case ANDb: instrTable[buildCycle++].func = &MOS6510::and_instr; break; case ANEb: // Also known as XAA instrTable[buildCycle++].func = &MOS6510::ane_instr; break; case ARRb: instrTable[buildCycle++].func = &MOS6510::arr_instr; break; case ASLn: instrTable[buildCycle++].func = &MOS6510::asla_instr; break; case ASLz: case ASLzx: case ASLa: case ASLax: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::asl_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case ASRb: // Also known as ALR instrTable[buildCycle++].func = &MOS6510::alr_instr; break; case BCCr: instrTable[buildCycle++].func = &MOS6510::bcc_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case BCSr: instrTable[buildCycle++].func = &MOS6510::bcs_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case BEQr: instrTable[buildCycle++].func = &MOS6510::beq_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case BITz: case BITa: instrTable[buildCycle++].func = &MOS6510::bit_instr; break; case BMIr: instrTable[buildCycle++].func = &MOS6510::bmi_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case BNEr: instrTable[buildCycle++].func = &MOS6510::bne_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case BPLr: instrTable[buildCycle++].func = &MOS6510::bpl_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case BRKn: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PushHighPC; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::brkPushLowPC; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PushSR; instrTable[buildCycle++].func = &MOS6510::IRQLoRequest; instrTable[buildCycle++].func = &MOS6510::IRQHiRequest; instrTable[buildCycle++].func = &MOS6510::fetchNextOpcode; break; case BVCr: instrTable[buildCycle++].func = &MOS6510::bvc_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case BVSr: instrTable[buildCycle++].func = &MOS6510::bvs_instr; instrTable[buildCycle++].func = &MOS6510::fix_branch; break; case CLCn: instrTable[buildCycle++].func = &MOS6510::clc_instr; break; case CLDn: instrTable[buildCycle++].func = &MOS6510::cld_instr; break; case CLIn: instrTable[buildCycle++].func = &MOS6510::cli_instr; break; case CLVn: instrTable[buildCycle++].func = &MOS6510::clv_instr; break; case CMPz: case CMPzx: case CMPa: case CMPax: case CMPay: case CMPix: case CMPiy: case CMPb: instrTable[buildCycle++].func = &MOS6510::cmp_instr; break; case CPXz: case CPXa: case CPXb: instrTable[buildCycle++].func = &MOS6510::cpx_instr; break; case CPYz: case CPYa: case CPYb: instrTable[buildCycle++].func = &MOS6510::cpy_instr; break; case DCPz: case DCPzx: case DCPa: case DCPax: case DCPay: case DCPix: case DCPiy: // Also known as DCM instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::dcm_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case DECz: case DECzx: case DECa: case DECax: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::dec_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case DEXn: instrTable[buildCycle++].func = &MOS6510::dex_instr; break; case DEYn: instrTable[buildCycle++].func = &MOS6510::dey_instr; break; case EORz: case EORzx: case EORa: case EORax: case EORay: case EORix: case EORiy: case EORb: instrTable[buildCycle++].func = &MOS6510::eor_instr; break; #if 0 // HLT, also known as JAM case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52: case 0x62: case 0x72: case 0x92: case 0xb2: case 0xd2: case 0xf2: case 0x02: case 0x12: case 0x22: case 0x32: case 0x42: case 0x52: case 0x62: case 0x72: case 0x92: case 0xb2: case 0xd2: case 0xf2: instrTable[buildCycle++].func = hlt_instr; break; #endif case INCz: case INCzx: case INCa: case INCax: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::inc_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case INXn: instrTable[buildCycle++].func = &MOS6510::inx_instr; break; case INYn: instrTable[buildCycle++].func = &MOS6510::iny_instr; break; case ISBz: case ISBzx: case ISBa: case ISBax: case ISBay: case ISBix: case ISBiy: // Also known as INS instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::ins_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case JSRw: instrTable[buildCycle++].func = &MOS6510::WasteCycle; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PushHighPC; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PushLowPC; instrTable[buildCycle++].func = &MOS6510::FetchHighAddr; // fallthrough case JMPw: case JMPi: instrTable[buildCycle++].func = &MOS6510::jmp_instr; break; case LASay: instrTable[buildCycle++].func = &MOS6510::las_instr; break; case LAXz: case LAXzy: case LAXa: case LAXay: case LAXix: case LAXiy: instrTable[buildCycle++].func = &MOS6510::lax_instr; break; case LDAz: case LDAzx: case LDAa: case LDAax: case LDAay: case LDAix: case LDAiy: case LDAb: instrTable[buildCycle++].func = &MOS6510::lda_instr; break; case LDXz: case LDXzy: case LDXa: case LDXay: case LDXb: instrTable[buildCycle++].func = &MOS6510::ldx_instr; break; case LDYz: case LDYzx: case LDYa: case LDYax: case LDYb: instrTable[buildCycle++].func = &MOS6510::ldy_instr; break; case LSRn: instrTable[buildCycle++].func = &MOS6510::lsra_instr; break; case LSRz: case LSRzx: case LSRa: case LSRax: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::lsr_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case NOPn_: case NOPb_: case NOPz_: case NOPzx_: case NOPa: case NOPax_: // NOPb NOPz NOPzx - Also known as SKBn // NOPa NOPax - Also known as SKWn break; case LXAb: // Also known as OAL instrTable[buildCycle++].func = &MOS6510::oal_instr; break; case ORAz: case ORAzx: case ORAa: case ORAax: case ORAay: case ORAix: case ORAiy: case ORAb: instrTable[buildCycle++].func = &MOS6510::ora_instr; break; case PHAn: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::pha_instr; break; case PHPn: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PushSR; break; case PLAn: // should read the value at current stack register. // Truly side-effect free. instrTable[buildCycle++].func = &MOS6510::WasteCycle; instrTable[buildCycle++].func = &MOS6510::pla_instr; break; case PLPn: // should read the value at current stack register. // Truly side-effect free. instrTable[buildCycle++].func = &MOS6510::WasteCycle; instrTable[buildCycle++].func = &MOS6510::PopSR; break; case RLAz: case RLAzx: case RLAix: case RLAa: case RLAax: case RLAay: case RLAiy: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::rla_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case ROLn: instrTable[buildCycle++].func = &MOS6510::rola_instr; break; case ROLz: case ROLzx: case ROLa: case ROLax: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::rol_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case RORn: instrTable[buildCycle++].func = &MOS6510::rora_instr; break; case RORz: case RORzx: case RORa: case RORax: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::ror_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case RRAa: case RRAax: case RRAay: case RRAz: case RRAzx: case RRAix: case RRAiy: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::rra_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case RTIn: // should read the value at current stack register. // Truly side-effect free. instrTable[buildCycle++].func = &MOS6510::WasteCycle; instrTable[buildCycle++].func = &MOS6510::PopSR; instrTable[buildCycle++].func = &MOS6510::PopLowPC; instrTable[buildCycle++].func = &MOS6510::PopHighPC; instrTable[buildCycle++].func = &MOS6510::rti_instr; break; case RTSn: // should read the value at current stack register. // Truly side-effect free. instrTable[buildCycle++].func = &MOS6510::WasteCycle; instrTable[buildCycle++].func = &MOS6510::PopLowPC; instrTable[buildCycle++].func = &MOS6510::PopHighPC; instrTable[buildCycle++].func = &MOS6510::rts_instr; break; case SAXz: case SAXzy: case SAXa: case SAXix: // Also known as AXS instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::axs_instr; break; case SBCz: case SBCzx: case SBCa: case SBCax: case SBCay: case SBCix: case SBCiy: case SBCb_: instrTable[buildCycle++].func = &MOS6510::sbc_instr; break; case SBXb: instrTable[buildCycle++].func = &MOS6510::sbx_instr; break; case SECn: instrTable[buildCycle++].func = &MOS6510::sec_instr; break; case SEDn: instrTable[buildCycle++].func = &MOS6510::sed_instr; break; case SEIn: instrTable[buildCycle++].func = &MOS6510::sei_instr; break; case SHAay: case SHAiy: // Also known as AXA instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::axa_instr; break; case SHSay: // Also known as TAS instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::shs_instr; break; case SHXay: // Also known as XAS instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::xas_instr; break; case SHYax: // Also known as SAY instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::say_instr; break; case SLOz: case SLOzx: case SLOa: case SLOax: case SLOay: case SLOix: case SLOiy: // Also known as ASO instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::aso_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case SREz: case SREzx: case SREa: case SREax: case SREay: case SREix: case SREiy: // Also known as LSE instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::lse_instr; instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::PutEffAddrDataByte; break; case STAz: case STAzx: case STAa: case STAax: case STAay: case STAix: case STAiy: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::sta_instr; break; case STXz: case STXzy: case STXa: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::stx_instr; break; case STYz: case STYzx: case STYa: instrTable[buildCycle].nosteal = true; instrTable[buildCycle++].func = &MOS6510::sty_instr; break; case TAXn: instrTable[buildCycle++].func = &MOS6510::tax_instr; break; case TAYn: instrTable[buildCycle++].func = &MOS6510::tay_instr; break; case TSXn: instrTable[buildCycle++].func = &MOS6510::tsx_instr; break; case TXAn: instrTable[buildCycle++].func = &MOS6510::txa_instr; break; case TXSn: instrTable[buildCycle++].func = &MOS6510::txs_instr; break; case TYAn: instrTable[buildCycle++].func = &MOS6510::tya_instr; break; default: legalInstr = false; break; } // Missing an addressing mode or implementation makes opcode invalid. // These are normally called HLT instructions. In the hardware, the // CPU state machine locks up and will never recover. if (!(legalMode && legalInstr)) { instrTable[buildCycle++].func = &MOS6510::invalidOpcode; } // check for IRQ triggers or fetch next opcode... instrTable[buildCycle].func = &MOS6510::interruptsAndNextOpcode; #if DEBUG > 1 printf("Done [%d Cycles]\n", buildCycle - (i << 3)); #endif } } /** * Initialise CPU Emulation (Registers). */ void MOS6510::Initialise() { // Reset stack Register_StackPointer = 0xff; // Reset Cycle Count cycleCount = (BRKn << 3) + 6; // fetchNextOpcode #ifdef DEBUG instrStartPC = -1; #endif // Reset Status Register flags.reset(); // Set PC to some value Register_ProgramCounter = 0; // IRQs pending check irqAssertedOnPin = false; nmiFlag = false; rstFlag = false; interruptCycle = MAX; // Signals rdy = true; d1x1 = false; eventScheduler.schedule(m_nosteal, 0, EVENT_CLOCK_PHI2); } /** * Reset CPU Emulation. */ void MOS6510::reset() { // Internal Stuff Initialise(); // Set processor port to the default values cpuWrite(0, 0x2f); cpuWrite(1, 0x37); // Requires External Bits // Read from reset vector for program entry point endian_16lo8(Cycle_EffectiveAddress, cpuRead(0xfffc)); endian_16hi8(Cycle_EffectiveAddress, cpuRead(0xfffd)); Register_ProgramCounter = Cycle_EffectiveAddress; } /** * Module Credits. */ const char *MOS6510::credits() { return "MOS6510 Cycle Exact Emulation\n" "\t(C) 2000 Simon A. White\n" "\t(C) 2008-2010 Antti S. Lankila\n" "\t(C) 2011-2020 Leandro Nini\n"; } void MOS6510::debug(MAYBE_UNUSED bool enable, MAYBE_UNUSED FILE *out) { #ifdef DEBUG dodump = enable; if (!(out && enable)) m_fdbg = stdout; else m_fdbg = out; #endif } } libsidplayfp-2.6.0/src/c64/CPU/mos6510debug.h0000644000175100001770000000231614544470307015243 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef MOS6510DEBUG_H #define MOS6510DEBUG_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef DEBUG #include "Event.h" namespace libsidplayfp { class MOS6510; namespace MOS6510Debug { void DumpState(event_clock_t time, MOS6510 &cpu); } } #endif // DEBUG #endif // MOS6510DEBUG_H libsidplayfp-2.6.0/src/c64/CPU/flags.h0000644000175100001770000000476214544470307014225 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef FLAGS_H #define FLAGS_H #include namespace libsidplayfp { /** * Processor Status Register */ class Flags { private: bool C; ///< Carry bool Z; ///< Zero bool I; ///< Interrupt disabled bool D; ///< Decimal bool V; ///< Overflow bool N; ///< Negative public: inline void reset() { C = Z = I = D = V = N = false; } /** * Set N and Z flag values. * * @param value to set flags from */ inline void setNZ(uint8_t value) { Z = value == 0; N = value & 0x80; } /** * Get status register value. */ inline uint8_t get() { uint8_t sr = 0; if (C) sr |= 0x01; if (Z) sr |= 0x02; if (I) sr |= 0x04; if (D) sr |= 0x08; if (V) sr |= 0x40; if (N) sr |= 0x80; return sr; } /** * Set status register value. */ inline void set(uint8_t sr) { C = sr & 0x01; Z = sr & 0x02; I = sr & 0x04; D = sr & 0x08; V = sr & 0x40; N = sr & 0x80; } inline bool getN() const { return N; } inline bool getC() const { return C; } inline bool getD() const { return D; } inline bool getZ() const { return Z; } inline bool getV() const { return V; } inline bool getI() const { return I; } inline void setN(bool f) { N = f; } inline void setC(bool f) { C = f; } inline void setD(bool f) { D = f; } inline void setZ(bool f) { Z = f; } inline void setV(bool f) { V = f; } inline void setI(bool f) { I = f; } }; } #endif libsidplayfp-2.6.0/src/c64/CPU/mos6510.h0000644000175100001770000002034014544470307014231 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2019 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef MOS6510_H #define MOS6510_H #include #include #include "flags.h" #include "EventCallback.h" #include "EventScheduler.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif class EventContext; namespace libsidplayfp { #ifdef DEBUG class MOS6510; namespace MOS6510Debug { void DumpState(event_clock_t time, MOS6510 &cpu); } #endif /** * Cycle-exact 6502/6510 emulation core. * * Code is based on work by Simon A. White . * Original Java port by Ken Händel. Later on, it has been hacked to * improve compatibility with Lorenz suite on VICE's test suite. * * @author alankila */ class MOS6510 { #ifdef DEBUG friend void MOS6510Debug::DumpState(event_clock_t time, MOS6510 &cpu); #endif public: class haltInstruction {}; private: /** * IRQ/NMI magic limit values. * Need to be larger than about 0x103 << 3, * but can't be min/max for Integer type. */ static const int MAX = 65536; /// Stack page location static const uint8_t SP_PAGE = 0x01; public: /// Status register interrupt bit. static const int SR_INTERRUPT = 2; private: struct ProcessorCycle { void (MOS6510::*func)(); bool nosteal; ProcessorCycle() : func(0), nosteal(false) {} }; private: /// Event scheduler EventScheduler &eventScheduler; /// Current instruction and subcycle within instruction int cycleCount; /// When IRQ was triggered. -MAX means "during some previous instruction", MAX means "no IRQ" int interruptCycle; /// IRQ asserted on CPU bool irqAssertedOnPin; /// NMI requested? bool nmiFlag; /// RST requested? bool rstFlag; /// RDY pin state (stop CPU on read) bool rdy; /// Address Low summer carry bool adl_carry; bool d1x1; /// The RDY pin state during last throw away read. bool rdyOnThrowAwayRead; /// Status register Flags flags; // Data regarding current instruction uint_least16_t Register_ProgramCounter; uint_least16_t Cycle_EffectiveAddress; uint_least16_t Cycle_Pointer; uint8_t Cycle_Data; uint8_t Register_StackPointer; uint8_t Register_Accumulator; uint8_t Register_X; uint8_t Register_Y; #ifdef DEBUG // Debug info int_least32_t instrStartPC; uint_least16_t instrOperand; FILE *m_fdbg; bool dodump; #endif /// Table of CPU opcode implementations struct ProcessorCycle instrTable[0x101 << 3]; private: /// Represents an instruction subcycle that writes EventCallback m_nosteal; /// Represents an instruction subcycle that reads EventCallback m_steal; EventCallback clearInt; void eventWithoutSteals(); void eventWithSteals(); void removeIRQ(); inline void Initialise(); // Declare Interrupt Routines inline void IRQLoRequest(); inline void IRQHiRequest(); inline void interruptsAndNextOpcode(); inline void calculateInterruptTriggerCycle(); // Declare Instruction Routines inline void fetchNextOpcode(); inline void throwAwayFetch(); inline void throwAwayRead(); inline void FetchDataByte(); inline void FetchLowAddr(); inline void FetchLowAddrX(); inline void FetchLowAddrY(); inline void FetchHighAddr(); inline void FetchHighAddrX(); inline void FetchHighAddrX2(); inline void FetchHighAddrY(); inline void FetchHighAddrY2(); inline void FetchLowEffAddr(); inline void FetchHighEffAddr(); inline void FetchHighEffAddrY(); inline void FetchHighEffAddrY2(); inline void FetchLowPointer(); inline void FetchLowPointerX(); inline void FetchHighPointer(); inline void FetchEffAddrDataByte(); inline void PutEffAddrDataByte(); inline void PushLowPC(); inline void PushHighPC(); inline void PushSR(); inline void PopLowPC(); inline void PopHighPC(); inline void PopSR(); inline void brkPushLowPC(); inline void WasteCycle(); inline void Push(uint8_t data); inline uint8_t Pop(); inline void compare(uint8_t data); // Delcare Instruction Operation Routines inline void adc_instr(); inline void alr_instr(); inline void anc_instr(); inline void and_instr(); inline void ane_instr(); inline void arr_instr(); inline void asl_instr(); inline void asla_instr(); inline void aso_instr(); inline void axa_instr(); inline void axs_instr(); inline void bcc_instr(); inline void bcs_instr(); inline void beq_instr(); inline void bit_instr(); inline void bmi_instr(); inline void bne_instr(); inline void branch_instr(bool condition); inline void fix_branch(); inline void bpl_instr(); inline void bvc_instr(); inline void bvs_instr(); inline void clc_instr(); inline void cld_instr(); inline void cli_instr(); inline void clv_instr(); inline void cmp_instr(); inline void cpx_instr(); inline void cpy_instr(); inline void dcm_instr(); inline void dec_instr(); inline void dex_instr(); inline void dey_instr(); inline void eor_instr(); inline void inc_instr(); inline void ins_instr(); inline void inx_instr(); inline void iny_instr(); inline void jmp_instr(); inline void las_instr(); inline void lax_instr(); inline void lda_instr(); inline void ldx_instr(); inline void ldy_instr(); inline void lse_instr(); inline void lsr_instr(); inline void lsra_instr(); inline void oal_instr(); inline void ora_instr(); inline void pha_instr(); inline void pla_instr(); inline void rla_instr(); inline void rol_instr(); inline void rola_instr(); inline void ror_instr(); inline void rora_instr(); inline void rra_instr(); inline void rti_instr(); inline void rts_instr(); inline void sbx_instr(); inline void say_instr(); inline void sbc_instr(); inline void sec_instr(); inline void sed_instr(); inline void sei_instr(); inline void shs_instr(); inline void sta_instr(); inline void stx_instr(); inline void sty_instr(); inline void tax_instr(); inline void tay_instr(); inline void tsx_instr(); inline void txa_instr(); inline void txs_instr(); inline void tya_instr(); inline void xas_instr(); inline void sh_instr(); /** * @throws haltInstruction */ void invalidOpcode(); // Declare Arithmetic Operations inline void doADC(); inline void doSBC(); inline bool checkInterrupts() const { return rstFlag || nmiFlag || (irqAssertedOnPin && !flags.getI()); } inline void buildInstructionTable(); protected: MOS6510(EventScheduler &scheduler); ~MOS6510() {} /** * Get data from system environment. * * @param address * @return data byte CPU requested */ virtual uint8_t cpuRead(uint_least16_t addr) =0; /** * Write data to system environment. * * @param address * @param data */ virtual void cpuWrite(uint_least16_t addr, uint8_t data) =0; public: void reset(); static const char *credits(); void debug(bool enable, FILE *out); void setRDY(bool newRDY); // Non-standard functions void triggerRST(); void triggerNMI(); void triggerIRQ(); void clearIRQ(); }; } #endif // MOS6510_H libsidplayfp-2.6.0/src/c64/Banks/0000755000175100001770000000000014544470322013433 500000000000000libsidplayfp-2.6.0/src/c64/Banks/DisconnectedBusBank.h0000644000175100001770000000321414544470307017377 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2021 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef DISCONNECTEDBUSBANK_H #define DISCONNECTEDBUSBANK_H #include "Bank.h" #include "pla.h" #include "sidcxx11.h" namespace libsidplayfp { /** * IO1/IO2 * * memory mapped registers or machine code routines of optional external devices. * * I/O Area #1 located at $DE00-$DEFF * * I/O Area #2 located at $DF00-$DFFF */ class DisconnectedBusBank final : public Bank { private: const PLA &pla; public: DisconnectedBusBank(PLA &pla) : pla(pla) {} /** * No device is connected so this is a no-op. */ void poke(uint_least16_t, uint8_t) override {} /** * No device is connected so this should return the value left on the bus. */ uint8_t peek(uint_least16_t) override { return pla.getLastReadByte(); } }; } #endif libsidplayfp-2.6.0/src/c64/Banks/NullSid.h0000644000175100001770000000275014544470307015105 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2014 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef NULLSID_H #define NULLSID_H #include "c64/c64sid.h" #include "sidcxx11.h" namespace libsidplayfp { /** * SID chip placeholder which does nothing and returns 0xff on reading. */ class NullSid final : public c64sid { private: NullSid() {} virtual ~NullSid() {} public: /** * Returns singleton instance. */ static NullSid *getInstance() { static NullSid nullsid; return &nullsid; } void reset(uint8_t) override {} void write(uint_least8_t, uint8_t) override {} uint8_t read(uint_least8_t) override { return 0xff; } }; } #endif // NULLSID_H libsidplayfp-2.6.0/src/c64/Banks/ZeroRAMBank.h0000644000175100001770000001757714544470307015623 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2015 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2010 Antti Lankila * * 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. */ #ifndef ZERORAMBANK_H #define ZERORAMBANK_H #include #include "Bank.h" #include "SystemRAMBank.h" #include "pla.h" #include "Event.h" #include "sidcxx11.h" namespace libsidplayfp { /** * Unused data port bits emulation, as investigated by groepaz: * * - There are 2 different unused bits, 1) the output bits, 2) the input bits * - The output bits can be (re)set when the data-direction is set to output * for those bits and the output bits will not drop-off to 0. * - When the data-direction for the unused bits is set to output then the * unused input bits can be (re)set by writing to them, when set to 1 the * drop-off timer will start which will cause the unused input bits to drop * down to 0 in a certain amount of time. * - When an unused input bit already had the drop-off timer running, and is * set to 1 again, the drop-off timer will restart. * - when a an unused bit changes from output to input, and the current output * bit is 1, the drop-off timer will restart again */ template class dataBit { private: /** * $01 bits 6 and 7 fall-off cycles (1->0), average is about 350 msec for a 6510 * and about 1500 msec for a 8500. * * NOTE: fall-off cycles are heavily chip- and temperature dependent. as a * consequence it is very hard to find suitable realistic values that * always work and we can only tweak them based on testcases. (unless we * want to make it configurable or emulate temperature over time =)) * * it probably makes sense to tweak the values for a warmed up CPU, since * this is likely how (old) programs were coded and tested :) * * NOTE: the unused bits of the 6510 seem to be much more temperature dependant * and the fall-off time decreases quicker and more drastically than on a * 8500 * * cpuports.prg from the lorenz testsuite will fail when the falloff takes more * than 1373 cycles. this suggests that he tested on a well warmed up c64 :) * he explicitly delays by ~1280 cycles and mentions capacitance, so he probably * even was aware of what happens. */ //@{ static event_clock_t const C64_CPU6510_DATA_PORT_FALL_OFF_CYCLES = 350000; static event_clock_t const C64_CPU8500_DATA_PORT_FALL_OFF_CYCLES = 1500000; // Curently unused //@} private: /// Cycle that should invalidate the bit. event_clock_t dataSetClk; /// Indicates if the bit is in the process of falling off. bool isFallingOff; /// Value of the bit. uint8_t dataSet; public: void reset() { isFallingOff = false; dataSet = 0; } uint8_t readBit(event_clock_t phi2time) { if (isFallingOff && (dataSetClk < phi2time)) { // discharge the "capacitor" reset(); } return dataSet; } void writeBit(event_clock_t phi2time, uint8_t value) { dataSetClk = phi2time + C64_CPU6510_DATA_PORT_FALL_OFF_CYCLES; dataSet = value & (1 << Bit); isFallingOff = true; } }; /** * Area backed by RAM, including cpu port addresses 0 and 1. * * This is bit of a fake. We know that the CPU port is an internal * detail of the CPU, and therefore CPU should simply pay the price * for reading/writing to $00/$01. * * However, that would slow down all accesses, which is suboptimal. Therefore * we install this little hook to the 4k 0 region to deal with this. * * Implementation based on VICE code. */ class ZeroRAMBank final : public Bank { private: // not emulated static bool const tape_sense = false; private: PLA &pla; /// C64 RAM area SystemRAMBank &ramBank; /// Unused bits of the data port. //@{ dataBit<6> dataBit6; dataBit<7> dataBit7; //@} /// Value written to processor port. //@{ uint8_t dir; uint8_t data; //@} /// Value read from processor port. uint8_t dataRead; /// State of processor port pins. uint8_t procPortPins; private: void updateCpuPort() { // Update data pins for which direction is OUTPUT procPortPins = (procPortPins & ~dir) | (data & dir); dataRead = (data | ~dir) & (procPortPins | 0x17); pla.setCpuPort((data | ~dir) & 0x07); if ((dir & 0x20) == 0) { dataRead &= ~0x20; } if (tape_sense && (dir & 0x10) == 0) { dataRead &= ~0x10; } } public: ZeroRAMBank(PLA &pla, SystemRAMBank &ramBank) : pla(pla), ramBank(ramBank) {} void reset() { dataBit6.reset(); dataBit7.reset(); dir = 0; data = 0x3f; dataRead = 0x3f; procPortPins = 0x3f; updateCpuPort(); } uint8_t peek(uint_least16_t address) override { switch (address) { case 0: return dir; case 1: { uint8_t retval = dataRead; // for unused bits in input mode, the value comes from the "capacitor" // set real value of bit 6 if (!(dir & 0x40)) { retval &= ~0x40; retval |= dataBit6.readBit(pla.getPhi2Time()); } // set real value of bit 7 if (!(dir & 0x80)) { retval &= ~0x80; retval |= dataBit7.readBit(pla.getPhi2Time()); } return retval; } default: return ramBank.peek(address); } } void poke(uint_least16_t address, uint8_t value) override { switch (address) { case 0: // when switching an unused bit from output (where it contained a // stable value) to input mode (where the input is floating), some // of the charge is transferred to the floating input if (dir != value) { // check if bit 6 has flipped from 1 to 0 if ((dir & 0x40) && !(value & 0x40)) dataBit6.writeBit(pla.getPhi2Time(), data); // check if bit 7 has flipped from 1 to 0 if ((dir & 0x80) && !(value & 0x80)) dataBit7.writeBit(pla.getPhi2Time(), data); dir = value; updateCpuPort(); } value = pla.getLastReadByte(); break; case 1: // when writing to an unused bit that is output, charge the "capacitor", // otherwise don't touch it if (dir & 0x40) dataBit6.writeBit(pla.getPhi2Time(), value); if (dir & 0x80) dataBit7.writeBit(pla.getPhi2Time(), value); if (data != value) { data = value; updateCpuPort(); } value = pla.getLastReadByte(); break; default: break; } ramBank.poke(address, value); } }; } #endif libsidplayfp-2.6.0/src/c64/Banks/ColorRAMBank.h0000644000175100001770000000305514544470307015744 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2013 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef COLORRAMBANK_H #define COLORRAMBANK_H #include #include #include "Bank.h" #include "sidcxx11.h" namespace libsidplayfp { /** * Color RAM. * * 1K x 4-bit Static RAM that stores text screen color information. * * Located at $D800-$DBFF (last 24 bytes are unused) */ class ColorRAMBank final : public Bank { private: uint8_t ram[0x400]; public: void reset() { memset(ram, 0, sizeof(ram)); } void poke(uint_least16_t address, uint8_t value) override { ram[address & 0x3ff] = value & 0xf; } uint8_t peek(uint_least16_t address) override { return ram[address & 0x3ff]; } }; } #endif libsidplayfp-2.6.0/src/c64/Banks/SidBank.h0000644000175100001770000000326214544470307015045 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2013 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef SIDBANK_H #define SIDBANK_H #include "Bank.h" #include "c64/c64sid.h" #include "sidcxx11.h" #include "NullSid.h" namespace libsidplayfp { /** * SID * * Located at $D400-$D7FF, mirrored each 32 bytes */ class SidBank final : public Bank { private: /// SID chip c64sid *sid; public: SidBank() : sid(NullSid::getInstance()) {} void reset() { sid->reset(0xf); } uint8_t peek(uint_least16_t addr) override { return sid->peek(addr); } void poke(uint_least16_t addr, uint8_t data) override { sid->poke(addr, data); } /** * Set SID emulation. * * @param s the emulation, nullptr to remove current sid */ void setSID(c64sid *s) { sid = (s != nullptr) ? s : NullSid::getInstance(); } }; } #endif libsidplayfp-2.6.0/src/c64/Banks/SystemRAMBank.h0000644000175100001770000000405414544470307016152 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2021 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef SYSTEMRAMBANK_H #define SYSTEMRAMBANK_H #include #include #include "Bank.h" #include "sidcxx11.h" namespace libsidplayfp { /** * Area backed by RAM. */ class SystemRAMBank final : public Bank { friend class MMU; private: /// C64 RAM area uint8_t ram[0x10000]; public: /** * Initialize RAM with powerup pattern. * * $0000: 00 00 ff ff ff ff 00 00 00 00 ff ff ff ff 00 00 * ... * $4000: ff ff 00 00 00 00 ff ff ff ff 00 00 00 00 ff ff * ... * $8000: 00 00 ff ff ff ff 00 00 00 00 ff ff ff ff 00 00 * ... * $c000: ff ff 00 00 00 00 ff ff ff ff 00 00 00 00 ff ff */ void reset() { uint8_t byte = 0x00; for (int j=0x0000; j<0x10000; j+=0x4000) { memset(ram+j, byte, 0x4000); byte = ~byte; for (int i = 0x02; i < 0x4000; i += 0x08) { memset(ram+j+i, byte, 0x04); } } } uint8_t peek(uint_least16_t address) override { return ram[address]; } void poke(uint_least16_t address, uint8_t value) override { ram[address] = value; } }; } #endif libsidplayfp-2.6.0/src/c64/Banks/SystemROMBanks.h0000644000175100001770000001161214544470307016351 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2022 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef SYSTEMROMBANKS_H #define SYSTEMROMBANKS_H #include #include #include "Bank.h" #include "c64/CPU/opcodes.h" #include "sidcxx11.h" namespace libsidplayfp { /** * ROM bank base class. */ template class romBank : public Bank { #ifdef HAVE_CXX11 static_assert((N != 0) && ((N & (N - 1)) == 0), "N must be a power of two"); #endif protected: /// The ROM array uint8_t rom[N]; protected: /** * Set value at memory address. */ void setVal(uint_least16_t address, uint8_t val) { rom[address & (N-1)]=val; } /** * Return value from memory address. */ uint8_t getVal(uint_least16_t address) const { return rom[address & (N-1)]; } /** * Return pointer to memory address. */ void* getPtr(uint_least16_t address) const { return (void*)&rom[address & (N-1)]; } public: /** * Copy content from source buffer. */ void set(const uint8_t* source) { if (source != nullptr) memcpy(rom, source, N); } /** * Writing to ROM is a no-op. */ void poke(uint_least16_t, uint8_t) override {} /** * Read from ROM. */ uint8_t peek(uint_least16_t address) override { return rom[address & (N-1)]; } }; /** * Kernal ROM * * Located at $E000-$FFFF */ class KernalRomBank final : public romBank<0x2000> { private: uint8_t resetVectorLo; // 0xfffc uint8_t resetVectorHi; // 0xfffd public: void set(const uint8_t* kernal) { romBank<0x2000>::set(kernal); if (kernal == nullptr) { // IRQ entry point setVal(0xffa0, PHAn); // Save regs setVal(0xffa1, TXAn); setVal(0xffa2, PHAn); setVal(0xffa3, TYAn); setVal(0xffa4, PHAn); setVal(0xffa5, JMPi); // Jump to IRQ routine setVal(0xffa6, 0x14); setVal(0xffa7, 0x03); // Halt setVal(0xea39, 0x02); // Hardware vectors setVal(0xfffa, 0x39); // NMI vector setVal(0xfffb, 0xea); setVal(0xfffc, 0x39); // RESET vector setVal(0xfffd, 0xea); setVal(0xfffe, 0xa0); // IRQ/BRK vector setVal(0xffff, 0xff); } // Backup Reset Vector resetVectorLo = getVal(0xfffc); resetVectorHi = getVal(0xfffd); } void reset() { // Restore original Reset Vector setVal(0xfffc, resetVectorLo); setVal(0xfffd, resetVectorHi); } /** * Change the RESET vector. * * @param addr the new addres to point to */ void installResetHook(uint_least16_t addr) { setVal(0xfffc, endian_16lo8(addr)); setVal(0xfffd, endian_16hi8(addr)); } }; /** * BASIC ROM * * Located at $A000-$BFFF */ class BasicRomBank final : public romBank<0x2000> { private: uint8_t trap[3]; uint8_t subTune[11]; public: void set(const uint8_t* basic) { romBank<0x2000>::set(basic); // Backup BASIC Warm Start memcpy(trap, getPtr(0xa7ae), sizeof(trap)); memcpy(subTune, getPtr(0xbf53), sizeof(subTune)); } void reset() { // Restore original BASIC Warm Start memcpy(getPtr(0xa7ae), trap, sizeof(trap)); memcpy(getPtr(0xbf53), subTune, sizeof(subTune)); } /** * Set BASIC Warm Start address. * * @param addr */ void installTrap(uint_least16_t addr) { setVal(0xa7ae, JMPw); setVal(0xa7af, endian_16lo8(addr)); setVal(0xa7b0, endian_16hi8(addr)); } void setSubtune(uint8_t tune) { setVal(0xbf53, LDAb); setVal(0xbf54, tune); setVal(0xbf55, STAa); setVal(0xbf56, 0x0c); setVal(0xbf57, 0x03); setVal(0xbf58, JSRw); setVal(0xbf59, 0x2c); setVal(0xbf5a, 0xa8); setVal(0xbf5b, JMPw); setVal(0xbf5c, 0xb1); setVal(0xbf5d, 0xa7); } }; /** * Character ROM * * Located at $D000-$DFFF */ class CharacterRomBank final : public romBank<0x1000> {}; } #endif libsidplayfp-2.6.0/src/c64/Banks/IOBank.h0000644000175100001770000000304214544470307014631 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2013 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef IOBANK_H #define IOBANK_H #include #include "Bank.h" #include "sidcxx11.h" namespace libsidplayfp { /** * IO region handler. 4k region, 16 chips, 256b banks. * * Located at $D000-$DFFF */ class IOBank final : public Bank { private: Bank* map[16]; public: void setBank(int num, Bank* bank) { map[num] = bank; } Bank *getBank(int num) const { return map[num]; } uint8_t peek(uint_least16_t addr) override { return map[addr >> 8 & 0xf]->peek(addr); } void poke(uint_least16_t addr, uint8_t data) override { map[addr >> 8 & 0xf]->poke(addr, data); } }; } #endif libsidplayfp-2.6.0/src/c64/Banks/ExtraSidBank.h0000644000175100001770000000460714544470307016055 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2014 Leandro Nini * * 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. */ #ifndef EXTRASIDBANK_H #define EXTRASIDBANK_H #include "Bank.h" #include #include #include "c64/c64sid.h" #include "sidcxx11.h" namespace libsidplayfp { /** * Extra SID bank. */ class ExtraSidBank final : public Bank { private: typedef std::vector sids_t; private: /** * Size of mapping table. Each 32 bytes another SID chip base address * can be assigned to. */ static const int MAPPER_SIZE = 8; private: /** * SID mapping table. * Maps a SID chip base address to a SID * or to the underlying bank. */ Bank *mapper[MAPPER_SIZE]; sids_t sids; private: static void resetSID(sids_t::value_type &e) { e->reset(0xf); } static unsigned int mapperIndex(int address) { return address >> 5 & (MAPPER_SIZE - 1); } public: virtual ~ExtraSidBank() {} void reset() { std::for_each(sids.begin(), sids.end(), resetSID); } void resetSIDMapper(Bank *bank) { for (int i = 0; i < MAPPER_SIZE; i++) mapper[i] = bank; } uint8_t peek(uint_least16_t addr) override { return mapper[mapperIndex(addr)]->peek(addr); } void poke(uint_least16_t addr, uint8_t data) override { mapper[mapperIndex(addr)]->poke(addr, data); } /** * Set SID emulation. * * @param s the emulation * @param address the address where to put the chip */ void addSID(c64sid *s, int address) { sids.push_back(s); mapper[mapperIndex(address)] = s; } }; } #endif libsidplayfp-2.6.0/src/c64/Banks/pla.h0000644000175100001770000000226214544470307014305 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2021 Leandro Nini * * 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. */ #ifndef PLA_H #define PLA_H #include #include "Event.h" namespace libsidplayfp { /** * Interface to PLA functions. */ class PLA { public: virtual void setCpuPort(uint8_t state) =0; virtual uint8_t getLastReadByte() const =0; virtual event_clock_t getPhi2Time() const =0; protected: ~PLA() {} }; } #endif libsidplayfp-2.6.0/src/c64/Banks/Bank.h0000644000175100001770000000335014544470307014403 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2013 Leandro Nini * Copyright 2010 Antti Lankila * * 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. */ #ifndef BANK_H #define BANK_H #include #include "sidplayfp/siddefs.h" namespace libsidplayfp { /** * Base interface for memory and I/O banks. */ class Bank { public: /** * Bank write. * * Override this method if you expect write operations on your bank. * Leave unimplemented if it's logically/operationally impossible for * writes to ever arrive to bank. * * @param address address to write to * @param value value to write */ virtual void poke(uint_least16_t address, uint8_t value) =0; /** * Bank read. You probably * should override this method, except if the Bank is only used in * write context. * * @param address value to read from * @return value at address */ virtual uint8_t peek(uint_least16_t address) =0; protected: ~Bank() {} }; } #endif libsidplayfp-2.6.0/src/c64/CIA/0000755000175100001770000000000014544470322012771 500000000000000libsidplayfp-2.6.0/src/c64/CIA/SerialPort.h0000644000175100001770000000442114544470307015152 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef SERIALPORT_H #define SERIALPORT_H #include "interrupt.h" #include "Event.h" namespace libsidplayfp { class MOS652X; class SerialPort : private Event { private: /// Pointer to the MOS6526 which this Serial Port belongs to. MOS652X &parent; /// Event context. EventScheduler &eventScheduler; EventCallback flipCntEvent; EventCallback flipFakeEvent; EventCallback startSdrEvent; event_clock_t lastSync; int count; uint8_t cnt; uint8_t cntHistory; bool loaded; bool pending; bool forceFinish; bool model4485; private: void event() override; void flipCnt(); void flipFake(); void doStartSdr(); void syncCntHistory(); public: explicit SerialPort(EventScheduler &scheduler, MOS652X &parent) : Event("Serial Port interrupt"), parent(parent), eventScheduler(scheduler), flipCntEvent("flip CNT", *this, &SerialPort::flipCnt), flipFakeEvent("flip fake", *this, &SerialPort::flipFake), startSdrEvent("start SDR", *this, &SerialPort::doStartSdr), model4485(false) {} void reset(); void setModel4485(bool is4485) { model4485 = is4485; } void startSdr(); void switchSerialDirection(bool input); void handle(); }; } #endif // SERIALPORT_H libsidplayfp-2.6.0/src/c64/CIA/tod.cpp0000644000175100001770000001467014544470307014216 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2009-2023 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "tod.h" #include #include "mos652x.h" namespace libsidplayfp { void Tod::reset() { cycles = 0; todtickcounter = 0; memset(clock, 0, sizeof(clock)); clock[HOURS] = 1; // the most common value memcpy(latch, clock, sizeof(latch)); memset(alarm, 0, sizeof(alarm)); isLatched = false; isStopped = true; eventScheduler.schedule(*this, 0, EVENT_CLOCK_PHI1); } uint8_t Tod::read(uint_least8_t reg) { // TOD clock is latched by reading Hours, and released // upon reading Tenths of Seconds. The counter itself // keeps ticking all the time. // Also note that this latching is different from the input one. if (!isLatched) memcpy(latch, clock, sizeof(latch)); if (reg == TENTHS) isLatched = false; else if (reg == HOURS) isLatched = true; return latch[reg]; } void Tod::write(uint_least8_t reg, uint8_t data) { switch (reg) { case TENTHS: // Time Of Day clock 1/10 s data &= 0x0f; break; case SECONDS: // Time Of Day clock sec case MINUTES: // Time Of Day clock min data &= 0x7f; break; case HOURS: // Time Of Day clock hour data &= 0x9f; // force bits 6-5 = 0 break; } bool changed = false; if (crb & 0x80) { // set alarm if (alarm[reg] != data) { changed = true; alarm[reg] = data; } } else { // set time if (reg == TENTHS) { // the tickcounter is kept clear while the clock // is not running and then restarted by writing to the 10th // seconds register. if (isStopped) { todtickcounter = 0; isStopped = false; } } else if (reg == HOURS) { isStopped = true; } if (clock[reg] != data) { // Flip AM/PM on hour 12 on the rising edge of the comparator if ((reg == HOURS) && ((data & 0x1f) == 0x12)) data ^= 0x80; changed = true; clock[reg] = data; } } // check alarm if (changed) { checkAlarm(); } } void Tod::event() { cycles += period; // Fixed precision 25.7 eventScheduler.schedule(*this, cycles >> 7); cycles &= 0x7F; // Just keep the decimal part if (!isStopped) { /* * The divider which divides the 50 or 60 Hz power supply ticks into * 10 Hz uses a 3-bit ring counter, which goes 000, 001, 011, 111, 110, * 100. * For 50 Hz: matches at 110 (like "4") * For 60 Hz: matches at 100 (like "5") * (the middle bit of the match value is CRA7) * After a match there is a 1 tick delay (until the next power supply * tick) and then the 1/10 seconds counter increases, and the ring * resets to 000. */ // todtickcounter bits are mirrored to save an ANDing if (todtickcounter == (0x1 | ((cra & 0x80) >> 6))) { // reset the counter and update the timer todtickcounter = 0; updateCounters(); } else { // Count 50/60 Hz power supply ticks todtickcounter = (todtickcounter >> 1) | ((~todtickcounter << 2) & 0x4); } } } void Tod::updateCounters() { // advance the counters. // - individual counters are 4 bit // except for sh and mh which are 3 bits uint8_t ts = clock[TENTHS] & 0x0f; uint8_t sl = clock[SECONDS] & 0x0f; uint8_t sh = (clock[SECONDS] >> 4) & 0x07; uint8_t ml = clock[MINUTES] & 0x0f; uint8_t mh = (clock[MINUTES] >> 4) & 0x07; uint8_t hl = clock[HOURS] & 0x0f; uint8_t hh = (clock[HOURS] >> 4) & 0x01; uint8_t pm = clock[HOURS] & 0x80; // tenth seconds (0-9) ts = (ts + 1) & 0x0f; if (ts == 10) { ts = 0; // seconds (0-59) sl = (sl + 1) & 0x0f; // x0...x9 if (sl == 10) { sl = 0; sh = (sh + 1) & 0x07; // 0x...5x if (sh == 6) { sh = 0; // minutes (0-59) ml = (ml + 1) & 0x0f; // x0...x9 if (ml == 10) { ml = 0; mh = (mh + 1) & 0x07; // 0x...5x if (mh == 6) { mh = 0; // hours (1-12) // flip from 09:59:59 to 10:00:00 // or from 12:59:59 to 01:00:00 if (((hl == 2) && (hh == 1)) || ((hl == 9) && (hh == 0))) { hl = hh; hh ^= 1; } else { hl = (hl + 1) & 0x0f; // toggle the am/pm flag when reaching 12 if ((hl == 2) && (hh == 1)) { pm ^= 0x80; } } } } } } } clock[TENTHS] = ts; clock[SECONDS] = sl | (sh << 4); clock[MINUTES] = ml | (mh << 4); clock[HOURS] = hl | (hh << 4) | pm; checkAlarm(); } void Tod::checkAlarm() { if (!memcmp(alarm, clock, sizeof(alarm))) { parent.todInterrupt(); } } } libsidplayfp-2.6.0/src/c64/CIA/mos652x.cpp0000644000175100001770000001627714544470307014660 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "mos652x.h" #include #include "sidendian.h" namespace libsidplayfp { enum { PRA = 0, PRB = 1, DDRA = 2, DDRB = 3, TAL = 4, TAH = 5, TBL = 6, TBH = 7, TOD_TEN = 8, TOD_SEC = 9, TOD_MIN = 10, TOD_HR = 11, SDR = 12, ICR = 13, IDR = 13, CRA = 14, CRB = 15 }; // Timer A void TimerA::underFlow() { parent.underflowA(); } void TimerA::serialPort() { parent.handleSerialPort(); } // Timer B void TimerB::underFlow() { parent.underflowB(); } // Interrupt Source 8521 void InterruptSource8521::trigger(uint8_t interruptMask) { if (InterruptSource::isTriggered(interruptMask)) { schedule(0); } } // Interrupt Source 6526 void InterruptSource6526::trigger(uint8_t interruptMask) { if (InterruptSource::isTriggered(interruptMask)) { // interrupts are delayed by 1 clk on old CIAs schedule(1); } // if timer B underflows during the acknowledge cycle // it triggers an interrupt as expected // but the second bit in icr is not set if ((interruptMask == INTERRUPT_UNDERFLOW_B) && ack0()) { idr &= ~INTERRUPT_UNDERFLOW_B; idrTemp &= ~INTERRUPT_UNDERFLOW_B; } } uint8_t InterruptSource6526::clear() { uint8_t oldIdr = InterruptSource::clear(); idr &= INTERRUPT_REQUEST; return oldIdr; } const char *MOS652X::credits() { return "MOS6526/8521 (CIA) Emulation:\n" "\tCopyright (C) 2001-2004 Simon White\n" "\tCopyright (C) 2007-2010 Antti S. Lankila\n" "\tCopyright (C) 2009-2014 VICE Project\n" "\tCopyright (C) 2011-2021 Leandro Nini\n"; } MOS652X::MOS652X(EventScheduler &scheduler) : eventScheduler(scheduler), pra(regs[PRA]), prb(regs[PRB]), ddra(regs[DDRA]), ddrb(regs[DDRB]), timerA(scheduler, *this), timerB(scheduler, *this), interruptSource(new InterruptSource6526(scheduler, *this)), tod(scheduler, *this, regs), serialPort(scheduler, *this), bTickEvent("CIA B counts A", *this, &MOS652X::bTick) { reset(); } void MOS652X::handleSerialPort() { if (regs[CRA] & 0x40) { serialPort.handle(); } } void MOS652X::reset() { memset(regs, 0, sizeof(regs)); serialPort.reset(); // Reset timers timerA.reset(); timerB.reset(); // Reset interruptSource interruptSource->reset(); // Reset tod tod.reset(); eventScheduler.cancel(bTickEvent); } uint8_t MOS652X::adjustDataPort(uint8_t data) { if (regs[CRA] & 0x02) { data &= 0xbf; if (timerA.getPb(regs[CRA])) data |= 0x40; } if (regs[CRB] & 0x02) { data &= 0x7f; if (timerB.getPb(regs[CRB])) data |= 0x80; } return data; } uint8_t MOS652X::read(uint_least8_t addr) { addr &= 0x0f; timerA.syncWithCpu(); timerA.wakeUpAfterSyncWithCpu(); timerB.syncWithCpu(); timerB.wakeUpAfterSyncWithCpu(); switch (addr) { case PRA: // Simulate a serial port return (regs[PRA] | ~regs[DDRA]); case PRB: return adjustDataPort(regs[PRB] | ~regs[DDRB]); case TAL: return endian_16lo8(timerA.getTimer()); case TAH: return endian_16hi8(timerA.getTimer()); case TBL: return endian_16lo8(timerB.getTimer()); case TBH: return endian_16hi8(timerB.getTimer()); case TOD_TEN: case TOD_SEC: case TOD_MIN: case TOD_HR: return tod.read(addr - TOD_TEN); case IDR: return interruptSource->clear(); case CRA: return (regs[CRA] & 0xee) | (timerA.getState() & 1); case CRB: return (regs[CRB] & 0xee) | (timerB.getState() & 1); default: return regs[addr]; } } void MOS652X::write(uint_least8_t addr, uint8_t data) { addr &= 0x0f; timerA.syncWithCpu(); timerB.syncWithCpu(); const uint8_t oldData = regs[addr]; regs[addr] = data; switch (addr) { case PRA: case DDRA: portA(); break; case PRB: case DDRB: portB(); break; case TAL: timerA.latchLo(data); break; case TAH: timerA.latchHi(data); break; case TBL: timerB.latchLo(data); break; case TBH: timerB.latchHi(data); break; case TOD_TEN: case TOD_SEC: case TOD_MIN: case TOD_HR: tod.write(addr - TOD_TEN, data); break; case SDR: serialPort.startSdr(); break; case ICR: interruptSource->set(data); break; case CRA: if ((data ^ oldData) & 0x40) serialPort.switchSerialDirection((data & 0x40) == 0); if ((data & 1) && !(oldData & 1)) { // Reset the underflow flipflop for the data port timerA.setPbToggle(true); } timerA.setControlRegister(data); break; case CRB: if ((data & 1) && !(oldData & 1)) { // Reset the underflow flipflop for the data port timerB.setPbToggle(true); } timerB.setControlRegister(data | (data & 0x40) >> 1); break; } timerA.wakeUpAfterSyncWithCpu(); timerB.wakeUpAfterSyncWithCpu(); } void MOS652X::bTick() { timerB.cascade(); } void MOS652X::underflowA() { interruptSource->trigger(InterruptSource::INTERRUPT_UNDERFLOW_A); if ((regs[CRB] & 0x41) == 0x41) { if (timerB.started()) { eventScheduler.schedule(bTickEvent, 0, EVENT_CLOCK_PHI2); } } } void MOS652X::underflowB() { interruptSource->trigger(InterruptSource::INTERRUPT_UNDERFLOW_B); } void MOS652X::todInterrupt() { interruptSource->trigger(InterruptSource::INTERRUPT_ALARM); } void MOS652X::spInterrupt() { interruptSource->trigger(InterruptSource::INTERRUPT_SP); } void MOS652X::setModel(model_t model) { switch (model) { case MOS6526W4485: case MOS6526: serialPort.setModel4485(model == MOS6526W4485); interruptSource.reset(new InterruptSource6526(eventScheduler, *this)); break; case MOS8521: serialPort.setModel4485(false); interruptSource.reset(new InterruptSource8521(eventScheduler, *this)); break; } } } libsidplayfp-2.6.0/src/c64/CIA/timer.cpp0000644000175100001770000001023014544470307014534 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "timer.h" #include "sidendian.h" namespace libsidplayfp { void Timer::setControlRegister(uint8_t cr) { state &= ~CIAT_CR_MASK; state |= (cr & CIAT_CR_MASK) ^ CIAT_PHI2IN; lastControlValue = cr; } void Timer::syncWithCpu() { if (ciaEventPauseTime > 0) { eventScheduler.cancel(m_cycleSkippingEvent); const event_clock_t elapsed = eventScheduler.getTime(EVENT_CLOCK_PHI2) - ciaEventPauseTime; // It's possible for CIA to determine that it wants to go to sleep starting from the next // cycle, and then have its plans aborted by CPU. Thus, we must avoid modifying // the CIA state if the first sleep clock was still in the future. if (elapsed >= 0) { timer -= elapsed; clock(); } } if (ciaEventPauseTime == 0) { eventScheduler.cancel(*this); } ciaEventPauseTime = -1; } void Timer::wakeUpAfterSyncWithCpu() { ciaEventPauseTime = 0; eventScheduler.schedule(*this, 0, EVENT_CLOCK_PHI1); } void Timer::event() { clock(); reschedule(); } void Timer::cycleSkippingEvent() { const event_clock_t elapsed = eventScheduler.getTime(EVENT_CLOCK_PHI1) - ciaEventPauseTime; ciaEventPauseTime = 0; timer -= elapsed; event(); } void Timer::clock() { if ((state & CIAT_COUNT3) != 0) { timer--; } /* ciatimer.c block start */ int_least32_t adj = state & (CIAT_CR_START | CIAT_CR_ONESHOT | CIAT_PHI2IN); if ((state & (CIAT_CR_START | CIAT_PHI2IN)) == (CIAT_CR_START | CIAT_PHI2IN)) { adj |= CIAT_COUNT2; } if ((state & CIAT_COUNT2) != 0 || (state & (CIAT_STEP | CIAT_CR_START)) == (CIAT_STEP | CIAT_CR_START)) { adj |= CIAT_COUNT3; } // CR_FLOAD -> LOAD1, CR_ONESHOT -> ONESHOT0, LOAD1 -> LOAD, ONESHOT0 -> ONESHOT adj |= (state & (CIAT_CR_FLOAD | CIAT_CR_ONESHOT | CIAT_LOAD1 | CIAT_ONESHOT0)) << 8; state = adj; /* ciatimer.c block end */ if ((timer == 0) && ((state & CIAT_COUNT3) != 0)) { state |= CIAT_LOAD | CIAT_OUT; if ((state & (CIAT_ONESHOT | CIAT_ONESHOT0)) != 0) { state &= ~(CIAT_CR_START | CIAT_COUNT2); } // By setting bits 2&3 of the control register, // PB6/PB7 will be toggled between high and low at each underflow. const bool toggle = (lastControlValue & 0x06) == 6; pbToggle = toggle && !pbToggle; // Implementation of the serial port serialPort(); // Timer A signals underflow handling: IRQ/B-count underFlow(); } if ((state & CIAT_LOAD) != 0) { timer = latch; state &= ~CIAT_COUNT3; } } void Timer::reset() { eventScheduler.cancel(*this); timer = latch = 0xffff; pbToggle = false; state = 0; lastControlValue = 0; ciaEventPauseTime = 0; eventScheduler.schedule(*this, 1, EVENT_CLOCK_PHI1); } void Timer::latchLo(uint8_t data) { endian_16lo8(latch, data); if ((state & CIAT_LOAD) != 0) timer = latch; } void Timer::latchHi(uint8_t data) { endian_16hi8(latch, data); if ((state & CIAT_LOAD) != 0) timer = latch; // Reload timer if stopped else if ((state & CIAT_CR_START) == 0) state |= CIAT_LOAD1; } } libsidplayfp-2.6.0/src/c64/CIA/interrupt.cpp0000644000175100001770000000523514544470307015461 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "interrupt.h" #include "mos652x.h" namespace libsidplayfp { void InterruptSource::interrupt() { if (!interruptTriggered()) { triggerInterrupt(); setIrq(); } scheduled = false; } void InterruptSource::updateIdr() { idr = idrTemp; if (ack0()) { eventScheduler.schedule(updateIdrEvent, 1, EVENT_CLOCK_PHI1); idrTemp = 0; } } void InterruptSource::setIrq() { if (!ack0()) { if (!asserted) { parent.interrupt(true); asserted = true; } } } void InterruptSource::clearIrq() { if (asserted) { parent.interrupt(false); asserted = false; } } bool InterruptSource::isTriggered(uint8_t interruptMask) { idr |= interruptMask; idrTemp |= interruptMask; if (interruptMasked(interruptMask)) return true; if ((interruptMask == INTERRUPT_NONE) && write0()) { // cancel pending interrupts if (scheduled) { eventScheduler.cancel(interruptEvent); scheduled = false; } } return false; } void InterruptSource::set(uint8_t interruptMask) { if (interruptMask & INTERRUPT_REQUEST) { icr |= interruptMask & ~INTERRUPT_REQUEST; } else { icr &= ~interruptMask; } if (!ack0()) trigger(INTERRUPT_NONE); last_set = eventScheduler.getTime(EVENT_CLOCK_PHI2); } uint8_t InterruptSource::clear() { last_clear = eventScheduler.getTime(EVENT_CLOCK_PHI2); eventScheduler.schedule(clearIrqEvent, 0, EVENT_CLOCK_PHI1); if (!eventScheduler.isPending(updateIdrEvent)) { eventScheduler.schedule(updateIdrEvent, 1, EVENT_CLOCK_PHI1); idrTemp = 0; } return idr; } } libsidplayfp-2.6.0/src/c64/CIA/tod.h0000644000175100001770000000507014544470307013655 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2018 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef TOD_H #define TOD_H #include #include "EventScheduler.h" namespace libsidplayfp { class MOS652X; /** * TOD implementation taken from Vice. */ class Tod : private Event { private: enum { TENTHS = 0, SECONDS = 1, MINUTES = 2, HOURS = 3 }; private: /// Event scheduler. EventScheduler &eventScheduler; /// Pointer to the MOS6526 which this Timer belongs to. MOS652X &parent; const uint8_t &cra; const uint8_t &crb; event_clock_t cycles; event_clock_t period; unsigned int todtickcounter; bool isLatched; bool isStopped; uint8_t clock[4]; uint8_t latch[4]; uint8_t alarm[4]; private: inline void checkAlarm(); inline void updateCounters(); void event(); public: Tod(EventScheduler &scheduler, MOS652X &parent, uint8_t regs[0x10]) : Event("CIA Time of Day"), eventScheduler(scheduler), parent(parent), cra(regs[0x0e]), crb(regs[0x0f]), period(~0), // Dummy todtickcounter(0) {} /** * Reset TOD. */ void reset(); /** * Read TOD register. * * @param addr * register register to read */ uint8_t read(uint_least8_t reg); /** * Write TOD register. * * @param addr * register to write * @param data * value to write */ void write(uint_least8_t reg, uint8_t data); /** * Set TOD period. * * @param clock */ void setPeriod(event_clock_t clock) { period = clock * (1 << 7); } }; } #endif libsidplayfp-2.6.0/src/c64/CIA/timer.h0000644000175100001770000001672514544470307014220 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2013 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef TIMER_H #define TIMER_H #include #include "Event.h" #include "EventCallback.h" #include "EventScheduler.h" #include "sidcxx11.h" namespace libsidplayfp { class MOS652X; /** * This is the base class for the MOS6526 timers. */ class Timer : private Event { protected: static const int_least32_t CIAT_CR_START = 0x01; static const int_least32_t CIAT_STEP = 0x04; static const int_least32_t CIAT_CR_ONESHOT = 0x08; static const int_least32_t CIAT_CR_FLOAD = 0x10; static const int_least32_t CIAT_PHI2IN = 0x20; static const int_least32_t CIAT_CR_MASK = CIAT_CR_START | CIAT_CR_ONESHOT | CIAT_CR_FLOAD | CIAT_PHI2IN; static const int_least32_t CIAT_COUNT2 = 0x100; static const int_least32_t CIAT_COUNT3 = 0x200; static const int_least32_t CIAT_ONESHOT0 = 0x08 << 8; static const int_least32_t CIAT_ONESHOT = 0x08 << 16; static const int_least32_t CIAT_LOAD1 = 0x10 << 8; static const int_least32_t CIAT_LOAD = 0x10 << 16; static const int_least32_t CIAT_OUT = 0x80000000; private: EventCallback m_cycleSkippingEvent; /// Event context. EventScheduler &eventScheduler; /** * This is a tri-state: * * - when -1: cia is completely stopped * - when 0: cia 1-clock events are ticking. * - otherwise: cycle skip event is ticking, and the value is the first * phi1 clock of skipping. */ event_clock_t ciaEventPauseTime; /// PB6/PB7 Flipflop to signal underflows. bool pbToggle; /// Current timer value. uint_least16_t timer; /// Timer start value (Latch). uint_least16_t latch; /// Copy of regs[CRA/B] uint8_t lastControlValue; protected: /// Pointer to the MOS6526 which this Timer belongs to. MOS652X &parent; /// CRA/CRB control register / state. int_least32_t state; private: /** * Perform scheduled cycle skipping, and resume. */ void cycleSkippingEvent(); /** * Execute one CIA state transition. */ void clock(); /** * Reschedule CIA event at the earliest interesting time. * If CIA timer is stopped or is programmed to just count down, * the events are paused. */ inline void reschedule(); /** * Timer ticking event. */ void event() override; /** * Signal timer underflow. */ virtual void underFlow() =0; /** * Handle the serial port. */ virtual void serialPort() {} protected: /** * Create a new timer. * * @param name component name * @param context event context * @param parent the MOS6526 which this Timer belongs to */ Timer(const char* name, EventScheduler &scheduler, MOS652X &parent) : Event(name), m_cycleSkippingEvent("Skip CIA clock decrement cycles", *this, &Timer::cycleSkippingEvent), eventScheduler(scheduler), pbToggle(false), timer(0), latch(0), lastControlValue(0), parent(parent), state(0) {} public: /** * Set CRA/CRB control register. * * @param cr control register value */ void setControlRegister(uint8_t cr); /** * Perform cycle skipping manually. * * Clocks the CIA up to the state it should be in, and stops all events. */ void syncWithCpu(); /** * Counterpart of syncWithCpu(), * starts the event ticking if it is needed. * No clock() call or anything such is permissible here! */ void wakeUpAfterSyncWithCpu(); /** * Reset timer. */ void reset(); /** * Set low byte of Timer start value (Latch). * * @param data * low byte of latch */ void latchLo(uint8_t data); /** * Set high byte of Timer start value (Latch). * * @param data * high byte of latch */ void latchHi(uint8_t data); /** * Set PB6/PB7 Flipflop state. * * @param state * PB6/PB7 flipflop state */ inline void setPbToggle(bool state) { pbToggle = state; } /** * Get current state value. * * @return current state value */ inline int_least32_t getState() const { return state; } /** * Get current timer value. * * @return current timer value */ inline uint_least16_t getTimer() const { return timer; } /** * Get PB6/PB7 Flipflop state. * * @param reg value of the control register * @return PB6/PB7 flipflop state */ inline bool getPb(uint8_t reg) const { return (reg & 0x04) ? pbToggle : (state & CIAT_OUT); } }; void Timer::reschedule() { // There are only two subcases to consider. // // - are we counting, and if so, are we going to // continue counting? // - have we stopped, and are there no conditions to force a new beginning? // // Additionally, there are numerous flags that are present only in passing manner, // but which we need to let cycle through the CIA state machine. const int_least32_t unwanted = CIAT_OUT | CIAT_CR_FLOAD | CIAT_LOAD1 | CIAT_LOAD; if ((state & unwanted) != 0) { eventScheduler.schedule(*this, 1); return; } if ((state & CIAT_COUNT3) != 0) { // Test the conditions that keep COUNT2 and thus COUNT3 alive, and also // ensure that all of them are set indicating steady state operation. const int_least32_t wanted = CIAT_CR_START | CIAT_PHI2IN | CIAT_COUNT2 | CIAT_COUNT3; if (timer > 2 && (state & wanted) == wanted) { // we executed this cycle, therefore the pauseTime is +1. If we are called // to execute on the very next clock, we need to get 0 because there's // another timer-- in it. ciaEventPauseTime = eventScheduler.getTime(EVENT_CLOCK_PHI1) + 1; // execute event slightly before the next underflow. eventScheduler.schedule(m_cycleSkippingEvent, timer - 1); return; } // play safe, keep on ticking. eventScheduler.schedule(*this, 1); } else { // Test conditions that result in CIA activity in next clocks. // If none, stop. const int_least32_t unwanted1 = CIAT_CR_START | CIAT_PHI2IN; const int_least32_t unwanted2 = CIAT_CR_START | CIAT_STEP; if ((state & unwanted1) == unwanted1 || (state & unwanted2) == unwanted2) { eventScheduler.schedule(*this, 1); return; } ciaEventPauseTime = -1; } } } #endif // TIMER_H libsidplayfp-2.6.0/src/c64/CIA/mos652x.h0000644000175100001770000001467514544470307014325 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef MOS652X_H #define MOS652X_H #include #include #include "interrupt.h" #include "timer.h" #include "tod.h" #include "SerialPort.h" #include "EventScheduler.h" #include "sidcxx11.h" class EventContext; namespace libsidplayfp { class MOS652X; /** * This is the timer A of this CIA. * * @author Ken Händel * */ class TimerA final : public Timer { private: /** * Signal underflows of Timer A to Timer B. */ void underFlow() override; void serialPort() override; public: /** * Create timer A. */ TimerA(EventScheduler &scheduler, MOS652X &parent) : Timer("CIA Timer A", scheduler, parent) {} }; /** * This is the timer B of this CIA. * * @author Ken Händel * */ class TimerB final : public Timer { private: void underFlow() override; public: /** * Create timer B. */ TimerB(EventScheduler &scheduler, MOS652X &parent) : Timer("CIA Timer B", scheduler, parent) {} /** * Receive an underflow from Timer A. */ void cascade() { // we pretend that we are CPU doing a write to ctrl register syncWithCpu(); state |= CIAT_STEP; wakeUpAfterSyncWithCpu(); } /** * Check if start flag is set. * * @return true if start flag is set, false otherwise */ bool started() const { return (state & CIAT_CR_START) != 0; } }; /** * InterruptSource that acts like new CIA */ class InterruptSource8521 final : public InterruptSource { protected: void triggerInterrupt() override { idr |= INTERRUPT_REQUEST; idrTemp |= INTERRUPT_REQUEST; if (ack0()) scheduleIrq(); } public: InterruptSource8521(EventScheduler &scheduler, MOS652X &parent) : InterruptSource(scheduler, parent) {} void trigger(uint8_t interruptMask) override; }; /** * InterruptSource that acts like old CIA */ class InterruptSource6526 final : public InterruptSource { protected: void triggerInterrupt() override { idr |= INTERRUPT_REQUEST; } public: InterruptSource6526(EventScheduler &scheduler, MOS652X &parent) : InterruptSource(scheduler, parent) {} void trigger(uint8_t interruptMask) override; uint8_t clear() override; }; /** * This class is heavily based on the ciacore/ciatimer source code from VICE. * The CIA state machine is lifted as-is. Big thanks to VICE project! * The Serial Port emulation is based on Denise emu code. */ class MOS652X { friend class InterruptSource; friend class SerialPort; friend class TimerA; friend class TimerB; friend class Tod; public: typedef enum { MOS6526 = 0 ///< Old CIA model, interrupts are delayed by 1 clock ,MOS8521 ///< New CIA model ,MOS6526W4485 ///< A batch of old CIA model with unique serial port behavior } model_t; private: static const char *credit; protected: /// Event context. EventScheduler &eventScheduler; /// Ports //@{ uint8_t &pra, &prb, &ddra, &ddrb; //@} /// These are all CIA registers. uint8_t regs[0x10]; /// Timers A and B. //@{ TimerA timerA; TimerB timerB; //@} /// Interrupt Source std::unique_ptr interruptSource; /// TOD Tod tod; /// Serial Data Registers SerialPort serialPort; /// Events //@{ EventCallback bTickEvent; //@} private: /** * Trigger an interrupt from TOD. */ void todInterrupt(); /** * Trigger an interrupt from Serial Port. */ void spInterrupt(); /** * This event exists solely to break the ambiguity of what scheduling on * top of PHI1 causes, because there is no ordering between events on * same phase. Thus it is scheduled in PHI2 to ensure the b.event() is * run once before the value changes. * * - PHI1 a.event() (which calls underFlow()) * - PHI1 b.event() * - PHI2 bTick.event() * - PHI1 a.event() * - PHI1 b.event() */ void bTick(); /** * Timer A underflow. */ void underflowA(); /** Timer B underflow. */ void underflowB(); /** * Handle the serial port. */ void handleSerialPort(); protected: /** * Create a new CIA. * * @param context the event context */ MOS652X(EventScheduler &scheduler); /** * Signal interrupt. * * @param state * interrupt state */ virtual void interrupt(bool state) = 0; virtual void portA() {} virtual void portB() {} /** * Timers can appear on the port. */ uint8_t adjustDataPort(uint8_t data); /** * Read CIA register. * * @param addr * register address to read (lowest 4 bits) */ uint8_t read(uint_least8_t addr); /** * Write CIA register. * * @param addr * register address to write (lowest 4 bits) * @param data * value to write */ void write(uint_least8_t addr, uint8_t data); public: /** * Select chip model. * * @param model */ void setModel(model_t model); /** * Reset CIA. */ virtual void reset(); /** * Get the credits. * * @return the credits */ static const char *credits(); /** * Set day-of-time event occurence of rate. * * @param clock */ void setDayOfTimeRate(unsigned int clock) { tod.setPeriod(clock); } }; } #endif // MOS6526_H libsidplayfp-2.6.0/src/c64/CIA/SerialPort.cpp0000644000175100001770000000631714544470307015513 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "interrupt.h" #include "mos652x.h" namespace libsidplayfp { void SerialPort::reset() { count = 0; cntHistory = 0; cnt = 1; loaded = false; pending = false; forceFinish = false; lastSync = eventScheduler.getTime(EVENT_CLOCK_PHI1); } void SerialPort::event() { parent.spInterrupt(); } void SerialPort::syncCntHistory() { const event_clock_t time = eventScheduler.getTime(EVENT_CLOCK_PHI1); const event_clock_t clocks = time - lastSync; lastSync = time; for (int i=0; i * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef INTERRUPT_H #define INTERRUPT_H #include "Event.h" #include "EventScheduler.h" #include "EventCallback.h" #include #include "sidcxx11.h" namespace libsidplayfp { class MOS652X; /** * This is the base class for the MOS6526 interrupt sources. * Based on Denise emu code. */ class InterruptSource { public: enum { INTERRUPT_NONE = 0, ///< no interrupt INTERRUPT_UNDERFLOW_A = 1 << 0, ///< underflow Timer A INTERRUPT_UNDERFLOW_B = 1 << 1, ///< underflow Timer B INTERRUPT_ALARM = 1 << 2, ///< alarm clock INTERRUPT_SP = 1 << 3, ///< serial port INTERRUPT_FLAG = 1 << 4, ///< external flag INTERRUPT_REQUEST = 1 << 7 ///< control bit }; private: /// Pointer to the MOS6526 which this Interrupt belongs to. MOS652X &parent; protected: /// Event scheduler. EventScheduler &eventScheduler; /// Clock when clear was called last event_clock_t last_clear; event_clock_t last_set; /// Interrupt control register uint8_t icr; /// Interrupt data register uint8_t idr; uint8_t idrTemp; /// Have we already scheduled CIA->CPU interrupt transition? bool scheduled; /// is the irq pin asserted? bool asserted; private: EventCallback interruptEvent; EventCallback updateIdrEvent; EventCallback setIrqEvent; EventCallback clearIrqEvent; protected: inline bool interruptTriggered() const { return idr & INTERRUPT_REQUEST; } inline bool interruptMasked(uint8_t interruptMask) const { return ((interruptMask != INTERRUPT_NONE) ? interruptMask : idr) & icr; } virtual void triggerInterrupt() =0; /** * Check if interrupts were ackowledged during previous cycle. */ inline bool ack0() const { return eventScheduler.getTime(EVENT_CLOCK_PHI2) == (last_clear+1); } inline bool write0() const { return eventScheduler.getTime(EVENT_CLOCK_PHI2) == (last_set+1); } /** * Signal interrupt to CPU. */ void interrupt(); void updateIdr(); void setIrq(); void clearIrq(); protected: /** * Create a new InterruptSource. * * @param scheduler event scheduler * @param parent the CIA chip which this Interrupt belongs to */ InterruptSource(EventScheduler &scheduler, MOS652X &parent) : parent(parent), eventScheduler(scheduler), last_clear(0), last_set(0), icr(0), idr(0), scheduled(false), asserted(false), interruptEvent("CIA Interrupt", *this, &InterruptSource::interrupt), updateIdrEvent("CIA update ICR", *this, &InterruptSource::updateIdr), setIrqEvent("CIA set IRQ", *this, &InterruptSource::setIrq), clearIrqEvent("CIA clear IRQ", *this, &InterruptSource::clearIrq) {} /** * Schedules an IRQ asserting state transition for next cycle. */ void schedule(int delay) { if (!scheduled) { eventScheduler.schedule(interruptEvent, delay, EVENT_CLOCK_PHI1); scheduled = true; } } void scheduleIrq() { eventScheduler.schedule(setIrqEvent, 1, EVENT_CLOCK_PHI1); } bool isTriggered(uint8_t interruptMask); public: virtual ~InterruptSource() {} /** * Trigger an interrupt. * * @param interruptMask Interrupt flag number */ virtual void trigger(uint8_t interruptMask) =0; /** * Clear interrupt state. * * @return old interrupt state */ virtual uint8_t clear(); /** * Clear pending interrupts, but do not signal to CPU we lost them. * It is assumed that all components get reset() calls in synchronous manner. */ virtual void reset() { last_clear = 0; last_set = 0; icr = 0; idr = 0; eventScheduler.cancel(updateIdrEvent); eventScheduler.cancel(setIrqEvent); eventScheduler.cancel(clearIrqEvent); eventScheduler.cancel(interruptEvent); scheduled = false; asserted = false; } /** * Set interrupt control mask bits. * * @param interruptMask control mask bits */ void set(uint8_t interruptMask); }; } #endif // INTERRUPT_H libsidplayfp-2.6.0/src/c64/c64sid.h0000644000175100001770000000330314544470307013564 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2013-2021 Leandro Nini * * 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. */ #ifndef C64SID_H #define C64SID_H #include "Banks/Bank.h" #include "sidcxx11.h" #include #include namespace libsidplayfp { /** * SID interface. */ class c64sid : public Bank { private: uint8_t lastpoke[0x20]; protected: virtual ~c64sid() {} virtual uint8_t read(uint_least8_t addr) = 0; virtual void write(uint_least8_t addr, uint8_t data) = 0; public: virtual void reset(uint8_t volume) = 0; void reset() { memset(lastpoke, 0, 0x20); reset(0); } // Bank functions void poke(uint_least16_t address, uint8_t value) override { lastpoke[address & 0x1f] = value; write(address & 0x1f, value); } uint8_t peek(uint_least16_t address) override { return read(address & 0x1f); } void getStatus(uint8_t regs[0x20]) const { memcpy(regs, lastpoke, 0x20); } }; } #endif // C64SID_H libsidplayfp-2.6.0/src/c64/c64cpu.h0000644000175100001770000000700314544470307013575 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2012-2021 Leandro Nini * * 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 */ #ifndef C64CPU_H #define C64CPU_H #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "c64/c64env.h" #include "CPU/mos6510.h" #ifdef VICE_TESTSUITE # include # include #endif //#define PRINTSCREENCODES #include "sidcxx11.h" namespace libsidplayfp { #ifdef PRINTSCREENCODES /** * Screen codes conversion table (0x01 = no output) */ static const char CHRtab[256] = { 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x01,0x01,0x01,0x01, 0x20,0x21,0x01,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, 0x40,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f, 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x5b,0x24,0x5d,0x20,0x20, // alternative: CHR$(92=0x5c) => ISO Latin-1(0xa3) 0x2d,0x23,0x7c,0x2d,0x2d,0x2d,0x2d,0x7c,0x7c,0x5c,0x5c,0x2f,0x5c,0x5c,0x2f,0x2f, 0x5c,0x23,0x5f,0x23,0x7c,0x2f,0x58,0x4f,0x23,0x7c,0x23,0x2b,0x7c,0x7c,0x26,0x5c, // 0x80-0xFF 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, 0x20,0x7c,0x23,0x2d,0x2d,0x7c,0x23,0x7c,0x23,0x2f,0x7c,0x7c,0x2f,0x5c,0x5c,0x2d, 0x2f,0x2d,0x2d,0x7c,0x7c,0x7c,0x7c,0x2d,0x2d,0x2d,0x2f,0x5c,0x5c,0x2f,0x2f,0x23, 0x20,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x2b,0x7c,0x7c,0x26,0x5c, 0x20,0x7c,0x23,0x2d,0x2d,0x7c,0x23,0x7c,0x23,0x2f,0x7c,0x7c,0x2f,0x5c,0x5c,0x2d, 0x2f,0x2d,0x2d,0x7c,0x7c,0x7c,0x7c,0x2d,0x2d,0x2d,0x2f,0x5c,0x5c,0x2f,0x2f,0x23 }; #endif class c64cpu final : public MOS6510 { private: c64env &m_env; protected: uint8_t cpuRead(uint_least16_t addr) override { return m_env.cpuRead(addr); } void cpuWrite(uint_least16_t addr, uint8_t data) override { #ifdef PRINTSCREENCODES if (addr >= 1024 && addr <= 2047) { std::cout << CHRtab[data]; } #endif #ifdef VICE_TESTSUITE // for VICE tests if (addr == 0xd7ff) { if (data == 0) { std::cout << std::endl << "OK" << std::endl; exit(EXIT_SUCCESS); } else if (data == 0xff) { std::cout << std::endl << "KO" << std::endl; exit(EXIT_FAILURE); } } #endif m_env.cpuWrite(addr, data); } public: c64cpu (c64env &env) : MOS6510(env.scheduler()), m_env(env) {} }; } #endif // C64CPU_H libsidplayfp-2.6.0/src/c64/c64.h0000644000175100001770000001456114544470307013074 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef C64_H #define C64_H #include #include #include #include "Banks/IOBank.h" #include "Banks/ColorRAMBank.h" #include "Banks/DisconnectedBusBank.h" #include "Banks/SidBank.h" #include "Banks/ExtraSidBank.h" #include "EventScheduler.h" #include "c64/c64env.h" #include "c64/c64cpu.h" #include "c64/c64cia.h" #include "c64/c64vic.h" #include "c64/mmu.h" #include "sidcxx11.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif namespace libsidplayfp { class c64sid; class sidmemory; /** * Commodore 64 emulation core. * * It consists of the following chips: * - CPU 6510 * - VIC-II 6567/6569/6572/6573 * - CIA 6526/8521 * - SID 6581/8580 * - PLA 7700/82S100 * - Color RAM 2114 * - System RAM 4164-20/50464-150 * - Character ROM 2332 * - Basic ROM 2364 * - Kernal ROM 2364 */ class c64 final : private c64env { public: typedef enum { PAL_B = 0 ///< PAL C64 ,NTSC_M ///< NTSC C64 ,OLD_NTSC_M ///< Old NTSC C64 ,PAL_N ///< C64 Drean ,PAL_M ///< C64 Brasil } model_t; typedef enum { OLD = 0 ///< Old CIA ,NEW ///< New CIA ,OLD_4485 ///< Old CIA, special batch labeled 4485 } cia_model_t; private: typedef std::map sidBankMap_t; private: /// System clock frequency double cpuFrequency; /// Number of sources asserting IRQ int irqCount; /// BA state bool oldBAState; /// System event context EventScheduler eventScheduler; /// CPU c64cpu cpu; /// CIA1 c64cia1 cia1; /// CIA2 c64cia2 cia2; /// VIC II c64vic vic; /// Color RAM ColorRAMBank colorRAMBank; /// SID SidBank sidBank; /// Extra SIDs sidBankMap_t extraSidBanks; /// I/O Area #1 and #2 DisconnectedBusBank disconnectedBusBank; /// I/O Area IOBank ioBank; /// MMU chip MMU mmu; private: static double getCpuFreq(model_t model); private: /** * Access memory as seen by CPU. * * @param addr the address where to read from * @return value at address */ uint8_t cpuRead(uint_least16_t addr) override { return mmu.cpuRead(addr); } /** * Access memory as seen by CPU. * * @param addr the address where to write to * @param data the value to write */ void cpuWrite(uint_least16_t addr, uint8_t data) override { mmu.cpuWrite(addr, data); } /** * IRQ trigger signal. * * Calls permitted any time, but normally originated by chips at PHI1. * * @param state */ inline void interruptIRQ(bool state) override; /** * NMI trigger signal. * * Calls permitted any time, but normally originated by chips at PHI1. */ inline void interruptNMI() override { cpu.triggerNMI(); } /** * Reset signal. */ inline void interruptRST() override { cpu.triggerRST(); } /** * BA signal. * * Calls permitted during PHI1. * * @param state */ inline void setBA(bool state) override; /** * @param state fire pressed, active low */ inline void lightpen(bool state) override; void resetIoBank(); public: c64(); ~c64(); /** * Get C64's event scheduler * * @return the scheduler */ EventScheduler *getEventScheduler() { return &eventScheduler; } uint_least32_t getTimeMs() const { return static_cast((eventScheduler.getTime(EVENT_CLOCK_PHI1) * 1000) / cpuFrequency); } /** * Clock the emulation. * * @throws haltInstruction */ void clock() { eventScheduler.clock(); } void debug(bool enable, FILE *out) { cpu.debug(enable, out); } void reset(); void resetCpu() { cpu.reset(); } /** * Set the c64 model. */ void setModel(model_t model); /** * Set the cia model. */ void setCiaModel(cia_model_t model); /** * Get the CPU clock speed. * * @return the speed in Hertz */ double getMainCpuSpeed() const { return cpuFrequency; } /** * Set the base SID. * * @param s the sid emu to set */ void setBaseSid(c64sid *s); /** * Add an extra SID. * * @param s the sid emu to set * @param sidAddress * base address (e.g. 0xd420) * * @return false if address is unsupported */ bool addExtraSid(c64sid *s, int address); /** * Remove all the SIDs. */ void clearSids(); /** * Get the components credits */ //@{ const char* cpuCredits() const { return cpu.credits(); } const char* ciaCredits() const { return cia1.credits(); } const char* vicCredits() const { return vic.credits(); } //@} sidmemory& getMemInterface() { return mmu; } uint_least16_t getCia1TimerA() const { return cia1.getTimerA(); } }; void c64::interruptIRQ(bool state) { if (state) { if (irqCount == 0) cpu.triggerIRQ(); irqCount ++; } else { irqCount --; if (irqCount == 0) cpu.clearIRQ(); } } void c64::setBA(bool state) { // only react to changes in state if (state == oldBAState) return; oldBAState = state; // Signal changes in BA to interested parties cpu.setRDY(state); } void c64::lightpen(bool state) { if (!state) vic.triggerLightpen(); else vic.clearLightpen(); } } #endif // C64_H libsidplayfp-2.6.0/src/c64/c64.cpp0000644000175100001770000001257414544470307013431 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2023 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "c64.h" #include #include "c64/CIA/mos652x.h" #include "c64/VIC_II/mos656x.h" namespace libsidplayfp { typedef struct { double colorBurst; ///< Colorburst frequency in Herz double divider; ///< Clock frequency divider double powerFreq; ///< Power line frequency in Herz MOS656X::model_t vicModel; ///< Video chip model } model_data_t; typedef struct { MOS652X::model_t ciaModel; ///< CIA chip model } cia_model_data_t; /* * Color burst frequencies: * * NTSC - 3.579545455 MHz = 315/88 MHz * PAL-B - 4.43361875 MHz = 283.75 * 15625 Hz + 25 Hz. * PAL-M - 3.57561149 MHz * PAL-N - 3.58205625 MHz */ const model_data_t modelData[] = { {4433618.75, 18., 50., MOS656X::MOS6569}, // PAL-B {3579545.455, 14., 60., MOS656X::MOS6567R8}, // NTSC-M {3579545.455, 14., 60., MOS656X::MOS6567R56A}, // Old NTSC-M {3582056.25, 14., 50., MOS656X::MOS6572}, // PAL-N {3575611.49, 14., 50., MOS656X::MOS6573}, // PAL-M }; const cia_model_data_t ciaModelData[] = { {MOS652X::MOS6526}, // Old {MOS652X::MOS8521}, // New {MOS652X::MOS6526W4485}, // Old week 4485 }; double c64::getCpuFreq(model_t model) { // The crystal clock that drives the VIC II chip is four times // the color burst frequency const double crystalFreq = modelData[model].colorBurst * 4.; // The VIC II produces the two-phase system clock // by running the input clock through a divider return crystalFreq / modelData[model].divider; } c64::c64() : c64env(eventScheduler), cpuFrequency(getCpuFreq(PAL_B)), cpu(*this), cia1(*this), cia2(*this), vic(*this), disconnectedBusBank(mmu), mmu(eventScheduler, &ioBank) { resetIoBank(); } void c64::resetIoBank() { ioBank.setBank(0x0, &vic); ioBank.setBank(0x1, &vic); ioBank.setBank(0x2, &vic); ioBank.setBank(0x3, &vic); ioBank.setBank(0x4, &sidBank); ioBank.setBank(0x5, &sidBank); ioBank.setBank(0x6, &sidBank); ioBank.setBank(0x7, &sidBank); ioBank.setBank(0x8, &colorRAMBank); ioBank.setBank(0x9, &colorRAMBank); ioBank.setBank(0xa, &colorRAMBank); ioBank.setBank(0xb, &colorRAMBank); ioBank.setBank(0xc, &cia1); ioBank.setBank(0xd, &cia2); ioBank.setBank(0xe, &disconnectedBusBank); ioBank.setBank(0xf, &disconnectedBusBank); } template void resetSID(T &e) { e.second->reset(); } void c64::reset() { eventScheduler.reset(); //cpu.reset(); cia1.reset(); cia2.reset(); vic.reset(); sidBank.reset(); colorRAMBank.reset(); mmu.reset(); std::for_each(extraSidBanks.begin(), extraSidBanks.end(), resetSID); irqCount = 0; oldBAState = true; } void c64::setModel(model_t model) { cpuFrequency = getCpuFreq(model); vic.chip(modelData[model].vicModel); const unsigned int rate = cpuFrequency / modelData[model].powerFreq; cia1.setDayOfTimeRate(rate); cia2.setDayOfTimeRate(rate); } void c64::setCiaModel(cia_model_t model) { cia1.setModel(ciaModelData[model].ciaModel); cia2.setModel(ciaModelData[model].ciaModel); } void c64::setBaseSid(c64sid *s) { sidBank.setSID(s); } bool c64::addExtraSid(c64sid *s, int address) { // Check for valid address in the IO area range ($dxxx) if ((address & 0xf000) != 0xd000) return false; const int idx = (address >> 8) & 0xf; // Only allow second SID chip in SID area ($d400-$d7ff) // or IO Area ($de00-$dfff) if ((idx < 0x4) || ((idx > 0x7) && (idx < 0xe))) return false; // Add new SID bank sidBankMap_t::iterator it = extraSidBanks.find(idx); if (it != extraSidBanks.end()) { ExtraSidBank *extraSidBank = it->second; extraSidBank->addSID(s, address); } else { ExtraSidBank *extraSidBank = extraSidBanks.insert(it, sidBankMap_t::value_type(idx, new ExtraSidBank()))->second; extraSidBank->resetSIDMapper(ioBank.getBank(idx)); ioBank.setBank(idx, extraSidBank); extraSidBank->addSID(s, address); } return true; } template void Delete(T &s) { delete s.second; } c64::~c64() { std::for_each(extraSidBanks.begin(), extraSidBanks.end(), Delete); extraSidBanks.clear(); } void c64::clearSids() { sidBank.setSID(nullptr); resetIoBank(); std::for_each(extraSidBanks.begin(), extraSidBanks.end(), Delete); extraSidBanks.clear(); } } libsidplayfp-2.6.0/src/c64/VIC_II/0000755000175100001770000000000014544470322013377 500000000000000libsidplayfp-2.6.0/src/c64/VIC_II/lightpen.h0000644000175100001770000000755614544470307015322 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef LIGHTPEN_H #define LIGHTPEN_H namespace libsidplayfp { /** * Lightpen emulation. * Does not reflect model differences. */ class Lightpen { private: /// Last VIC raster line unsigned int lastLine; /// VIC cycles per line unsigned int cyclesPerLine; /// X coordinate unsigned int lpx; /// Y coordinate unsigned int lpy; /// Has light pen IRQ been triggered in this frame already? bool isTriggered; private: /** * Transform line cycle into x coordinate. * * @param lineCycle * @return x position divided by two */ uint8_t getXpos(unsigned int lineCycle) const { if (lineCycle < 13) lineCycle += cyclesPerLine; lineCycle -= 13; // On NTSC the xpos is not incremented at lineCycle 61 if ((cyclesPerLine == 65) && (lineCycle > (61 - 13))) { lineCycle--; } return lineCycle << 2; } public: /** * Set VIC screen size. * * @param height number of raster lines * @param width number of cycles per line */ void setScreenSize(unsigned int height, unsigned int width) { lastLine = height - 1; cyclesPerLine = width; } /** * Reset the lightpen. */ void reset() { lpx = 0; lpy = 0; isTriggered = false; } /** * Return the low byte of x coordinate. */ uint8_t getX() const { return lpx; } /** * Return the low byte of y coordinate. */ uint8_t getY() const { return lpy; } /** * Retrigger lightpen on vertical blank. * * @return true if an IRQ should be triggered */ bool retrigger() { if (isTriggered) return false; isTriggered = true; switch (cyclesPerLine) { case 63: default: lpx = 0xd1; break; case 65: lpx = 0xd5; break; } lpy = 0; return true; } /** * Trigger lightpen from CIA. * * @param lineCycle current line cycle * @param rasterY current y raster position * @return true if an IRQ should be triggered */ bool trigger(unsigned int lineCycle, unsigned int rasterY) { if (isTriggered) return false; isTriggered = true; // don't latch on the last line, except on the first cycle if ((rasterY == lastLine) && (lineCycle > 0)) { return false; } // Latch current coordinates lpx = getXpos(lineCycle) + 2; // + 1 for MOS 85XX lpy = rasterY; // On 6569R1 and 6567R56A the interrupt is triggered only // when the line is low on the first cycle of the frame. return true; // false for old chip revisions } /** * Untrigger lightpen from CIA. */ void untrigger() { isTriggered = false; } }; } #endif libsidplayfp-2.6.0/src/c64/VIC_II/sprites.h0000644000175100001770000001000114544470307015154 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2014 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef SPRITES_H #define SPRITES_H #include #include #define SPRITES 8 namespace libsidplayfp { /** * Sprites handling. */ class Sprites { private: const uint8_t &enable, &y_expansion; uint8_t exp_flop; uint8_t dma; uint8_t mc_base[SPRITES]; uint8_t mc[SPRITES]; public: Sprites(uint8_t regs[0x40]) : enable(regs[0x15]), y_expansion(regs[0x17]) {} void reset() { exp_flop = 0xff; dma = 0; memset(mc_base, 0, sizeof(mc_base)); memset(mc, 0, sizeof(mc)); } /** * Update mc values in one pass * after the dma has been processed */ void updateMc() { uint8_t mask = 1; for (unsigned int i = 0; i < SPRITES; i++, mask <<= 1) { if (dma & mask) mc[i] = (mc[i] + 3) & 0x3f; } } /** * Update mc base value. */ void updateMcBase() { uint8_t mask = 1; for (unsigned int i = 0; i < SPRITES; i++, mask <<= 1) { if (exp_flop & mask) { mc_base[i] = mc[i]; if (mc_base[i] == 0x3f) dma &= ~mask; } } } /** * Calculate sprite expansion. */ void checkExp() { exp_flop ^= dma & y_expansion; } /** * Check if sprite is displayed. */ void checkDisplay() { for (unsigned int i = 0; i < SPRITES; i++) { mc[i] = mc_base[i]; } } /** * Calculate sprite DMA. * * @rasterY y raster position * @regs the VIC registers */ void checkDma(unsigned int rasterY, uint8_t regs[0x40]) { const uint8_t y = rasterY & 0xff; uint8_t mask = 1; for (unsigned int i = 0; i < SPRITES; i++, mask <<= 1) { if ((enable & mask) && (y == regs[(i << 1) + 1]) && !(dma & mask)) { dma |= mask; mc_base[i] = 0; exp_flop |= mask; } } } /** * Calculate line crunch. * * @param data the data written to the register * @param lineCycle current line cycle */ void lineCrunch(uint8_t data, unsigned int lineCycle) { uint8_t mask = 1; for (unsigned int i = 0; i < SPRITES; i++, mask <<= 1) { if (!(data & mask) && !(exp_flop & mask)) { // sprite crunch if (lineCycle == 14) { const uint8_t mc_i = mc[i]; const uint8_t mcBase_i = mc_base[i]; mc[i] = (0x2a & (mcBase_i & mc_i)) | (0x15 & (mcBase_i | mc_i)); // mcbase will be set from mc on the following clock call } exp_flop |= mask; } } } /** * Check if dma is active for sprites. * * @param val bitmask for selected sprites */ inline bool isDma(unsigned int val) const { return dma & val; } }; } #endif libsidplayfp-2.6.0/src/c64/VIC_II/mos656x.h0000644000175100001770000002027114544470307014724 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2020 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ #ifndef MOS656X_H #define MOS656X_H #include #include "lightpen.h" #include "sprites.h" #include "Event.h" #include "EventCallback.h" #include "EventScheduler.h" #include "sidcxx11.h" namespace libsidplayfp { /** * MOS 6567/6569/6572/6573 emulation. * Not cycle exact but good enough for SID playback. */ class MOS656X : private Event { public: typedef enum { MOS6567R56A = 0 ///< OLD NTSC CHIP ,MOS6567R8 ///< NTSC-M ,MOS6569 ///< PAL-B ,MOS6572 ///< PAL-N ,MOS6573 ///< PAL-M } model_t; private: typedef event_clock_t (MOS656X::*ClockFunc)(); typedef struct { unsigned int rasterLines; unsigned int cyclesPerLine; ClockFunc clock; } model_data_t; private: static const model_data_t modelData[]; /// raster IRQ flag static const int IRQ_RASTER = 1 << 0; /// Light-Pen IRQ flag static const int IRQ_LIGHTPEN = 1 << 3; /// First line when we check for bad lines static const unsigned int FIRST_DMA_LINE = 0x30; /// Last line when we check for bad lines static const unsigned int LAST_DMA_LINE = 0xf7; private: /// Current model clock function. ClockFunc clock; /// Current raster clock. event_clock_t rasterClk; /// System's event scheduler. EventScheduler &eventScheduler; /// Number of cycles per line. unsigned int cyclesPerLine; /// Number of raster lines. unsigned int maxRasters; /// Current visible line unsigned int lineCycle; /// current raster line unsigned int rasterY; /// vertical scrolling value unsigned int yscroll; /// are bad lines enabled for this frame? bool areBadLinesEnabled; /// is the current line a bad line bool isBadLine; /// Is rasterYIRQ condition true? bool rasterYIRQCondition; /// Set when new frame starts. bool vblanking; /// Is CIA asserting lightpen? bool lpAsserted; /// internal IRQ flags uint8_t irqFlags; /// masks for the IRQ flags uint8_t irqMask; /// Light pen Lightpen lp; /// the 8 sprites data Sprites sprites; /// memory for chip registers uint8_t regs[0x40]; EventCallback badLineStateChangeEvent; EventCallback rasterYIRQEdgeDetectorEvent; EventCallback lightpenTriggerEvent; private: event_clock_t clockPAL(); event_clock_t clockNTSC(); event_clock_t clockOldNTSC(); /** * Signal CPU interrupt if requested by VIC. */ void handleIrqState(); /** * AEC state was updated. */ void badLineStateChange() { setBA(!isBadLine); } /** * RasterY IRQ edge detector. */ void rasterYIRQEdgeDetector() { const bool oldRasterYIRQCondition = rasterYIRQCondition; rasterYIRQCondition = rasterY == readRasterLineIRQ(); if (!oldRasterYIRQCondition && rasterYIRQCondition) activateIRQFlag(IRQ_RASTER); } void lightpenTrigger() { // Synchronise simulation sync(); if (lp.trigger(lineCycle, rasterY)) { activateIRQFlag(IRQ_LIGHTPEN); } } /** * Set an IRQ flag and trigger an IRQ if the corresponding IRQ mask is set. * The IRQ only gets activated, i.e. flag 0x80 gets set, if it was not active before. */ void activateIRQFlag(int flag) { irqFlags |= flag; handleIrqState(); } /** * Read the value of the raster line IRQ * * @return raster line when to trigger an IRQ */ unsigned int readRasterLineIRQ() const { return regs[0x12] + ((regs[0x11] & 0x80) << 1); } /** * Read the DEN flag which tells whether the display is enabled * * @return true if DEN is set, otherwise false */ bool readDEN() const { return (regs[0x11] & 0x10) != 0; } bool evaluateIsBadLine() const { return areBadLinesEnabled && rasterY >= FIRST_DMA_LINE && rasterY <= LAST_DMA_LINE && (rasterY & 7) == yscroll; } /** * Get previous value of Y raster */ inline unsigned int oldRasterY() const { return (rasterY > 0 ? rasterY : maxRasters) - 1; } inline void sync() { eventScheduler.cancel(*this); event(); } /** * Check for vertical blanking. */ inline void checkVblank() { // IRQ occurred (xraster != 0) if (rasterY == (maxRasters - 1)) { vblanking = true; } // Check DEN bit on first cycle of the line following the first DMA line if (rasterY == FIRST_DMA_LINE && !areBadLinesEnabled && readDEN()) { areBadLinesEnabled = true; } // Disallow bad lines after the last possible one has passed if (rasterY == LAST_DMA_LINE) { areBadLinesEnabled = false; } isBadLine = false; if (!vblanking) { rasterY++; rasterYIRQEdgeDetector(); if ((rasterY == FIRST_DMA_LINE) && !areBadLinesEnabled) areBadLinesEnabled = readDEN(); } if (evaluateIsBadLine()) isBadLine = true; } /** * Vertical blank (line 0). */ inline void vblank() { if (vblanking) { vblanking = false; rasterY = 0; rasterYIRQEdgeDetector(); lp.untrigger(); if (lpAsserted && lp.retrigger()) { activateIRQFlag(IRQ_LIGHTPEN); } } } /** * Start DMA for sprite n. */ template inline void startDma() { if (sprites.isDma(0x01 << n)) setBA(false); } /** * End DMA for sprite n. */ template inline void endDma() { if (!sprites.isDma(0x06 << n)) setBA(true); } /** * Start bad line. */ inline void startBadline() { if (isBadLine) setBA(false); } protected: MOS656X(EventScheduler &scheduler); ~MOS656X() {} // Environment Interface virtual void interrupt(bool state) = 0; virtual void setBA(bool state) = 0; /** * Read VIC register. * * @param addr * Register to read. */ uint8_t read(uint_least8_t addr); /** * Write to VIC register. * * @param addr * Register to write to. * @param data * Data byte to write. */ void write(uint_least8_t addr, uint8_t data); public: void event() override; /** * Set chip model. */ void chip(model_t model); /** * Trigger the lightpen. Sets the lightpen usage flag. */ void triggerLightpen(); /** * Clears the lightpen usage flag. */ void clearLightpen(); /** * Reset VIC II. */ void reset(); static const char *credits(); }; // Template specializations /** * Start DMA for sprite 0. */ template<> inline void MOS656X::startDma<0>() { setBA(!sprites.isDma(0x01)); } /** * End DMA for sprite 7. */ template<> inline void MOS656X::endDma<7>() { setBA(true); } } #endif // MOS656X_H libsidplayfp-2.6.0/src/c64/VIC_II/mos656x.cpp0000644000175100001770000003311314544470307015256 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2009-2014 VICE Project * Copyright 2007-2010 Antti Lankila * Copyright 2001 Simon White * * 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. */ // References below are from: // The MOS 6567/6569 video controller (VIC-II) // and its application in the Commodore 64 // http://www.uni-mainz.de/~bauec002/VIC-Article.gz // // MOS 6572 info taken from http://solidstate.com.ar/wp/?p=200 // MOS 6573 info taken from http://csdb.dk/forums/?roomid=11&topicid=123713 #include "mos656x.h" #include #include "sidendian.h" namespace libsidplayfp { /// Cycle # at which the VIC takes the bus in a bad line (BA goes low). const unsigned int VICII_FETCH_CYCLE = 11; const unsigned int VICII_SCREEN_TEXTCOLS = 40; const MOS656X::model_data_t MOS656X::modelData[] = { {262, 64, &MOS656X::clockOldNTSC}, // Old NTSC (MOS6567R56A) {263, 65, &MOS656X::clockNTSC}, // NTSC-M (MOS6567R8) {312, 63, &MOS656X::clockPAL}, // PAL-B (MOS6569R1, MOS6569R3) {312, 65, &MOS656X::clockNTSC}, // PAL-N (MOS6572) {263, 65, &MOS656X::clockNTSC}, // PAL-M (MOS6573) }; const char *MOS656X::credits() { return "MOS6567/6569/6572/6573 (VIC II) Emulation:\n" "\tCopyright (C) 2001 Simon White\n" "\tCopyright (C) 2007-2010 Antti Lankila\n" "\tCopyright (C) 2009-2014 VICE Project\n" "\tCopyright (C) 2011-2021 Leandro Nini\n"; } MOS656X::MOS656X(EventScheduler &scheduler) : Event("VIC Raster"), eventScheduler(scheduler), sprites(regs), badLineStateChangeEvent("Update AEC signal", *this, &MOS656X::badLineStateChange), rasterYIRQEdgeDetectorEvent("RasterY changed", *this, &MOS656X::rasterYIRQEdgeDetector), lightpenTriggerEvent("Trigger lightpen", *this, &MOS656X::lightpenTrigger) { chip(MOS6569); } void MOS656X::reset() { irqFlags = 0; irqMask = 0; yscroll = 0; rasterY = maxRasters - 1; lineCycle = 0; areBadLinesEnabled = false; isBadLine = false; rasterYIRQCondition = false; rasterClk = 0; vblanking = false; lpAsserted = false; memset(regs, 0, sizeof(regs)); lp.reset(); sprites.reset(); eventScheduler.cancel(*this); eventScheduler.schedule(*this, 0, EVENT_CLOCK_PHI1); } void MOS656X::chip(model_t model) { maxRasters = modelData[model].rasterLines; cyclesPerLine = modelData[model].cyclesPerLine; clock = modelData[model].clock; lp.setScreenSize(maxRasters, cyclesPerLine); reset(); } uint8_t MOS656X::read(uint_least8_t addr) { addr &= 0x3f; // Sync up timers sync(); switch (addr) { case 0x11: // Control register 1 return (regs[addr] & 0x7f) | ((rasterY & 0x100) >> 1); case 0x12: // Raster counter return rasterY & 0xff; case 0x13: return lp.getX(); case 0x14: return lp.getY(); case 0x19: // Interrupt Pending Register return irqFlags | 0x70; case 0x1a: // Interrupt Mask Register return irqMask | 0xf0; default: // for addresses < $20 read from register directly if (addr < 0x20) return regs[addr]; // for addresses < $2f set bits of high nibble to 1 if (addr < 0x2f) return regs[addr] | 0xf0; // for addresses >= $2f return $ff return 0xff; } } void MOS656X::write(uint_least8_t addr, uint8_t data) { addr &= 0x3f; regs[addr] = data; // Sync up timers sync(); switch (addr) { case 0x11: // Control register 1 { const unsigned int oldYscroll = yscroll; yscroll = data & 0x7; // This is the funniest part... handle bad line tricks. const bool wasBadLinesEnabled = areBadLinesEnabled; if ((rasterY == FIRST_DMA_LINE) && (lineCycle == 0)) { areBadLinesEnabled = readDEN(); } if ((oldRasterY() == FIRST_DMA_LINE) && readDEN()) { areBadLinesEnabled = true; } if (((oldYscroll != yscroll) || (areBadLinesEnabled != wasBadLinesEnabled)) && (rasterY >= FIRST_DMA_LINE) && (rasterY <= LAST_DMA_LINE)) { // Check whether bad line state has changed. const bool wasBadLine = (wasBadLinesEnabled && (oldYscroll == (rasterY & 7))); const bool nowBadLine = (areBadLinesEnabled && (yscroll == (rasterY & 7))); if (nowBadLine != wasBadLine) { const bool oldBadLine = isBadLine; if (wasBadLine) { if (lineCycle < VICII_FETCH_CYCLE) { isBadLine = false; } } else { // Bad line may be generated during fetch interval // (VICII_FETCH_CYCLE <= lineCycle < VICII_FETCH_CYCLE + VICII_SCREEN_TEXTCOLS + 3) // or outside the fetch interval but before raster ycounter is incremented // (lineCycle <= VICII_FETCH_CYCLE + VICII_SCREEN_TEXTCOLS + 6) if (lineCycle <= VICII_FETCH_CYCLE + VICII_SCREEN_TEXTCOLS + 6) { isBadLine = true; } } if (isBadLine != oldBadLine) eventScheduler.schedule(badLineStateChangeEvent, 0, EVENT_CLOCK_PHI1); } } } // fall-through case 0x12: // Raster counter // check raster Y irq condition changes at the next PHI1 eventScheduler.schedule(rasterYIRQEdgeDetectorEvent, 0, EVENT_CLOCK_PHI1); break; case 0x17: sprites.lineCrunch(data, lineCycle); break; case 0x19: // VIC Interrupt Flag Register irqFlags &= (~data & 0x0f) | 0x80; handleIrqState(); break; case 0x1a: // IRQ Mask Register irqMask = data & 0x0f; handleIrqState(); break; } } void MOS656X::handleIrqState() { // signal an IRQ unless we already signaled it if ((irqFlags & irqMask & 0x0f) != 0) { if ((irqFlags & 0x80) == 0) { interrupt(true); irqFlags |= 0x80; } } else { if ((irqFlags & 0x80) != 0) { interrupt(false); irqFlags &= 0x7f; } } } void MOS656X::event() { const event_clock_t cycles = eventScheduler.getTime(eventScheduler.phase()) - rasterClk; event_clock_t delay; if (cycles) { // Update x raster rasterClk += cycles; lineCycle += cycles; lineCycle %= cyclesPerLine; delay = (this->*clock)(); } else delay = 1; eventScheduler.schedule(*this, delay - eventScheduler.phase(), EVENT_CLOCK_PHI1); } event_clock_t MOS656X::clockPAL() { event_clock_t delay = 1; switch (lineCycle) { case 0: checkVblank(); endDma<2>(); break; case 1: vblank(); startDma<5>(); // No sprites before next compulsory cycle if (!sprites.isDma(0xf8)) delay = 10; break; case 2: endDma<3>(); break; case 3: startDma<6>(); break; case 4: endDma<4>(); break; case 5: startDma<7>(); break; case 6: endDma<5>(); delay = sprites.isDma(0xc0) ? 2 : 5; break; case 7: break; case 8: endDma<6>(); delay = 2; break; case 9: break; case 10: endDma<7>(); break; case 11: startBadline(); delay = 3; break; case 12: delay = 2; break; case 13: break; case 14: sprites.updateMc(); break; case 15: sprites.updateMcBase(); delay = 39; break; case 54: sprites.checkDma(rasterY, regs); startDma<0>(); break; case 55: sprites.checkDma(rasterY, regs); // Phi1 sprites.checkExp(); // Phi2 startDma<0>(); break; case 56: startDma<1>(); break; case 57: sprites.checkDisplay(); // No sprites before next compulsory cycle if (!sprites.isDma(0x1f)) delay = 6; break; case 58: startDma<2>(); break; case 59: endDma<0>(); break; case 60: startDma<3>(); break; case 61: endDma<1>(); break; case 62: startDma<4>(); break; default: delay = 54 - lineCycle; } return delay; } event_clock_t MOS656X::clockNTSC() { event_clock_t delay = 1; switch (lineCycle) { case 0: checkVblank(); startDma<5>(); break; case 1: vblank(); endDma<3>(); // No sprites before next compulsory cycle if (!sprites.isDma(0xf0)) delay = 10; break; case 2: startDma<6>(); break; case 3: endDma<4>(); break; case 4: startDma<7>(); break; case 5: endDma<5>(); delay = sprites.isDma(0xc0) ? 2 : 6; break; case 6: break; case 7: endDma<6>(); delay = 2; break; case 8: break; case 9: endDma<7>(); delay = 2; break; case 10: break; case 11: startBadline(); delay = 3; break; case 12: delay = 2; break; case 13: break; case 14: sprites.updateMc(); break; case 15: sprites.updateMcBase(); delay = 39; break; case 54: setBA(true); break; case 55: sprites.checkDma(rasterY, regs); // Phi1 sprites.checkExp(); // Phi2 startDma<0>(); break; case 56: sprites.checkDma(rasterY, regs); startDma<0>(); break; case 57: startDma<1>(); break; case 58: sprites.checkDisplay(); // No sprites before next compulsory cycle if (!sprites.isDma(0x1f)) delay = 7; break; case 59: startDma<2>(); break; case 60: endDma<0>(); break; case 61: startDma<3>(); break; case 62: endDma<1>(); break; case 63: startDma<4>(); break; case 64: endDma<2>(); break; default: delay = 54 - lineCycle; } return delay; } event_clock_t MOS656X::clockOldNTSC() { event_clock_t delay = 1; switch (lineCycle) { case 0: checkVblank(); endDma<2>(); break; case 1: vblank(); startDma<5>(); // No sprites before next compulsory cycle if (!sprites.isDma(0xf8)) delay = 10; break; case 2: endDma<3>(); break; case 3: startDma<6>(); break; case 4: endDma<4>(); break; case 5: startDma<7>(); break; case 6: endDma<5>(); delay = sprites.isDma(0xc0) ? 2 : 5; break; case 7: break; case 8: endDma<6>(); delay = 2; break; case 9: break; case 10: endDma<7>(); break; case 11: startBadline(); delay = 3; break; case 12: delay = 2; break; case 13: break; case 14: sprites.updateMc(); break; case 15: sprites.updateMcBase(); delay = 39; break; case 54: setBA(true); break; case 55: sprites.checkDma(rasterY, regs); // Phi1 sprites.checkExp(); // Phi2 startDma<0>(); break; case 56: sprites.checkDma(rasterY, regs); startDma<0>(); break; case 57: sprites.checkDisplay(); startDma<1>(); // No sprites before next compulsory cycle delay = sprites.isDma(0x1f) ? 2 : 7; break; case 58: break; case 59: startDma<2>(); break; case 60: endDma<0>(); break; case 61: startDma<3>(); break; case 62: endDma<1>(); break; case 63: startDma<4>(); break; default: delay = 54 - lineCycle; } return delay; } void MOS656X::triggerLightpen() { lpAsserted = true; eventScheduler.schedule(lightpenTriggerEvent, 1); } void MOS656X::clearLightpen() { lpAsserted = false; } } libsidplayfp-2.6.0/src/c64/mmu.cpp0000644000175100001770000000515614544470307013631 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "mmu.h" #include "Banks/Bank.h" #include "Banks/IOBank.h" namespace libsidplayfp { class Bank; MMU::MMU(EventScheduler &scheduler, IOBank* ioBank) : eventScheduler(scheduler), loram(false), hiram(false), charen(false), ioBank(ioBank), zeroRAMBank(*this, ramBank), seed(3686734) { cpuReadMap[0] = &zeroRAMBank; cpuWriteMap[0] = &zeroRAMBank; for (int i = 1; i < 16; i++) { cpuReadMap[i] = &ramBank; cpuWriteMap[i] = &ramBank; } } void MMU::setCpuPort(uint8_t state) { loram = (state & 1) != 0; hiram = (state & 2) != 0; charen = (state & 4) != 0; updateMappingPHI2(); } void MMU::updateMappingPHI2() { cpuReadMap[0xe] = cpuReadMap[0xf] = hiram ? (Bank*)&kernalRomBank : &ramBank; cpuReadMap[0xa] = cpuReadMap[0xb] = (loram && hiram) ? (Bank*)&basicRomBank : &ramBank; if (charen && (loram || hiram)) { cpuReadMap[0xd] = cpuWriteMap[0xd] = ioBank; } else { cpuReadMap[0xd] = (!charen && (loram || hiram)) ? (Bank*)&characterRomBank : &ramBank; cpuWriteMap[0xd] = &ramBank; } } void MMU::reset() { ramBank.reset(); zeroRAMBank.reset(); // Reset the ROMs to undo the hacks applied kernalRomBank.reset(); basicRomBank.reset(); loram = false; hiram = false; charen = false; updateMappingPHI2(); } // LCG unsigned int random(unsigned int val) { return val * 1664525 + 1013904223; } /* * This should actually return last byte read from VIC * but since the VIC emulation currently does not fetch * any value from memory we return a pseudo random value. */ uint8_t MMU::getLastReadByte() const { seed = random(seed); return seed; } } libsidplayfp-2.6.0/src/player.h0000644000175100001770000001013214544470307013366 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2022 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #ifndef PLAYER_H #define PLAYER_H #include #include #include "sidplayfp/siddefs.h" #include "sidplayfp/SidConfig.h" #include "sidplayfp/SidTuneInfo.h" #include "SidInfoImpl.h" #include "sidrandom.h" #include "mixer.h" #include "c64/c64.h" #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifdef HAVE_CXX11 # include #endif #include class SidTune; class SidInfo; class sidbuilder; namespace libsidplayfp { class Player { private: typedef enum { STOPPED, PLAYING, STOPPING } state_t; private: /// Commodore 64 emulator c64 m_c64; /// Mixer Mixer m_mixer; /// Emulator info SidTune *m_tune; /// User Configuration Settings SidInfoImpl m_info; /// User Configuration Settings SidConfig m_cfg; /// Error message const char *m_errorString; #ifndef HAVE_CXX11 volatile state_t m_isPlaying; #else std::atomic m_isPlaying; #endif sidrandom m_rand; /// PAL/NTSC switch value uint8_t videoSwitch; private: /** * Get the C64 model for the current loaded tune. * * @param defaultModel the default model * @param forced true if the default model shold be forced in spite of tune model */ c64::model_t c64model(SidConfig::c64_model_t defaultModel, bool forced); /** * Initialize the emulation. * * @throw configError */ void initialise(); /** * Release the SID builders. */ void sidRelease(); /** * Create the SID emulation(s). * * @throw configError */ void sidCreate(sidbuilder *builder, SidConfig::sid_model_t defaultModel, bool digiboost, bool forced, const std::vector &extraSidAddresses); /** * Set the SID emulation parameters. * * @param cpuFreq the CPU clock frequency * @param frequency the output sampling frequency * @param sampling the sampling method to use * @param fastSampling true to enable fast low quality resampling (only for reSID) */ void sidParams(double cpuFreq, int frequency, SidConfig::sampling_method_t sampling, bool fastSampling); inline void run(unsigned int events); public: Player(); ~Player() {} const SidConfig &config() const { return m_cfg; } const SidInfo &info() const { return m_info; } bool config(const SidConfig &cfg, bool force=false); bool fastForward(unsigned int percent); bool load(SidTune *tune); uint_least32_t play(short *buffer, uint_least32_t samples); bool isPlaying() const { return m_isPlaying != STOPPED; } void stop(); uint_least32_t timeMs() const { return m_c64.getTimeMs(); } void debug(const bool enable, FILE *out) { m_c64.debug(enable, out); } void mute(unsigned int sidNum, unsigned int voice, bool enable); const char *error() const { return m_errorString; } void setKernal(const uint8_t* rom); void setBasic(const uint8_t* rom); void setChargen(const uint8_t* rom); uint_least16_t getCia1TimerA() const { return m_c64.getCia1TimerA(); } bool getSidStatus(unsigned int sidNum, uint8_t regs[32]); }; } #endif // PLAYER_H libsidplayfp-2.6.0/src/sidmd5.h0000644000175100001770000000417414544470307013270 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2015 Leandro Nini * * 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. */ #ifndef SIDMD5_H #define SIDMD5_H #include #include #include #include #include "utils/md5Factory.h" #include "utils/iMd5.h" #include "sidcxx11.h" namespace libsidplayfp { /** * A wrapper around the md5 implementation that provides * an hex formatted digest */ class sidmd5 { private: std::unique_ptr m_md5; public: /** * @throw md5Error */ sidmd5() : m_md5(md5Factory::get()) {} /** * Append a string to the message. */ void append(const void* data, int nbytes) { m_md5->append(data, nbytes); } /** * Finish the message. */ void finish() { m_md5->finish(); } /** * Initialize the algorithm. Reset starting values. */ void reset() { m_md5->reset(); } /** * Return pointer to 32-byte hex fingerprint. */ std::string getDigest() { const unsigned char* digest = m_md5->getDigest(); if (digest == nullptr) return std::string(); // Construct fingerprint. std::ostringstream ss; ss.fill('0'); ss.flags(std::ios::hex); for (int di = 0; di < 16; ++di) { ss << std::setw(2) << static_cast(digest[di]); } return ss.str(); } }; } #endif libsidplayfp-2.6.0/src/psiddrv.a650000644000175100001770000001170714544470307013722 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2014 Leandro Nini * Copyright 2001-2004 Simon White * Copyright 2000 Dag Lem * * 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. */ /*************************************************************************** * psiddrv.a65 - C64 Sid Player * * written by Dag Lem * modified by Simon White for use in the sidplayer SIDPlay2. * * Build with: * xa -R -G psiddrv.a65 -o psiddrv.o65 * od -v -An -w8 -tx1 psiddrv.o65 | sed -re 's/[[:alnum:]]+/0x&,/g' > psiddrv.bin ***************************************************************************/ ; entry address coldvec .word cold ; initial user interrupt vectors irqusr .word irqret ; These should never run brkusr .word exception nmiusr .word exception ; redirect basic restart vector ; to finish the init sequence ; (hooks in via stop function) stopusr .word setiomap playnum .byte 0 speed .byte 0 initvec .word 0 playvec .word 0 rndwait .word 0 initiomap .byte 0 playiomap .byte 0 video .byte 0 clock .byte 0 flags .byte 0 ; init/play PSID play jmp (playvec) init jmp (initvec) ; cold start cold sei ; turn interrupts off and ; clear any pending irqs lda #$00 sta $d01a lda $d019 sta $d019 lda #$7f sta $dc0d sta $dd0d lda $dc0d lda $dd0d ; setup hardware ; maximum volume lda #$0f sta $d418 ; set CIA 1 Timer A to 50/60 Hz lda video beq ntsc pal ldx #$25 ldy #$40 jmp timer ntsc ldx #$95 ldy #$42 timer stx $dc04 sty $dc05 ; set VICII raster to line 311 for RSIDs ldx #$9b ldy #$37 ; we should use the proper values for ; the default raster, however if the tune ; is playing at the wrong speed (e.g. ; PAL at NTSC) use the compatibility ; raster instead to try make it work eor clock ora initiomap beq vicinit ; set VICII raster to line 0 for PSIDs ; (compatibility raster) ldx #$1b ldy #$00 vicinit stx $d011 sty $d012 ; don't override default irq handler for RSIDs lda initiomap beq delay ; if play address, override default irq vector so ; we reach our routine to handle play routine lda playiomap beq delay ldx # * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "player.h" #include "sidplayfp/SidTune.h" #include "sidplayfp/sidbuilder.h" #include "sidemu.h" #include "psiddrv.h" #include "romCheck.h" #include "sidcxx11.h" namespace libsidplayfp { // Speed strings const char TXT_PAL_VBI[] = "50 Hz VBI (PAL)"; const char TXT_PAL_VBI_FIXED[] = "60 Hz VBI (PAL FIXED)"; const char TXT_PAL_CIA[] = "CIA (PAL)"; const char TXT_PAL_UNKNOWN[] = "UNKNOWN (PAL)"; const char TXT_NTSC_VBI[] = "60 Hz VBI (NTSC)"; const char TXT_NTSC_VBI_FIXED[] = "50 Hz VBI (NTSC FIXED)"; const char TXT_NTSC_CIA[] = "CIA (NTSC)"; const char TXT_NTSC_UNKNOWN[] = "UNKNOWN (NTSC)"; // Error Strings const char ERR_NA[] = "NA"; const char ERR_UNSUPPORTED_FREQ[] = "SIDPLAYER ERROR: Unsupported sampling frequency."; const char ERR_UNSUPPORTED_SID_ADDR[] = "SIDPLAYER ERROR: Unsupported SID address."; const char ERR_UNSUPPORTED_SIZE[] = "SIDPLAYER ERROR: Size of music data exceeds C64 memory."; const char ERR_INVALID_PERCENTAGE[] = "SIDPLAYER ERROR: Percentage value out of range."; /** * Configuration error exception. */ class configError { private: const char* m_msg; public: configError(const char* msg) : m_msg(msg) {} const char* message() const { return m_msg; } }; Player::Player() : // Set default settings for system m_tune(nullptr), m_errorString(ERR_NA), m_isPlaying(STOPPED), m_rand((unsigned int)::time(0)) { // We need at least some minimal interrupt handling m_c64.getMemInterface().setKernal(nullptr); config(m_cfg); // Get component credits m_info.m_credits.push_back(m_c64.cpuCredits()); m_info.m_credits.push_back(m_c64.ciaCredits()); m_info.m_credits.push_back(m_c64.vicCredits()); } template inline void checkRom(const uint8_t* rom, std::string &desc) { if (rom != nullptr) { T romCheck(rom); desc.assign(romCheck.info()); } else desc.clear(); } void Player::setKernal(const uint8_t* rom) { checkRom(rom, m_info.m_kernalDesc); m_c64.getMemInterface().setKernal(rom); } void Player::setBasic(const uint8_t* rom) { checkRom(rom, m_info.m_basicDesc); m_c64.getMemInterface().setBasic(rom); } void Player::setChargen(const uint8_t* rom) { checkRom(rom, m_info.m_chargenDesc); m_c64.getMemInterface().setChargen(rom); } bool Player::fastForward(unsigned int percent) { if (!m_mixer.setFastForward(percent / 100)) { m_errorString = ERR_INVALID_PERCENTAGE; return false; } return true; } void Player::initialise() { m_isPlaying = STOPPED; m_c64.reset(); const SidTuneInfo* tuneInfo = m_tune->getInfo(); const uint_least32_t size = static_cast(tuneInfo->loadAddr()) + tuneInfo->c64dataLen() - 1; if (size > 0xffff) { throw configError(ERR_UNSUPPORTED_SIZE); } uint_least16_t powerOnDelay = m_cfg.powerOnDelay; // Delays above MAX result in random delays if (powerOnDelay > SidConfig::MAX_POWER_ON_DELAY) { // Limit the delay to something sensible. powerOnDelay = (uint_least16_t)((m_rand.next() >> 3) & SidConfig::MAX_POWER_ON_DELAY); } psiddrv driver(m_tune->getInfo()); driver.powerOnDelay(powerOnDelay); if (!driver.drvReloc()) { throw configError(driver.errorString()); } m_info.m_driverAddr = driver.driverAddr(); m_info.m_driverLength = driver.driverLength(); m_info.m_powerOnDelay = powerOnDelay; driver.install(m_c64.getMemInterface(), videoSwitch); if (!m_tune->placeSidTuneInC64mem(m_c64.getMemInterface())) { throw configError(m_tune->statusString()); } m_c64.resetCpu(); } bool Player::load(SidTune *tune) { m_tune = tune; if (tune != nullptr) { // Must re-configure on fly for stereo support! if (!config(m_cfg, true)) { // Failed configuration with new tune, reject it m_tune = nullptr; return false; } } return true; } void Player::mute(unsigned int sidNum, unsigned int voice, bool enable) { sidemu *s = m_mixer.getSid(sidNum); if (s != nullptr) s->voice(voice, enable); } /** * @throws MOS6510::haltInstruction */ void Player::run(unsigned int events) { for (unsigned int i = 0; m_isPlaying && i < events; i++) m_c64.clock(); } uint_least32_t Player::play(short *buffer, uint_least32_t count) { // Make sure a tune is loaded if (m_tune == nullptr) return 0; // Start the player loop if (m_isPlaying == STOPPED) m_isPlaying = PLAYING; if (m_isPlaying == PLAYING) { try { m_mixer.begin(buffer, count); if (m_mixer.getSid(0) != nullptr) { if (count && (buffer != nullptr)) { // reset count in case of exceptions count = 0; // Clock chips and mix into output buffer while (m_isPlaying && m_mixer.notFinished()) { run(sidemu::OUTPUTBUFFERSIZE); m_mixer.clockChips(); m_mixer.doMix(); } count = m_mixer.samplesGenerated(); } else { // Clock chips and discard buffers int size = m_c64.getMainCpuSpeed() / m_cfg.frequency; while (m_isPlaying && --size) { run(sidemu::OUTPUTBUFFERSIZE); m_mixer.clockChips(); m_mixer.resetBufs(); } } } else { // Clock the machine int size = m_c64.getMainCpuSpeed() / m_cfg.frequency; while (m_isPlaying && --size) { run(sidemu::OUTPUTBUFFERSIZE); } } } catch (MOS6510::haltInstruction const &) { m_errorString = "Illegal instruction executed"; m_isPlaying = STOPPING; } catch (Mixer::badBufferSize const &) { m_errorString = "Bad buffer size"; m_isPlaying = STOPPING; } } if (m_isPlaying == STOPPING) { try { initialise(); } catch (configError const &) {} m_isPlaying = STOPPED; } return count; } void Player::stop() { if (m_tune != nullptr && m_isPlaying == PLAYING) { m_isPlaying = STOPPING; } } c64::cia_model_t getCiaModel(SidConfig::cia_model_t model) { switch (model) { default: case SidConfig::MOS6526: return c64::OLD; case SidConfig::MOS8521: return c64::NEW; case SidConfig::MOS6526W4485: return c64::OLD_4485; } } bool Player::config(const SidConfig &cfg, bool force) { // Check if configuration have been changed or forced if (!force && !m_cfg.compare(cfg)) { return true; } // Check for base sampling frequency if (cfg.frequency < 8000) { m_errorString = ERR_UNSUPPORTED_FREQ; return false; } // Only do these if we have a loaded tune if (m_tune != nullptr) { const SidTuneInfo* tuneInfo = m_tune->getInfo(); try { sidRelease(); std::vector addresses; const uint_least16_t secondSidAddress = tuneInfo->sidChipBase(1) != 0 ? tuneInfo->sidChipBase(1) : cfg.secondSidAddress; if (secondSidAddress != 0) addresses.push_back(secondSidAddress); const uint_least16_t thirdSidAddress = tuneInfo->sidChipBase(2) != 0 ? tuneInfo->sidChipBase(2) : cfg.thirdSidAddress; if (thirdSidAddress != 0) addresses.push_back(thirdSidAddress); // SID emulation setup (must be performed before the // environment setup call) sidCreate(cfg.sidEmulation, cfg.defaultSidModel, cfg.digiBoost, cfg.forceSidModel, addresses); // Determine c64 model const c64::model_t model = c64model(cfg.defaultC64Model, cfg.forceC64Model); m_c64.setModel(model); const c64::cia_model_t ciaModel = getCiaModel(cfg.ciaModel); m_c64.setCiaModel(ciaModel); sidParams(m_c64.getMainCpuSpeed(), cfg.frequency, cfg.samplingMethod, cfg.fastSampling); // Configure, setup and install C64 environment/events initialise(); } catch (configError const &e) { m_errorString = e.message(); m_cfg.sidEmulation = 0; if (&m_cfg != &cfg) { config(m_cfg); } return false; } } const bool isStereo = cfg.playback == SidConfig::STEREO; m_info.m_channels = isStereo ? 2 : 1; m_mixer.setStereo(isStereo); m_mixer.setSamplerate(cfg.frequency); m_mixer.setVolume(cfg.leftVolume, cfg.rightVolume); // Update Configuration m_cfg = cfg; return true; } // Clock speed changes due to loading a new song c64::model_t Player::c64model(SidConfig::c64_model_t defaultModel, bool forced) { const SidTuneInfo* tuneInfo = m_tune->getInfo(); SidTuneInfo::clock_t clockSpeed = tuneInfo->clockSpeed(); c64::model_t model; // Use preferred speed if forced or if song speed is unknown if (forced || clockSpeed == SidTuneInfo::CLOCK_UNKNOWN || clockSpeed == SidTuneInfo::CLOCK_ANY) { switch (defaultModel) { case SidConfig::PAL: clockSpeed = SidTuneInfo::CLOCK_PAL; model = c64::PAL_B; videoSwitch = 1; break; case SidConfig::DREAN: clockSpeed = SidTuneInfo::CLOCK_PAL; model = c64::PAL_N; videoSwitch = 1; // TODO verify break; case SidConfig::NTSC: clockSpeed = SidTuneInfo::CLOCK_NTSC; model = c64::NTSC_M; videoSwitch = 0; break; case SidConfig::OLD_NTSC: clockSpeed = SidTuneInfo::CLOCK_NTSC; model = c64::OLD_NTSC_M; videoSwitch = 0; break; case SidConfig::PAL_M: clockSpeed = SidTuneInfo::CLOCK_NTSC; model = c64::PAL_M; videoSwitch = 0; // TODO verify break; } } else { switch (clockSpeed) { default: case SidTuneInfo::CLOCK_PAL: model = c64::PAL_B; videoSwitch = 1; break; case SidTuneInfo::CLOCK_NTSC: model = c64::NTSC_M; videoSwitch = 0; break; } } switch (clockSpeed) { case SidTuneInfo::CLOCK_PAL: if (tuneInfo->songSpeed() == SidTuneInfo::SPEED_CIA_1A) m_info.m_speedString = TXT_PAL_CIA; else if (tuneInfo->clockSpeed() == SidTuneInfo::CLOCK_NTSC) m_info.m_speedString = TXT_PAL_VBI_FIXED; else m_info.m_speedString = TXT_PAL_VBI; break; case SidTuneInfo::CLOCK_NTSC: if (tuneInfo->songSpeed() == SidTuneInfo::SPEED_CIA_1A) m_info.m_speedString = TXT_NTSC_CIA; else if (tuneInfo->clockSpeed() == SidTuneInfo::CLOCK_PAL) m_info.m_speedString = TXT_NTSC_VBI_FIXED; else m_info.m_speedString = TXT_NTSC_VBI; break; default: break; } return model; } /** * Get the SID model. * * @param sidModel the tune requested model * @param defaultModel the default model * @param forced true if the default model shold be forced in spite of tune model */ SidConfig::sid_model_t getSidModel(SidTuneInfo::model_t sidModel, SidConfig::sid_model_t defaultModel, bool forced) { SidTuneInfo::model_t tuneModel = sidModel; // Use preferred speed if forced or if song speed is unknown if (forced || tuneModel == SidTuneInfo::SIDMODEL_UNKNOWN || tuneModel == SidTuneInfo::SIDMODEL_ANY) { switch (defaultModel) { case SidConfig::MOS6581: tuneModel = SidTuneInfo::SIDMODEL_6581; break; case SidConfig::MOS8580: tuneModel = SidTuneInfo::SIDMODEL_8580; break; default: break; } } SidConfig::sid_model_t newModel; switch (tuneModel) { default: case SidTuneInfo::SIDMODEL_6581: newModel = SidConfig::MOS6581; break; case SidTuneInfo::SIDMODEL_8580: newModel = SidConfig::MOS8580; break; } return newModel; } void Player::sidRelease() { m_c64.clearSids(); for (unsigned int i = 0; ; i++) { sidemu *s = m_mixer.getSid(i); if (s == nullptr) break; if (sidbuilder *b = s->builder()) { b->unlock(s); } } m_mixer.clearSids(); } void Player::sidCreate(sidbuilder *builder, SidConfig::sid_model_t defaultModel, bool digiboost, bool forced, const std::vector &extraSidAddresses) { if (builder != nullptr) { const SidTuneInfo* tuneInfo = m_tune->getInfo(); // Setup base SID const SidConfig::sid_model_t userModel = getSidModel(tuneInfo->sidModel(0), defaultModel, forced); sidemu *s = builder->lock(m_c64.getEventScheduler(), userModel, digiboost); if (!builder->getStatus()) { throw configError(builder->error()); } m_c64.setBaseSid(s); m_mixer.addSid(s); // Setup extra SIDs if needed if (extraSidAddresses.size() != 0) { // If bits 6-7 are set to Unknown then the second SID will be set to the same SID // model as the first SID. defaultModel = userModel; const unsigned int extraSidChips = extraSidAddresses.size(); for (unsigned int i = 0; i < extraSidChips; i++) { const SidConfig::sid_model_t userModel = getSidModel(tuneInfo->sidModel(i+1), defaultModel, forced); sidemu *s = builder->lock(m_c64.getEventScheduler(), userModel, digiboost); if (!builder->getStatus()) { throw configError(builder->error()); } if (!m_c64.addExtraSid(s, extraSidAddresses[i])) throw configError(ERR_UNSUPPORTED_SID_ADDR); m_mixer.addSid(s); } } } } void Player::sidParams(double cpuFreq, int frequency, SidConfig::sampling_method_t sampling, bool fastSampling) { for (unsigned int i = 0; ; i++) { sidemu *s = m_mixer.getSid(i); if (s == nullptr) break; s->sampling((float)cpuFreq, frequency, sampling, fastSampling); } } bool Player::getSidStatus(unsigned int sidNum, uint8_t regs[32]) { sidemu *s = m_mixer.getSid(sidNum); if (s == nullptr) return false; s->getStatus(regs); return true; } } libsidplayfp-2.6.0/src/poweron.bin0000644000175100001770000000336114544470307014112 00000000000000/* addr, off, rle, values */ /*$0003*/ 0x83, 0x04, 0xaa, 0xb1, 0x91, 0xb3, 0x22, /*$000b*/ 0x03, 0x4c, /*$000f*/ 0x03, 0x04, /*$0016*/ 0x86, 0x05, 0x19, 0x16, 0x00, 0x0a, 0x76, 0xa3, /*$0022*/ 0x86, 0x03, 0x40, 0xa3, 0xb3, 0xbd, /*$002b*/ 0x85, 0x01, 0x01, 0x08, /*$0034*/ 0x07, 0xa0, /*$0038*/ 0x03, 0xa0, /*$003a*/ 0x01, 0xff, /*$0042*/ 0x07, 0x08, /*$0047*/ 0x04, 0x24, /*$0053*/ 0x8b, 0x01, 0x03, 0x4c, /*$0061*/ 0x0c, 0x8d, /*$0063*/ 0x02, 0x10, /*$0069*/ 0x84, 0x02, 0x8c, 0xff, 0xa0, /*$0071*/ 0x85, 0x1e, 0x0a, 0xa3, 0xe6, 0x7a, 0xd0, 0x02, 0xe6, 0x7b, 0xad, 0x00, 0x08, 0xc9, 0x3a, 0xb0, 0x0a, 0xc9, 0x20, 0xf0, 0xef, 0x38, 0xe9, 0x30, 0x38, 0xe9, 0xd0, 0x60, 0x80, 0x4f, 0xc7, 0x52, 0x58, /*$0091*/ 0x01, 0xff, /*$009a*/ 0x08, 0x03, /*$00b2*/ 0x97, 0x01, 0x3c, 0x03, /*$00c2*/ 0x8e, 0x03, 0xa0, 0x30, 0xfd, 0x01, /*$00c8*/ 0x82, 0x82, 0x03, /*$00cb*/ 0x80, 0x81, 0x01, /*$00ce*/ 0x01, 0x20, /*$00d1*/ 0x82, 0x01, 0x18, 0x05, /*$00d5*/ 0x82, 0x02, 0x27, 0x07, 0x0d, /*$00d9*/ 0x81, 0x86, 0x84, /*$00e0*/ 0x80, 0x85, 0x85, /*$00e6*/ 0x80, 0x86, 0x86, /*$00ed*/ 0x80, 0x85, 0x87, /*$00f3*/ 0x80, 0x03, 0x18, 0xd9, 0x81, 0xeb, /*$0176*/ 0x7f, 0x00, /*$01f6*/ 0x7f, 0x00, /*$0276*/ 0x7f, 0x00, /*$0282*/ 0x8b, 0x0a, 0x08, 0x00, 0xa0, 0x00, 0x0e, 0x00, 0x04, 0x0a, 0x00, 0x04, 0x10, /*$028f*/ 0x82, 0x01, 0x48, 0xeb, /*$0300*/ 0xef, 0x0b, 0x8b, 0xe3, 0x83, 0xa4, 0x7c, 0xa5, 0x1a, 0xa7, 0xe4, 0xa7, 0x86, 0xae, /*$0310*/ 0x84, 0x02, 0x4c, 0x48, 0xb2, /*$0314*/ 0x81, 0x1f, 0x31, 0xea, 0x66, 0xfe, 0x47, 0xfe, 0x4a, 0xf3, 0x91, 0xf2, 0x0e, 0xf2, 0x50, 0xf2, 0x33, 0xf3, 0x57, 0xf1, 0xca, 0xf1, 0xed, 0xf6, 0x3e, 0xf1, 0x2f, 0xf3, 0x66, 0xfe, 0xa5, 0xf4, 0xed, 0xf5, /*Total 217*/ libsidplayfp-2.6.0/src/sidtune/0000755000175100001770000000000014544470322013454 500000000000000libsidplayfp-2.6.0/src/sidtune/sidplayer1.a650000644000175100001770000004426414544470307016003 00000000000000 .word $e000 * = $e000 le000 le001 = * + 1 le002 = * + 2 .byt $00,$00,$00 le005 = * + 2 .byt $00,$00,$00 le008 = * + 2 .byt $00,$00,$00 le00b = * + 2 .byt $00,$00,$00 le00e = * + 2 .byt $00,$00,$00 le011 = * + 2 .byt $00,$00,$00 le014 = * + 2 .byt $00,$00,$00 le017 = * + 2 .byt $00,$00,$00 le01a = * + 2 .byt $00,$00,$00 le01b le01c = * + 1 le01d = * + 2 .byt $00,$00,$00 le020 = * + 2 .byt $00,$00,$00 le023 = * + 2 .byt $00,$00,$00 le024 le025 = * + 1 le026 = * + 2 .byt $00,$00,$00 le027 le028 = * + 1 le029 = * + 2 .byt $00,$00,$00 le02a .byt $00,$00,$00 le02d le02e = * + 1 le02f = * + 2 .byt $00,$00,$00 le030 .byt $00,$00,$00 le033 .byt $00,$00,$00 le036 .byt $00,$00,$00 le039 .byt $00,$00,$00 le03c .byt $00,$00,$00 le03f .byt $00,$00,$00 le042 .byt $00,$00,$00 le045 .byt $00,$00,$00 le048 .byt $00,$00,$00 le04b .byt $00,$00,$00 le04e .byt $00,$00,$00 le051 .byt $00,$00,$00 le054 .byt $00,$00,$00 le057 .byt $00,$00,$00 le05a .byt $00,$00,$00 le05d .byt $00,$00,$00 le060 .byt $00,$00,$00 le063 .byt $00,$00,$00 le066 .byt $00,$00,$00 le069 .byt $00,$00,$00 le06c .byt $00,$00,$00 le06f .byt $00,$00,$00 le072 .byt $00,$00,$00 le075 .byt $00,$00,$00 le078 .byt $00,$00,$00 le07b .byt $00,$00,$00 le07e .byt $00,$00,$00 le081 .byt $00,$00,$00 le084 .byt $00,$00,$00 le087 .byt $00,$00,$00 le08a .byt $00,$00,$00 le08d .byt $00,$00,$00 le090 .byt $00,$00,$00 le093 .byt $00,$00,$00 le096 .byt $00,$00,$00 le099 .byt $00,$00,$00 le09c .byt $00,$00,$00 le09f .byt $00,$00,$00 le0a2 .byt $00,$00,$00 le0a5 .byt $00,$00,$00 le0a8 .byt $00,$00,$00 le0ab .byt $00,$00,$00 le0ae .byt $00,$00,$00 le0b1 .byt $00,$00,$00 le0b4 .byt $00,$00,$00 le0b7 .byt $00,$00,$00 le0ba le0bc = * + 2 .byt $00,$00,$00 le0bd le0be = * + 1 le0bf = * + 2 .byt $00,$00,$00 le0c0 .byt $00,$00,$00 le0c3 .byt $00,$00,$00 le0c6 .byt $00,$00,$00 le0c9 le0ca = * + 1 le0cb = * + 2 .byt $00,$00,$00 le0cc le0cd = * + 1 .byt $00,$00,$00 le0d0 = * + 1 .byt $00,$00,$00 le0d3 = * + 1 .byt $00,$00,$00 le0d6 = * + 1 .byt $00,$00,$00 le0d9 = * + 1 .byt $00,$00,$00 le0dc = * + 1 .byt $00,$00,$00 le0df = * + 1 le0e0 = * + 2 .byt $00,$00,$00 le0e1 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 le0f0 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 le0ff .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 le117 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 le12f .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 le13e .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 .byt $00,$00,$00 le156 le157 = * + 1 le158 = * + 2 .byt $00,$00,$00 le159 le15a = * + 1 le15b = * + 2 .byt $00,$00,$00 le15c le15d = * + 1 le15e = * + 2 .byt $00,$00,$00 le15f le160 = * + 1 ; Instruction opcode accessed. ; Instruction parameter accessed. adc ($e1,x) rts le162 .byt $01,$02,$04 le165 le167 = * + 2 .byt $00,$07,$0e .byt $02,$02,$fe .byt $02,$02,$fe le16f = * + 1 .byt $fe,$00,$01 le172 = * + 1 .byt $00,$ff,$00 .byt $02,$04,$05 .byt $07,$09,$0b le17a .byt $1e,$18,$8b .byt $7e,$fa,$06 .byt $ac,$f3,$e6 .byt $8f,$f8,$2e le186 .byt $86,$8e,$96 .byt $9f,$a8,$b3 .byt $bd,$c8,$d4 .byt $e1,$ee,$fd le192 sty $6478 bvc le1d3 .byt $28,$14,$00 le19a .byt $00,$02,$03 .byt $05,$07,$08 .byt $0a,$0c,$0d .byt $0f,$11,$12 le1a6 le1a8 = * + 2 .byt $00,$e0,$00 le1a9 .byt $05,$0a,$0f le1ac le1ad = * + 1 .byt $f9,$00,$f5 le1af .byt $00,$00,$00 le1b2 bpl le1b4 le1b4 .byt $00 le1b5 jsr $0000 bmi le1ba le1ba .byt $00,$40,$00 .byt $00 le1be bvc le1c0 le1c0 .byt $00,$60,$00 .byt $00 le1c4 bvs le1c6 le1c6 .byt $00,$80,$00 .byt $00 le1ca bcc le1cc le1cc .byt $00 le1cd ldy #$00 le1cf lda #$00 le1d3 = * + 2 ; Instruction parameter jumped to. sta le000 le1d4 le1d5 = * + 1 ; Instruction parameter jumped to. ldx #$95 le1d6 ldy #$42 lda $02a6 beq le1e1 le1dd ldx #$25 ldy #$40 le1e1 stx le15b sty le15c nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop rts le200 lda #$00 sta le000 stx $61 sty $62 ldy #$bc le20b sta le000,y dey bne le20b le211 ldy #$72 le213 sta le0bc,y dey bne le213 le219 sta $d415 sta $d416 lda #$08 sta le025 sta $d417 sta le026 sta $d418 lda #$90 sta le027 lda #$60 sta le028 lda #$0c sta le029 lda le15b sta le02d lda le15c sta le02e lda #$ff sta le0cc lda #$d4 sta $64 ldx #$02 le253 lda #$ff sta le00b,x lda #$01 sta le030,x sta le02a,x txa sta le033,x sta le0ae,x lda #$04 sta le039,x lda le1a8,x sta le0ba,x lda #$5b sta le07e,x lda le165,x sta $63 lda #$00 tay sta ($63),y iny sta ($63),y iny sta ($63),y lda #$08 sta le017,x sta le09c,x iny sta ($63),y iny sta ($63),y lda #$40 sta le01a,x sta ($63),y lda #$20 sta le01d,x iny sta ($63),y lda #$f5 sta le020,x iny sta ($63),y dex bpl le253 le2af txa ldx #$17 le2b2 sta le13e,x dex bpl le2b2 le2b8 lda $61 clc adc #$06 sta $63 lda #$00 tax tay adc $62 le2c5 sta $64 sta le0ab,x sta le0b4,x lda $63 sta le0a8,x sta le0b1,x clc adc ($61),y sta $63 lda $64 iny adc ($61),y iny inx cpx #$03 bne le2c5 le2e5 ldx $63 tay rts le2e9 lda #$00 sta $d404 sta $d40b sta $d412 sta $d401 sta $d408 sta $d40f lda #$08 sta $d417 lda le15b sta $dc04 lda le15c sta $dc05 rts le30f nop nop nop nop nop nop nop nop nop nop nop nop nop nop rts le31e lda #$08 sta le000 le323 jmp (le15d) le326 nop nop nop le329 lda le000 bmi le31e le32e ora #$80 tay and #$07 beq le323 le335 cld sty le000 nop lda $fb sta le156 lda $fc sta le157 lda $fd sta le158 lda $fe sta le159 lda $ff sta le15a lda le023 clc adc le0d9 pha and #$07 tay lda le0dc adc #$00 sta $ff pla lsr $ff ror lsr $ff ror lsr $ff ror clc adc le024 sty $d415 sta $d416 lda le025 sta $d417 lda le026 sta $d418 lda #$d4 sta $fc ldx #$00 le38b lda le000 and le162,x beq le3e4 le393 lda le165,x sta $fb lda le00e,x clc adc le051,x tay lda le011,x adc le054,x pha tya clc adc le0cd,x ldy #$00 sta ($fb),y pla adc le0d0,x iny sta ($fb),y lda le014,x clc adc le069,x sta $ff lda le017,x adc le06c,x pha lda $ff clc adc le0d3,x iny sta ($fb),y pla adc le0d6,x iny sta ($fb),y lda le01d,x iny iny sta ($fb),y lda le020,x iny sta ($fb),y le3e4 inx cpx #$03 bne le38b le3e9 ldy le01a ldx le01b lda le01c sty $d404 stx $d40b sta $d412 ldx le02d ldy le02e stx $dc04 sty $dc05 lda $d41b sta le0be lda $d41c sta le0bf ldx #$00 le415 lda le000 and le162,x beq le42d le41d stx le02f jsr le536 lda le000 and #$78 beq le42d le42a jmp le50c le42d inx cpx #$03 bne le415 le432 lda le0c9 bne le489 le437 lda le0ca ora le0cb beq le4b7 le43f lda le0df bne le46c le444 lda le0ca beq le471 le449 clc adc le0bd bcs le456 le44f cmp le0cc bcc le4b4 le454 beq le4b4 le456 lda #$00 sta le0df lda le0cb beq le4b4 le460 inc le0df lda le0bd sbc le0cb jmp le4b4 le46c lda le0cb beq le444 le471 lda le0bd sec sbc le0cb bcs le4b4 le47a lda #$00 sta le0df lda le0ca bne le4b4 le484 inc le0df bne le4b1 le489 dec le0e0 bne le4b7 le48e lda le0df bne le4a4 le493 inc le0df lda le0cb bne le49d le49b lda #$20 le49d sta le0e0 lda #$00 beq le4b4 le4a4 dec le0df lda le0ca bne le4ae le4ac lda #$20 le4ae sta le0e0 le4b1 lda le0cc le4b4 sta le0bd le4b7 ldx #$00 le4b9 lda le0c3,x beq le502 le4be lda #$00 sta $ff ldy le0c0,x lda le0bd,y ldy le0c6,x beq le4db le4cd bmi le4d7 le4cf asl rol $ff dey bne le4cf le4d5 beq le4db le4d7 lsr iny bne le4d7 le4db ldy le0c3,x dey bne le4ec le4e1 sta le0cd,x lda $ff sta le0d0,x jmp le502 le4ec dey bne le4fa le4ef sta le0d3,x lda $ff sta le0d6,x jmp le502 le4fa sta le0d9 lda $ff sta le0dc le502 inx cpx #$03 bne le4b9 le507 lda le000 and #$7f le50c sta le000 lda le156 sta $fb lda le157 sta $fc lda le158 sta $fd lda le159 sta $fe lda le15a sta $ff jmp (le15d) le52b lda le060,x bne le533 le530 jmp le69f le533 jmp le5ba le536 dec le030,x bne le53e le53b jmp le6a0 le53e lda le036,x bmi le52b le543 bne le55f le545 lda le03f,x beq le54f le54a dec le03f,x bne le55f le54f lda le039,x cmp le030,x bcc le55f le557 lda le01a,x and #$fe sta le01a,x le55f lda le042,x beq le5ba le564 asl lda le00e,x bcs le587 le56a adc le045,x sta le00e,x tay lda le011,x adc le048,x sta le011,x pha tya cmp le08d,x pla sbc le090,x bcs le5a4 le585 bcc le5b5 le587 sbc le045,x sta le00e,x lda le011,x sbc le048,x sta le011,x lda le08d,x cmp le00e,x lda le090,x sbc le011,x bcc le5b5 le5a4 lda le08d,x sta le00e,x lda le090,x sta le011,x lda #$00 sta le042,x le5b5 lda le060,x beq le60f le5ba lda le04b,x beq le60a le5bf ldy #$00 dec le04e,x bne le5f7 le5c6 lda le051,x ora le054,x bne le5e9 le5ce lda le05d,x sta le057,x sta le04e,x lda le04b,x asl lda le05a,x bcc le5e4 le5e0 eor #$ff adc #$00 le5e4 sta le04b,x bne le5f9 le5e9 lda le057,x sta le04e,x tya sec sbc le04b,x sta le04b,x le5f7 cmp #$00 le5f9 bpl le5fc le5fb dey le5fc clc adc le051,x sta le051,x tya adc le054,x sta le054,x le60a lda le036,x bmi le624 le60f lda le093,x beq le624 le614 clc adc le014,x sta le014,x lda le096,x adc le017,x sta le017,x le624 lda le063,x beq le674 le629 ldy #$00 dec le066,x bne le661 le630 lda le069,x ora le06c,x bne le653 le638 lda le072,x sta le06f,x sta le066,x lda le063,x asl lda le075,x bcc le64e le64a eor #$ff adc #$00 le64e sta le063,x bne le663 le653 lda le06f,x sta le066,x tya sec sbc le063,x sta le063,x le661 cmp #$00 le663 bpl le666 le665 dey le666 clc adc le069,x sta le069,x tya adc le06c,x sta le06c,x le674 lda le036,x bpl le67c le679 jmp le69f le67c ldy #$00 lda le0a2,x beq le69f le683 bpl le686 le685 iny le686 clc adc le023 pha and #$07 sta le023 pla ror lsr lsr clc adc le1a6,y clc adc le024 sta le024 le69f rts le6a0 lda le0a8,x sta $fd lda le0ab,x sta $fe bne le6b0 le6ac rts le6ad jsr le898 le6b0 lda le000 and le162,x beq le6ac le6b8 ldy #$00 lda ($fd),y sta $ff iny lda ($fd),y tay lda $fd clc adc #$02 sta $fd sta le0a8,x lda $fe adc #$00 sta $fe sta le0ab,x lda $ff and #$03 bne le6ad le6db lda le08d,x sta le00e,x lda le090,x sta le011,x lda $ff sta le005,x tya sta le002,x and #$07 tay lda le167,y sta le16f lda le002,x and #$38 lsr lsr lsr adc le081,x sta $fd lda le002,x and #$c0 asl rol rol tay lda le16f,y sta $fe lda le002,x and #$07 beq le77d le71b tay lda le172,y adc $fe clc adc le084,x bpl le72c le727 clc adc #$0c inc $fd le72c cmp #$0c bcc le734 le730 sbc #$0c dec $fd le734 sta $fe tay lda le186,y sta $ff lda le17a,y ldy $fd dey bmi le74a le744 lsr $ff ror dey bpl le744 le74a clc adc le087,x sta le08d,x lda $ff adc le08a,x sta le090,x lda le005,x bne le761 le75e jmp le6a0 le761 lda le045,x ora le048,x beq le77f le769 lda le00e,x cmp le08d,x lda le011,x sbc le090,x lda #$fe ror sta le042,x bcc le78e le77d beq le7c9 le77f sta le042,x lda le08d,x sta le00e,x lda le090,x sta le011,x le78e lda le036,x asl bne le7c9 le794 lda le093,x beq le7a5 le799 lda le099,x sta le014,x lda le09c,x sta le017,x le7a5 lda le09f,x beq le7b9 le7aa ldy $fd clc adc le192,y ldy $fe clc adc le19a,y clc bcc le7c1 le7b9 lda le0a2,x beq le7c9 le7be lda le0a5,x le7c1 sta le024 lda #$00 sta le023 le7c9 lda le03c,x sta le03f,x lda le005,x and #$40 sta le036,x lda le005,x lsr lsr and #$07 bne le810 le7e0 lda le005,x bmi le7f9 le7e5 lda le027 and #$3c bne le80a le7ec lda le027 asl rol rol bne le7f6 le7f4 lda #$04 le7f6 jmp le870 le7f9 lda le028 beq le80a le7fe and #$3f bne le80a le802 lda le028 asl rol rol bne le870 le80a lda #$10 sta le000 rts le810 cmp #$01 bne le827 le814 lda le005,x and #$20 bne le821 le81b lda le029 jmp le870 le821 lda le02a,x jmp le870 le827 tay lda le005,x and #$a0 cmp #$80 beq le861 le831 sta $ff clc lda le027 bne le83a le839 sec le83a dey dey beq le844 le83e ror bcs le88f le841 dey bne le83e le844 ldy $ff sta $ff beq le870 le84a lsr $ff bcs le88f le84e beq le892 le850 adc $ff bcs le892 le854 iny bpl le870 le857 lsr $ff bcs le88f le85b adc $ff bcc le870 le85f bcs le892 le861 lda le028 beq le88f le866 dey dey beq le870 le86a lsr bcs le88f le86d dey bne le86a le870 sta le030,x lda le01a,x and #$f6 sta le01a,x sec lda le002,x and #$07 bne le886 le883 ror le036,x le886 lda le01a,x adc #$00 sta le01a,x rts le88f lda #$10 le892 = * + 1 ; Instruction parameter jumped to. bit $18a9 sta le000 rts le898 tya pha lda $ff lsr bcc le8a2 le89f jmp lea42 le8a2 lsr lsr bcs le8c4 le8a6 lsr bcs le8b7 le8a9 sta le09c,x sta le017,x pla sta le099,x sta le014,x rts le8b7 lsr bcc le8bc le8ba ora #$f8 le8bc sta le08a,x pla sta le087,x rts le8c4 lsr bcs le8ca le8c7 jmp le94a le8ca lsr bcs le92e le8cd lsr bcs le8df le8d0 bne le8da le8d2 pla sta le0a5,x sta le024 rts le8da pla sta le03c,x rts le8df bne le929 le8e1 pla sta le07e,x cmp #$5b beq le91c le8e9 tay lsr lsr lsr sec sbc #$0b clc adc le084,x bmi le902 le8f6 cmp #$0c bcc le90b le8fa sbc #$0c dec le081,x jmp le90b le902 cmp #$f5 bcs le90b le906 adc #$0c inc le081,x le90b sta le084,x tya and #$07 sec sbc #$03 clc adc le081,x sta le081,x rts le91c lda le078,x sta le081,x lda le07b,x sta le084,x rts le929 pla sta le0c6,x rts le92e lsr bcs le939 le931 sta le00b,x pla sta le008,x rts le939 lsr ror ror adc le15b sta le02d pla adc le15c sta le02e rts le94a lsr bcc le950 le94d jmp le9d3 le950 lsr bcs le993 le953 lsr bcs le96d le956 lsr bcs le968 le959 pla sta le027 lsr lsr lsr tay lda le1af,y sta le028 rts le968 pla sta le05d,x rts le96d lsr bcs le975 le970 pla sta le001 rts le975 pla beq le989 le978 sta le075,x ldy le063,x bne le988 le980 sta le063,x lda #$01 sta le066,x le988 rts le989 sta le063,x sta le069,x sta le06c,x rts le993 lsr bcs le9c6 le996 lsr bcs le99e le999 pla sta le039,x rts le99e pla ldy #$00 lsr bcc le9a6 le9a4 iny clc le9a6 pha and #$07 adc le1ac,y sta le078,x sta le081,x pla lsr lsr lsr clc adc le1ad,y sta le07b,x sta le084,x lda #$5b sta le07e,x rts le9c6 lsr bcs le9ce le9c9 pla sta le0a2,x rts le9ce pla sta le0cc rts le9d3 lsr bcs le9fd le9d6 lsr bcs le9e6 le9d9 lsr bcs le9e1 le9dc pla sta le029 rts le9e1 pla sta le09f,x rts le9e6 lsr bcs le9f8 le9e9 pla sta le093,x ldy #$00 asl bcc le9f3 le9f2 dey le9f3 tya sta le096,x rts le9f8 pla sta le072,x rts le9fd lsr bcs lea1c lea00 lsr bcs lea18 lea03 pla sta le0b7,x lda $fd sta le0b1,x lda $fe sta le0b4,x lda le033,x sta le0ae,x rts lea18 pla jmp (le15f) lea1c lsr bcs lea3d lea1f pla bne lea2c lea22 sta le04b,x sta le051,x sta le054,x rts lea2c sta le05a,x ldy le04b,x bne lea3c lea34 sta le04b,x lda #$01 sta le04e,x lea3c rts lea3d pla sta le02a,x rts lea42 lsr bcc lea4d lea45 sta le048,x pla sta le045,x rts lea4d pla lsr bcs leab2 lea51 lsr bcs lea79 lea54 lsr bcs lea5c lea57 lsr ldy #$f0 bne lea62 lea5c asl asl asl asl ldy #$0f lea62 sta $ff tya bcs lea70 lea67 and le01d,x ora $ff sta le01d,x rts lea70 and le020,x ora $ff sta le020,x rts lea79 lsr bcs leab4 lea7c lsr bcs leae3 lea7f sta $ff lda le0ba,x cmp le1a9,x beq leadd lea89 inc le0ba,x tay lda $fd sta le0e1,y lda $fe sta le0f0,y lda le033,x sta le12f,y ldy $ff lda le117,y beq leada leaa4 sta $fe lda le0ff,y sta $fd lda le13e,y sta le033,x rts leab2 bcs leaff leab4 lsr bcs leaf3 leab7 tay lda $fd sta le0ff,y lda $fe sta le117,y lda le033,x sta le13e,y lda le0ba,x cmp le1a9,x beq leadd lead0 inc le0ba,x tay lda #$00 sta le0f0,y rts leada lda #$30 leadd = * + 1 ; Instruction parameter jumped to. bit $28a9 sta le000 rts leae3 asl asl asl asl eor le025 and #$f0 eor le025 sta le025 rts leaf3 eor le026 and #$0f eor le026 sta le026 rts leaff lsr bcs leb0d leb02 lsr bcs leb09 leb05 sta le0ca rts leb09 sta le0cb rts leb0d lsr bcc leb13 leb10 jmp leba5 leb13 lsr tay beq leb38 leb17 dey beq leb4e leb1a dey beq leb5f leb1d dey beq leb6a leb20 dey beq leb75 leb23 dey beq leb82 leb26 dey beq leb8f leb29 dey beq leb9f leb2c and #$07 ora #$10 bcs leb35 leb32 jmp leab7 leb35 jmp lea7f leb38 ldy le026 bcs leb44 leb3d iny tya and #$0f bne leb4a leb43 rts leb44 tya and #$0f beq leb4d leb49 dey leb4a sty le026 leb4d rts leb4e lda le162,x eor #$ff and le025 bcc leb5b leb58 ora le162,x leb5b sta le025 rts leb5f lda le01a,x and #$fb bcc lebbb leb66 ora #$04 bcs lebbb leb6a lda le01a,x and #$fd bcc lebbb leb71 ora #$02 bcs lebbb leb75 lda le025 and #$f7 bcc leb7e leb7c ora #$08 leb7e sta le025 rts leb82 lda le026 and #$7f bcc leb8b leb89 ora #$80 leb8b sta le026 rts leb8f tya sta le0bd sta le0df iny sty le0e0 rol sta le0c9 rts leb9f tya rol sta le060,x rts leba5 lsr bcs lebcf leba8 lsr bcs lebbf lebab bne lebaf lebad lda #$08 lebaf asl asl asl asl eor le01a,x and #$f0 eor le01a,x lebbb sta le01a,x rts lebbf asl asl asl asl eor le026 and #$70 eor le026 sta le026 rts lebcf lsr bcc lebd6 lebd2 sta le0c0,x rts lebd6 tay beq lebf9 lebd9 dey beq lec1c lebdc dey beq lec42 lebdf and #$03 sta le0c3,x lda #$00 sta le0cd,x sta le0d0,x sta le0d3,x sta le0d6,x sta le0d9 sta le0dc rts lebf9 lda le0b7,x beq lec03 lebfe dec le0b7,x beq lec15 lec03 lda le033,x cmp le0ae,x bne lec16 lec0b lda le0b1,x sta $fd lda le0b4,x sta $fe lec15 rts lec16 lda #$38 sta le000 rts lec1c lda le0ba,x cmp le1a8,x beq lec3c lec24 dec le0ba,x tay dey lda le0f0,y beq lec3b lec2e sta $fe lda le0e1,y sta $fd lda le12f,y sta le033,x lec3b rts lec3c lda #$20 sta le000 rts lec42 lda le000 eor le162,x sta le000 lda #$01 sta le030,x rts lec51 lda le000 and #$07 sta lec81 bne lec5e lec5b jsr le2e9 lec5e rts .byt $00 lec60 ldx #$51 ldy #$ec stx le15d sty le15e jsr le1cf ldx #$00 ldy #$09 jsr le200 lda #$07 sta le000 sta lec81 lec7c rts .byt $00,$00,$00 lec80 lec81 = * + 1 ; Instruction parameter accessed. lda #$00 and #$ff beq lec7c lec86 jmp le329 lec89 lda #$07 sta le000 rts libsidplayfp-2.6.0/src/sidtune/prg.h0000644000175100001770000000255214544470307014344 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2015 Leandro Nini * * 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. */ #ifndef PRG_H #define PRG_H #include "SidTuneBase.h" #include "sidcxx11.h" namespace libsidplayfp { class prg final : public SidTuneBase { protected: prg() {} private: void load(); public: /** * @return pointer to a SidTune or 0 if not a prg file * @throw loadError if prg file is corrupt */ static SidTuneBase* load(const char *fileName, buffer_t& dataBuf); virtual ~prg() {} private: // prevent copying prg(const prg&); prg& operator=(prg&); }; } #endif libsidplayfp-2.6.0/src/sidtune/SidTuneCfg.h0000644000175100001770000000114114544470307015540 00000000000000/* SidTuneCfg.h (template) */ #ifndef SIDTUNECFG_H #define SIDTUNECFG_H #ifdef HAVE_CONFIG_H # include "config.h" #endif // Define the file/path separator(s) that your filesystem uses: // SID_FS_IS_COLON_AND_BACKSLASH, SID_FS_IS_COLON_AND_SLASH, // SID_FS_IS_BACKSLASH, SID_FS_IS_COLON, SID_FS_IS_SLASH #if defined(_WIN32) || defined(_MSDOS) || defined(_OS2) # define SID_FS_IS_COLON_AND_BACKSLASH_AND_SLASH #elif defined(__APPLE__) && defined(__MACH__) # define SID_FS_IS_COLON #elif defined(AMIGA) # define SID_FS_IS_COLON_AND_SLASH #else # define SID_FS_IS_SLASH #endif #endif /* SIDTUNECFG_H */ libsidplayfp-2.6.0/src/sidtune/SidTuneBase.cpp0000644000175100001770000004535214544470307016262 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #include "SidTuneBase.h" #include #include #include #include #include #include #include #include "SmartPtr.h" #include "SidTuneTools.h" #include "SidTuneInfoImpl.h" #include "sidendian.h" #include "sidmemory.h" #include "stringutils.h" #include "MUS.h" #include "p00.h" #include "prg.h" #include "PSID.h" namespace libsidplayfp { // Error and status message strings. const char ERR_EMPTY[] = "SIDTUNE ERROR: No data to load"; const char ERR_UNRECOGNIZED_FORMAT[] = "SIDTUNE ERROR: Could not determine file format"; const char ERR_CANT_LOAD_FILE[] = "SIDTUNE ERROR: Could not load input file"; const char ERR_CANT_OPEN_FILE[] = "SIDTUNE ERROR: Could not open file for binary input"; const char ERR_FILE_TOO_LONG[] = "SIDTUNE ERROR: Input data too long"; const char ERR_DATA_TOO_LONG[] = "SIDTUNE ERROR: Size of music data exceeds C64 memory"; const char ERR_BAD_ADDR[] = "SIDTUNE ERROR: Bad address data"; const char ERR_BAD_RELOC[] = "SIDTUNE ERROR: Bad reloc data"; const char ERR_CORRUPT[] = "SIDTUNE ERROR: File is incomplete or corrupt"; //const char ERR_NOT_ENOUGH_MEMORY[] = "SIDTUNE ERROR: Not enough free memory"; const char SidTuneBase::ERR_TRUNCATED[] = "SIDTUNE ERROR: File is most likely truncated"; const char SidTuneBase::ERR_INVALID[] = "SIDTUNE ERROR: File contains invalid data"; /** * Petscii to Ascii conversion table (0x01 = no output). */ const char CHR_tab[256] = { 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x20,0x21,0x01,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f, 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f, 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f, 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x24,0x5d,0x20,0x20, // alternative: CHR$(92=0x5c) => ISO Latin-1(0xa3) 0x2d,0x23,0x7c,0x2d,0x2d,0x2d,0x2d,0x7c,0x7c,0x5c,0x5c,0x2f,0x5c,0x5c,0x2f,0x2f, 0x5c,0x23,0x5f,0x23,0x7c,0x2f,0x58,0x4f,0x23,0x7c,0x23,0x2b,0x7c,0x7c,0x26,0x5c, // 0x80-0xFF 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, 0x20,0x7c,0x23,0x2d,0x2d,0x7c,0x23,0x7c,0x23,0x2f,0x7c,0x7c,0x2f,0x5c,0x5c,0x2d, 0x2f,0x2d,0x2d,0x7c,0x7c,0x7c,0x7c,0x2d,0x2d,0x2d,0x2f,0x5c,0x5c,0x2f,0x2f,0x23, 0x2d,0x23,0x7c,0x2d,0x2d,0x2d,0x2d,0x7c,0x7c,0x5c,0x5c,0x2f,0x5c,0x5c,0x2f,0x2f, 0x5c,0x23,0x5f,0x23,0x7c,0x2f,0x58,0x4f,0x23,0x7c,0x23,0x2b,0x7c,0x7c,0x26,0x5c, 0x20,0x7c,0x23,0x2d,0x2d,0x7c,0x23,0x7c,0x23,0x2f,0x7c,0x7c,0x2f,0x5c,0x5c,0x2d, 0x2f,0x2d,0x2d,0x7c,0x7c,0x7c,0x7c,0x2d,0x2d,0x2d,0x2f,0x5c,0x5c,0x2f,0x2f,0x23 }; /// The Commodore 64 memory size const uint_least32_t MAX_MEMORY = 65536; /// C64KB + LOAD + PSID const uint_least32_t MAX_FILELEN = MAX_MEMORY + 2 + 0x7C; /// Minimum load address for real c64 only tunes const uint_least16_t SIDTUNE_R64_MIN_LOAD_ADDR = 0x07e8; SidTuneBase* SidTuneBase::load(const char* fileName, const char **fileNameExt, bool separatorIsSlash) { return load(nullptr, fileName, fileNameExt, separatorIsSlash); } SidTuneBase* SidTuneBase::load(LoaderFunc loader, const char* fileName, const char **fileNameExt, bool separatorIsSlash) { if (fileName == nullptr) return nullptr; #if !defined(SIDTUNE_NO_STDIN_LOADER) // Filename "-" is used as a synonym for standard input. if (strcmp(fileName, "-") == 0) return getFromStdIn(); #endif return getFromFiles(loader, fileName, fileNameExt, separatorIsSlash); } SidTuneBase* SidTuneBase::read(const uint_least8_t* sourceBuffer, uint_least32_t bufferLen) { return getFromBuffer(sourceBuffer, bufferLen); } const SidTuneInfo* SidTuneBase::getInfo() const { return info.get(); } const SidTuneInfo* SidTuneBase::getInfo(unsigned int songNum) { selectSong(songNum); return info.get(); } unsigned int SidTuneBase::selectSong(unsigned int selectedSong) { // Check whether selected song is valid, use start song if not const unsigned int song = (selectedSong == 0 || selectedSong > info->m_songs) ? info->m_startSong : selectedSong; // Copy any song-specific variable information // such a speed/clock setting to the info structure. info->m_currentSong = song; // Retrieve song speed definition. switch (info->m_compatibility) { case SidTuneInfo::COMPATIBILITY_R64: info->m_songSpeed = SidTuneInfo::SPEED_CIA_1A; break; case SidTuneInfo::COMPATIBILITY_PSID: // This does not take into account the PlaySID bug upon evaluating the // SPEED field. It would most likely break compatibility to lots of // sidtunes, which have been converted from .SID format and vice versa. // The .SID format does the bit-wise/song-wise evaluation of the SPEED // value correctly, like it is described in the PlaySID documentation. info->m_songSpeed = songSpeed[(song - 1) & 31]; break; default: info->m_songSpeed = songSpeed[song - 1]; break; } info->m_clockSpeed = clockSpeed[song - 1]; return info->m_currentSong; } // ------------------------------------------------- private member functions void SidTuneBase::placeSidTuneInC64mem(sidmemory& mem) { // The Basic ROM sets these values on loading a file. // Program end address const uint_least16_t start = info->m_loadAddr; const uint_least16_t end = start + info->m_c64dataLen; mem.writeMemWord(0x2d, end); // Variables start mem.writeMemWord(0x2f, end); // Arrays start mem.writeMemWord(0x31, end); // Strings start mem.writeMemWord(0xac, start); mem.writeMemWord(0xae, end); // Copy data from cache to the correct destination. mem.fillRam(info->m_loadAddr, &cache[fileOffset], info->m_c64dataLen); } void SidTuneBase::loadFile(const char* fileName, buffer_t& bufferRef) { std::ifstream inFile(fileName, std::ifstream::binary); if (!inFile.is_open()) { throw loadError(ERR_CANT_OPEN_FILE); } inFile.seekg(0, inFile.end); const int fileLen = inFile.tellg(); if (fileLen <= 0) { throw loadError(ERR_EMPTY); } inFile.seekg(0, inFile.beg); buffer_t fileBuf; fileBuf.reserve(fileLen); try { fileBuf.assign(std::istreambuf_iterator(inFile), std::istreambuf_iterator()); } catch (std::exception &ex) { throw loadError(ex.what()); } if (inFile.bad()) { throw loadError(ERR_CANT_LOAD_FILE); } inFile.close(); bufferRef.swap(fileBuf); } SidTuneBase::SidTuneBase() : info(new SidTuneInfoImpl()), fileOffset(0) { // Initialize the object with some safe defaults. for (unsigned int si = 0; si < MAX_SONGS; si++) { songSpeed[si] = info->m_songSpeed; clockSpeed[si] = info->m_clockSpeed; } } #if !defined(SIDTUNE_NO_STDIN_LOADER) SidTuneBase* SidTuneBase::getFromStdIn() { buffer_t fileBuf; // We only read as much as fits in the buffer. // This way we avoid choking on huge data. char datb; while (std::cin.get(datb) && fileBuf.size() < MAX_FILELEN) { fileBuf.push_back((uint_least8_t)datb); } return getFromBuffer(&fileBuf.front(), fileBuf.size()); } #endif SidTuneBase* SidTuneBase::getFromBuffer(const uint_least8_t* const buffer, uint_least32_t bufferLen) { if (buffer == nullptr || bufferLen == 0) { throw loadError(ERR_EMPTY); } if (bufferLen > MAX_FILELEN) { throw loadError(ERR_FILE_TOO_LONG); } buffer_t buf1(buffer, buffer + bufferLen); // Here test for the possible single file formats. std::unique_ptr s(PSID::load(buf1)); if (s.get() == nullptr) s.reset(MUS::load(buf1, true)); if (s.get() == nullptr) throw loadError(ERR_UNRECOGNIZED_FORMAT); s->acceptSidTune("-", "-", buf1, false); return s.release(); } void SidTuneBase::acceptSidTune(const char* dataFileName, const char* infoFileName, buffer_t& buf, bool isSlashedFileName) { // Make a copy of the data file name and path, if available. if (dataFileName != nullptr) { const size_t fileNamePos = isSlashedFileName ? SidTuneTools::slashedFileNameWithoutPath(dataFileName) : SidTuneTools::fileNameWithoutPath(dataFileName); info->m_path = std::string(dataFileName, fileNamePos); info->m_dataFileName = std::string(dataFileName + fileNamePos); } // Make a copy of the info file name, if available. if (infoFileName != nullptr) { const size_t fileNamePos = isSlashedFileName ? SidTuneTools::slashedFileNameWithoutPath(infoFileName) : SidTuneTools::fileNameWithoutPath(infoFileName); info->m_infoFileName = std::string(infoFileName + fileNamePos); } // Fix bad sidtune set up. if (info->m_songs > MAX_SONGS) { info->m_songs = MAX_SONGS; } else if (info->m_songs == 0) { info->m_songs = 1; } if (info->m_startSong == 0 || info->m_startSong > info->m_songs) { info->m_startSong = 1; } info->m_dataFileLen = buf.size(); info->m_c64dataLen = buf.size() - fileOffset; // Calculate any remaining addresses and then // confirm all the file details are correct resolveAddrs(&buf[fileOffset]); if (checkRelocInfo() == false) { throw loadError(ERR_BAD_RELOC); } if (checkCompatibility() == false) { throw loadError(ERR_BAD_ADDR); } if (info->m_dataFileLen >= 2) { // We only detect an offset of two. Some position independent // sidtunes contain a load address of 0xE000, but are loaded // to 0x0FFE and call player at 0x1000. info->m_fixLoad = (endian_little16(&buf[fileOffset])==(info->m_loadAddr+2)); } // Check the size of the data. if (info->m_c64dataLen > MAX_MEMORY) { throw loadError(ERR_DATA_TOO_LONG); } else if (info->m_c64dataLen == 0) { throw loadError(ERR_EMPTY); } cache.swap(buf); } void SidTuneBase::createNewFileName(std::string& destString, const char* sourceName, const char* sourceExt) { destString.assign(sourceName); destString.erase(destString.find_last_of('.')); destString.append(sourceExt); } // Initializing the object based upon what we find in the specified file. SidTuneBase* SidTuneBase::getFromFiles(const char* fileName, const char **fileNameExtensions, bool separatorIsSlash) { return getFromFiles(nullptr, fileName, fileNameExtensions, separatorIsSlash); } SidTuneBase* SidTuneBase::getFromFiles(LoaderFunc loader, const char* fileName, const char **fileNameExtensions, bool separatorIsSlash) { buffer_t fileBuf1; if (loader == nullptr) loader = (LoaderFunc) loadFile; loader(fileName, fileBuf1); // File loaded. Now check if it is in a valid single-file-format. std::unique_ptr s(PSID::load(fileBuf1)); if (s.get() == nullptr) { // Try some native C64 file formats s.reset(MUS::load(fileBuf1, true)); if (s.get() != nullptr) { // Try to find second file. std::string fileName2; int n = 0; while (fileNameExtensions[n] != nullptr) { createNewFileName(fileName2, fileName, fileNameExtensions[n]); // 1st data file was loaded into "fileBuf1", // so we load the 2nd one into "fileBuf2". // Do not load the first file again if names are equal. if (!stringutils::equal(fileName, fileName2.data(), fileName2.size())) { try { buffer_t fileBuf2; loader(fileName2.c_str(), fileBuf2); // Check if tunes in wrong order and therefore swap them here if (stringutils::equal(fileNameExtensions[n], ".mus")) { std::unique_ptr s2(MUS::load(fileBuf2, fileBuf1, 0, true)); if (s2.get() != nullptr) { s2->acceptSidTune(fileName2.c_str(), fileName, fileBuf2, separatorIsSlash); return s2.release(); } } else { std::unique_ptr s2(MUS::load(fileBuf1, fileBuf2, 0, true)); if (s2.get() != nullptr) { s2->acceptSidTune(fileName, fileName2.c_str(), fileBuf1, separatorIsSlash); return s2.release(); } } // The first tune loaded ok, so ignore errors on the // second tune, may find an ok one later } catch (loadError const &) {} } n++; } } } if (s.get() == nullptr) s.reset(p00::load(fileName, fileBuf1)); if (s.get() == nullptr) s.reset(prg::load(fileName, fileBuf1)); if (s.get() == nullptr) throw loadError(ERR_UNRECOGNIZED_FORMAT); s->acceptSidTune(fileName, nullptr, fileBuf1, separatorIsSlash); return s.release(); } void SidTuneBase::convertOldStyleSpeedToTables(uint_least32_t speed, SidTuneInfo::clock_t clock) { // Create the speed/clock setting tables. // // This routine implements the PSIDv2NG compliant speed conversion. All tunes // above 32 use the same song speed as tune 32 // NOTE: The cast here is used to avoid undefined references // as the std::min function takes its parameters by reference const unsigned int toDo = std::min(info->m_songs, static_cast(MAX_SONGS)); for (unsigned int s = 0; s < toDo; s++) { clockSpeed[s] = clock; songSpeed[s] = (speed & 1) ? SidTuneInfo::SPEED_CIA_1A : SidTuneInfo::SPEED_VBI; if (s < 31) { speed >>= 1; } } } bool SidTuneBase::checkRelocInfo() { // Fix relocation information if (info->m_relocStartPage == 0xFF) { info->m_relocPages = 0; return true; } else if (info->m_relocPages == 0) { info->m_relocStartPage = 0; return true; } // Calculate start/end page const uint_least8_t startp = info->m_relocStartPage; const uint_least8_t endp = (startp + info->m_relocPages - 1) & 0xff; if (endp < startp) { return false; } { // Check against load range const uint_least8_t startlp = (uint_least8_t) (info->m_loadAddr >> 8); const uint_least8_t endlp = startlp + (uint_least8_t) ((info->m_c64dataLen - 1) >> 8); if (((startp <= startlp) && (endp >= startlp)) || ((startp <= endlp) && (endp >= endlp))) { return false; } } // Check that the relocation information does not use the following // memory areas: 0x0000-0x03FF, 0xA000-0xBFFF and 0xD000-0xFFFF if ((startp < 0x04) || ((0xa0 <= startp) && (startp <= 0xbf)) || (startp >= 0xd0) || ((0xa0 <= endp) && (endp <= 0xbf)) || (endp >= 0xd0)) { return false; } return true; } void SidTuneBase::resolveAddrs(const uint_least8_t *c64data) { // Originally used as a first attempt at an RSID // style format. Now reserved for future use if (info->m_playAddr == 0xffff) { info->m_playAddr = 0; } // loadAddr = 0 means, the address is stored in front of the C64 data. if (info->m_loadAddr == 0) { if (info->m_c64dataLen < 2) { throw loadError(ERR_CORRUPT); } info->m_loadAddr = endian_16(*(c64data+1), *c64data); fileOffset += 2; info->m_c64dataLen -= 2; } if (info->m_compatibility == SidTuneInfo::COMPATIBILITY_BASIC) { if (info->m_initAddr != 0) { throw loadError(ERR_BAD_ADDR); } } else if (info->m_initAddr == 0) { info->m_initAddr = info->m_loadAddr; } } bool SidTuneBase::checkCompatibility() { if (info->m_compatibility == SidTuneInfo::COMPATIBILITY_R64) { // Check valid init address switch (info->m_initAddr >> 12) { case 0x0A: case 0x0B: case 0x0D: case 0x0E: case 0x0F: return false; default: if ((info->m_initAddr < info->m_loadAddr) || (info->m_initAddr > (info->m_loadAddr + info->m_c64dataLen - 1))) { return false; } } // Check tune is loadable on a real C64 if (info->m_loadAddr < SIDTUNE_R64_MIN_LOAD_ADDR) { return false; } } return true; } std::string SidTuneBase::petsciiToAscii(SmartPtr_sidtt& spPet) { std::string buffer; do { const uint8_t petsciiChar = *spPet; spPet++; if ((petsciiChar == 0x00) || (petsciiChar == 0x0d)) break; // If character is 0x9d (left arrow key) then move back. if ((petsciiChar == 0x9d) && (!buffer.empty())) { buffer.resize(buffer.size() - 1); } else { // ASCII CHR$ conversion const char asciiChar = CHR_tab[petsciiChar]; if ((asciiChar >= 0x20) && (buffer.length() <= 31)) buffer.push_back(asciiChar); } } while (!spPet.fail()); return buffer; } } libsidplayfp-2.6.0/src/sidtune/SidTuneTools.cpp0000644000175100001770000000475614544470307016513 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) Michael Schwendt * * 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. */ #include "SidTuneTools.h" #include "SidTuneCfg.h" namespace libsidplayfp { // Return pointer to file name position in complete path. size_t SidTuneTools::fileNameWithoutPath(const char* s) { size_t last_slash_pos = -1; const size_t length = strlen(s); for (size_t pos = 0; pos < length; pos++) { #if defined(SID_FS_IS_COLON_AND_BACKSLASH_AND_SLASH) if (s[pos] == ':' || s[pos] == '\\' || s[pos] == '/') #elif defined(SID_FS_IS_COLON_AND_SLASH) if (s[pos] == ':' || s[pos] == '/') #elif defined(SID_FS_IS_SLASH) if (s[pos] == '/') #elif defined(SID_FS_IS_BACKSLASH) if (s[pos] == '\\') #elif defined(SID_FS_IS_COLON) if (s[pos] == ':') #else # error Missing file/path separator definition. #endif { last_slash_pos = pos; } } return last_slash_pos + 1; } // Return pointer to file name position in complete path. // Special version: file separator = forward slash. size_t SidTuneTools::slashedFileNameWithoutPath(const char* s) { size_t last_slash_pos = -1; const size_t length = strlen(s); for (size_t pos = 0; pos < length; pos++) { if ( s[pos] == '/' ) { last_slash_pos = pos; } } return last_slash_pos + 1; } // Return pointer to file name extension in path. // The backwards-version. const char* SidTuneTools::fileExtOfPath(const char* s) { size_t last_dot_pos = strlen(s); // assume no dot and append for (size_t pos = last_dot_pos; pos > 0; pos--) { if (s[pos-1] == '.') { last_dot_pos = pos - 1; break; } } return &s[last_dot_pos]; } } libsidplayfp-2.6.0/src/sidtune/p00.cpp0000644000175100001770000001135214544470307014504 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "p00.h" #include #include #include #include #include "sidplayfp/SidTuneInfo.h" #include "SmartPtr.h" #include "SidTuneTools.h" namespace libsidplayfp { #define X00_ID_LEN 8 #define X00_NAME_LEN 17 // File format from PC64. PC64 automatically generates // the filename from the cbm name (16 to 8 conversion) // but we only need to worry about that when writing files // should we want pc64 compatibility. The extension numbers // are just an index to try to avoid repeats. Name conversion // works by creating an initial filename from alphanumeric // and ' ', '-' characters only with the later two being // converted to '_'. Then it parses the filename // from end to start removing characters stopping as soon // as the filename becomes <= 8. The removal of characters // occurs in three passes, the first removes all '_', then // vowels and finally numerics. If the filename is still // greater than 8 it is truncated. struct X00Header { char id[X00_ID_LEN]; // 'C64File' (ASCII) uint8_t name[X00_NAME_LEN]; // C64 name (PETSCII) uint8_t length; // Rel files only (Bytes/Record), // should be 0 for all other types }; typedef enum { X00_DEL, X00_SEQ, X00_PRG, X00_USR, X00_REL } X00Format; // Format strings const char TXT_FORMAT_DEL[] = "Unsupported tape image file (DEL)"; const char TXT_FORMAT_SEQ[] = "Unsupported tape image file (SEQ)"; const char TXT_FORMAT_PRG[] = "Tape image file (PRG)"; const char TXT_FORMAT_USR[] = "Unsupported USR file (USR)"; const char TXT_FORMAT_REL[] = "Unsupported tape image file (REL)"; // Magic field const char P00_ID[] = "C64File"; SidTuneBase* p00::load(const char *fileName, buffer_t& dataBuf) { const char *ext = SidTuneTools::fileExtOfPath(fileName); // Combined extension & magic field identification if (strlen(ext) != 4) return nullptr; if (!isdigit(ext[2]) || !isdigit(ext[3])) return nullptr; const char *format = nullptr; X00Format type; switch (toupper(ext[1])) { case 'D': type = X00_DEL; format = TXT_FORMAT_DEL; break; case 'S': type = X00_SEQ; format = TXT_FORMAT_SEQ; break; case 'P': type = X00_PRG; format = TXT_FORMAT_PRG; break; case 'U': type = X00_USR; format = TXT_FORMAT_USR; break; case 'R': type = X00_REL; format = TXT_FORMAT_REL; break; default: return nullptr; } // Verify the file is what we think it is const buffer_t::size_type bufLen = dataBuf.size(); if (bufLen < X00_ID_LEN) return nullptr; X00Header pHeader; memcpy(pHeader.id, &dataBuf[0], X00_ID_LEN); memcpy(pHeader.name, &dataBuf[X00_ID_LEN], X00_NAME_LEN); pHeader.length = dataBuf[X00_ID_LEN + X00_NAME_LEN]; if (strcmp(pHeader.id, P00_ID)) return nullptr; // File types current supported if (type != X00_PRG) throw loadError("Not a PRG inside X00"); if (bufLen < sizeof(X00Header) + 2) throw loadError(ERR_TRUNCATED); std::unique_ptr tune(new p00()); tune->load(format, &pHeader); return tune.release(); } void p00::load(const char* format, const X00Header* pHeader) { info->m_formatString = format; { // Decode file name SmartPtr_sidtt spPet(pHeader->name, X00_NAME_LEN); info->m_infoString.push_back(petsciiToAscii(spPet)); } // Automatic settings fileOffset = X00_ID_LEN + X00_NAME_LEN + 1; info->m_songs = 1; info->m_startSong = 1; info->m_compatibility = SidTuneInfo::COMPATIBILITY_BASIC; // Create the speed/clock setting table. convertOldStyleSpeedToTables(~0, info->m_clockSpeed); } } libsidplayfp-2.6.0/src/sidtune/SmartPtr.h0000644000175100001770000000671414544470307015334 00000000000000/* Simple smart pointer class. */ #ifndef SMARTPTR_H #define SMARTPTR_H #include "sidcxx11.h" namespace libsidplayfp { typedef unsigned long int ulint_smartpt; template class SmartPtrBase_sidtt { public: SmartPtrBase_sidtt(T* buffer, ulint_smartpt bufferLen, bool bufOwner = false) : bufBegin(nullptr), bufEnd(nullptr), pBufCurrent(nullptr), bufLen(0), status(false), doFree(bufOwner), dummy(0) { if ((buffer != nullptr) && (bufferLen != 0)) { bufBegin = buffer; pBufCurrent = buffer; bufEnd = bufBegin + bufferLen; bufLen = bufferLen; status = true; } } virtual ~SmartPtrBase_sidtt() { if (doFree && (bufBegin != nullptr)) { delete[] bufBegin; } } /* --- public member functions --- */ virtual T* tellBegin() const { return bufBegin; } virtual ulint_smartpt tellLength() const { return bufLen; } virtual ulint_smartpt tellPos() const { return static_cast(pBufCurrent - bufBegin); } virtual bool checkIndex(ulint_smartpt index) const { return (pBufCurrent + index) < bufEnd; } virtual bool reset() { if (bufLen) { pBufCurrent = bufBegin; status = true; } else { status = false; } return status; } virtual bool good() const { return pBufCurrent < bufEnd; } virtual bool fail() const { return pBufCurrent == bufEnd; } virtual void operator ++() { if (good()) { pBufCurrent++; } else { status = false; } } virtual void operator ++(int) { if (good()) { pBufCurrent++; } else { status = false; } } virtual void operator --() { if (!fail()) { pBufCurrent--; } else { status = false; } } virtual void operator --(int) { if (!fail()) { pBufCurrent--; } else { status = false; } } virtual void operator +=(ulint_smartpt offset) { if (checkIndex(offset)) { pBufCurrent += offset; } else { status = false; } } virtual void operator -=(ulint_smartpt offset) { if ((pBufCurrent-offset) >= bufBegin) { pBufCurrent -= offset; } else { status = false; } } virtual T operator*() { if (good()) { return *pBufCurrent; } else { status = false; return dummy; } } virtual T& operator [](ulint_smartpt index) { if (checkIndex(index)) { return pBufCurrent[index]; } else { status = false; return dummy; } } virtual operator bool() { return status; } protected: T* bufBegin; T* bufEnd; T* pBufCurrent; ulint_smartpt bufLen; bool status; const bool doFree; const T dummy; }; template class SmartPtr_sidtt final : public SmartPtrBase_sidtt { public: SmartPtr_sidtt(T* buffer, ulint_smartpt bufferLen, bool bufOwner = false) : SmartPtrBase_sidtt(buffer, bufferLen, bufOwner) {} SmartPtr_sidtt() : SmartPtrBase_sidtt(0, 0) {} void setBuffer(T* buffer, ulint_smartpt bufferLen) { if ((buffer != nullptr) && (bufferLen != 0)) { this->bufBegin = buffer; this->pBufCurrent = buffer; this->bufEnd = buffer + bufferLen; this->bufLen = bufferLen; this->status = true; } else { this->bufBegin = nullptr; this->pBufCurrent = nullptr; this->bufEnd = nullptr; this->bufLen = 0; this->status = false; } } }; } #endif /* SMARTPTR_H */ libsidplayfp-2.6.0/src/sidtune/PSID.cpp0000644000175100001770000003247214544470307014652 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "PSID.h" #include #include #include #include "sidplayfp/SidTuneInfo.h" #include "sidendian.h" #include "sidmd5.h" namespace libsidplayfp { const int PSID_MAXSTRLEN = 32; // Header has been extended for 'RSID' format // The following changes are present: // id = 'RSID' // version = 2, 3 or 4 // play, load and speed reserved 0 // psidspecific flag is called C64BASIC flag // init cannot be under ROMS/IO memory area // load address cannot be less than $07E8 // info strings may be 32 characters long without trailing zero struct psidHeader // all values are big-endian { uint32_t id; // 'PSID' or 'RSID' (ASCII) uint16_t version; // 1, 2, 3 or 4 uint16_t data; // 16-bit offset to binary data in file uint16_t load; // 16-bit C64 address to load file to uint16_t init; // 16-bit C64 address of init subroutine uint16_t play; // 16-bit C64 address of play subroutine uint16_t songs; // number of songs uint16_t start; // start song out of [1..256] uint32_t speed; // 32-bit speed info // bit: 0=50 Hz, 1=CIA 1 Timer A (default: 60 Hz) char name[PSID_MAXSTRLEN]; // ASCII strings, 31 characters long and char author[PSID_MAXSTRLEN]; // terminated by a trailing zero char released[PSID_MAXSTRLEN]; // uint16_t flags; // only version >= 2 uint8_t relocStartPage; // only version >= 2ng uint8_t relocPages; // only version >= 2ng uint8_t sidChipBase2; // only version >= 3 uint8_t sidChipBase3; // only version >= 4 }; enum { PSID_MUS = 1 << 0, PSID_SPECIFIC = 1 << 1, // These two are mutally exclusive PSID_BASIC = 1 << 1, PSID_CLOCK = 3 << 2, PSID_SIDMODEL = 3 << 4 }; enum { PSID_CLOCK_UNKNOWN = 0, PSID_CLOCK_PAL = 1 << 2, PSID_CLOCK_NTSC = 1 << 3, PSID_CLOCK_ANY = PSID_CLOCK_PAL | PSID_CLOCK_NTSC }; enum { PSID_SIDMODEL_UNKNOWN = 0, PSID_SIDMODEL_6581 = 1, PSID_SIDMODEL_8580 = 2, PSID_SIDMODEL_ANY = PSID_SIDMODEL_6581 | PSID_SIDMODEL_8580 }; // Format strings const char TXT_FORMAT_PSID[] = "PlaySID one-file format (PSID)"; const char TXT_FORMAT_RSID[] = "Real C64 one-file format (RSID)"; const char TXT_UNKNOWN_PSID[] = "Unsupported PSID version"; const char TXT_UNKNOWN_RSID[] = "Unsupported RSID version"; const int psid_headerSize = 118; const int psidv2_headerSize = psid_headerSize + 6; // Magic fields const uint32_t PSID_ID = 0x50534944; const uint32_t RSID_ID = 0x52534944; /** * Decode SID model flags. */ SidTuneInfo::model_t getSidModel(uint_least16_t modelFlag) { if ((modelFlag & PSID_SIDMODEL_ANY) == PSID_SIDMODEL_ANY) return SidTuneInfo::SIDMODEL_ANY; if (modelFlag & PSID_SIDMODEL_6581) return SidTuneInfo::SIDMODEL_6581; if (modelFlag & PSID_SIDMODEL_8580) return SidTuneInfo::SIDMODEL_8580; return SidTuneInfo::SIDMODEL_UNKNOWN; } /** * Check if extra SID addres is valid for PSID specs. */ bool validateAddress(uint_least8_t address) { // Only even values are valid. if (address & 1) return false; // Ranges $00-$41 ($D000-$D410) and $80-$DF ($D800-$DDF0) are invalid. // Any invalid value means that no second SID is used, like $00. if (address <= 0x41 || (address >= 0x80 && address <= 0xdf)) return false; return true; } SidTuneBase* PSID::load(buffer_t& dataBuf) { // File format check if (dataBuf.size() < 4) { return nullptr; } const uint32_t magic = endian_big32(&dataBuf[0]); if ((magic != PSID_ID) && (magic != RSID_ID)) { return nullptr; } psidHeader pHeader; readHeader(dataBuf, pHeader); std::unique_ptr tune(new PSID()); tune->tryLoad(pHeader); return tune.release(); } void PSID::readHeader(const buffer_t &dataBuf, psidHeader &hdr) { // Due to security concerns, input must be at least as long as version 1 // header plus 16-bit C64 load address. That is the area which will be // accessed. if (dataBuf.size() < (psid_headerSize + 2)) { throw loadError(ERR_TRUNCATED); } // Read v1 fields hdr.id = endian_big32(&dataBuf[0]); hdr.version = endian_big16(&dataBuf[4]); hdr.data = endian_big16(&dataBuf[6]); hdr.load = endian_big16(&dataBuf[8]); hdr.init = endian_big16(&dataBuf[10]); hdr.play = endian_big16(&dataBuf[12]); hdr.songs = endian_big16(&dataBuf[14]); hdr.start = endian_big16(&dataBuf[16]); hdr.speed = endian_big32(&dataBuf[18]); memcpy(hdr.name, &dataBuf[22], PSID_MAXSTRLEN); memcpy(hdr.author, &dataBuf[54], PSID_MAXSTRLEN); memcpy(hdr.released, &dataBuf[86], PSID_MAXSTRLEN); if (hdr.version >= 2) { if (dataBuf.size() < (psidv2_headerSize + 2)) { throw loadError(ERR_TRUNCATED); } // Read v2/3/4 fields hdr.flags = endian_big16(&dataBuf[118]); hdr.relocStartPage = dataBuf[120]; hdr.relocPages = dataBuf[121]; hdr.sidChipBase2 = dataBuf[122]; hdr.sidChipBase3 = dataBuf[123]; } } void PSID::tryLoad(const psidHeader &pHeader) { SidTuneInfo::compatibility_t compatibility = SidTuneInfo::COMPATIBILITY_C64; // Require a valid ID and version number. if (pHeader.id == PSID_ID) { switch (pHeader.version) { case 1: compatibility = SidTuneInfo::COMPATIBILITY_PSID; break; case 2: case 3: case 4: break; default: throw loadError(TXT_UNKNOWN_PSID); } info->m_formatString = TXT_FORMAT_PSID; } else if (pHeader.id == RSID_ID) { switch (pHeader.version) { case 2: case 3: case 4: break; default: throw loadError(TXT_UNKNOWN_RSID); } info->m_formatString = TXT_FORMAT_RSID; compatibility = SidTuneInfo::COMPATIBILITY_R64; } fileOffset = pHeader.data; info->m_loadAddr = pHeader.load; info->m_initAddr = pHeader.init; info->m_playAddr = pHeader.play; info->m_songs = pHeader.songs; info->m_startSong = pHeader.start; info->m_compatibility = compatibility; info->m_relocPages = 0; info->m_relocStartPage = 0; uint_least32_t speed = pHeader.speed; SidTuneInfo::clock_t clock = SidTuneInfo::CLOCK_UNKNOWN; bool musPlayer = false; if (pHeader.version >= 2) { const uint_least16_t flags = pHeader.flags; // Check clock if (flags & PSID_MUS) { // MUS tunes run at any speed clock = SidTuneInfo::CLOCK_ANY; musPlayer = true; } else { switch (flags & PSID_CLOCK) { case PSID_CLOCK_ANY: clock = SidTuneInfo::CLOCK_ANY; break; case PSID_CLOCK_PAL: clock = SidTuneInfo::CLOCK_PAL; break; case PSID_CLOCK_NTSC: clock = SidTuneInfo::CLOCK_NTSC; break; default: break; } } // These flags are only available for the appropriate // file formats switch (compatibility) { case SidTuneInfo::COMPATIBILITY_C64: if (flags & PSID_SPECIFIC) info->m_compatibility = SidTuneInfo::COMPATIBILITY_PSID; break; case SidTuneInfo::COMPATIBILITY_R64: if (flags & PSID_BASIC) info->m_compatibility = SidTuneInfo::COMPATIBILITY_BASIC; break; default: break; } info->m_clockSpeed = clock; info->m_sidModels[0] = getSidModel(flags >> 4); info->m_relocStartPage = pHeader.relocStartPage; info->m_relocPages = pHeader.relocPages; if (pHeader.version >= 3) { if (validateAddress(pHeader.sidChipBase2)) { info->m_sidChipAddresses.push_back(0xd000 | (pHeader.sidChipBase2 << 4)); info->m_sidModels.push_back(getSidModel(flags >> 6)); } if (pHeader.version >= 4) { if (pHeader.sidChipBase3 != pHeader.sidChipBase2 && validateAddress(pHeader.sidChipBase3)) { info->m_sidChipAddresses.push_back(0xd000 | (pHeader.sidChipBase3 << 4)); info->m_sidModels.push_back(getSidModel(flags >> 8)); } } } } // Check reserved fields to force real c64 compliance // as required by the RSID specification if (compatibility == SidTuneInfo::COMPATIBILITY_R64) { if ((info->m_loadAddr != 0) || (info->m_playAddr != 0) || (speed != 0)) { throw loadError(ERR_INVALID); } // Real C64 tunes appear as CIA speed = ~0; } // Create the speed/clock setting table. convertOldStyleSpeedToTables(speed, clock); // Copy info strings. info->m_infoString.push_back(std::string(pHeader.name, PSID_MAXSTRLEN)); info->m_infoString.push_back(std::string(pHeader.author, PSID_MAXSTRLEN)); info->m_infoString.push_back(std::string(pHeader.released, PSID_MAXSTRLEN)); if (musPlayer) throw loadError("Compute!'s Sidplayer MUS data is not supported yet"); // TODO } const char *PSID::createMD5(char *md5) { if (md5 == nullptr) md5 = m_md5; *md5 = '\0'; try { // Include C64 data. sidmd5 myMD5; myMD5.append(&cache[fileOffset], info->m_c64dataLen); uint8_t tmp[2]; // Include INIT and PLAY address. endian_little16(tmp, info->m_initAddr); myMD5.append(tmp, sizeof(tmp)); endian_little16(tmp, info->m_playAddr); myMD5.append(tmp, sizeof(tmp)); // Include number of songs. endian_little16(tmp, info->m_songs); myMD5.append(tmp, sizeof(tmp)); { // Include song speed for each song. const unsigned int currentSong = info->m_currentSong; for (unsigned int s = 1; s <= info->m_songs; s++) { selectSong(s); const uint8_t songSpeed = static_cast(info->m_songSpeed); myMD5.append(&songSpeed, sizeof(songSpeed)); } // Restore old song selectSong(currentSong); } // Deal with PSID v2NG clock speed flags: Let only NTSC // clock speed change the MD5 fingerprint. That way the // fingerprint of a PAL-speed sidtune in PSID v1, v2, and // PSID v2NG format is the same. if (info->m_clockSpeed == SidTuneInfo::CLOCK_NTSC) { const uint8_t ntsc_val = 2; myMD5.append(&ntsc_val, sizeof(ntsc_val)); } // NB! If the fingerprint is used as an index into a // song-lengths database or cache, modify above code to // allow for PSID v2NG files which have clock speed set to // SIDTUNE_CLOCK_ANY. If the SID player program fully // supports the SIDTUNE_CLOCK_ANY setting, a sidtune could // either create two different fingerprints depending on // the clock speed chosen by the player, or there could be // two different values stored in the database/cache. myMD5.finish(); // Get fingerprint. myMD5.getDigest().copy(md5, SidTune::MD5_LENGTH); md5[SidTune::MD5_LENGTH] = '\0'; } catch (md5Error const &) { return nullptr; } return md5; } const char *PSID::createMD5New(char *md5) { if (md5 == nullptr) md5 = m_md5; *md5 = '\0'; try { // The calculation is now simplified // All the header + all the data sidmd5 myMD5; myMD5.append(&cache[0], cache.size()); myMD5.finish(); // Get fingerprint. myMD5.getDigest().copy(md5, SidTune::MD5_LENGTH); md5[SidTune::MD5_LENGTH] = '\0'; } catch (md5Error const &) { return nullptr; } return md5; } } libsidplayfp-2.6.0/src/sidtune/p00.h0000644000175100001770000000265314544470307014155 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2015 Leandro Nini * * 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. */ #ifndef P00_H #define P00_H #include "SidTuneBase.h" #include "sidcxx11.h" namespace libsidplayfp { struct X00Header; class p00 final : public SidTuneBase { protected: p00() {} private: void load(const char* format, const X00Header* pHeader); public: /** * @return pointer to a SidTune or 0 if not a PC64 file * @throw loadError if PC64 file is corrupt */ static SidTuneBase* load(const char *fileName, buffer_t& dataBuf); virtual ~p00() {} private: // prevent copying p00(const p00&); p00& operator=(p00&); }; } #endif libsidplayfp-2.6.0/src/sidtune/SidTuneTools.h0000644000175100001770000000273014544470307016146 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) Michael Schwendt * * 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. */ #ifndef SIDTUNETOOLS_H #define SIDTUNETOOLS_H #include namespace libsidplayfp { namespace SidTuneTools { /** * Return pointer to file name position in complete path. */ size_t fileNameWithoutPath(const char* s); /** * Return pointer to file name position in complete path. * Special version: file separator = forward slash. */ size_t slashedFileNameWithoutPath(const char* s); /** * Return pointer to file name extension in path. * Searching backwards until first dot is found. */ const char* fileExtOfPath(const char* s); } } #endif /* SIDTUNETOOLS_H */ libsidplayfp-2.6.0/src/sidtune/SidTuneInfoImpl.h0000644000175100001770000001141014544470307016556 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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 */ #ifndef SIDTUNEINFOIMPL_H #define SIDTUNEINFOIMPL_H #include #include #include #include "sidplayfp/SidTuneInfo.h" #include "sidcxx11.h" namespace libsidplayfp { /** * The implementation of the SidTuneInfo interface. */ class SidTuneInfoImpl final : public SidTuneInfo { public: const char* m_formatString; unsigned int m_songs; unsigned int m_startSong; unsigned int m_currentSong; int m_songSpeed; clock_t m_clockSpeed; compatibility_t m_compatibility; uint_least32_t m_dataFileLen; uint_least32_t m_c64dataLen; uint_least16_t m_loadAddr; uint_least16_t m_initAddr; uint_least16_t m_playAddr; uint_least8_t m_relocStartPage; uint_least8_t m_relocPages; std::string m_path; std::string m_dataFileName; std::string m_infoFileName; std::vector m_sidModels; std::vector m_sidChipAddresses; std::vector m_infoString; std::vector m_commentString; bool m_fixLoad; private: // prevent copying SidTuneInfoImpl(const SidTuneInfoImpl&); SidTuneInfoImpl& operator=(SidTuneInfoImpl&); public: SidTuneInfoImpl() : m_formatString("N/A"), m_songs(0), m_startSong(0), m_currentSong(0), m_songSpeed(SPEED_VBI), m_clockSpeed(CLOCK_UNKNOWN), m_compatibility(COMPATIBILITY_C64), m_dataFileLen(0), m_c64dataLen(0), m_loadAddr(0), m_initAddr(0), m_playAddr(0), m_relocStartPage(0), m_relocPages(0), m_fixLoad(false) { m_sidModels.push_back(SIDMODEL_UNKNOWN); m_sidChipAddresses.push_back(0xd400); } uint_least16_t getLoadAddr() const override { return m_loadAddr; } uint_least16_t getInitAddr() const override { return m_initAddr; } uint_least16_t getPlayAddr() const override { return m_playAddr; } unsigned int getSongs() const override { return m_songs; } unsigned int getStartSong() const override { return m_startSong; } unsigned int getCurrentSong() const override { return m_currentSong; } uint_least16_t getSidChipBase(unsigned int i) const override { return i < m_sidChipAddresses.size() ? m_sidChipAddresses[i] : 0; } int getSidChips() const override { return m_sidChipAddresses.size(); } int getSongSpeed() const override { return m_songSpeed; } uint_least8_t getRelocStartPage() const override { return m_relocStartPage; } uint_least8_t getRelocPages() const override { return m_relocPages; } model_t getSidModel(unsigned int i) const override { return i < m_sidModels.size() ? m_sidModels[i] : SIDMODEL_UNKNOWN; } compatibility_t getCompatibility() const override { return m_compatibility; } unsigned int getNumberOfInfoStrings() const override { return m_infoString.size(); } const char* getInfoString(unsigned int i) const override { return i * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "MUS.h" #include #include "sidplayfp/SidTuneInfo.h" #include "SmartPtr.h" #include "sidendian.h" #include "sidmemory.h" static const uint8_t sidplayer1[] = { # include "sidplayer1.bin" }; static const uint8_t sidplayer2[] = { # include "sidplayer2.bin" }; namespace libsidplayfp { // Format strings const char TXT_FORMAT_MUS[] = "C64 Sidplayer format (MUS)"; const char TXT_FORMAT_STR[] = "C64 Stereo Sidplayer format (MUS+STR)"; // Error strings const char ERR_2ND_INVALID[] = "SIDTUNE ERROR: 2nd file contains invalid data"; const char ERR_SIZE_EXCEEDED[] = "SIDTUNE ERROR: Total file size too large"; static const uint_least16_t SIDTUNE_MUS_HLT_CMD = 0x14F; static const uint_least16_t SIDTUNE_MUS_DATA_ADDR = 0x0900; static const uint_least16_t SIDTUNE_SID2_BASE_ADDR = 0xd500; const int o65headersize = 27; const uint8_t* player1 = sidplayer1 + o65headersize; const uint8_t* player2 = sidplayer2 + o65headersize; const size_t player1size = sizeof(sidplayer1) - o65headersize; const size_t player2size = sizeof(sidplayer2) - o65headersize; bool detect(const uint8_t* buffer, size_t bufsize, uint_least32_t& voice3Index) { // sanity check if ((buffer == nullptr) || (bufsize < 8)) return false; // Skip load address and 3x length entry. uint_least32_t voice1Index = 2 + 3 * 2; // Add length of voice 1 data. voice1Index += endian_little16(&buffer[2]); // Add length of voice 2 data. uint_least32_t voice2Index = voice1Index + endian_little16(&buffer[4]); // Add length of voice 3 data. voice3Index = voice2Index + endian_little16(&buffer[6]); if (voice3Index > bufsize) return false; return ((endian_big16(&buffer[voice1Index - 2]) == SIDTUNE_MUS_HLT_CMD) && (endian_big16(&buffer[voice2Index - 2]) == SIDTUNE_MUS_HLT_CMD) && (endian_big16(&buffer[voice3Index - 2]) == SIDTUNE_MUS_HLT_CMD)); } void MUS::setPlayerAddress() { if (info->getSidChips() == 1) { // Player #1. info->m_initAddr = 0xec60; info->m_playAddr = 0xec80; } else { // Player #1 + #2. info->m_initAddr = 0xfc90; info->m_playAddr = 0xfc96; } } void MUS::acceptSidTune(const char* dataFileName, const char* infoFileName, buffer_t& buf, bool isSlashedFileName) { setPlayerAddress(); SidTuneBase::acceptSidTune(dataFileName, infoFileName, buf, isSlashedFileName); } void MUS::placeSidTuneInC64mem(sidmemory& mem) { SidTuneBase::placeSidTuneInC64mem(mem); installPlayer(mem); } bool MUS::mergeParts(buffer_t& musBuf, buffer_t& strBuf) { const uint_least32_t mergeLen = musBuf.size() + strBuf.size(); // Sanity check. I do not trust those MUS/STR files around. const uint_least32_t freeSpace = endian_16(player1[1], player1[0]) - SIDTUNE_MUS_DATA_ADDR; if ((mergeLen - 4) > freeSpace) { throw loadError(ERR_SIZE_EXCEEDED); } if (!strBuf.empty() && info->getSidChips() > 1) { // Install MUS data #2 _NOT_ including load address. musBuf.insert(musBuf.end(), strBuf.begin(), strBuf.end()); } strBuf.clear(); return true; } /** * Replace useless SID reads with NOPs. */ void removeReads(sidmemory& mem, uint_least16_t dest) { const int sid_read_offset = 0x424 - o65headersize - 2; mem.fillRam(dest + sid_read_offset, 0xea, 12); } void MUS::installPlayer(sidmemory& mem) { // Install MUS player #1. uint_least16_t dest = endian_16(player1[1], player1[0]); mem.fillRam(dest, player1 + 2, player1size - 2); removeReads(mem, dest); // Point player #1 to data #1. mem.writeMemByte(dest + 0xc6e, (SIDTUNE_MUS_DATA_ADDR + 2) & 0xFF); mem.writeMemByte(dest + 0xc70, (SIDTUNE_MUS_DATA_ADDR + 2) >> 8); if (info->getSidChips() > 1) { // Install MUS player #2. dest = endian_16(player2[1], player2[0]); mem.fillRam(dest, player2 + 2, player2size - 2); removeReads(mem, dest); // Point player #2 to data #2. mem.writeMemByte(dest + 0xc6e, (SIDTUNE_MUS_DATA_ADDR + musDataLen + 2) & 0xFF); mem.writeMemByte(dest + 0xc70, (SIDTUNE_MUS_DATA_ADDR + musDataLen + 2) >> 8); } } SidTuneBase* MUS::load(buffer_t& musBuf, bool init) { buffer_t empty; return load(musBuf, empty, 0, init); } SidTuneBase* MUS::load(buffer_t& musBuf, buffer_t& strBuf, uint_least32_t fileOffset, bool init) { uint_least32_t voice3Index; if (!detect(&musBuf[fileOffset], musBuf.size()-fileOffset, voice3Index)) return nullptr; std::unique_ptr tune(new MUS()); tune->tryLoad(musBuf, strBuf, fileOffset, voice3Index, init); tune->mergeParts(musBuf, strBuf); return tune.release(); } void MUS::tryLoad(buffer_t& musBuf, buffer_t& strBuf, uint_least32_t fileOffset, uint_least32_t voice3Index, bool init) { if (init) { info->m_songs = 1; info->m_startSong = 1; songSpeed[0] = SidTuneInfo::SPEED_CIA_1A; clockSpeed[0] = SidTuneInfo::CLOCK_ANY; } // Check setting compatibility for MUS playback if ((info->m_compatibility != SidTuneInfo::COMPATIBILITY_C64) || (info->m_relocStartPage != 0) || (info->m_relocPages != 0)) { throw loadError(ERR_INVALID); } { // All subtunes should be CIA for (unsigned int i = 0; i < info->m_songs; i++) { if (songSpeed[i] != SidTuneInfo::SPEED_CIA_1A) { throw loadError(ERR_INVALID); } } } musDataLen = musBuf.size(); info->m_loadAddr = SIDTUNE_MUS_DATA_ADDR; SmartPtr_sidtt spPet(&musBuf[fileOffset], musDataLen - fileOffset); // Voice3Index now is offset to text lines (uppercase Pet-strings). spPet += voice3Index; // Extract credits while (*spPet) { info->m_commentString.push_back(petsciiToAscii(spPet)); } spPet++; // If we appear to have additional data at the end, check is it's // another mus file (but only if a second file isn't supplied) bool stereo = false; if (!strBuf.empty()) { if (!detect(&strBuf[0], strBuf.size(), voice3Index)) throw loadError(ERR_2ND_INVALID); spPet.setBuffer(&strBuf[0], strBuf.size()); stereo = true; } else { // For MUS + STR via stdin the files come combined if (spPet.good()) { const ulint_smartpt pos = spPet.tellPos(); if (detect(&spPet[0], spPet.tellLength()-pos, voice3Index)) { musDataLen = static_cast(pos); stereo = true; } } } if (stereo) { // Voice3Index now is offset to text lines (uppercase Pet-strings). spPet += voice3Index; // Extract credits while (*spPet) { info->m_commentString.push_back(petsciiToAscii(spPet)); } info->m_sidChipAddresses.push_back(SIDTUNE_SID2_BASE_ADDR); info->m_formatString = TXT_FORMAT_STR; } else { info->m_formatString = TXT_FORMAT_MUS; } setPlayerAddress(); // Remove trailing empty lines. const int lines = info->m_commentString.size(); { for (int line = lines-1; line >= 0; line--) { if (info->m_commentString[line].length() == 0) info->m_commentString.pop_back(); else break; } } } } libsidplayfp-2.6.0/src/sidtune/PSID.h0000644000175100001770000000351414544470307014312 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2014 Leandro Nini * * 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. */ #ifndef PSID_H #define PSID_H #include #include "SidTuneBase.h" #include "sidplayfp/SidTune.h" #include "sidcxx11.h" namespace libsidplayfp { struct psidHeader; class PSID final : public SidTuneBase { private: char m_md5[SidTune::MD5_LENGTH+1]; private: /** * Load PSID file. * * @throw loadError */ void tryLoad(const psidHeader &pHeader); /** * Read PSID file header. * * @throw loadError */ static void readHeader(const buffer_t &dataBuf, psidHeader &hdr); protected: PSID() {} public: virtual ~PSID() {} /** * @return pointer to a SidTune or 0 if not a PSID file * @throw loadError if PSID file is corrupt */ static SidTuneBase* load(buffer_t& dataBuf); virtual const char *createMD5(char *md5) override; virtual const char *createMD5New(char *md5) override; private: // prevent copying PSID(const PSID&); PSID& operator=(PSID&); }; } #endif // PSID_H libsidplayfp-2.6.0/src/sidtune/sidplayer1.bin0000644000175100001770000004670314544470322016155 00000000000000 0x01, 0x00, 0x6f, 0x36, 0x35, 0x00, 0x00, 0x00, 0x00, 0x10, 0x91, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xe1, 0x60, 0x01, 0x02, 0x04, 0x00, 0x07, 0x0e, 0x02, 0x02, 0xfe, 0x02, 0x02, 0xfe, 0xfe, 0x00, 0x01, 0x00, 0xff, 0x00, 0x02, 0x04, 0x05, 0x07, 0x09, 0x0b, 0x1e, 0x18, 0x8b, 0x7e, 0xfa, 0x06, 0xac, 0xf3, 0xe6, 0x8f, 0xf8, 0x2e, 0x86, 0x8e, 0x96, 0x9f, 0xa8, 0xb3, 0xbd, 0xc8, 0xd4, 0xe1, 0xee, 0xfd, 0x8c, 0x78, 0x64, 0x50, 0x3c, 0x28, 0x14, 0x00, 0x00, 0x02, 0x03, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x11, 0x12, 0x00, 0xe0, 0x00, 0x05, 0x0a, 0x0f, 0xf9, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x00, 0xa9, 0x00, 0x8d, 0x00, 0xe0, 0xa2, 0x95, 0xa0, 0x42, 0xad, 0xa6, 0x02, 0xf0, 0x04, 0xa2, 0x25, 0xa0, 0x40, 0x8e, 0x5b, 0xe1, 0x8c, 0x5c, 0xe1, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x60, 0xa9, 0x00, 0x8d, 0x00, 0xe0, 0x86, 0x61, 0x84, 0x62, 0xa0, 0xbc, 0x99, 0x00, 0xe0, 0x88, 0xd0, 0xfa, 0xa0, 0x72, 0x99, 0xbc, 0xe0, 0x88, 0xd0, 0xfa, 0x8d, 0x15, 0xd4, 0x8d, 0x16, 0xd4, 0xa9, 0x08, 0x8d, 0x25, 0xe0, 0x8d, 0x17, 0xd4, 0x8d, 0x26, 0xe0, 0x8d, 0x18, 0xd4, 0xa9, 0x90, 0x8d, 0x27, 0xe0, 0xa9, 0x60, 0x8d, 0x28, 0xe0, 0xa9, 0x0c, 0x8d, 0x29, 0xe0, 0xad, 0x5b, 0xe1, 0x8d, 0x2d, 0xe0, 0xad, 0x5c, 0xe1, 0x8d, 0x2e, 0xe0, 0xa9, 0xff, 0x8d, 0xcc, 0xe0, 0xa9, 0xd4, 0x85, 0x64, 0xa2, 0x02, 0xa9, 0xff, 0x9d, 0x0b, 0xe0, 0xa9, 0x01, 0x9d, 0x30, 0xe0, 0x9d, 0x2a, 0xe0, 0x8a, 0x9d, 0x33, 0xe0, 0x9d, 0xae, 0xe0, 0xa9, 0x04, 0x9d, 0x39, 0xe0, 0xbd, 0xa8, 0xe1, 0x9d, 0xba, 0xe0, 0xa9, 0x5b, 0x9d, 0x7e, 0xe0, 0xbd, 0x65, 0xe1, 0x85, 0x63, 0xa9, 0x00, 0xa8, 0x91, 0x63, 0xc8, 0x91, 0x63, 0xc8, 0x91, 0x63, 0xa9, 0x08, 0x9d, 0x17, 0xe0, 0x9d, 0x9c, 0xe0, 0xc8, 0x91, 0x63, 0xc8, 0x91, 0x63, 0xa9, 0x40, 0x9d, 0x1a, 0xe0, 0x91, 0x63, 0xa9, 0x20, 0x9d, 0x1d, 0xe0, 0xc8, 0x91, 0x63, 0xa9, 0xf5, 0x9d, 0x20, 0xe0, 0xc8, 0x91, 0x63, 0xca, 0x10, 0xa4, 0x8a, 0xa2, 0x17, 0x9d, 0x3e, 0xe1, 0xca, 0x10, 0xfa, 0xa5, 0x61, 0x18, 0x69, 0x06, 0x85, 0x63, 0xa9, 0x00, 0xaa, 0xa8, 0x65, 0x62, 0x85, 0x64, 0x9d, 0xab, 0xe0, 0x9d, 0xb4, 0xe0, 0xa5, 0x63, 0x9d, 0xa8, 0xe0, 0x9d, 0xb1, 0xe0, 0x18, 0x71, 0x61, 0x85, 0x63, 0xa5, 0x64, 0xc8, 0x71, 0x61, 0xc8, 0xe8, 0xe0, 0x03, 0xd0, 0xe0, 0xa6, 0x63, 0xa8, 0x60, 0xa9, 0x00, 0x8d, 0x04, 0xd4, 0x8d, 0x0b, 0xd4, 0x8d, 0x12, 0xd4, 0x8d, 0x01, 0xd4, 0x8d, 0x08, 0xd4, 0x8d, 0x0f, 0xd4, 0xa9, 0x08, 0x8d, 0x17, 0xd4, 0xad, 0x5b, 0xe1, 0x8d, 0x04, 0xdc, 0xad, 0x5c, 0xe1, 0x8d, 0x05, 0xdc, 0x60, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x60, 0xa9, 0x08, 0x8d, 0x00, 0xe0, 0x6c, 0x5d, 0xe1, 0xea, 0xea, 0xea, 0xad, 0x00, 0xe0, 0x30, 0xf0, 0x09, 0x80, 0xa8, 0x29, 0x07, 0xf0, 0xee, 0xd8, 0x8c, 0x00, 0xe0, 0xea, 0xa5, 0xfb, 0x8d, 0x56, 0xe1, 0xa5, 0xfc, 0x8d, 0x57, 0xe1, 0xa5, 0xfd, 0x8d, 0x58, 0xe1, 0xa5, 0xfe, 0x8d, 0x59, 0xe1, 0xa5, 0xff, 0x8d, 0x5a, 0xe1, 0xad, 0x23, 0xe0, 0x18, 0x6d, 0xd9, 0xe0, 0x48, 0x29, 0x07, 0xa8, 0xad, 0xdc, 0xe0, 0x69, 0x00, 0x85, 0xff, 0x68, 0x46, 0xff, 0x6a, 0x46, 0xff, 0x6a, 0x46, 0xff, 0x6a, 0x18, 0x6d, 0x24, 0xe0, 0x8c, 0x15, 0xd4, 0x8d, 0x16, 0xd4, 0xad, 0x25, 0xe0, 0x8d, 0x17, 0xd4, 0xad, 0x26, 0xe0, 0x8d, 0x18, 0xd4, 0xa9, 0xd4, 0x85, 0xfc, 0xa2, 0x00, 0xad, 0x00, 0xe0, 0x3d, 0x62, 0xe1, 0xf0, 0x51, 0xbd, 0x65, 0xe1, 0x85, 0xfb, 0xbd, 0x0e, 0xe0, 0x18, 0x7d, 0x51, 0xe0, 0xa8, 0xbd, 0x11, 0xe0, 0x7d, 0x54, 0xe0, 0x48, 0x98, 0x18, 0x7d, 0xcd, 0xe0, 0xa0, 0x00, 0x91, 0xfb, 0x68, 0x7d, 0xd0, 0xe0, 0xc8, 0x91, 0xfb, 0xbd, 0x14, 0xe0, 0x18, 0x7d, 0x69, 0xe0, 0x85, 0xff, 0xbd, 0x17, 0xe0, 0x7d, 0x6c, 0xe0, 0x48, 0xa5, 0xff, 0x18, 0x7d, 0xd3, 0xe0, 0xc8, 0x91, 0xfb, 0x68, 0x7d, 0xd6, 0xe0, 0xc8, 0x91, 0xfb, 0xbd, 0x1d, 0xe0, 0xc8, 0xc8, 0x91, 0xfb, 0xbd, 0x20, 0xe0, 0xc8, 0x91, 0xfb, 0xe8, 0xe0, 0x03, 0xd0, 0xa2, 0xac, 0x1a, 0xe0, 0xae, 0x1b, 0xe0, 0xad, 0x1c, 0xe0, 0x8c, 0x04, 0xd4, 0x8e, 0x0b, 0xd4, 0x8d, 0x12, 0xd4, 0xae, 0x2d, 0xe0, 0xac, 0x2e, 0xe0, 0x8e, 0x04, 0xdc, 0x8c, 0x05, 0xdc, 0xad, 0x1b, 0xd4, 0x8d, 0xbe, 0xe0, 0xad, 0x1c, 0xd4, 0x8d, 0xbf, 0xe0, 0xa2, 0x00, 0xad, 0x00, 0xe0, 0x3d, 0x62, 0xe1, 0xf0, 0x10, 0x8e, 0x2f, 0xe0, 0x20, 0x36, 0xe5, 0xad, 0x00, 0xe0, 0x29, 0x78, 0xf0, 0x03, 0x4c, 0x0c, 0xe5, 0xe8, 0xe0, 0x03, 0xd0, 0xe3, 0xad, 0xc9, 0xe0, 0xd0, 0x52, 0xad, 0xca, 0xe0, 0x0d, 0xcb, 0xe0, 0xf0, 0x78, 0xad, 0xdf, 0xe0, 0xd0, 0x28, 0xad, 0xca, 0xe0, 0xf0, 0x28, 0x18, 0x6d, 0xbd, 0xe0, 0xb0, 0x07, 0xcd, 0xcc, 0xe0, 0x90, 0x60, 0xf0, 0x5e, 0xa9, 0x00, 0x8d, 0xdf, 0xe0, 0xad, 0xcb, 0xe0, 0xf0, 0x54, 0xee, 0xdf, 0xe0, 0xad, 0xbd, 0xe0, 0xed, 0xcb, 0xe0, 0x4c, 0xb4, 0xe4, 0xad, 0xcb, 0xe0, 0xf0, 0xd3, 0xad, 0xbd, 0xe0, 0x38, 0xed, 0xcb, 0xe0, 0xb0, 0x3a, 0xa9, 0x00, 0x8d, 0xdf, 0xe0, 0xad, 0xca, 0xe0, 0xd0, 0x30, 0xee, 0xdf, 0xe0, 0xd0, 0x28, 0xce, 0xe0, 0xe0, 0xd0, 0x29, 0xad, 0xdf, 0xe0, 0xd0, 0x11, 0xee, 0xdf, 0xe0, 0xad, 0xcb, 0xe0, 0xd0, 0x02, 0xa9, 0x20, 0x8d, 0xe0, 0xe0, 0xa9, 0x00, 0xf0, 0x10, 0xce, 0xdf, 0xe0, 0xad, 0xca, 0xe0, 0xd0, 0x02, 0xa9, 0x20, 0x8d, 0xe0, 0xe0, 0xad, 0xcc, 0xe0, 0x8d, 0xbd, 0xe0, 0xa2, 0x00, 0xbd, 0xc3, 0xe0, 0xf0, 0x44, 0xa9, 0x00, 0x85, 0xff, 0xbc, 0xc0, 0xe0, 0xb9, 0xbd, 0xe0, 0xbc, 0xc6, 0xe0, 0xf0, 0x0e, 0x30, 0x08, 0x0a, 0x26, 0xff, 0x88, 0xd0, 0xfa, 0xf0, 0x04, 0x4a, 0xc8, 0xd0, 0xfc, 0xbc, 0xc3, 0xe0, 0x88, 0xd0, 0x0b, 0x9d, 0xcd, 0xe0, 0xa5, 0xff, 0x9d, 0xd0, 0xe0, 0x4c, 0x02, 0xe5, 0x88, 0xd0, 0x0b, 0x9d, 0xd3, 0xe0, 0xa5, 0xff, 0x9d, 0xd6, 0xe0, 0x4c, 0x02, 0xe5, 0x8d, 0xd9, 0xe0, 0xa5, 0xff, 0x8d, 0xdc, 0xe0, 0xe8, 0xe0, 0x03, 0xd0, 0xb2, 0xad, 0x00, 0xe0, 0x29, 0x7f, 0x8d, 0x00, 0xe0, 0xad, 0x56, 0xe1, 0x85, 0xfb, 0xad, 0x57, 0xe1, 0x85, 0xfc, 0xad, 0x58, 0xe1, 0x85, 0xfd, 0xad, 0x59, 0xe1, 0x85, 0xfe, 0xad, 0x5a, 0xe1, 0x85, 0xff, 0x6c, 0x5d, 0xe1, 0xbd, 0x60, 0xe0, 0xd0, 0x03, 0x4c, 0x9f, 0xe6, 0x4c, 0xba, 0xe5, 0xde, 0x30, 0xe0, 0xd0, 0x03, 0x4c, 0xa0, 0xe6, 0xbd, 0x36, 0xe0, 0x30, 0xe8, 0xd0, 0x1a, 0xbd, 0x3f, 0xe0, 0xf0, 0x05, 0xde, 0x3f, 0xe0, 0xd0, 0x10, 0xbd, 0x39, 0xe0, 0xdd, 0x30, 0xe0, 0x90, 0x08, 0xbd, 0x1a, 0xe0, 0x29, 0xfe, 0x9d, 0x1a, 0xe0, 0xbd, 0x42, 0xe0, 0xf0, 0x56, 0x0a, 0xbd, 0x0e, 0xe0, 0xb0, 0x1d, 0x7d, 0x45, 0xe0, 0x9d, 0x0e, 0xe0, 0xa8, 0xbd, 0x11, 0xe0, 0x7d, 0x48, 0xe0, 0x9d, 0x11, 0xe0, 0x48, 0x98, 0xdd, 0x8d, 0xe0, 0x68, 0xfd, 0x90, 0xe0, 0xb0, 0x1f, 0x90, 0x2e, 0xfd, 0x45, 0xe0, 0x9d, 0x0e, 0xe0, 0xbd, 0x11, 0xe0, 0xfd, 0x48, 0xe0, 0x9d, 0x11, 0xe0, 0xbd, 0x8d, 0xe0, 0xdd, 0x0e, 0xe0, 0xbd, 0x90, 0xe0, 0xfd, 0x11, 0xe0, 0x90, 0x11, 0xbd, 0x8d, 0xe0, 0x9d, 0x0e, 0xe0, 0xbd, 0x90, 0xe0, 0x9d, 0x11, 0xe0, 0xa9, 0x00, 0x9d, 0x42, 0xe0, 0xbd, 0x60, 0xe0, 0xf0, 0x55, 0xbd, 0x4b, 0xe0, 0xf0, 0x4b, 0xa0, 0x00, 0xde, 0x4e, 0xe0, 0xd0, 0x31, 0xbd, 0x51, 0xe0, 0x1d, 0x54, 0xe0, 0xd0, 0x1b, 0xbd, 0x5d, 0xe0, 0x9d, 0x57, 0xe0, 0x9d, 0x4e, 0xe0, 0xbd, 0x4b, 0xe0, 0x0a, 0xbd, 0x5a, 0xe0, 0x90, 0x04, 0x49, 0xff, 0x69, 0x00, 0x9d, 0x4b, 0xe0, 0xd0, 0x10, 0xbd, 0x57, 0xe0, 0x9d, 0x4e, 0xe0, 0x98, 0x38, 0xfd, 0x4b, 0xe0, 0x9d, 0x4b, 0xe0, 0xc9, 0x00, 0x10, 0x01, 0x88, 0x18, 0x7d, 0x51, 0xe0, 0x9d, 0x51, 0xe0, 0x98, 0x7d, 0x54, 0xe0, 0x9d, 0x54, 0xe0, 0xbd, 0x36, 0xe0, 0x30, 0x15, 0xbd, 0x93, 0xe0, 0xf0, 0x10, 0x18, 0x7d, 0x14, 0xe0, 0x9d, 0x14, 0xe0, 0xbd, 0x96, 0xe0, 0x7d, 0x17, 0xe0, 0x9d, 0x17, 0xe0, 0xbd, 0x63, 0xe0, 0xf0, 0x4b, 0xa0, 0x00, 0xde, 0x66, 0xe0, 0xd0, 0x31, 0xbd, 0x69, 0xe0, 0x1d, 0x6c, 0xe0, 0xd0, 0x1b, 0xbd, 0x72, 0xe0, 0x9d, 0x6f, 0xe0, 0x9d, 0x66, 0xe0, 0xbd, 0x63, 0xe0, 0x0a, 0xbd, 0x75, 0xe0, 0x90, 0x04, 0x49, 0xff, 0x69, 0x00, 0x9d, 0x63, 0xe0, 0xd0, 0x10, 0xbd, 0x6f, 0xe0, 0x9d, 0x66, 0xe0, 0x98, 0x38, 0xfd, 0x63, 0xe0, 0x9d, 0x63, 0xe0, 0xc9, 0x00, 0x10, 0x01, 0x88, 0x18, 0x7d, 0x69, 0xe0, 0x9d, 0x69, 0xe0, 0x98, 0x7d, 0x6c, 0xe0, 0x9d, 0x6c, 0xe0, 0xbd, 0x36, 0xe0, 0x10, 0x03, 0x4c, 0x9f, 0xe6, 0xa0, 0x00, 0xbd, 0xa2, 0xe0, 0xf0, 0x1c, 0x10, 0x01, 0xc8, 0x18, 0x6d, 0x23, 0xe0, 0x48, 0x29, 0x07, 0x8d, 0x23, 0xe0, 0x68, 0x6a, 0x4a, 0x4a, 0x18, 0x79, 0xa6, 0xe1, 0x18, 0x6d, 0x24, 0xe0, 0x8d, 0x24, 0xe0, 0x60, 0xbd, 0xa8, 0xe0, 0x85, 0xfd, 0xbd, 0xab, 0xe0, 0x85, 0xfe, 0xd0, 0x04, 0x60, 0x20, 0x98, 0xe8, 0xad, 0x00, 0xe0, 0x3d, 0x62, 0xe1, 0xf0, 0xf4, 0xa0, 0x00, 0xb1, 0xfd, 0x85, 0xff, 0xc8, 0xb1, 0xfd, 0xa8, 0xa5, 0xfd, 0x18, 0x69, 0x02, 0x85, 0xfd, 0x9d, 0xa8, 0xe0, 0xa5, 0xfe, 0x69, 0x00, 0x85, 0xfe, 0x9d, 0xab, 0xe0, 0xa5, 0xff, 0x29, 0x03, 0xd0, 0xd2, 0xbd, 0x8d, 0xe0, 0x9d, 0x0e, 0xe0, 0xbd, 0x90, 0xe0, 0x9d, 0x11, 0xe0, 0xa5, 0xff, 0x9d, 0x05, 0xe0, 0x98, 0x9d, 0x02, 0xe0, 0x29, 0x07, 0xa8, 0xb9, 0x67, 0xe1, 0x8d, 0x6f, 0xe1, 0xbd, 0x02, 0xe0, 0x29, 0x38, 0x4a, 0x4a, 0x4a, 0x7d, 0x81, 0xe0, 0x85, 0xfd, 0xbd, 0x02, 0xe0, 0x29, 0xc0, 0x0a, 0x2a, 0x2a, 0xa8, 0xb9, 0x6f, 0xe1, 0x85, 0xfe, 0xbd, 0x02, 0xe0, 0x29, 0x07, 0xf0, 0x62, 0xa8, 0xb9, 0x72, 0xe1, 0x65, 0xfe, 0x18, 0x7d, 0x84, 0xe0, 0x10, 0x05, 0x18, 0x69, 0x0c, 0xe6, 0xfd, 0xc9, 0x0c, 0x90, 0x04, 0xe9, 0x0c, 0xc6, 0xfd, 0x85, 0xfe, 0xa8, 0xb9, 0x86, 0xe1, 0x85, 0xff, 0xb9, 0x7a, 0xe1, 0xa4, 0xfd, 0x88, 0x30, 0x06, 0x46, 0xff, 0x6a, 0x88, 0x10, 0xfa, 0x18, 0x7d, 0x87, 0xe0, 0x9d, 0x8d, 0xe0, 0xa5, 0xff, 0x7d, 0x8a, 0xe0, 0x9d, 0x90, 0xe0, 0xbd, 0x05, 0xe0, 0xd0, 0x03, 0x4c, 0xa0, 0xe6, 0xbd, 0x45, 0xe0, 0x1d, 0x48, 0xe0, 0xf0, 0x16, 0xbd, 0x0e, 0xe0, 0xdd, 0x8d, 0xe0, 0xbd, 0x11, 0xe0, 0xfd, 0x90, 0xe0, 0xa9, 0xfe, 0x6a, 0x9d, 0x42, 0xe0, 0x90, 0x11, 0xf0, 0x4a, 0x9d, 0x42, 0xe0, 0xbd, 0x8d, 0xe0, 0x9d, 0x0e, 0xe0, 0xbd, 0x90, 0xe0, 0x9d, 0x11, 0xe0, 0xbd, 0x36, 0xe0, 0x0a, 0xd0, 0x35, 0xbd, 0x93, 0xe0, 0xf0, 0x0c, 0xbd, 0x99, 0xe0, 0x9d, 0x14, 0xe0, 0xbd, 0x9c, 0xe0, 0x9d, 0x17, 0xe0, 0xbd, 0x9f, 0xe0, 0xf0, 0x0f, 0xa4, 0xfd, 0x18, 0x79, 0x92, 0xe1, 0xa4, 0xfe, 0x18, 0x79, 0x9a, 0xe1, 0x18, 0x90, 0x08, 0xbd, 0xa2, 0xe0, 0xf0, 0x0b, 0xbd, 0xa5, 0xe0, 0x8d, 0x24, 0xe0, 0xa9, 0x00, 0x8d, 0x23, 0xe0, 0xbd, 0x3c, 0xe0, 0x9d, 0x3f, 0xe0, 0xbd, 0x05, 0xe0, 0x29, 0x40, 0x9d, 0x36, 0xe0, 0xbd, 0x05, 0xe0, 0x4a, 0x4a, 0x29, 0x07, 0xd0, 0x30, 0xbd, 0x05, 0xe0, 0x30, 0x14, 0xad, 0x27, 0xe0, 0x29, 0x3c, 0xd0, 0x1e, 0xad, 0x27, 0xe0, 0x0a, 0x2a, 0x2a, 0xd0, 0x02, 0xa9, 0x04, 0x4c, 0x70, 0xe8, 0xad, 0x28, 0xe0, 0xf0, 0x0c, 0x29, 0x3f, 0xd0, 0x08, 0xad, 0x28, 0xe0, 0x0a, 0x2a, 0x2a, 0xd0, 0x66, 0xa9, 0x10, 0x8d, 0x00, 0xe0, 0x60, 0xc9, 0x01, 0xd0, 0x13, 0xbd, 0x05, 0xe0, 0x29, 0x20, 0xd0, 0x06, 0xad, 0x29, 0xe0, 0x4c, 0x70, 0xe8, 0xbd, 0x2a, 0xe0, 0x4c, 0x70, 0xe8, 0xa8, 0xbd, 0x05, 0xe0, 0x29, 0xa0, 0xc9, 0x80, 0xf0, 0x30, 0x85, 0xff, 0x18, 0xad, 0x27, 0xe0, 0xd0, 0x01, 0x38, 0x88, 0x88, 0xf0, 0x06, 0x6a, 0xb0, 0x4e, 0x88, 0xd0, 0xfa, 0xa4, 0xff, 0x85, 0xff, 0xf0, 0x26, 0x46, 0xff, 0xb0, 0x41, 0xf0, 0x42, 0x65, 0xff, 0xb0, 0x3e, 0xc8, 0x10, 0x19, 0x46, 0xff, 0xb0, 0x34, 0x65, 0xff, 0x90, 0x11, 0xb0, 0x31, 0xad, 0x28, 0xe0, 0xf0, 0x29, 0x88, 0x88, 0xf0, 0x06, 0x4a, 0xb0, 0x22, 0x88, 0xd0, 0xfa, 0x9d, 0x30, 0xe0, 0xbd, 0x1a, 0xe0, 0x29, 0xf6, 0x9d, 0x1a, 0xe0, 0x38, 0xbd, 0x02, 0xe0, 0x29, 0x07, 0xd0, 0x03, 0x7e, 0x36, 0xe0, 0xbd, 0x1a, 0xe0, 0x69, 0x00, 0x9d, 0x1a, 0xe0, 0x60, 0xa9, 0x10, 0x2c, 0xa9, 0x18, 0x8d, 0x00, 0xe0, 0x60, 0x98, 0x48, 0xa5, 0xff, 0x4a, 0x90, 0x03, 0x4c, 0x42, 0xea, 0x4a, 0x4a, 0xb0, 0x1e, 0x4a, 0xb0, 0x0e, 0x9d, 0x9c, 0xe0, 0x9d, 0x17, 0xe0, 0x68, 0x9d, 0x99, 0xe0, 0x9d, 0x14, 0xe0, 0x60, 0x4a, 0x90, 0x02, 0x09, 0xf8, 0x9d, 0x8a, 0xe0, 0x68, 0x9d, 0x87, 0xe0, 0x60, 0x4a, 0xb0, 0x03, 0x4c, 0x4a, 0xe9, 0x4a, 0xb0, 0x61, 0x4a, 0xb0, 0x0f, 0xd0, 0x08, 0x68, 0x9d, 0xa5, 0xe0, 0x8d, 0x24, 0xe0, 0x60, 0x68, 0x9d, 0x3c, 0xe0, 0x60, 0xd0, 0x48, 0x68, 0x9d, 0x7e, 0xe0, 0xc9, 0x5b, 0xf0, 0x33, 0xa8, 0x4a, 0x4a, 0x4a, 0x38, 0xe9, 0x0b, 0x18, 0x7d, 0x84, 0xe0, 0x30, 0x0c, 0xc9, 0x0c, 0x90, 0x11, 0xe9, 0x0c, 0xde, 0x81, 0xe0, 0x4c, 0x0b, 0xe9, 0xc9, 0xf5, 0xb0, 0x05, 0x69, 0x0c, 0xfe, 0x81, 0xe0, 0x9d, 0x84, 0xe0, 0x98, 0x29, 0x07, 0x38, 0xe9, 0x03, 0x18, 0x7d, 0x81, 0xe0, 0x9d, 0x81, 0xe0, 0x60, 0xbd, 0x78, 0xe0, 0x9d, 0x81, 0xe0, 0xbd, 0x7b, 0xe0, 0x9d, 0x84, 0xe0, 0x60, 0x68, 0x9d, 0xc6, 0xe0, 0x60, 0x4a, 0xb0, 0x08, 0x9d, 0x0b, 0xe0, 0x68, 0x9d, 0x08, 0xe0, 0x60, 0x4a, 0x6a, 0x6a, 0x6d, 0x5b, 0xe1, 0x8d, 0x2d, 0xe0, 0x68, 0x6d, 0x5c, 0xe1, 0x8d, 0x2e, 0xe0, 0x60, 0x4a, 0x90, 0x03, 0x4c, 0xd3, 0xe9, 0x4a, 0xb0, 0x40, 0x4a, 0xb0, 0x17, 0x4a, 0xb0, 0x0f, 0x68, 0x8d, 0x27, 0xe0, 0x4a, 0x4a, 0x4a, 0xa8, 0xb9, 0xaf, 0xe1, 0x8d, 0x28, 0xe0, 0x60, 0x68, 0x9d, 0x5d, 0xe0, 0x60, 0x4a, 0xb0, 0x05, 0x68, 0x8d, 0x01, 0xe0, 0x60, 0x68, 0xf0, 0x11, 0x9d, 0x75, 0xe0, 0xbc, 0x63, 0xe0, 0xd0, 0x08, 0x9d, 0x63, 0xe0, 0xa9, 0x01, 0x9d, 0x66, 0xe0, 0x60, 0x9d, 0x63, 0xe0, 0x9d, 0x69, 0xe0, 0x9d, 0x6c, 0xe0, 0x60, 0x4a, 0xb0, 0x30, 0x4a, 0xb0, 0x05, 0x68, 0x9d, 0x39, 0xe0, 0x60, 0x68, 0xa0, 0x00, 0x4a, 0x90, 0x02, 0xc8, 0x18, 0x48, 0x29, 0x07, 0x79, 0xac, 0xe1, 0x9d, 0x78, 0xe0, 0x9d, 0x81, 0xe0, 0x68, 0x4a, 0x4a, 0x4a, 0x18, 0x79, 0xad, 0xe1, 0x9d, 0x7b, 0xe0, 0x9d, 0x84, 0xe0, 0xa9, 0x5b, 0x9d, 0x7e, 0xe0, 0x60, 0x4a, 0xb0, 0x05, 0x68, 0x9d, 0xa2, 0xe0, 0x60, 0x68, 0x8d, 0xcc, 0xe0, 0x60, 0x4a, 0xb0, 0x27, 0x4a, 0xb0, 0x0d, 0x4a, 0xb0, 0x05, 0x68, 0x8d, 0x29, 0xe0, 0x60, 0x68, 0x9d, 0x9f, 0xe0, 0x60, 0x4a, 0xb0, 0x0f, 0x68, 0x9d, 0x93, 0xe0, 0xa0, 0x00, 0x0a, 0x90, 0x01, 0x88, 0x98, 0x9d, 0x96, 0xe0, 0x60, 0x68, 0x9d, 0x72, 0xe0, 0x60, 0x4a, 0xb0, 0x1c, 0x4a, 0xb0, 0x15, 0x68, 0x9d, 0xb7, 0xe0, 0xa5, 0xfd, 0x9d, 0xb1, 0xe0, 0xa5, 0xfe, 0x9d, 0xb4, 0xe0, 0xbd, 0x33, 0xe0, 0x9d, 0xae, 0xe0, 0x60, 0x68, 0x6c, 0x5f, 0xe1, 0x4a, 0xb0, 0x1e, 0x68, 0xd0, 0x0a, 0x9d, 0x4b, 0xe0, 0x9d, 0x51, 0xe0, 0x9d, 0x54, 0xe0, 0x60, 0x9d, 0x5a, 0xe0, 0xbc, 0x4b, 0xe0, 0xd0, 0x08, 0x9d, 0x4b, 0xe0, 0xa9, 0x01, 0x9d, 0x4e, 0xe0, 0x60, 0x68, 0x9d, 0x2a, 0xe0, 0x60, 0x4a, 0x90, 0x08, 0x9d, 0x48, 0xe0, 0x68, 0x9d, 0x45, 0xe0, 0x60, 0x68, 0x4a, 0xb0, 0x61, 0x4a, 0xb0, 0x25, 0x4a, 0xb0, 0x05, 0x4a, 0xa0, 0xf0, 0xd0, 0x06, 0x0a, 0x0a, 0x0a, 0x0a, 0xa0, 0x0f, 0x85, 0xff, 0x98, 0xb0, 0x09, 0x3d, 0x1d, 0xe0, 0x05, 0xff, 0x9d, 0x1d, 0xe0, 0x60, 0x3d, 0x20, 0xe0, 0x05, 0xff, 0x9d, 0x20, 0xe0, 0x60, 0x4a, 0xb0, 0x38, 0x4a, 0xb0, 0x64, 0x85, 0xff, 0xbd, 0xba, 0xe0, 0xdd, 0xa9, 0xe1, 0xf0, 0x54, 0xfe, 0xba, 0xe0, 0xa8, 0xa5, 0xfd, 0x99, 0xe1, 0xe0, 0xa5, 0xfe, 0x99, 0xf0, 0xe0, 0xbd, 0x33, 0xe0, 0x99, 0x2f, 0xe1, 0xa4, 0xff, 0xb9, 0x17, 0xe1, 0xf0, 0x36, 0x85, 0xfe, 0xb9, 0xff, 0xe0, 0x85, 0xfd, 0xb9, 0x3e, 0xe1, 0x9d, 0x33, 0xe0, 0x60, 0xb0, 0x4b, 0x4a, 0xb0, 0x3c, 0xa8, 0xa5, 0xfd, 0x99, 0xff, 0xe0, 0xa5, 0xfe, 0x99, 0x17, 0xe1, 0xbd, 0x33, 0xe0, 0x99, 0x3e, 0xe1, 0xbd, 0xba, 0xe0, 0xdd, 0xa9, 0xe1, 0xf0, 0x0d, 0xfe, 0xba, 0xe0, 0xa8, 0xa9, 0x00, 0x99, 0xf0, 0xe0, 0x60, 0xa9, 0x30, 0x2c, 0xa9, 0x28, 0x8d, 0x00, 0xe0, 0x60, 0x0a, 0x0a, 0x0a, 0x0a, 0x4d, 0x25, 0xe0, 0x29, 0xf0, 0x4d, 0x25, 0xe0, 0x8d, 0x25, 0xe0, 0x60, 0x4d, 0x26, 0xe0, 0x29, 0x0f, 0x4d, 0x26, 0xe0, 0x8d, 0x26, 0xe0, 0x60, 0x4a, 0xb0, 0x0b, 0x4a, 0xb0, 0x04, 0x8d, 0xca, 0xe0, 0x60, 0x8d, 0xcb, 0xe0, 0x60, 0x4a, 0x90, 0x03, 0x4c, 0xa5, 0xeb, 0x4a, 0xa8, 0xf0, 0x21, 0x88, 0xf0, 0x34, 0x88, 0xf0, 0x42, 0x88, 0xf0, 0x4a, 0x88, 0xf0, 0x52, 0x88, 0xf0, 0x5c, 0x88, 0xf0, 0x66, 0x88, 0xf0, 0x73, 0x29, 0x07, 0x09, 0x10, 0xb0, 0x03, 0x4c, 0xb7, 0xea, 0x4c, 0x7f, 0xea, 0xac, 0x26, 0xe0, 0xb0, 0x07, 0xc8, 0x98, 0x29, 0x0f, 0xd0, 0x07, 0x60, 0x98, 0x29, 0x0f, 0xf0, 0x04, 0x88, 0x8c, 0x26, 0xe0, 0x60, 0xbd, 0x62, 0xe1, 0x49, 0xff, 0x2d, 0x25, 0xe0, 0x90, 0x03, 0x1d, 0x62, 0xe1, 0x8d, 0x25, 0xe0, 0x60, 0xbd, 0x1a, 0xe0, 0x29, 0xfb, 0x90, 0x55, 0x09, 0x04, 0xb0, 0x51, 0xbd, 0x1a, 0xe0, 0x29, 0xfd, 0x90, 0x4a, 0x09, 0x02, 0xb0, 0x46, 0xad, 0x25, 0xe0, 0x29, 0xf7, 0x90, 0x02, 0x09, 0x08, 0x8d, 0x25, 0xe0, 0x60, 0xad, 0x26, 0xe0, 0x29, 0x7f, 0x90, 0x02, 0x09, 0x80, 0x8d, 0x26, 0xe0, 0x60, 0x98, 0x8d, 0xbd, 0xe0, 0x8d, 0xdf, 0xe0, 0xc8, 0x8c, 0xe0, 0xe0, 0x2a, 0x8d, 0xc9, 0xe0, 0x60, 0x98, 0x2a, 0x9d, 0x60, 0xe0, 0x60, 0x4a, 0xb0, 0x27, 0x4a, 0xb0, 0x14, 0xd0, 0x02, 0xa9, 0x08, 0x0a, 0x0a, 0x0a, 0x0a, 0x5d, 0x1a, 0xe0, 0x29, 0xf0, 0x5d, 0x1a, 0xe0, 0x9d, 0x1a, 0xe0, 0x60, 0x0a, 0x0a, 0x0a, 0x0a, 0x4d, 0x26, 0xe0, 0x29, 0x70, 0x4d, 0x26, 0xe0, 0x8d, 0x26, 0xe0, 0x60, 0x4a, 0x90, 0x04, 0x9d, 0xc0, 0xe0, 0x60, 0xa8, 0xf0, 0x20, 0x88, 0xf0, 0x40, 0x88, 0xf0, 0x63, 0x29, 0x03, 0x9d, 0xc3, 0xe0, 0xa9, 0x00, 0x9d, 0xcd, 0xe0, 0x9d, 0xd0, 0xe0, 0x9d, 0xd3, 0xe0, 0x9d, 0xd6, 0xe0, 0x8d, 0xd9, 0xe0, 0x8d, 0xdc, 0xe0, 0x60, 0xbd, 0xb7, 0xe0, 0xf0, 0x05, 0xde, 0xb7, 0xe0, 0xf0, 0x12, 0xbd, 0x33, 0xe0, 0xdd, 0xae, 0xe0, 0xd0, 0x0b, 0xbd, 0xb1, 0xe0, 0x85, 0xfd, 0xbd, 0xb4, 0xe0, 0x85, 0xfe, 0x60, 0xa9, 0x38, 0x8d, 0x00, 0xe0, 0x60, 0xbd, 0xba, 0xe0, 0xdd, 0xa8, 0xe1, 0xf0, 0x18, 0xde, 0xba, 0xe0, 0xa8, 0x88, 0xb9, 0xf0, 0xe0, 0xf0, 0x0d, 0x85, 0xfe, 0xb9, 0xe1, 0xe0, 0x85, 0xfd, 0xb9, 0x2f, 0xe1, 0x9d, 0x33, 0xe0, 0x60, 0xa9, 0x20, 0x8d, 0x00, 0xe0, 0x60, 0xad, 0x00, 0xe0, 0x5d, 0x62, 0xe1, 0x8d, 0x00, 0xe0, 0xa9, 0x01, 0x9d, 0x30, 0xe0, 0x60, 0xad, 0x00, 0xe0, 0x29, 0x07, 0x8d, 0x81, 0xec, 0xd0, 0x03, 0x20, 0xe9, 0xe2, 0x60, 0x00, 0xa2, 0x51, 0xa0, 0xec, 0x8e, 0x5d, 0xe1, 0x8c, 0x5e, 0xe1, 0x20, 0xcf, 0xe1, 0xa2, 0x00, 0xa0, 0x09, 0x20, 0x00, 0xe2, 0xa9, 0x07, 0x8d, 0x00, 0xe0, 0x8d, 0x81, 0xec, 0x60, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x29, 0xff, 0xf0, 0xf6, 0x4c, 0x29, 0xe3, 0xa9, 0x07, 0x8d, 0x00, 0xe0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, libsidplayfp-2.6.0/src/sidtune/SidTuneBase.h0000644000175100001770000002010314544470307015712 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2021 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000 Simon White * * 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. */ #ifndef SIDTUNEBASE_H #define SIDTUNEBASE_H #include #include #include #include #include "sidplayfp/SidTuneInfo.h" #include "sidplayfp/siddefs.h" #include "SmartPtr.h" #include "SidTuneInfoImpl.h" #include "sidcxx11.h" namespace libsidplayfp { class sidmemory; template class SmartPtr_sidtt; /** * loadError */ class loadError { private: const char* m_msg; public: loadError(const char* msg) : m_msg(msg) {} const char* message() const { return m_msg; } }; /** * SidTuneBaseBase */ class SidTuneBase { protected: typedef std::vector buffer_t; protected: /// Also PSID file format limit. static const unsigned int MAX_SONGS = 256; // Generic error messages static const char ERR_TRUNCATED[]; static const char ERR_INVALID[]; public: // ---------------------------------------------------------------- virtual ~SidTuneBase() {} typedef void (*LoaderFunc)(const char* fileName, buffer_t& bufferRef); /** * Load a sidtune from a file. * * To retrieve data from standard input pass in filename "-". * If you want to override the default filename extensions use this * contructor. Please note, that if the specified "sidTuneFileName" * does exist and the loader is able to determine its file format, * this function does not try to append any file name extension. * See "SidTune.cpp" for the default list of file name extensions. * * @param fileName * @param fileNameExt * @param separatorIsSlash * @return the sid tune * @throw loadError */ static SidTuneBase* load(const char* fileName, const char **fileNameExt, bool separatorIsSlash); /** * Load a sidtune from a file, using a file access callback. * * Uses the same call methodology as the above function, only * a callback is supplied, which will be used to read every * file this function accesses. * * @param loader * @param fileName * @param fileNameExt * @param separatorIsSlash * @return the sid tune * @throw loadError */ static SidTuneBase* load(LoaderFunc loader, const char* fileName, const char **fileNameExt, bool separatorIsSlash); /** * Load a single-file sidtune from a memory buffer. * Currently supported: PSID format * * @param sourceBuffer * @param bufferLen * @return the sid tune * @throw loadError */ static SidTuneBase* read(const uint_least8_t* sourceBuffer, uint_least32_t bufferLen); /** * Select sub-song (0 = default starting song) * and return active song number out of [1,2,..,SIDTUNE_MAX_SONGS]. * * @param songNum * @return the active song */ unsigned int selectSong(unsigned int songNum); /** * Retrieve sub-song specific information. */ const SidTuneInfo* getInfo() const; /** * Select sub-song (0 = default starting song) * and retrieve active song information. * * @param songNum */ const SidTuneInfo* getInfo(unsigned int songNum); /** * Copy sidtune into C64 memory (64 KB). * * @param mem */ virtual void placeSidTuneInC64mem(sidmemory& mem); /** * Calculates the MD5 hash of the tune. * Not providing an md5 buffer will cause the internal one to be used. * If provided, buffer must be MD5_LENGTH + 1 * * @return a pointer to the buffer containing the md5 string. */ virtual const char *createMD5(char *) { return nullptr; } /** * Calculates the MD5 hash of the tune. * Not providing an md5 buffer will cause the internal one to be used. * If provided, buffer must be MD5_LENGTH + 1 * * @return a pointer to the buffer containing the md5 string. */ virtual const char *createMD5New(char *) { return nullptr; } /** * Get the pointer to the tune data. */ const uint_least8_t* c64Data() const { return &cache[fileOffset]; } protected: // ------------------------------------------------------------- std::unique_ptr info; uint_least8_t songSpeed[MAX_SONGS]; SidTuneInfo::clock_t clockSpeed[MAX_SONGS]; /// For files with header: offset to real data uint_least32_t fileOffset; buffer_t cache; protected: SidTuneBase(); /** * Does not affect status of object, and therefore can be used * to load files. Error string is put into info.statusString, though. * * @param fileName * @param bufferRef * @throw loadError */ static void loadFile(const char* fileName, buffer_t& bufferRef); /** * Convert 32-bit PSID-style speed word to internal tables. * * @param speed * @param clock */ void convertOldStyleSpeedToTables(uint_least32_t speed, SidTuneInfo::clock_t clock = SidTuneInfo::CLOCK_PAL); /** * Check if compatibility constraints are fulfilled. */ bool checkCompatibility(); /** * Check for valid relocation information. */ bool checkRelocInfo(); /** * Common address resolution procedure. * * @param c64data */ void resolveAddrs(const uint_least8_t* c64data); /** * Cache the data of a single-file or two-file sidtune and its * corresponding file names. * * @param dataFileName * @param infoFileName * @param buf * @param isSlashedFileName If your opendir() and readdir()->d_name return path names * that contain the forward slash (/) as file separator, but * your operating system uses a different character, there are * extra functions that can deal with this special case. Set * separatorIsSlash to true if you like path names to be split * correctly. * You do not need these extra functions if your systems file * separator is the forward slash. * @throw loadError */ virtual void acceptSidTune(const char* dataFileName, const char* infoFileName, buffer_t& buf, bool isSlashedFileName); /** * Petscii to Ascii converter. */ std::string petsciiToAscii(SmartPtr_sidtt& spPet); private: // --------------------------------------------------------------- #if !defined(SIDTUNE_NO_STDIN_LOADER) static SidTuneBase* getFromStdIn(); #endif static SidTuneBase* getFromFiles(const char* name, const char **fileNameExtensions, bool separatorIsSlash); static SidTuneBase* getFromFiles(LoaderFunc loader, const char* name, const char **fileNameExtensions, bool separatorIsSlash); /** * Try to retrieve single-file sidtune from specified buffer. */ static SidTuneBase* getFromBuffer(const uint_least8_t* const buffer, uint_least32_t bufferLen); /** * Get new file name with specified extension. * * @param destString destinaton string * @param sourceName original file name * @param sourceExt new extension */ static void createNewFileName(std::string& destString, const char* sourceName, const char* sourceExt); private: // prevent copying SidTuneBase(const SidTuneBase&); SidTuneBase& operator=(SidTuneBase&); }; } #endif /* SIDTUNEBASE_H */ libsidplayfp-2.6.0/src/sidtune/MUS.h0000644000175100001770000000412214544470307014213 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2012-2015 Leandro Nini * * 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. */ #ifndef MUS_H #define MUS_H #include #include "SidTuneBase.h" #include "sidcxx11.h" namespace libsidplayfp { class MUS final : public SidTuneBase { private: /// Needed for MUS/STR player installation. uint_least16_t musDataLen; private: bool mergeParts(buffer_t& musBuf, buffer_t& strBuf); void tryLoad(buffer_t& musBuf, buffer_t& strBuf, uint_least32_t fileOffset, uint_least32_t voice3Index, bool init); protected: MUS() {} void installPlayer(sidmemory& mem); void setPlayerAddress(); virtual void acceptSidTune(const char* dataFileName, const char* infoFileName, buffer_t& buf, bool isSlashedFileName) override; public: virtual ~MUS() {} static SidTuneBase* load(buffer_t& dataBuf, bool init = false); static SidTuneBase* load(buffer_t& musBuf, buffer_t& strBuf, uint_least32_t fileOffset, bool init = false); virtual void placeSidTuneInC64mem(sidmemory& mem) override; private: // prevent copying MUS(const MUS&); MUS& operator=(MUS&); }; } #endif // MUS_H libsidplayfp-2.6.0/src/sidtune/sidplayer2.bin0000644000175100001770000004702214544470322016151 00000000000000 0x01, 0x00, 0x6f, 0x36, 0x35, 0x00, 0x00, 0x00, 0x00, 0x10, 0x9e, 0x0c, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xf1, 0x60, 0x01, 0x02, 0x04, 0x00, 0x07, 0x0e, 0x02, 0x02, 0xfe, 0x02, 0x02, 0xfe, 0xfe, 0x00, 0x01, 0x00, 0xff, 0x00, 0x02, 0x04, 0x05, 0x07, 0x09, 0x0b, 0x1e, 0x18, 0x8b, 0x7e, 0xfa, 0x06, 0xac, 0xf3, 0xe6, 0x8f, 0xf8, 0x2e, 0x86, 0x8e, 0x96, 0x9f, 0xa8, 0xb3, 0xbd, 0xc8, 0xd4, 0xe1, 0xee, 0xfd, 0x8c, 0x78, 0x64, 0x50, 0x3c, 0x28, 0x14, 0x00, 0x00, 0x02, 0x03, 0x05, 0x07, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x11, 0x12, 0x00, 0xe0, 0x00, 0x05, 0x0a, 0x0f, 0xf9, 0x00, 0xf5, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x20, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x00, 0x50, 0x00, 0x00, 0x60, 0x00, 0x00, 0x70, 0x00, 0x00, 0x80, 0x00, 0x00, 0x90, 0x00, 0x00, 0xa0, 0x00, 0xa9, 0x00, 0x8d, 0x00, 0xf0, 0xa2, 0x95, 0xa0, 0x42, 0xad, 0xa6, 0x02, 0xf0, 0x04, 0xa2, 0x25, 0xa0, 0x40, 0x8e, 0x5b, 0xf1, 0x8c, 0x5c, 0xf1, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x60, 0xa9, 0x00, 0x8d, 0x00, 0xf0, 0x86, 0x61, 0x84, 0x62, 0xa0, 0xbc, 0x99, 0x00, 0xf0, 0x88, 0xd0, 0xfa, 0xa0, 0x72, 0x99, 0xbc, 0xf0, 0x88, 0xd0, 0xfa, 0x8d, 0x15, 0xd5, 0x8d, 0x16, 0xd5, 0xa9, 0x08, 0x8d, 0x25, 0xf0, 0x8d, 0x17, 0xd5, 0x8d, 0x26, 0xf0, 0x8d, 0x18, 0xd5, 0xa9, 0x90, 0x8d, 0x27, 0xf0, 0xa9, 0x60, 0x8d, 0x28, 0xf0, 0xa9, 0x0c, 0x8d, 0x29, 0xf0, 0xad, 0x5b, 0xf1, 0x8d, 0x2d, 0xf0, 0xad, 0x5c, 0xf1, 0x8d, 0x2e, 0xf0, 0xa9, 0xff, 0x8d, 0xcc, 0xf0, 0xa9, 0xd5, 0x85, 0x64, 0xa2, 0x02, 0xa9, 0xff, 0x9d, 0x0b, 0xf0, 0xa9, 0x01, 0x9d, 0x30, 0xf0, 0x9d, 0x2a, 0xf0, 0x8a, 0x9d, 0x33, 0xf0, 0x9d, 0xae, 0xf0, 0xa9, 0x04, 0x9d, 0x39, 0xf0, 0xbd, 0xa8, 0xf1, 0x9d, 0xba, 0xf0, 0xa9, 0x5b, 0x9d, 0x7e, 0xf0, 0xbd, 0x65, 0xf1, 0x85, 0x63, 0xa9, 0x00, 0xa8, 0x91, 0x63, 0xc8, 0x91, 0x63, 0xc8, 0x91, 0x63, 0xa9, 0x08, 0x9d, 0x17, 0xf0, 0x9d, 0x9c, 0xf0, 0xc8, 0x91, 0x63, 0xc8, 0x91, 0x63, 0xa9, 0x40, 0x9d, 0x1a, 0xf0, 0x91, 0x63, 0xa9, 0x20, 0x9d, 0x1d, 0xf0, 0xc8, 0x91, 0x63, 0xa9, 0xf5, 0x9d, 0x20, 0xf0, 0xc8, 0x91, 0x63, 0xca, 0x10, 0xa4, 0x8a, 0xa2, 0x17, 0x9d, 0x3e, 0xf1, 0xca, 0x10, 0xfa, 0xa5, 0x61, 0x18, 0x69, 0x06, 0x85, 0x63, 0xa9, 0x00, 0xaa, 0xa8, 0x65, 0x62, 0x85, 0x64, 0x9d, 0xab, 0xf0, 0x9d, 0xb4, 0xf0, 0xa5, 0x63, 0x9d, 0xa8, 0xf0, 0x9d, 0xb1, 0xf0, 0x18, 0x71, 0x61, 0x85, 0x63, 0xa5, 0x64, 0xc8, 0x71, 0x61, 0xc8, 0xe8, 0xe0, 0x03, 0xd0, 0xe0, 0xa6, 0x63, 0xa8, 0x60, 0xa9, 0x00, 0x8d, 0x04, 0xd5, 0x8d, 0x0b, 0xd5, 0x8d, 0x12, 0xd5, 0x8d, 0x01, 0xd5, 0x8d, 0x08, 0xd5, 0x8d, 0x0f, 0xd5, 0xa9, 0x08, 0x8d, 0x17, 0xd5, 0xad, 0x5b, 0xf1, 0x8d, 0x04, 0xdc, 0xad, 0x5c, 0xf1, 0x8d, 0x05, 0xdc, 0x60, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0xea, 0x60, 0xa9, 0x08, 0x8d, 0x00, 0xf0, 0x6c, 0x5d, 0xf1, 0xea, 0xea, 0xea, 0xad, 0x00, 0xf0, 0x30, 0xf0, 0x09, 0x80, 0xa8, 0x29, 0x07, 0xf0, 0xee, 0xd8, 0x8c, 0x00, 0xf0, 0xea, 0xa5, 0xfb, 0x8d, 0x56, 0xf1, 0xa5, 0xfc, 0x8d, 0x57, 0xf1, 0xa5, 0xfd, 0x8d, 0x58, 0xf1, 0xa5, 0xfe, 0x8d, 0x59, 0xf1, 0xa5, 0xff, 0x8d, 0x5a, 0xf1, 0xad, 0x23, 0xf0, 0x18, 0x6d, 0xd9, 0xf0, 0x48, 0x29, 0x07, 0xa8, 0xad, 0xdc, 0xf0, 0x69, 0x00, 0x85, 0xff, 0x68, 0x46, 0xff, 0x6a, 0x46, 0xff, 0x6a, 0x46, 0xff, 0x6a, 0x18, 0x6d, 0x24, 0xf0, 0x8c, 0x15, 0xd5, 0x8d, 0x16, 0xd5, 0xad, 0x25, 0xf0, 0x8d, 0x17, 0xd5, 0xad, 0x26, 0xf0, 0x8d, 0x18, 0xd5, 0xa9, 0xd5, 0x85, 0xfc, 0xa2, 0x00, 0xad, 0x00, 0xf0, 0x3d, 0x62, 0xf1, 0xf0, 0x51, 0xbd, 0x65, 0xf1, 0x85, 0xfb, 0xbd, 0x0e, 0xf0, 0x18, 0x7d, 0x51, 0xf0, 0xa8, 0xbd, 0x11, 0xf0, 0x7d, 0x54, 0xf0, 0x48, 0x98, 0x18, 0x7d, 0xcd, 0xf0, 0xa0, 0x00, 0x91, 0xfb, 0x68, 0x7d, 0xd0, 0xf0, 0xc8, 0x91, 0xfb, 0xbd, 0x14, 0xf0, 0x18, 0x7d, 0x69, 0xf0, 0x85, 0xff, 0xbd, 0x17, 0xf0, 0x7d, 0x6c, 0xf0, 0x48, 0xa5, 0xff, 0x18, 0x7d, 0xd3, 0xf0, 0xc8, 0x91, 0xfb, 0x68, 0x7d, 0xd6, 0xf0, 0xc8, 0x91, 0xfb, 0xbd, 0x1d, 0xf0, 0xc8, 0xc8, 0x91, 0xfb, 0xbd, 0x20, 0xf0, 0xc8, 0x91, 0xfb, 0xe8, 0xe0, 0x03, 0xd0, 0xa2, 0xac, 0x1a, 0xf0, 0xae, 0x1b, 0xf0, 0xad, 0x1c, 0xf0, 0x8c, 0x04, 0xd5, 0x8e, 0x0b, 0xd5, 0x8d, 0x12, 0xd5, 0xae, 0x2d, 0xf0, 0xac, 0x2e, 0xf0, 0x8e, 0x04, 0xdc, 0x8c, 0x05, 0xdc, 0xad, 0x1b, 0xd5, 0x8d, 0xbe, 0xf0, 0xad, 0x1c, 0xd5, 0x8d, 0xbf, 0xf0, 0xa2, 0x00, 0xad, 0x00, 0xf0, 0x3d, 0x62, 0xf1, 0xf0, 0x10, 0x8e, 0x2f, 0xf0, 0x20, 0x36, 0xf5, 0xad, 0x00, 0xf0, 0x29, 0x78, 0xf0, 0x03, 0x4c, 0x0c, 0xf5, 0xe8, 0xe0, 0x03, 0xd0, 0xe3, 0xad, 0xc9, 0xf0, 0xd0, 0x52, 0xad, 0xca, 0xf0, 0x0d, 0xcb, 0xf0, 0xf0, 0x78, 0xad, 0xdf, 0xf0, 0xd0, 0x28, 0xad, 0xca, 0xf0, 0xf0, 0x28, 0x18, 0x6d, 0xbd, 0xf0, 0xb0, 0x07, 0xcd, 0xcc, 0xf0, 0x90, 0x60, 0xf0, 0x5e, 0xa9, 0x00, 0x8d, 0xdf, 0xf0, 0xad, 0xcb, 0xf0, 0xf0, 0x54, 0xee, 0xdf, 0xf0, 0xad, 0xbd, 0xf0, 0xed, 0xcb, 0xf0, 0x4c, 0xb4, 0xf4, 0xad, 0xcb, 0xf0, 0xf0, 0xd3, 0xad, 0xbd, 0xf0, 0x38, 0xed, 0xcb, 0xf0, 0xb0, 0x3a, 0xa9, 0x00, 0x8d, 0xdf, 0xf0, 0xad, 0xca, 0xf0, 0xd0, 0x30, 0xee, 0xdf, 0xf0, 0xd0, 0x28, 0xce, 0xe0, 0xf0, 0xd0, 0x29, 0xad, 0xdf, 0xf0, 0xd0, 0x11, 0xee, 0xdf, 0xf0, 0xad, 0xcb, 0xf0, 0xd0, 0x02, 0xa9, 0x20, 0x8d, 0xe0, 0xf0, 0xa9, 0x00, 0xf0, 0x10, 0xce, 0xdf, 0xf0, 0xad, 0xca, 0xf0, 0xd0, 0x02, 0xa9, 0x20, 0x8d, 0xe0, 0xf0, 0xad, 0xcc, 0xf0, 0x8d, 0xbd, 0xf0, 0xa2, 0x00, 0xbd, 0xc3, 0xf0, 0xf0, 0x44, 0xa9, 0x00, 0x85, 0xff, 0xbc, 0xc0, 0xf0, 0xb9, 0xbd, 0xf0, 0xbc, 0xc6, 0xf0, 0xf0, 0x0e, 0x30, 0x08, 0x0a, 0x26, 0xff, 0x88, 0xd0, 0xfa, 0xf0, 0x04, 0x4a, 0xc8, 0xd0, 0xfc, 0xbc, 0xc3, 0xf0, 0x88, 0xd0, 0x0b, 0x9d, 0xcd, 0xf0, 0xa5, 0xff, 0x9d, 0xd0, 0xf0, 0x4c, 0x02, 0xf5, 0x88, 0xd0, 0x0b, 0x9d, 0xd3, 0xf0, 0xa5, 0xff, 0x9d, 0xd6, 0xf0, 0x4c, 0x02, 0xf5, 0x8d, 0xd9, 0xf0, 0xa5, 0xff, 0x8d, 0xdc, 0xf0, 0xe8, 0xe0, 0x03, 0xd0, 0xb2, 0xad, 0x00, 0xf0, 0x29, 0x7f, 0x8d, 0x00, 0xf0, 0xad, 0x56, 0xf1, 0x85, 0xfb, 0xad, 0x57, 0xf1, 0x85, 0xfc, 0xad, 0x58, 0xf1, 0x85, 0xfd, 0xad, 0x59, 0xf1, 0x85, 0xfe, 0xad, 0x5a, 0xf1, 0x85, 0xff, 0x6c, 0x5d, 0xf1, 0xbd, 0x60, 0xf0, 0xd0, 0x03, 0x4c, 0x9f, 0xf6, 0x4c, 0xba, 0xf5, 0xde, 0x30, 0xf0, 0xd0, 0x03, 0x4c, 0xa0, 0xf6, 0xbd, 0x36, 0xf0, 0x30, 0xe8, 0xd0, 0x1a, 0xbd, 0x3f, 0xf0, 0xf0, 0x05, 0xde, 0x3f, 0xf0, 0xd0, 0x10, 0xbd, 0x39, 0xf0, 0xdd, 0x30, 0xf0, 0x90, 0x08, 0xbd, 0x1a, 0xf0, 0x29, 0xfe, 0x9d, 0x1a, 0xf0, 0xbd, 0x42, 0xf0, 0xf0, 0x56, 0x0a, 0xbd, 0x0e, 0xf0, 0xb0, 0x1d, 0x7d, 0x45, 0xf0, 0x9d, 0x0e, 0xf0, 0xa8, 0xbd, 0x11, 0xf0, 0x7d, 0x48, 0xf0, 0x9d, 0x11, 0xf0, 0x48, 0x98, 0xdd, 0x8d, 0xf0, 0x68, 0xfd, 0x90, 0xf0, 0xb0, 0x1f, 0x90, 0x2e, 0xfd, 0x45, 0xf0, 0x9d, 0x0e, 0xf0, 0xbd, 0x11, 0xf0, 0xfd, 0x48, 0xf0, 0x9d, 0x11, 0xf0, 0xbd, 0x8d, 0xf0, 0xdd, 0x0e, 0xf0, 0xbd, 0x90, 0xf0, 0xfd, 0x11, 0xf0, 0x90, 0x11, 0xbd, 0x8d, 0xf0, 0x9d, 0x0e, 0xf0, 0xbd, 0x90, 0xf0, 0x9d, 0x11, 0xf0, 0xa9, 0x00, 0x9d, 0x42, 0xf0, 0xbd, 0x60, 0xf0, 0xf0, 0x55, 0xbd, 0x4b, 0xf0, 0xf0, 0x4b, 0xa0, 0x00, 0xde, 0x4e, 0xf0, 0xd0, 0x31, 0xbd, 0x51, 0xf0, 0x1d, 0x54, 0xf0, 0xd0, 0x1b, 0xbd, 0x5d, 0xf0, 0x9d, 0x57, 0xf0, 0x9d, 0x4e, 0xf0, 0xbd, 0x4b, 0xf0, 0x0a, 0xbd, 0x5a, 0xf0, 0x90, 0x04, 0x49, 0xff, 0x69, 0x00, 0x9d, 0x4b, 0xf0, 0xd0, 0x10, 0xbd, 0x57, 0xf0, 0x9d, 0x4e, 0xf0, 0x98, 0x38, 0xfd, 0x4b, 0xf0, 0x9d, 0x4b, 0xf0, 0xc9, 0x00, 0x10, 0x01, 0x88, 0x18, 0x7d, 0x51, 0xf0, 0x9d, 0x51, 0xf0, 0x98, 0x7d, 0x54, 0xf0, 0x9d, 0x54, 0xf0, 0xbd, 0x36, 0xf0, 0x30, 0x15, 0xbd, 0x93, 0xf0, 0xf0, 0x10, 0x18, 0x7d, 0x14, 0xf0, 0x9d, 0x14, 0xf0, 0xbd, 0x96, 0xf0, 0x7d, 0x17, 0xf0, 0x9d, 0x17, 0xf0, 0xbd, 0x63, 0xf0, 0xf0, 0x4b, 0xa0, 0x00, 0xde, 0x66, 0xf0, 0xd0, 0x31, 0xbd, 0x69, 0xf0, 0x1d, 0x6c, 0xf0, 0xd0, 0x1b, 0xbd, 0x72, 0xf0, 0x9d, 0x6f, 0xf0, 0x9d, 0x66, 0xf0, 0xbd, 0x63, 0xf0, 0x0a, 0xbd, 0x75, 0xf0, 0x90, 0x04, 0x49, 0xff, 0x69, 0x00, 0x9d, 0x63, 0xf0, 0xd0, 0x10, 0xbd, 0x6f, 0xf0, 0x9d, 0x66, 0xf0, 0x98, 0x38, 0xfd, 0x63, 0xf0, 0x9d, 0x63, 0xf0, 0xc9, 0x00, 0x10, 0x01, 0x88, 0x18, 0x7d, 0x69, 0xf0, 0x9d, 0x69, 0xf0, 0x98, 0x7d, 0x6c, 0xf0, 0x9d, 0x6c, 0xf0, 0xbd, 0x36, 0xf0, 0x10, 0x03, 0x4c, 0x9f, 0xf6, 0xa0, 0x00, 0xbd, 0xa2, 0xf0, 0xf0, 0x1c, 0x10, 0x01, 0xc8, 0x18, 0x6d, 0x23, 0xf0, 0x48, 0x29, 0x07, 0x8d, 0x23, 0xf0, 0x68, 0x6a, 0x4a, 0x4a, 0x18, 0x79, 0xa6, 0xf1, 0x18, 0x6d, 0x24, 0xf0, 0x8d, 0x24, 0xf0, 0x60, 0xbd, 0xa8, 0xf0, 0x85, 0xfd, 0xbd, 0xab, 0xf0, 0x85, 0xfe, 0xd0, 0x04, 0x60, 0x20, 0x98, 0xf8, 0xad, 0x00, 0xf0, 0x3d, 0x62, 0xf1, 0xf0, 0xf4, 0xa0, 0x00, 0xb1, 0xfd, 0x85, 0xff, 0xc8, 0xb1, 0xfd, 0xa8, 0xa5, 0xfd, 0x18, 0x69, 0x02, 0x85, 0xfd, 0x9d, 0xa8, 0xf0, 0xa5, 0xfe, 0x69, 0x00, 0x85, 0xfe, 0x9d, 0xab, 0xf0, 0xa5, 0xff, 0x29, 0x03, 0xd0, 0xd2, 0xbd, 0x8d, 0xf0, 0x9d, 0x0e, 0xf0, 0xbd, 0x90, 0xf0, 0x9d, 0x11, 0xf0, 0xa5, 0xff, 0x9d, 0x05, 0xf0, 0x98, 0x9d, 0x02, 0xf0, 0x29, 0x07, 0xa8, 0xb9, 0x67, 0xf1, 0x8d, 0x6f, 0xf1, 0xbd, 0x02, 0xf0, 0x29, 0x38, 0x4a, 0x4a, 0x4a, 0x7d, 0x81, 0xf0, 0x85, 0xfd, 0xbd, 0x02, 0xf0, 0x29, 0xc0, 0x0a, 0x2a, 0x2a, 0xa8, 0xb9, 0x6f, 0xf1, 0x85, 0xfe, 0xbd, 0x02, 0xf0, 0x29, 0x07, 0xf0, 0x62, 0xa8, 0xb9, 0x72, 0xf1, 0x65, 0xfe, 0x18, 0x7d, 0x84, 0xf0, 0x10, 0x05, 0x18, 0x69, 0x0c, 0xe6, 0xfd, 0xc9, 0x0c, 0x90, 0x04, 0xe9, 0x0c, 0xc6, 0xfd, 0x85, 0xfe, 0xa8, 0xb9, 0x86, 0xf1, 0x85, 0xff, 0xb9, 0x7a, 0xf1, 0xa4, 0xfd, 0x88, 0x30, 0x06, 0x46, 0xff, 0x6a, 0x88, 0x10, 0xfa, 0x18, 0x7d, 0x87, 0xf0, 0x9d, 0x8d, 0xf0, 0xa5, 0xff, 0x7d, 0x8a, 0xf0, 0x9d, 0x90, 0xf0, 0xbd, 0x05, 0xf0, 0xd0, 0x03, 0x4c, 0xa0, 0xf6, 0xbd, 0x45, 0xf0, 0x1d, 0x48, 0xf0, 0xf0, 0x16, 0xbd, 0x0e, 0xf0, 0xdd, 0x8d, 0xf0, 0xbd, 0x11, 0xf0, 0xfd, 0x90, 0xf0, 0xa9, 0xfe, 0x6a, 0x9d, 0x42, 0xf0, 0x90, 0x11, 0xf0, 0x4a, 0x9d, 0x42, 0xf0, 0xbd, 0x8d, 0xf0, 0x9d, 0x0e, 0xf0, 0xbd, 0x90, 0xf0, 0x9d, 0x11, 0xf0, 0xbd, 0x36, 0xf0, 0x0a, 0xd0, 0x35, 0xbd, 0x93, 0xf0, 0xf0, 0x0c, 0xbd, 0x99, 0xf0, 0x9d, 0x14, 0xf0, 0xbd, 0x9c, 0xf0, 0x9d, 0x17, 0xf0, 0xbd, 0x9f, 0xf0, 0xf0, 0x0f, 0xa4, 0xfd, 0x18, 0x79, 0x92, 0xf1, 0xa4, 0xfe, 0x18, 0x79, 0x9a, 0xf1, 0x18, 0x90, 0x08, 0xbd, 0xa2, 0xf0, 0xf0, 0x0b, 0xbd, 0xa5, 0xf0, 0x8d, 0x24, 0xf0, 0xa9, 0x00, 0x8d, 0x23, 0xf0, 0xbd, 0x3c, 0xf0, 0x9d, 0x3f, 0xf0, 0xbd, 0x05, 0xf0, 0x29, 0x40, 0x9d, 0x36, 0xf0, 0xbd, 0x05, 0xf0, 0x4a, 0x4a, 0x29, 0x07, 0xd0, 0x30, 0xbd, 0x05, 0xf0, 0x30, 0x14, 0xad, 0x27, 0xf0, 0x29, 0x3c, 0xd0, 0x1e, 0xad, 0x27, 0xf0, 0x0a, 0x2a, 0x2a, 0xd0, 0x02, 0xa9, 0x04, 0x4c, 0x70, 0xf8, 0xad, 0x28, 0xf0, 0xf0, 0x0c, 0x29, 0x3f, 0xd0, 0x08, 0xad, 0x28, 0xf0, 0x0a, 0x2a, 0x2a, 0xd0, 0x66, 0xa9, 0x10, 0x8d, 0x00, 0xf0, 0x60, 0xc9, 0x01, 0xd0, 0x13, 0xbd, 0x05, 0xf0, 0x29, 0x20, 0xd0, 0x06, 0xad, 0x29, 0xf0, 0x4c, 0x70, 0xf8, 0xbd, 0x2a, 0xf0, 0x4c, 0x70, 0xf8, 0xa8, 0xbd, 0x05, 0xf0, 0x29, 0xa0, 0xc9, 0x80, 0xf0, 0x30, 0x85, 0xff, 0x18, 0xad, 0x27, 0xf0, 0xd0, 0x01, 0x38, 0x88, 0x88, 0xf0, 0x06, 0x6a, 0xb0, 0x4e, 0x88, 0xd0, 0xfa, 0xa4, 0xff, 0x85, 0xff, 0xf0, 0x26, 0x46, 0xff, 0xb0, 0x41, 0xf0, 0x42, 0x65, 0xff, 0xb0, 0x3e, 0xc8, 0x10, 0x19, 0x46, 0xff, 0xb0, 0x34, 0x65, 0xff, 0x90, 0x11, 0xb0, 0x31, 0xad, 0x28, 0xf0, 0xf0, 0x29, 0x88, 0x88, 0xf0, 0x06, 0x4a, 0xb0, 0x22, 0x88, 0xd0, 0xfa, 0x9d, 0x30, 0xf0, 0xbd, 0x1a, 0xf0, 0x29, 0xf6, 0x9d, 0x1a, 0xf0, 0x38, 0xbd, 0x02, 0xf0, 0x29, 0x07, 0xd0, 0x03, 0x7e, 0x36, 0xf0, 0xbd, 0x1a, 0xf0, 0x69, 0x00, 0x9d, 0x1a, 0xf0, 0x60, 0xa9, 0x10, 0x2c, 0xa9, 0x18, 0x8d, 0x00, 0xf0, 0x60, 0x98, 0x48, 0xa5, 0xff, 0x4a, 0x90, 0x03, 0x4c, 0x42, 0xfa, 0x4a, 0x4a, 0xb0, 0x1e, 0x4a, 0xb0, 0x0e, 0x9d, 0x9c, 0xf0, 0x9d, 0x17, 0xf0, 0x68, 0x9d, 0x99, 0xf0, 0x9d, 0x14, 0xf0, 0x60, 0x4a, 0x90, 0x02, 0x09, 0xf8, 0x9d, 0x8a, 0xf0, 0x68, 0x9d, 0x87, 0xf0, 0x60, 0x4a, 0xb0, 0x03, 0x4c, 0x4a, 0xf9, 0x4a, 0xb0, 0x61, 0x4a, 0xb0, 0x0f, 0xd0, 0x08, 0x68, 0x9d, 0xa5, 0xf0, 0x8d, 0x24, 0xf0, 0x60, 0x68, 0x9d, 0x3c, 0xf0, 0x60, 0xd0, 0x48, 0x68, 0x9d, 0x7e, 0xf0, 0xc9, 0x5b, 0xf0, 0x33, 0xa8, 0x4a, 0x4a, 0x4a, 0x38, 0xe9, 0x0b, 0x18, 0x7d, 0x84, 0xf0, 0x30, 0x0c, 0xc9, 0x0c, 0x90, 0x11, 0xe9, 0x0c, 0xde, 0x81, 0xf0, 0x4c, 0x0b, 0xf9, 0xc9, 0xf5, 0xb0, 0x05, 0x69, 0x0c, 0xfe, 0x81, 0xf0, 0x9d, 0x84, 0xf0, 0x98, 0x29, 0x07, 0x38, 0xe9, 0x03, 0x18, 0x7d, 0x81, 0xf0, 0x9d, 0x81, 0xf0, 0x60, 0xbd, 0x78, 0xf0, 0x9d, 0x81, 0xf0, 0xbd, 0x7b, 0xf0, 0x9d, 0x84, 0xf0, 0x60, 0x68, 0x9d, 0xc6, 0xf0, 0x60, 0x4a, 0xb0, 0x08, 0x9d, 0x0b, 0xf0, 0x68, 0x9d, 0x08, 0xf0, 0x60, 0x4a, 0x6a, 0x6a, 0x6d, 0x5b, 0xf1, 0x8d, 0x2d, 0xf0, 0x68, 0x6d, 0x5c, 0xf1, 0x8d, 0x2e, 0xf0, 0x60, 0x4a, 0x90, 0x03, 0x4c, 0xd3, 0xf9, 0x4a, 0xb0, 0x40, 0x4a, 0xb0, 0x17, 0x4a, 0xb0, 0x0f, 0x68, 0x8d, 0x27, 0xf0, 0x4a, 0x4a, 0x4a, 0xa8, 0xb9, 0xaf, 0xf1, 0x8d, 0x28, 0xf0, 0x60, 0x68, 0x9d, 0x5d, 0xf0, 0x60, 0x4a, 0xb0, 0x05, 0x68, 0x8d, 0x01, 0xf0, 0x60, 0x68, 0xf0, 0x11, 0x9d, 0x75, 0xf0, 0xbc, 0x63, 0xf0, 0xd0, 0x08, 0x9d, 0x63, 0xf0, 0xa9, 0x01, 0x9d, 0x66, 0xf0, 0x60, 0x9d, 0x63, 0xf0, 0x9d, 0x69, 0xf0, 0x9d, 0x6c, 0xf0, 0x60, 0x4a, 0xb0, 0x30, 0x4a, 0xb0, 0x05, 0x68, 0x9d, 0x39, 0xf0, 0x60, 0x68, 0xa0, 0x00, 0x4a, 0x90, 0x02, 0xc8, 0x18, 0x48, 0x29, 0x07, 0x79, 0xac, 0xf1, 0x9d, 0x78, 0xf0, 0x9d, 0x81, 0xf0, 0x68, 0x4a, 0x4a, 0x4a, 0x18, 0x79, 0xad, 0xf1, 0x9d, 0x7b, 0xf0, 0x9d, 0x84, 0xf0, 0xa9, 0x5b, 0x9d, 0x7e, 0xf0, 0x60, 0x4a, 0xb0, 0x05, 0x68, 0x9d, 0xa2, 0xf0, 0x60, 0x68, 0x8d, 0xcc, 0xf0, 0x60, 0x4a, 0xb0, 0x27, 0x4a, 0xb0, 0x0d, 0x4a, 0xb0, 0x05, 0x68, 0x8d, 0x29, 0xf0, 0x60, 0x68, 0x9d, 0x9f, 0xf0, 0x60, 0x4a, 0xb0, 0x0f, 0x68, 0x9d, 0x93, 0xf0, 0xa0, 0x00, 0x0a, 0x90, 0x01, 0x88, 0x98, 0x9d, 0x96, 0xf0, 0x60, 0x68, 0x9d, 0x72, 0xf0, 0x60, 0x4a, 0xb0, 0x1c, 0x4a, 0xb0, 0x15, 0x68, 0x9d, 0xb7, 0xf0, 0xa5, 0xfd, 0x9d, 0xb1, 0xf0, 0xa5, 0xfe, 0x9d, 0xb4, 0xf0, 0xbd, 0x33, 0xf0, 0x9d, 0xae, 0xf0, 0x60, 0x68, 0x6c, 0x5f, 0xf1, 0x4a, 0xb0, 0x1e, 0x68, 0xd0, 0x0a, 0x9d, 0x4b, 0xf0, 0x9d, 0x51, 0xf0, 0x9d, 0x54, 0xf0, 0x60, 0x9d, 0x5a, 0xf0, 0xbc, 0x4b, 0xf0, 0xd0, 0x08, 0x9d, 0x4b, 0xf0, 0xa9, 0x01, 0x9d, 0x4e, 0xf0, 0x60, 0x68, 0x9d, 0x2a, 0xf0, 0x60, 0x4a, 0x90, 0x08, 0x9d, 0x48, 0xf0, 0x68, 0x9d, 0x45, 0xf0, 0x60, 0x68, 0x4a, 0xb0, 0x61, 0x4a, 0xb0, 0x25, 0x4a, 0xb0, 0x05, 0x4a, 0xa0, 0xf0, 0xd0, 0x06, 0x0a, 0x0a, 0x0a, 0x0a, 0xa0, 0x0f, 0x85, 0xff, 0x98, 0xb0, 0x09, 0x3d, 0x1d, 0xf0, 0x05, 0xff, 0x9d, 0x1d, 0xf0, 0x60, 0x3d, 0x20, 0xf0, 0x05, 0xff, 0x9d, 0x20, 0xf0, 0x60, 0x4a, 0xb0, 0x38, 0x4a, 0xb0, 0x64, 0x85, 0xff, 0xbd, 0xba, 0xf0, 0xdd, 0xa9, 0xf1, 0xf0, 0x54, 0xfe, 0xba, 0xf0, 0xa8, 0xa5, 0xfd, 0x99, 0xe1, 0xf0, 0xa5, 0xfe, 0x99, 0xf0, 0xf0, 0xbd, 0x33, 0xf0, 0x99, 0x2f, 0xf1, 0xa4, 0xff, 0xb9, 0x17, 0xf1, 0xf0, 0x36, 0x85, 0xfe, 0xb9, 0xff, 0xf0, 0x85, 0xfd, 0xb9, 0x3e, 0xf1, 0x9d, 0x33, 0xf0, 0x60, 0xb0, 0x4b, 0x4a, 0xb0, 0x3c, 0xa8, 0xa5, 0xfd, 0x99, 0xff, 0xf0, 0xa5, 0xfe, 0x99, 0x17, 0xf1, 0xbd, 0x33, 0xf0, 0x99, 0x3e, 0xf1, 0xbd, 0xba, 0xf0, 0xdd, 0xa9, 0xf1, 0xf0, 0x0d, 0xfe, 0xba, 0xf0, 0xa8, 0xa9, 0x00, 0x99, 0xf0, 0xf0, 0x60, 0xa9, 0x30, 0x2c, 0xa9, 0x28, 0x8d, 0x00, 0xf0, 0x60, 0x0a, 0x0a, 0x0a, 0x0a, 0x4d, 0x25, 0xf0, 0x29, 0xf0, 0x4d, 0x25, 0xf0, 0x8d, 0x25, 0xf0, 0x60, 0x4d, 0x26, 0xf0, 0x29, 0x0f, 0x4d, 0x26, 0xf0, 0x8d, 0x26, 0xf0, 0x60, 0x4a, 0xb0, 0x0b, 0x4a, 0xb0, 0x04, 0x8d, 0xca, 0xf0, 0x60, 0x8d, 0xcb, 0xf0, 0x60, 0x4a, 0x90, 0x03, 0x4c, 0xa5, 0xfb, 0x4a, 0xa8, 0xf0, 0x21, 0x88, 0xf0, 0x34, 0x88, 0xf0, 0x42, 0x88, 0xf0, 0x4a, 0x88, 0xf0, 0x52, 0x88, 0xf0, 0x5c, 0x88, 0xf0, 0x66, 0x88, 0xf0, 0x73, 0x29, 0x07, 0x09, 0x10, 0xb0, 0x03, 0x4c, 0xb7, 0xfa, 0x4c, 0x7f, 0xfa, 0xac, 0x26, 0xf0, 0xb0, 0x07, 0xc8, 0x98, 0x29, 0x0f, 0xd0, 0x07, 0x60, 0x98, 0x29, 0x0f, 0xf0, 0x04, 0x88, 0x8c, 0x26, 0xf0, 0x60, 0xbd, 0x62, 0xf1, 0x49, 0xff, 0x2d, 0x25, 0xf0, 0x90, 0x03, 0x1d, 0x62, 0xf1, 0x8d, 0x25, 0xf0, 0x60, 0xbd, 0x1a, 0xf0, 0x29, 0xfb, 0x90, 0x55, 0x09, 0x04, 0xb0, 0x51, 0xbd, 0x1a, 0xf0, 0x29, 0xfd, 0x90, 0x4a, 0x09, 0x02, 0xb0, 0x46, 0xad, 0x25, 0xf0, 0x29, 0xf7, 0x90, 0x02, 0x09, 0x08, 0x8d, 0x25, 0xf0, 0x60, 0xad, 0x26, 0xf0, 0x29, 0x7f, 0x90, 0x02, 0x09, 0x80, 0x8d, 0x26, 0xf0, 0x60, 0x98, 0x8d, 0xbd, 0xf0, 0x8d, 0xdf, 0xf0, 0xc8, 0x8c, 0xe0, 0xf0, 0x2a, 0x8d, 0xc9, 0xf0, 0x60, 0x98, 0x2a, 0x9d, 0x60, 0xf0, 0x60, 0x4a, 0xb0, 0x27, 0x4a, 0xb0, 0x14, 0xd0, 0x02, 0xa9, 0x08, 0x0a, 0x0a, 0x0a, 0x0a, 0x5d, 0x1a, 0xf0, 0x29, 0xf0, 0x5d, 0x1a, 0xf0, 0x9d, 0x1a, 0xf0, 0x60, 0x0a, 0x0a, 0x0a, 0x0a, 0x4d, 0x26, 0xf0, 0x29, 0x70, 0x4d, 0x26, 0xf0, 0x8d, 0x26, 0xf0, 0x60, 0x4a, 0x90, 0x04, 0x9d, 0xc0, 0xf0, 0x60, 0xa8, 0xf0, 0x20, 0x88, 0xf0, 0x40, 0x88, 0xf0, 0x63, 0x29, 0x03, 0x9d, 0xc3, 0xf0, 0xa9, 0x00, 0x9d, 0xcd, 0xf0, 0x9d, 0xd0, 0xf0, 0x9d, 0xd3, 0xf0, 0x9d, 0xd6, 0xf0, 0x8d, 0xd9, 0xf0, 0x8d, 0xdc, 0xf0, 0x60, 0xbd, 0xb7, 0xf0, 0xf0, 0x05, 0xde, 0xb7, 0xf0, 0xf0, 0x12, 0xbd, 0x33, 0xf0, 0xdd, 0xae, 0xf0, 0xd0, 0x0b, 0xbd, 0xb1, 0xf0, 0x85, 0xfd, 0xbd, 0xb4, 0xf0, 0x85, 0xfe, 0x60, 0xa9, 0x38, 0x8d, 0x00, 0xf0, 0x60, 0xbd, 0xba, 0xf0, 0xdd, 0xa8, 0xf1, 0xf0, 0x18, 0xde, 0xba, 0xf0, 0xa8, 0x88, 0xb9, 0xf0, 0xf0, 0xf0, 0x0d, 0x85, 0xfe, 0xb9, 0xe1, 0xf0, 0x85, 0xfd, 0xb9, 0x2f, 0xf1, 0x9d, 0x33, 0xf0, 0x60, 0xa9, 0x20, 0x8d, 0x00, 0xf0, 0x60, 0xad, 0x00, 0xf0, 0x5d, 0x62, 0xf1, 0x8d, 0x00, 0xf0, 0xa9, 0x01, 0x9d, 0x30, 0xf0, 0x60, 0xad, 0x00, 0xf0, 0x29, 0x07, 0x8d, 0x81, 0xfc, 0xd0, 0x03, 0x20, 0xe9, 0xf2, 0x60, 0x00, 0xa2, 0x51, 0xa0, 0xfc, 0x8e, 0x5d, 0xf1, 0x8c, 0x5e, 0xf1, 0x20, 0xcf, 0xf1, 0xa2, 0x00, 0xa0, 0x09, 0x20, 0x00, 0xf2, 0xa9, 0x07, 0x8d, 0x00, 0xf0, 0x8d, 0x81, 0xfc, 0x60, 0x00, 0x00, 0x00, 0xa9, 0x00, 0x29, 0xff, 0xf0, 0xf6, 0x4c, 0x29, 0xf3, 0xa9, 0x07, 0x8d, 0x00, 0xf0, 0x60, 0x00, 0x20, 0x60, 0xec, 0x4c, 0x60, 0xfc, 0x20, 0x80, 0xec, 0x4c, 0x80, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, libsidplayfp-2.6.0/src/sidtune/prg.cpp0000644000175100001770000000357614544470307014706 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright 2011-2015 Leandro Nini * Copyright 2007-2010 Antti Lankila * Copyright 2000-2001 Simon White * * 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. */ #include "prg.h" #include #include "sidplayfp/SidTuneInfo.h" #include "SidTuneTools.h" #include "stringutils.h" namespace libsidplayfp { // Format strings const char TXT_FORMAT_PRG[] = "Tape image file (PRG)"; SidTuneBase* prg::load(const char *fileName, buffer_t& dataBuf) { const char *ext = SidTuneTools::fileExtOfPath(fileName); if ((!stringutils::equal(ext, ".prg")) && (!stringutils::equal(ext, ".c64"))) { return nullptr; } if (dataBuf.size() < 2) { throw loadError(ERR_TRUNCATED); } std::unique_ptr tune(new prg()); tune->load(); return tune.release(); } void prg::load() { info->m_formatString = TXT_FORMAT_PRG; // Automatic settings info->m_songs = 1; info->m_startSong = 1; info->m_compatibility = SidTuneInfo::COMPATIBILITY_BASIC; // Create the speed/clock setting table. convertOldStyleSpeedToTables(~0, info->m_clockSpeed); } } libsidplayfp-2.6.0/Makefile.am0000644000175100001770000003344214544470307013177 00000000000000 ACLOCAL_AMFLAGS = -I m4 AUTOMAKE_OPTIONS = foreign subdir-objects SUBDIRS = tests DISTCHECK_CONFIGURE_FLAGS = --enable-tests if MINGW32 W32_CPPFLAGS = -DWIN32_LEAN_AND_MEAN W32_LDFLAGS = -no-undefined endif if HAVE_VISIBILITY VISIBILITY_CXXFLAGS = -fvisibility=hidden -fvisibility-inlines-hidden endif AM_CPPFLAGS = -I $(top_builddir)/src/builders/residfp-builder \ -I $(top_builddir)/src/builders/residfp-builder/residfp \ -I $(top_builddir)/src/builders/resid-builder \ -I $(top_builddir)/src/builders/resid-builder/resid \ -I $(top_builddir)/src \ -I $(top_builddir)/src/sidtune \ -I $(top_srcdir)/src \ ${W32_CPPFLAGS} \ $(EXSID_CFLAGS) \ $(PTHREAD_CFLAGS) \ $(FTDI_CFLAGS) \ @debug_flags@ AM_CXXFLAGS = $(VISIBILITY_CXXFLAGS) $(OPENMP_CXXFLAGS) #========================================================= EXTRA_DIST = \ docs/mainpage.dox \ src/psiddrv.a65 \ src/sidtune/sidplayer1.a65 \ src/sidtune/sidplayer2.a65 \ src/builders/residfp-builder/residfp/AUTHORS \ src/builders/residfp-builder/residfp/COPYING \ src/builders/residfp-builder/residfp/README \ src/builders/resid-builder/resid/AUTHORS \ src/builders/resid-builder/resid/ChangeLog \ src/builders/resid-builder/resid/configure.in \ src/builders/resid-builder/resid/Makefile.am \ src/builders/resid-builder/resid/NEWS \ src/builders/resid-builder/resid/README \ src/builders/resid-builder/resid/README.VICE \ src/builders/resid-builder/resid/THANKS \ src/builders/resid-builder/resid/TODO \ src/builders/resid-builder/resid/filter8580new.cc \ src/builders/resid-builder/resid/filter8580new.h \ $(noinst_DATA) \ $(noinst_SCRIPTS) \ test/testsuite.sh \ test/testlist #========================================================= # Libraries lib_LTLIBRARIES = \ src/libsidplayfp.la \ src/libstilview.la noinst_LTLIBRARIES = \ src/builders/residfp-builder/residfp/libresidfp.la \ src/builders/resid-builder/resid/libresid.la \ src/builders/residfp-builder/libsidplayfp-residfp.la \ src/builders/resid-builder/libsidplayfp-resid.la if HARDSID noinst_LTLIBRARIES += src/builders/hardsid-builder/libsidplayfp-hardsid.la endif if EXSID_SUPPORT noinst_LTLIBRARIES += src/builders/exsid-builder/libsidplayfp-exsid.la endif #========================================================= # libsidplayfp if LIBGCRYPT MD5SRC = \ src/utils/md5Gcrypt.h else MD5SRC = \ src/utils/md5Internal.h \ src/utils/MD5/MD5.cpp \ src/utils/MD5/MD5.h \ src/utils/MD5/MD5_Defs.h endif src_libsidplayfp_la_SOURCES = \ src/Event.h \ src/EventCallback.h \ src/EventScheduler.cpp \ src/EventScheduler.h \ src/player.cpp \ src/player.h \ src/psiddrv.cpp \ src/psiddrv.h \ src/psiddrv.bin \ src/mixer.cpp \ src/mixer.h \ src/poweron.bin \ src/reloc65.cpp \ src/reloc65.h \ src/sidcxx11.h \ src/sidmd5.h \ src/sidmemory.h \ src/SidInfoImpl.h \ src/romCheck.h \ src/sidemu.cpp \ src/sidemu.h \ src/sidendian.h \ src/sidrandom.h \ src/stringutils.h \ src/c64/Banks/Bank.h \ src/c64/c64cpu.h \ src/c64/c64cia.h \ src/c64/c64env.h \ src/c64/c64sid.h \ src/c64/c64vic.h \ src/c64/c64.cpp \ src/c64/c64.h \ src/c64/mmu.cpp \ src/c64/mmu.h \ src/c64/Banks/ColorRAMBank.h \ src/c64/Banks/DisconnectedBusBank.h \ src/c64/Banks/ExtraSidBank.h \ src/c64/Banks/IOBank.h \ src/c64/Banks/NullSid.h \ src/c64/Banks/pla.h \ src/c64/Banks/SidBank.h \ src/c64/Banks/SystemRAMBank.h \ src/c64/Banks/SystemROMBanks.h \ src/c64/Banks/ZeroRAMBank.h \ src/c64/VIC_II/mos656x.cpp \ src/c64/VIC_II/mos656x.h \ src/c64/VIC_II/lightpen.h \ src/c64/VIC_II/sprites.h \ src/c64/CPU/flags.h \ src/c64/CPU/mos6510.cpp \ src/c64/CPU/mos6510.h \ src/c64/CPU/mos6510debug.cpp \ src/c64/CPU/mos6510debug.h \ src/c64/CPU/opcodes.h \ src/c64/CIA/interrupt.cpp \ src/c64/CIA/interrupt.h \ src/c64/CIA/mos652x.cpp \ src/c64/CIA/mos652x.h \ src/c64/CIA/SerialPort.h \ src/c64/CIA/SerialPort.cpp \ src/c64/CIA/timer.cpp \ src/c64/CIA/timer.h \ src/c64/CIA/tod.cpp \ src/c64/CIA/tod.h \ src/sidplayfp/sidplayfp.cpp \ src/sidplayfp/sidbuilder.cpp \ src/sidplayfp/SidConfig.cpp \ src/sidplayfp/SidInfo.cpp \ src/sidplayfp/SidTune.cpp \ src/sidplayfp/SidTuneInfo.cpp \ src/sidtune/MUS.cpp \ src/sidtune/MUS.h \ src/sidtune/p00.cpp \ src/sidtune/p00.h \ src/sidtune/prg.cpp \ src/sidtune/prg.h \ src/sidtune/PSID.cpp \ src/sidtune/PSID.h \ src/sidtune/sidplayer1.bin \ src/sidtune/sidplayer2.bin \ src/sidtune/SidTuneBase.cpp \ src/sidtune/SidTuneBase.h \ src/sidtune/SidTuneCfg.h \ src/sidtune/SidTuneInfoImpl.h \ src/sidtune/SidTuneTools.cpp \ src/sidtune/SidTuneTools.h \ src/sidtune/SmartPtr.h \ src/utils/iMd5.h \ src/utils/iniParser.cpp \ src/utils/iniParser.h \ src/utils/md5Factory.cpp \ src/utils/md5Factory.h \ src/utils/SidDatabase.cpp \ $(MD5SRC) src_libsidplayfp_la_LDFLAGS = -version-info $(LIBSIDPLAYVERSION) $(W32_LDFLAGS) src_libsidplayfp_ladir = $(includedir)/sidplayfp src_libsidplayfp_la_HEADERS = \ src/sidplayfp/siddefs.h \ src/sidplayfp/SidConfig.h \ src/sidplayfp/SidInfo.h \ src/sidplayfp/SidTuneInfo.h \ src/sidplayfp/sidbuilder.h \ src/sidplayfp/sidplayfp.h \ src/sidplayfp/SidTune.h \ src/utils/SidDatabase.h nodist_src_libsidplayfp_la_HEADERS = \ src/sidplayfp/sidversion.h src_libsidplayfp_la_LIBADD = \ src/builders/residfp-builder/libsidplayfp-residfp.la \ src/builders/resid-builder/libsidplayfp-resid.la \ $(LIBGCRYPT_LIBS) src_libsidplayfp_la_CPPFLAGS = $(LIBGCRYPT_CFLAGS) $(AM_CPPFLAGS) if HARDSID src_libsidplayfp_la_LIBADD += src/builders/hardsid-builder/libsidplayfp-hardsid.la endif if EXSID_SUPPORT src_libsidplayfp_la_LIBADD += src/builders/exsid-builder/libsidplayfp-exsid.la endif #========================================================= # residfp src_builders_residfp_builder_residfp_libresidfp_la_SOURCES = \ src/builders/residfp-builder/residfp/array.h \ src/builders/residfp-builder/residfp/Dac.cpp \ src/builders/residfp-builder/residfp/Dac.h \ src/builders/residfp-builder/residfp/EnvelopeGenerator.cpp \ src/builders/residfp-builder/residfp/EnvelopeGenerator.h \ src/builders/residfp-builder/residfp/ExternalFilter.cpp \ src/builders/residfp-builder/residfp/ExternalFilter.h \ src/builders/residfp-builder/residfp/Filter.cpp \ src/builders/residfp-builder/residfp/Filter.h \ src/builders/residfp-builder/residfp/Filter6581.cpp \ src/builders/residfp-builder/residfp/Filter6581.h \ src/builders/residfp-builder/residfp/Filter8580.cpp \ src/builders/residfp-builder/residfp/Filter8580.h \ src/builders/residfp-builder/residfp/FilterModelConfig.cpp \ src/builders/residfp-builder/residfp/FilterModelConfig.h \ src/builders/residfp-builder/residfp/FilterModelConfig6581.cpp \ src/builders/residfp-builder/residfp/FilterModelConfig6581.h \ src/builders/residfp-builder/residfp/FilterModelConfig8580.cpp \ src/builders/residfp-builder/residfp/FilterModelConfig8580.h \ src/builders/residfp-builder/residfp/Integrator6581.cpp \ src/builders/residfp-builder/residfp/Integrator6581.h \ src/builders/residfp-builder/residfp/Integrator8580.cpp \ src/builders/residfp-builder/residfp/Integrator8580.h \ src/builders/residfp-builder/residfp/OpAmp.cpp \ src/builders/residfp-builder/residfp/OpAmp.h \ src/builders/residfp-builder/residfp/Potentiometer.h \ src/builders/residfp-builder/residfp/SID.cpp \ src/builders/residfp-builder/residfp/SID.h \ src/builders/residfp-builder/residfp/Spline.cpp \ src/builders/residfp-builder/residfp/Spline.h \ src/builders/residfp-builder/residfp/Voice.h \ src/builders/residfp-builder/residfp/WaveformCalculator.cpp \ src/builders/residfp-builder/residfp/WaveformCalculator.h \ src/builders/residfp-builder/residfp/WaveformGenerator.cpp \ src/builders/residfp-builder/residfp/WaveformGenerator.h \ src/builders/residfp-builder/residfp/resample/Resampler.h \ src/builders/residfp-builder/residfp/resample/ZeroOrderResampler.h \ src/builders/residfp-builder/residfp/resample/SincResampler.cpp \ src/builders/residfp-builder/residfp/resample/SincResampler.h \ src/builders/residfp-builder/residfp/resample/TwoPassSincResampler.h \ src/builders/residfp-builder/residfp/version.cc #========================================================= # resid src_builders_resid_builder_resid_libresid_la_CPPFLAGS = \ $(AM_CPPFLAGS) \ -DVERSION=\"1.0-pre2\" if NEW_8580_FILTER FILTER8580SRC = \ src/builders/resid-builder/resid/filter8580new.h \ src/builders/resid-builder/resid/filter8580new.cc else FILTER8580SRC = \ src/builders/resid-builder/resid/filter.h \ src/builders/resid-builder/resid/filter.cc endif src_builders_resid_builder_resid_libresid_la_SOURCES = \ src/builders/resid-builder/resid/dac.h \ src/builders/resid-builder/resid/sid.h \ src/builders/resid-builder/resid/voice.h \ src/builders/resid-builder/resid/wave.h \ src/builders/resid-builder/resid/envelope.h \ src/builders/resid-builder/resid/extfilt.h \ src/builders/resid-builder/resid/pot.h \ src/builders/resid-builder/resid/spline.h \ src/builders/resid-builder/resid/dac.cc \ src/builders/resid-builder/resid/sid.cc \ src/builders/resid-builder/resid/voice.cc \ src/builders/resid-builder/resid/wave.cc \ src/builders/resid-builder/resid/envelope.cc \ src/builders/resid-builder/resid/extfilt.cc \ src/builders/resid-builder/resid/pot.cc \ src/builders/resid-builder/resid/resid-config.h \ src/builders/resid-builder/resid/version.cc \ $(FILTER8580SRC) \ $(noinst_DATA:.dat=.h) noinst_DATA = \ src/builders/resid-builder/resid/wave6581_PST.dat \ src/builders/resid-builder/resid/wave6581_PS_.dat \ src/builders/resid-builder/resid/wave6581_P_T.dat \ src/builders/resid-builder/resid/wave6581__ST.dat \ src/builders/resid-builder/resid/wave8580_PST.dat \ src/builders/resid-builder/resid/wave8580_PS_.dat \ src/builders/resid-builder/resid/wave8580_P_T.dat \ src/builders/resid-builder/resid/wave8580__ST.dat noinst_SCRIPTS = src/builders/resid-builder/resid/samp2src.pl .dat.h: $(PERL) $(srcdir)/src/builders/resid-builder/resid/samp2src.pl $* $< $@ #========================================================= # builders src_builders_residfp_builder_libsidplayfp_residfp_ladir = $(includedir)/sidplayfp/builders src_builders_residfp_builder_libsidplayfp_residfp_la_HEADERS = \ src/builders/residfp-builder/residfp.h src_builders_residfp_builder_libsidplayfp_residfp_la_SOURCES = \ src/builders/residfp-builder/residfp-builder.cpp \ src/builders/residfp-builder/residfp-emu.cpp \ src/builders/residfp-builder/residfp-emu.h src_builders_residfp_builder_libsidplayfp_residfp_la_LIBADD = \ src/builders/residfp-builder/residfp/libresidfp.la src_builders_resid_builder_libsidplayfp_resid_ladir = $(includedir)/sidplayfp/builders src_builders_resid_builder_libsidplayfp_resid_la_HEADERS = \ src/builders/resid-builder/resid.h src_builders_resid_builder_libsidplayfp_resid_la_SOURCES = \ src/builders/resid-builder/resid-builder.cpp \ src/builders/resid-builder/resid-emu.cpp \ src/builders/resid-builder/resid-emu.h src_builders_resid_builder_libsidplayfp_resid_la_LIBADD = \ src/builders/resid-builder/resid/libresid.la if HARDSID src_builders_hardsid_builder_libsidplayfp_hardsid_ladir = $(includedir)/sidplayfp/builders src_builders_hardsid_builder_libsidplayfp_hardsid_la_HEADERS = \ src/builders/hardsid-builder/hardsid.h if MINGW32 hardsid_src = src/builders/hardsid-builder/hardsid-emu-win.cpp else hardsid_src = src/builders/hardsid-builder/hardsid-emu-unix.cpp endif src_builders_hardsid_builder_libsidplayfp_hardsid_la_SOURCES = \ $(hardsid_src) \ src/builders/hardsid-builder/hardsid-builder.cpp \ src/builders/hardsid-builder/hardsid-emu.h endif if EXSID_SUPPORT if EXSID_DRIVER exsid_src = \ src/builders/exsid-builder/driver/exSID.c \ src/builders/exsid-builder/driver/exSID.h \ src/builders/exsid-builder/driver/exSID_defs.h \ src/builders/exsid-builder/driver/exSID_ftdiwrap.c \ src/builders/exsid-builder/driver/exSID_ftdiwrap.h endif src_builders_exsid_builder_libsidplayfp_exsid_ladir = $(includedir)/sidplayfp/builders src_builders_exsid_builder_libsidplayfp_exsid_la_HEADERS = \ src/builders/exsid-builder/exsid.h src_builders_exsid_builder_libsidplayfp_exsid_la_SOURCES = \ src/builders/exsid-builder/exsid-builder.cpp \ src/builders/exsid-builder/exsid-emu.cpp \ src/builders/exsid-builder/exsid-emu.h \ $(exsid_src) src_builders_exsid_builder_libsidplayfp_exsid_la_LIBADD = \ $(EXSID_LIBS) \ $(PTHREAD_LIBS) endif #========================================================= # libstilview src_libstilview_la_SOURCES = \ src/utils/STILview/stil.cpp src_libstilview_la_LDFLAGS = -version-info $(LIBSTILVIEWVERSION) $(W32_LDFLAGS) src_libstilview_ladir = $(includedir)/stilview src_libstilview_la_HEADERS = \ src/utils/STILview/stil.h \ src/utils/STILview/stildefs.h #========================================================= # docs if HAVE_DOXYGEN doc: $(DOXYGEN) Doxyfile clean-local: rm -fr $(builddir)/docs/html endif #========================================================= # test if TESTSUITE if MINGW32 DEMO_SRC = else DEMO_SRC = test/demo endif noinst_PROGRAMS = \ $(DEMO_SRC) \ test/test \ src/builders/residfp-builder/residfp/resample/test test_demo_SOURCES = test/demo.cpp test_demo_LDADD = src/libsidplayfp.la test_test_SOURCES = test/test.cpp test_test_LDADD = src/libsidplayfp.la src_builders_residfp_builder_residfp_resample_test_SOURCES = src/builders/residfp-builder/residfp/resample/test.cpp src_builders_residfp_builder_residfp_resample_test_LDADD = src/builders/residfp-builder/residfp/resample/SincResampler.lo endif #========================================================= pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libsidplayfp.pc libstilview.pc #========================================================= BUILT_SOURCES = \ $(noinst_DATA:.dat=.h) \ src/psiddrv.bin \ src/sidtune/sidplayer1.bin \ src/sidtune/sidplayer2.bin #========================================================= # Recreate psiddrv.bin, needs xa65 MAINTAINERCLEANFILES = $(BUILT_SOURCES) .a65.bin: o65file=`echo $@ | sed 's/bin/o65/'`;\ [ -n "$(OD)" ] || { echo "od not found"; false; } &&\ [ -n "$(XA)" ] || { echo "xa not found"; false; } &&\ ${XA} -R -G $< -o $$o65file &&\ ${OD} -v -An -w8 -tx1 $$o65file | sed -re 's/[[:alnum:]]+/0x&,/g' > $@ &&\ ${RM} $$o65file libsidplayfp-2.6.0/README0000644000175100001770000000712614544470307012023 00000000000000libsidplayfp ============ https://github.com/libsidplayfp/libsidplayfp libsidplayfp is a C64 music player library which integrates the reSID SID chip emulation into a cycle-based emulator environment, constantly aiming to improve emulation of the C64 system and the SID chips. Copyright (c) 2000-2001 Simon White Copyright (c) 2007-2010 Antti Lankila Copyright (c) 2010-2023 Leandro Nini ----------------------------------------------------------------------------- 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. ----------------------------------------------------------------------------- **NOTE**: the git repository contains submodules, clone with the --recurse-submodules option ----------------------------------------------------------------------------- API documentation available online at https://libsidplayfp.github.io/libsidplayfp/ ----------------------------------------------------------------------------- * Build This package uses autotools so the usual ./configure && make is enough to build the libraries. If cloning the bare sources the package need to be bootstrapped in advance with the autoreconf -i command. This step requires the xa cross-assembler to compile the 6502 code, usually provided by distributions with the xa65 package or available at http://www.floodgap.com/retrotech/xa/. In addition to the standard build options the following are available: --enable-debug[=no/yes/full] compile with debugging messages disabled by default --enable-inline enable inlinig in reSID engine, increases performances at the expense of bigger code size enabled by default --enable-branch-hints enable branch hints in reSID engine so the compiler can produce more optimized code enabled by default --with-simd= enable SIMD code in reSIDfp that might increase resampling performance. Be aware that this is processor specific and the compiler could actually produce more optimized code with the appropriate flags. Use only if you know what you're doing. none by default --enable-testsuite=PATH_TO_TESTSUITE add support for running VICE testsuite (in prg format). The testsuite is available in the repository. Intended only for regression tests since it may break normal code execution. The path to testsuite must include terminal path separator disabled by default --enable-tests enables unit tests. Requires libUnitTest++ installed. Use "make check" to launch the testsuite disabled by default --enable-hardsid enables hardsid support --with-gcrypt / --without-gcrypt force/disable libgcrypt support for MD5 computation default check --with-exsid Build with exsid support. Requires either libexsid or one of libfdti1 or libftd2xx --disable-openmp do not use OpenMP If doxygen is installed and detected by the configure script the documentation can be built by invoking "make doc". Known bugs/limitations: * mus data embedded in psid file is not supported * hardsid support is untested and possibly broken libsidplayfp-2.6.0/TODO0000644000175100001770000000046614544470307011633 000000000000003.0 * wrap everything into a library namespace (?) * require c++11 (?) * add API to allow mixing client side someday/maybe: * support non-ascii paths on Windows (SidTune, STIL) * relocate only psid tunes (?) * add SIDid support * implement support for mus data embedded in psid files * test hardsid support libsidplayfp-2.6.0/AUTHORS0000644000175100001770000000425214544470307012210 00000000000000libsidplayfp is a C64 music player library which integrates the reSID and reSIDfp SID chip emulation into a cycle-based emulator environment, constantly aiming to improve emulation of the C64 system and the SID chips. Copyright (c) 2000 Simon White Copyright (c) 2007-2010 Antti Lankila Copyright (c) 2010-2024 Leandro Nini This version of the freely available libsidplayfp emulator engine source code contains the following contributed or derived work. In the order they first supplied contributions or code was derived from their work: Dag Lem - reSID library Michael Schwendt - initial implementation of SidTune library, SidTune Wrapper, MD5 (based on work by L. Peter Deutsch) Simon White - Majority of LIBSIDPLAY2 Code Antti Lankila - SID distortion simulation (reSID-fp), emulation improvements Leandro Nini - build system rewrite, code refactoring, backporting fixes from jsidplay2 and VICE, emulation improvements LaLa - stilview André Fachat - reloc65 Jarno Paananen - HardSID UNIX builder Thibaut VARENE - exSID driver and builder VIC II, CIA and cpu-port emulation is based on VICE code. CIA SDR and interrupt handling are based on Denise emulator implementation. Credit where credit is due, so if I missed anyone please let me know. ----------------------------------------------------------------------------- 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. libsidplayfp-2.6.0/COPYING0000644000175100001770000004325414544470307012200 00000000000000 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. libsidplayfp-2.6.0/build-aux/0000755000175100001770000000000014544470322013104 500000000000000libsidplayfp-2.6.0/build-aux/depcomp0000755000175100001770000005602014544470316014407 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 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 # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz digits=0123456789 alpha=${upper}${lower} 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" # Avoid interferences from the environment. gccflag= dashmflag= # 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 information. 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 -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. ## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## 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). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - 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 -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # 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. ## 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. tr ' ' "$nl" < "$tmpdepfile" \ | 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 -ne 0; then 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 make_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. set_dir_from "$object" set_base_from "$object" 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 -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then 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 "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$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. set_dir_from "$object" set_base_from "$object" 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 -ne 0; then 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,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_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. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool 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$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; 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 -ne 0; then 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" echo >> "$depfile" # make sure the fragment doesn't end with a backslash 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" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | 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" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | 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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libsidplayfp-2.6.0/build-aux/ltmain.sh0000755000175100001770000117720314544470313014662 00000000000000#! /bin/sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2014-01-03.01 # libtool (GNU libtool) 2.4.6 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2015 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. # GNU Libtool is free software; 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. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be 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 . PROGRAM=libtool PACKAGE=libtool VERSION="2.4.6 Debian-2.4.6-15build2" package_revision=2.4.6 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2015-01-20.17; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # Copyright (C) 2004-2015 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. # 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 3 of the License, or # (at your option) any later version. # As a special exception to the GNU General Public License, if you distribute # this file as part of a program or library that is built using GNU Libtool, # you may include this file under the same distribution terms that you use # for the rest of that program. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNES 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! 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 # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some retarded systems that use ';' as a PATH separator! 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 ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # useable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1+=\\ \$func_quote_for_eval_result" }' else func_append_quoted () { $debug_cmd func_quote_for_eval "$2" eval "$1=\$$1\\ \$func_quote_for_eval_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value retuned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list incase some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_for_eval ARG... # -------------------------- # Aesthetically quote ARGs to be evaled later. # This function returns two values: # i) func_quote_for_eval_result # double-quoted, suitable for a subsequent eval # ii) func_quote_for_eval_unquoted_result # has all characters that are still active within double # quotes backslashified. func_quote_for_eval () { $debug_cmd func_quote_for_eval_unquoted_result= func_quote_for_eval_result= while test 0 -lt $#; do case $1 in *[\\\`\"\$]*) _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; *) _G_unquoted_arg=$1 ;; esac if test -n "$func_quote_for_eval_unquoted_result"; then func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" else func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" fi case $_G_unquoted_arg in # Double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_quoted_arg=\"$_G_unquoted_arg\" ;; *) _G_quoted_arg=$_G_unquoted_arg ;; esac if test -n "$func_quote_for_eval_result"; then func_append func_quote_for_eval_result " $_G_quoted_arg" else func_append func_quote_for_eval_result "$_G_quoted_arg" fi shift done } # func_quote_for_expand ARG # ------------------------- # Aesthetically quote ARG to be evaled later; same as above, # but do not quote variable references. func_quote_for_expand () { $debug_cmd case $1 in *[\\\`\"]*) _G_arg=`$ECHO "$1" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; *) _G_arg=$1 ;; esac case $_G_arg in # Double-quote args containing shell metacharacters to delay # word splitting and command substitution for a subsequent eval. # Many Bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") _G_arg=\"$_G_arg\" ;; esac func_quote_for_expand_result=$_G_arg } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_for_expand "$_G_cmd" eval "func_notquiet $func_quote_for_expand_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_for_expand "$_G_cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # Set a version string for this script. scriptversion=2015-10-07.11; # UTC # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # Copyright (C) 2010-2015 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. # 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 3 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 . # Please report bugs or propose patches to gary@gnu.org. ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# warranty; '. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # to the main code. A hook is just a named list of of function, that can # be run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of functions called by FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It is assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd _G_rc_run_hooks=false case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook funcions.n" ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do if eval $_G_hook '"$@"'; then # store returned options list back into positional # parameters for next 'cmd' execution. eval _G_hook_result=\$${_G_hook}_result eval set dummy "$_G_hook_result"; shift _G_rc_run_hooks=: fi done $_G_rc_run_hooks && func_run_hooks_result=$_G_hook_result } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list in your hook function, you may remove/edit # any options that you action, and then pass back the remaining unprocessed # options in '_result', escaped suitably for # 'eval'. In this case you also must return $EXIT_SUCCESS to let the # hook's caller know that it should pay attention to # '_result'. Returning $EXIT_FAILURE signalizes that # arguments are left untouched by the hook and therefore caller will ignore the # result variable. # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). There is # # no need to do the equivalent (but slower) action: # # func_quote_for_eval ${1+"$@"} # # my_options_prep_result=$func_quote_for_eval_result # false # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@", we could need that later # # if $args_changed is true. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # if $args_changed; then # func_quote_for_eval ${1+"$@"} # my_silent_option_result=$func_quote_for_eval_result # fi # # $args_changed # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # # false # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd _G_func_options_finish_exit=false if func_run_hooks func_options ${1+"$@"}; then func_options_finish_result=$func_run_hooks_result _G_func_options_finish_exit=: fi $_G_func_options_finish_exit } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_rc_options=false for my_func in options_prep parse_options validate_options options_finish do if eval func_$my_func '${1+"$@"}'; then eval _G_res_var='$'"func_${my_func}_result" eval set dummy "$_G_res_var" ; shift _G_rc_options=: fi done # Save modified positional parameters for caller. As a top-level # options-parser function we always need to set the 'func_options_result' # variable (regardless the $_G_rc_options value). if $_G_rc_options; then func_options_result=$_G_res_var else func_quote_for_eval ${1+"$@"} func_options_result=$func_quote_for_eval_result fi $_G_rc_options } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before # returning $EXIT_SUCCESS (otherwise $EXIT_FAILURE is returned). func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= _G_rc_options_prep=false if func_run_hooks func_options_prep ${1+"$@"}; then _G_rc_options_prep=: # save modified positional parameters for caller func_options_prep_result=$func_run_hooks_result fi $_G_rc_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd func_parse_options_result= _G_rc_parse_options=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. if func_run_hooks func_parse_options ${1+"$@"}; then eval set dummy "$func_run_hooks_result"; shift _G_rc_parse_options=: fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_rc_parse_options=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_rc_parse_options=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac $_G_match_parse_options && _G_rc_parse_options=: done if $_G_rc_parse_options; then # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} func_parse_options_result=$func_quote_for_eval_result fi $_G_rc_parse_options } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd _G_rc_validate_options=false # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" if func_run_hooks func_validate_options ${1+"$@"}; then # save modified positional parameters for caller func_validate_options_result=$func_run_hooks_result _G_rc_validate_options=: fi # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE $_G_rc_validate_options } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables after # splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} test "x$func_split_equals_lhs" = "x$1" \ && func_split_equals_rhs= }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /(C)/!b go :more /\./!{ N s|\n# | | b more } :go /^# Written by /,/# warranty; / { s|^# || s|^# *$|| s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| p } /^# Written by / { s|^# || p } /^warranty; /q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.4.6' # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { $debug_cmd $warning_func ${1+"$@"} } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information and exit --mode=MODE use operation mode MODE --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname $scriptversion Debian-2.4.6-15build2 automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func__fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_preserve_dup_deps=false opt_quiet=false nonopt= preserve_args= _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote_for_eval ${1+"$@"} libtool_options_prep_result=$func_quote_for_eval_result fi $_G_rc_lt_options_prep } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument for $_G_opt" exit_cmd=exit break ;; esac shift ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote_for_eval ${1+"$@"} libtool_parse_options_result=$func_quote_for_eval_result fi $_G_rc_lt_parse_options } func_add_hook func_parse_options libtool_parse_options # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote_for_eval ${1+"$@"} libtool_validate_options_result=$func_quote_for_eval_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, cygwin, or some other w32 environment. Relies on a correctly # configured wine environment available, with the winepath program in $build's # $PATH. Assumes ARG has no leading or trailing path separator characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_for_eval "$libobj" test "X$libobj" != "X$func_quote_for_eval_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_for_eval "$srcfile" qsrcfile=$func_quote_for_eval_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_for_eval "$nonopt" install_prog="$func_quote_for_eval_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_for_eval "$arg" func_append install_prog "$func_quote_for_eval_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_for_eval "$arg" func_append install_prog " $func_quote_for_eval_result" if test -n "$arg2"; then func_quote_for_eval "$arg2" fi func_append install_shared_prog " $func_quote_for_eval_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_for_eval "$install_override_mode" func_append install_shared_prog " -m $func_quote_for_eval_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_for_expand "$relink_command" eval "func_echo $func_quote_for_expand_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs 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 BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=\"$qECHO\" fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #ifdef _MSC_VER # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ int _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= thread_safe=no vinfo= vinfo_number=no weak_libs= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_for_eval "$arg" qarg=$func_quote_for_eval_unquoted_result func_append libtool_args " $func_quote_for_eval_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. -model|-arch|-isysroot|--sysroot) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" prev=xcompiler continue ;; -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) func_append compiler_flags " $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case "$new_inherited_linker_flags " in *" $arg "*) ;; * ) func_append new_inherited_linker_flags " $arg" ;; esac continue ;; -multi_module) single_module=$wl-multi_module continue ;; -no-fast-install) fast_install=no continue ;; -no-install) case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. func_warning "'-no-install' is ignored for $host" func_warning "assuming '-no-fast-install' instead" fast_install=no ;; *) no_install=yes ;; esac continue ;; -no-undefined) allow_undefined=no continue ;; -objectlist) prev=objectlist continue ;; -os2dllname) prev=os2dllname continue ;; -o) prev=output ;; -precious-files-regex) prev=precious_regex continue ;; -release) prev=release continue ;; -rpath) prev=rpath continue ;; -R) prev=xrpath continue ;; -R*) func_stripname '-R' '' "$arg" dir=$func_stripname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; =*) func_stripname '=' '' "$dir" dir=$lt_sysroot$func_stripname_result ;; *) func_fatal_error "only absolute run-paths are allowed" ;; esac case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac continue ;; -shared) # The effects of -shared are defined in a previous loop. continue ;; -shrext) prev=shrext continue ;; -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that # didn't have a PIC flag, but the assumption that the effects # would be equivalent was wrong. It would break on at least # Digital Unix and AIX. continue ;; -thread-safe) thread_safe=yes continue ;; -version-info) prev=vinfo continue ;; -version-number) prev=vinfo vinfo_number=yes continue ;; -weak) prev=weak continue ;; -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $func_quote_for_eval_result" func_append compiler_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Wl,*) func_stripname '-Wl,' '' "$arg" args=$func_stripname_result arg= save_ifs=$IFS; IFS=, for flag in $args; do IFS=$save_ifs func_quote_for_eval "$flag" func_append arg " $wl$func_quote_for_eval_result" func_append compiler_flags " $wl$func_quote_for_eval_result" func_append linker_flags " $func_quote_for_eval_result" done IFS=$save_ifs func_stripname ' ' '' "$arg" arg=$func_stripname_result ;; -Xcompiler) prev=xcompiler continue ;; -Xlinker) prev=xlinker continue ;; -XCClinker) prev=xcclinker continue ;; # -msg_* for osf cc -msg_*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; # Flags to be passed through unchanged, with rationale: # -64, -mips[0-9] enable 64-bit mode for the SGI compiler # -r[0-9][0-9]* specify processor for the SGI compiler # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler # +DA*, +DD* enable 64-bit mode for the HP compiler # -q* compiler args for the IBM compiler # -m*, -t[45]*, -txscale* architecture-specific flags for GCC # -F/path path to uninstalled frameworks, gcc on darwin # -p, -pg, --coverage, -fprofile-* profiling flags for GCC # -fstack-protector* stack protector flags for GCC # @file GCC response files # -tp=* Portland pgcc target processor selection # --sysroot=* for sysroot support # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization # -specs=* GCC specs files # -stdlib=* select c++ std lib with clang # -fsanitize=* Clang/GCC memory and address sanitizer # -fuse-ld=* Linker select flags for GCC # -static-* direct GCC to link specific libraries statically # -fcilkplus Cilk Plus language extension features for C/C++ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ -specs=*|-fsanitize=*|-fuse-ld=*|-static-*|-fcilkplus) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result func_append compile_command " $arg" func_append finalize_command " $arg" func_append compiler_flags " $arg" continue ;; -Z*) if test os2 = "`expr $host : '.*\(os2\)'`"; then # OS/2 uses -Zxxx to specify OS/2-specific options compiler_flags="$compiler_flags $arg" func_append compile_command " $arg" func_append finalize_command " $arg" case $arg in -Zlinker | -Zstack) prev=xcompiler ;; esac continue else # Otherwise treat like 'Some other compiler flag' below func_quote_for_eval "$arg" arg=$func_quote_for_eval_result fi ;; # Some other compiler flag. -* | +*) func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; *.$objext) # A standard object. func_append objs " $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result test none = "$pic_object" || { # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object } # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi ;; *.$libext) # An archive. func_append deplibs " $arg" func_append old_deplibs " $arg" continue ;; *.la) # A libtool-controlled library. func_resolve_sysroot "$arg" if test dlfiles = "$prev"; then # This library was specified with -dlopen. func_append dlfiles " $func_resolve_sysroot_result" prev= elif test dlprefiles = "$prev"; then # The library was specified with -dlpreopen. func_append dlprefiles " $func_resolve_sysroot_result" prev= else func_append deplibs " $func_resolve_sysroot_result" fi continue ;; # Some other compiler argument. *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. func_quote_for_eval "$arg" arg=$func_quote_for_eval_result ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then func_append compile_command " $arg" func_append finalize_command " $arg" fi done # argument parsing loop test -n "$prev" && \ func_fatal_help "the '$prevarg' option requires an argument" if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" func_append compile_command " $arg" func_append finalize_command " $arg" fi oldlibs= # calculate the name of the file, without its directory func_basename "$output" outputname=$func_basename_result libobjs_save=$libobjs if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" # Definition is injected by LT_CONFIG during libtool generation. func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" func_dirname "$output" "/" "" output_objdir=$func_dirname_result$objdir func_to_tool_file "$output_objdir/" tool_output_objdir=$func_to_tool_file_result # Create the object directory. func_mkdir_p "$output_objdir" # Determine the type of output case $output in "") func_fatal_help "you must specify an output file" ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; *.la) linkmode=lib ;; *) linkmode=prog ;; # Anything else should be a program. esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do if $opt_preserve_dup_deps; then case "$libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append libs " $deplib" done if test lib = "$linkmode"; then libs="$predeps $libs $compiler_lib_search_path $postdeps" # Compute libraries that are listed more than once in $predeps # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= if $opt_duplicate_compiler_generated_deps; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; esac func_append pre_post_deps " $pre_post_dep" done fi pre_post_deps= fi deplibs= newdependency_libs= newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries notinst_path= # paths that contain not-installed libtool libraries case $linkmode in lib) passes="conv dlpreopen link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" ;; esac done ;; prog) compile_deplibs= finalize_deplibs= alldeplibs=false newdlfiles= newdlprefiles= passes="conv scan dlopen dlpreopen link" ;; *) passes="conv" ;; esac for pass in $passes; do # The preopen pass in lib mode reverses $deplibs; put it back here # so that -L comes before libs that need it for instance... if test lib,link = "$linkmode,$pass"; then ## FIXME: Find the place where the list is rebuilt in the wrong ## order, and fix it there properly tmp_deplibs= for deplib in $deplibs; do tmp_deplibs="$deplib $tmp_deplibs" done deplibs=$tmp_deplibs fi if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass"; then libs=$deplibs deplibs= fi if test prog = "$linkmode"; then case $pass in dlopen) libs=$dlfiles ;; dlpreopen) libs=$dlprefiles ;; link) libs="$deplibs %DEPLIBS%" test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" ;; esac fi if test lib,dlpreopen = "$linkmode,$pass"; then # Collect and forward deplibs of preopened libtool libs for lib in $dlprefiles; do # Ignore non-libtool-libs dependency_libs= func_resolve_sysroot "$lib" case $lib in *.la) func_source "$func_resolve_sysroot_result" ;; esac # Collect preopened libtool deplibs, except any this library # has declared as weak libs for deplib in $dependency_libs; do func_basename "$deplib" deplib_base=$func_basename_result case " $weak_libs " in *" $deplib_base "*) ;; *) func_append deplibs " $deplib" ;; esac done done libs=$dlprefiles fi if test dlopen = "$pass"; then # Collect dlpreopened libraries save_deplibs=$deplibs deplibs= fi for deplib in $libs; do lib= found=false case $deplib in -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append compiler_flags " $deplib" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -l*) if test lib != "$linkmode" && test prog != "$linkmode"; then func_warning "'-l' is ignored for archives/objects" continue fi func_stripname '-l' '' "$deplib" name=$func_stripname_result if test lib = "$linkmode"; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" fi for searchdir in $searchdirs; do for search_ext in .la $std_shrext .so .a; do # Search the libtool library lib=$searchdir/lib$name$search_ext if test -f "$lib"; then if test .la = "$search_ext"; then found=: else found=false fi break 2 fi done done if $found; then # deplib is a libtool library # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, # We need to do some special things here, and not later. if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $deplib "*) if func_lalib_p "$lib"; then library_names= old_library= func_source "$lib" for l in $old_library $library_names; do ll=$l done if test "X$ll" = "X$old_library"; then # only static version available found=false func_dirname "$lib" "" "." ladir=$func_dirname_result lib=$ladir/$old_library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi fi ;; *) ;; esac fi else # deplib doesn't seem to be a libtool library if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" fi continue fi ;; # -l *.ltframework) if test prog,link = "$linkmode,$pass"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else deplibs="$deplib $deplibs" if test lib = "$linkmode"; then case "$new_inherited_linker_flags " in *" $deplib "*) ;; * ) func_append new_inherited_linker_flags " $deplib" ;; esac fi fi continue ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test conv = "$pass" && continue newdependency_libs="$deplib $newdependency_libs" func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; prog) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi if test scan = "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; *) func_warning "'-L' is ignored for archives/objects" ;; esac # linkmode continue ;; # -L -R*) if test link = "$pass"; then func_stripname '-R' '' "$deplib" func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; *) func_append xrpath " $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; *.la) func_resolve_sysroot "$deplib" lib=$func_resolve_sysroot_result ;; *.$libext) if test conv = "$pass"; then deplibs="$deplib $deplibs" continue fi case $linkmode in lib) # Linking convenience modules into shared libraries is allowed, # but linking other static libraries is non-portable. case " $dlpreconveniencelibs " in *" $deplib "*) ;; *) valid_a_lib=false case $deplibs_check_method in match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then valid_a_lib=: fi ;; pass_all) valid_a_lib=: ;; esac if $valid_a_lib; then echo $ECHO "*** Warning: Linking the shared library $output against the" $ECHO "*** static library $deplib is not portable!" deplibs="$deplib $deplibs" else echo $ECHO "*** Warning: Trying to link with static lib archive $deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because the file extensions .$libext of this argument makes me believe" echo "*** that it is just a static archive that I should not use here." fi ;; esac continue ;; prog) if test link != "$pass"; then deplibs="$deplib $deplibs" else compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi continue ;; esac # linkmode ;; # *.$libext *.lo | *.$objext) if test conv = "$pass"; then deplibs="$deplib $deplibs" elif test prog = "$linkmode"; then if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then # If there is no dlopen support or we're linking statically, # we need to preload. func_append newdlprefiles " $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else func_append newdlfiles " $deplib" fi fi continue ;; %DEPLIBS%) alldeplibs=: continue ;; esac # case $deplib $found || test -f "$lib" \ || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$lib" \ || func_fatal_error "'$lib' is not a valid libtool archive" func_dirname "$lib" "" "." ladir=$func_dirname_result dlname= dlopen= dlpreopen= libdir= library_names= old_library= inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes shouldnotlink=no avoidtemprpath= # Read the .la file func_source "$lib" # Convert "-framework foo" to "foo.ltframework" if test -n "$inherited_linker_flags"; then tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do case " $new_inherited_linker_flags " in *" $tmp_inherited_linker_flag "*) ;; *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; esac done fi dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test lib,link = "$linkmode,$pass" || test prog,scan = "$linkmode,$pass" || { test prog != "$linkmode" && test lib != "$linkmode"; }; then test -n "$dlopen" && func_append dlfiles " $dlopen" test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" fi if test conv = "$pass"; then # Only check for convenience libraries deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then func_fatal_error "cannot find name of link library for '$lib'" fi # It is a libtool convenience library, so add in its objects. func_append convenience " $ladir/$objdir/$old_library" func_append old_convenience " $ladir/$objdir/$old_library" tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done elif test prog != "$linkmode" && test lib != "$linkmode"; then func_fatal_error "'$lib' is not a convenience library" fi continue fi # $pass = conv # Get the name of the library we link against. linklib= if test -n "$old_library" && { test yes = "$prefer_static_libs" || test built,no = "$prefer_static_libs,$installed"; }; then linklib=$old_library else for l in $old_library $library_names; do linklib=$l done fi if test -z "$linklib"; then func_fatal_error "cannot find name of link library for '$lib'" fi # This library was specified with -dlopen. if test dlopen = "$pass"; then test -z "$libdir" \ && func_fatal_error "cannot -dlopen a convenience library: '$lib'" if test -z "$dlname" || test yes != "$dlopen_support" || test no = "$build_libtool_libs" then # If there is no dlname, no dlopen support or we're linking # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. func_append dlprefiles " $lib $dependency_libs" else func_append newdlfiles " $lib" fi continue fi # $pass = dlopen # We need an absolute path. case $ladir in [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then func_warning "cannot determine absolute directory name of '$ladir'" func_warning "passing it literally to the linker, although it might fail" abs_ladir=$ladir fi ;; esac func_basename "$lib" laname=$func_basename_result # Find the relevant object directory and library name. if test yes = "$installed"; then if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then func_warning "library '$lib' was moved." dir=$ladir absdir=$abs_ladir libdir=$abs_ladir else dir=$lt_sysroot$libdir absdir=$lt_sysroot$libdir fi test yes = "$hardcode_automatic" && avoidtemprpath=yes else if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then dir=$ladir absdir=$abs_ladir # Remove this search path later func_append notinst_path " $abs_ladir" else dir=$ladir/$objdir absdir=$abs_ladir/$objdir # Remove this search path later func_append notinst_path " $abs_ladir" fi fi # $installed = yes func_stripname 'lib' '.la' "$laname" name=$func_stripname_result # This library was specified with -dlpreopen. if test dlpreopen = "$pass"; then if test -z "$libdir" && test prog = "$linkmode"; then func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" fi case $host in # special handling for platforms with PE-DLLs. *cygwin* | *mingw* | *cegcc* ) # Linker will automatically link against shared library if both # static and shared are present. Therefore, ensure we extract # symbols from the import library if a shared library is present # (otherwise, the dlopen module name will be incorrect). We do # this by putting the import library name into $newdlprefiles. # We recover the dlopen module name by 'saving' the la file # name in a special purpose variable, and (later) extracting the # dlname from the la file. if test -n "$dlname"; then func_tr_sh "$dir/$linklib" eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" func_append newdlprefiles " $dir/$linklib" else func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" fi ;; * ) # Prefer using a static library (so that no silly _DYNAMIC symbols # are required to link). if test -n "$old_library"; then func_append newdlprefiles " $dir/$old_library" # Keep a list of preopened convenience libraries to check # that they are being used correctly in the link pass. test -z "$libdir" && \ func_append dlpreconveniencelibs " $dir/$old_library" # Otherwise, use the dlname, so that lt_dlopen finds it. elif test -n "$dlname"; then func_append newdlprefiles " $dir/$dlname" else func_append newdlprefiles " $dir/$linklib" fi ;; esac fi # $pass = dlpreopen if test -z "$libdir"; then # Link the convenience library if test lib = "$linkmode"; then deplibs="$dir/$old_library $deplibs" elif test prog,link = "$linkmode,$pass"; then compile_deplibs="$dir/$old_library $compile_deplibs" finalize_deplibs="$dir/$old_library $finalize_deplibs" else deplibs="$lib $deplibs" # used for prog,scan pass fi continue fi if test prog = "$linkmode" && test link != "$pass"; then func_append newlib_search_path " $ladir" deplibs="$lib $deplibs" linkalldeplibs=false if test no != "$link_all_deplibs" || test -z "$library_names" || test no = "$build_libtool_libs"; then linkalldeplibs=: fi tmp_libs= for deplib in $dependency_libs; do case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result" func_append newlib_search_path " $func_resolve_sysroot_result" ;; esac # Need to link against all dependency_libs? if $linkalldeplibs; then deplibs="$deplib $deplibs" else # Need to hardcode shared library paths # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $deplib "*) func_append specialdeplibs " $deplib" ;; esac fi func_append tmp_libs " $deplib" done # for deplib continue fi # $linkmode = prog... if test prog,link = "$linkmode,$pass"; then if test -n "$library_names" && { { test no = "$prefer_static_libs" || test built,yes = "$prefer_static_libs,$installed"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then # Make sure the rpath contains only unique directories. case $temp_rpath: in *"$absdir:"*) ;; *) func_append temp_rpath "$absdir:" ;; esac fi # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi # $linkmode,$pass = prog,link... if $alldeplibs && { test pass_all = "$deplibs_check_method" || { test yes = "$build_libtool_libs" && test -n "$library_names"; }; }; then # We only need to search for static libraries continue fi fi link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs if test built = "$use_static_libs" && test yes = "$installed"; then use_static_libs=no fi if test -n "$library_names" && { test no = "$use_static_libs" || test -z "$old_library"; }; then case $host in *cygwin* | *mingw* | *cegcc* | *os2*) # No point in relinking DLLs because paths are not encoded func_append notinst_deplibs " $lib" need_relink=no ;; *) if test no = "$installed"; then func_append notinst_deplibs " $lib" need_relink=yes fi ;; esac # This is a shared library # Warn about portability, can't link against -module's on some # systems (darwin). Don't bleat about dlopened modules though! dlopenmodule= for dlpremoduletest in $dlprefiles; do if test "X$dlpremoduletest" = "X$lib"; then dlopenmodule=$dlpremoduletest break fi done if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then echo if test prog = "$linkmode"; then $ECHO "*** Warning: Linking the executable $output against the loadable module" else $ECHO "*** Warning: Linking the shared library $output against the loadable module" fi $ECHO "*** $linklib is not portable!" fi if test lib = "$linkmode" && test yes = "$hardcode_into_libs"; then # Hardcode the library path. # Skip directories that are in the system default run-time # search path. case " $sys_lib_dlsearch_path " in *" $absdir "*) ;; *) case "$compile_rpath " in *" $absdir "*) ;; *) func_append compile_rpath " $absdir" ;; esac ;; esac case " $sys_lib_dlsearch_path " in *" $libdir "*) ;; *) case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac ;; esac fi if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names shift realname=$1 shift libname=`eval "\\$ECHO \"$libname_spec\""` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname=$dlname elif test -n "$soname_spec"; then # bleh windows case $host in *cygwin* | mingw* | *cegcc* | *os2*) func_arith $current - $age major=$func_arith_result versuffix=-$major ;; esac eval soname=\"$soname_spec\" else soname=$realname fi # Make a new name for the extract_expsyms_cmds to use soroot=$soname func_basename "$soroot" soname=$func_basename_result func_stripname 'lib' '.dll' "$soname" newlib=libimp-$func_stripname_result.a # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else func_verbose "extracting exported symbol list from '$soname'" func_execute_cmds "$extract_expsyms_cmds" 'exit $?' fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else func_verbose "generating import library for '$soname'" func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" if test prog = "$linkmode" || test relink != "$opt_mode"; then add_shlibpath= add_dir= add= lib_linked=yes case $hardcode_action in immediate | unsupported) if test no = "$hardcode_direct"; then add=$dir/$linklib case $host in *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; *-*-sysv4*uw2*) add_dir=-L$dir ;; *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir=-L$dir ;; *-*-darwin* ) # if the lib is a (non-dlopened) module then we cannot # link against it, someone is ignoring the earlier warnings if /usr/bin/file -L $add 2> /dev/null | $GREP ": [^:]* bundle" >/dev/null; then if test "X$dlopenmodule" != "X$lib"; then $ECHO "*** Warning: lib $linklib is a module, not a shared library" if test -z "$old_library"; then echo echo "*** And there doesn't seem to be a static archive available" echo "*** The link will probably fail, sorry" else add=$dir/$old_library fi elif test -n "$old_library"; then add=$dir/$old_library fi fi esac elif test no = "$hardcode_minus_L"; then case $host in *-*-sunos*) add_shlibpath=$dir ;; esac add_dir=-L$dir add=-l$name elif test no = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; relink) if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$dir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$absdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name elif test yes = "$hardcode_shlibpath_var"; then add_shlibpath=$dir add=-l$name else lib_linked=no fi ;; *) lib_linked=no ;; esac if test yes != "$lib_linked"; then func_fatal_configuration "unsupported hardcode properties" fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; *) func_append compile_shlibpath "$add_shlibpath:" ;; esac fi if test prog = "$linkmode"; then test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" test -n "$add" && compile_deplibs="$add $compile_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" if test yes != "$hardcode_direct" && test yes != "$hardcode_minus_L" && test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac fi fi fi if test prog = "$linkmode" || test relink = "$opt_mode"; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. if test yes = "$hardcode_direct" && test no = "$hardcode_direct_absolute"; then add=$libdir/$linklib elif test yes = "$hardcode_minus_L"; then add_dir=-L$libdir add=-l$name elif test yes = "$hardcode_shlibpath_var"; then case :$finalize_shlibpath: in *":$libdir:"*) ;; *) func_append finalize_shlibpath "$libdir:" ;; esac add=-l$name elif test yes = "$hardcode_automatic"; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib"; then add=$inst_prefix_dir$libdir/$linklib else add=$libdir/$linklib fi else # We cannot seem to hardcode it, guess we'll fake it. add_dir=-L$libdir # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) func_append add_dir " -L$inst_prefix_dir$libdir" ;; esac fi add=-l$name fi if test prog = "$linkmode"; then test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" test -n "$add" && finalize_deplibs="$add $finalize_deplibs" else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" fi fi elif test prog = "$linkmode"; then # Here we assume that one of hardcode_direct or hardcode_minus_L # is not unsupported. This is valid on all known static and # shared platforms. if test unsupported != "$hardcode_direct"; then test -n "$old_library" && linklib=$old_library compile_deplibs="$dir/$linklib $compile_deplibs" finalize_deplibs="$dir/$linklib $finalize_deplibs" else compile_deplibs="-l$name -L$dir $compile_deplibs" finalize_deplibs="-l$name -L$dir $finalize_deplibs" fi elif test yes = "$build_libtool_libs"; then # Not a shared library if test pass_all != "$deplibs_check_method"; then # We're trying link a shared library against a static one # but the system doesn't support it. # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. echo $ECHO "*** Warning: This system cannot link to static lib archive $lib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have." if test yes = "$module"; then echo "*** But as you try to build a module library, libtool will still create " echo "*** a static module, that should work as long as the dlopening application" echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi else deplibs="$dir/$old_library $deplibs" link_static=yes fi fi # link shared/static library? if test lib = "$linkmode"; then if test -n "$dependency_libs" && { test yes != "$hardcode_into_libs" || test yes = "$build_old_libs" || test yes = "$link_static"; }; then # Extract -R from dependency_libs temp_deplibs= for libdir in $dependency_libs; do case $libdir in -R*) func_stripname '-R' '' "$libdir" temp_xrpath=$func_stripname_result case " $xrpath " in *" $temp_xrpath "*) ;; *) func_append xrpath " $temp_xrpath";; esac;; *) func_append temp_deplibs " $libdir";; esac done dependency_libs=$temp_deplibs fi func_append newlib_search_path " $absdir" # Link against this library test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" case $deplib in -L*) func_stripname '-L' '' "$deplib" func_resolve_sysroot "$func_stripname_result";; *) func_resolve_sysroot "$deplib" ;; esac if $opt_preserve_dup_deps; then case "$tmp_libs " in *" $func_resolve_sysroot_result "*) func_append specialdeplibs " $func_resolve_sysroot_result" ;; esac fi func_append tmp_libs " $func_resolve_sysroot_result" done if test no != "$link_all_deplibs"; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do path= case $deplib in -L*) path=$deplib ;; *.la) func_resolve_sysroot "$deplib" deplib=$func_resolve_sysroot_result func_dirname "$deplib" "" "." dir=$func_dirname_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then func_warning "cannot determine absolute directory name of '$dir'" absdir=$dir fi ;; esac if $GREP "^installed=no" $deplib > /dev/null; then case $host in *-*-darwin*) depdepl= eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names"; then for tmp in $deplibrary_names; do depdepl=$tmp done if test -f "$absdir/$objdir/$depdepl"; then depdepl=$absdir/$objdir/$depdepl darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` if test -z "$darwin_install_name"; then darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` fi func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" path= fi fi ;; *) path=-L$absdir/$objdir ;; esac else eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" test "$absdir" != "$libdir" && \ func_warning "'$deplib' seems to be moved" path=-L$absdir fi ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs if test link = "$pass"; then if test prog = "$linkmode"; then compile_deplibs="$new_inherited_linker_flags $compile_deplibs" finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" else compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` fi fi dependency_libs=$newdependency_libs if test dlpreopen = "$pass"; then # Link the dlpreopened libraries before other libraries for deplib in $save_deplibs; do deplibs="$deplib $deplibs" done fi if test dlopen != "$pass"; then test conv = "$pass" || { # Make sure lib_search_path contains only unique directories. lib_search_path= for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; *) func_append lib_search_path " $dir" ;; esac done newlib_search_path= } if test prog,link = "$linkmode,$pass"; then vars="compile_deplibs finalize_deplibs" else vars=deplibs fi for var in $vars dependency_libs; do # Add libraries to $var in reverse order eval tmp_libs=\"\$$var\" new_libs= for deplib in $tmp_libs; do # FIXME: Pedantically, this is the right thing to do, so # that some nasty dependency loop isn't accidentally # broken: #new_libs="$deplib $new_libs" # Pragmatically, this seems to cause very few problems in # practice: case $deplib in -L*) new_libs="$deplib $new_libs" ;; -R*) ;; *) # And here is the reason: when a library appears more # than once as an explicit dependence of a library, or # is implicitly linked in more than once by the # compiler, it is considered special, and multiple # occurrences thereof are not removed. Compare this # with having the same library being listed as a # dependency of multiple other libraries: in this case, # we know (pedantically, we assume) the library does not # need to be listed more than once, so we keep only the # last copy. This is not always right, but it is rare # enough that we require users that really mean to play # such unportable linking tricks to link the library # using -Wl,-lname, so that libtool does not consider it # for duplicate removal. case " $specialdeplibs " in *" $deplib "*) new_libs="$deplib $new_libs" ;; *) case " $new_libs " in *" $deplib "*) ;; *) new_libs="$deplib $new_libs" ;; esac ;; esac ;; esac done tmp_libs= for deplib in $new_libs; do case $deplib in -L*) case " $tmp_libs " in *" $deplib "*) ;; *) func_append tmp_libs " $deplib" ;; esac ;; *) func_append tmp_libs " $deplib" ;; esac done eval $var=\"$tmp_libs\" done # for var fi # Add Sun CC postdeps if required: test CXX = "$tagname" && { case $host_os in linux*) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; solaris*) func_cc_basename "$CC" case $func_cc_basename_result in CC* | sunCC*) func_suncc_cstd_abi if test no != "$suncc_use_cstd_abi"; then func_append postdeps ' -library=Cstd -library=Crun' fi ;; esac ;; esac } # Last step: remove runtime libs from dependency_libs # (they stay in deplibs) tmp_libs= for i in $dependency_libs; do case " $predeps $postdeps $compiler_lib_search_path " in *" $i "*) i= ;; esac if test -n "$i"; then func_append tmp_libs " $i" fi done dependency_libs=$tmp_libs done # for pass if test prog = "$linkmode"; then dlfiles=$newdlfiles fi if test prog = "$linkmode" || test lib = "$linkmode"; then dlprefiles=$newdlprefiles fi case $linkmode in oldlib) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for archives" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for archives" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for archives" test -n "$xrpath" && \ func_warning "'-R' is ignored for archives" test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for archives" test -n "$release" && \ func_warning "'-release' is ignored for archives" test -n "$export_symbols$export_symbols_regex" && \ func_warning "'-export-symbols' is ignored for archives" # Now set the variables for building old libraries. build_libtool_libs=no oldlibs=$output func_append objs "$old_deplibs" ;; lib) # Make sure we only generate libraries of the form 'libNAME.la'. case $outputname in lib*) func_stripname 'lib' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) test no = "$module" \ && func_fatal_help "libtool library '$output' must begin with 'lib'" if test no != "$need_lib_prefix"; then # Add the "lib" prefix for modules if required func_stripname '' '.la' "$outputname" name=$func_stripname_result eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else func_stripname '' '.la' "$outputname" libname=$func_stripname_result fi ;; esac if test -n "$objs"; then if test pass_all != "$deplibs_check_method"; then func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" else echo $ECHO "*** Warning: Linking the shared library $output against the non-libtool" $ECHO "*** objects $objs is not portable!" func_append libobjs " $objs" fi fi test no = "$dlself" \ || func_warning "'-dlopen self' is ignored for libtool libraries" set dummy $rpath shift test 1 -lt "$#" \ && func_warning "ignoring multiple '-rpath's for a libtool library" install_libdir=$1 oldlibs= if test -z "$rpath"; then if test yes = "$build_libtool_libs"; then # Building a libtool convenience library. # Some compilers have problems with a '.al' extension so # convenience libraries should have the same extension an # archive normally would. oldlibs="$output_objdir/$libname.$libext $oldlibs" build_libtool_libs=convenience build_old_libs=yes fi test -n "$vinfo" && \ func_warning "'-version-info/-version-number' is ignored for convenience libraries" test -n "$release" && \ func_warning "'-release' is ignored for convenience libraries" else # Parse the version information argument. save_ifs=$IFS; IFS=: set dummy $vinfo 0 0 0 shift IFS=$save_ifs test -n "$7" && \ func_fatal_help "too many parameters to '-version-info'" # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts # to make the code below a bit more comprehensible case $vinfo_number in yes) number_major=$1 number_minor=$2 number_revision=$3 # # There are really only two kinds -- those that # use the current revision as the major version # and those that subtract age and use age as # a minor version. But, then there is irix # that has an extra 1 added just for fun # case $version_type in # correct linux to gnu/linux during the next big refactor darwin|freebsd-elf|linux|osf|windows|none) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_revision ;; freebsd-aout|qnx|sunos) current=$number_major revision=$number_minor age=0 ;; irix|nonstopux) func_arith $number_major + $number_minor current=$func_arith_result age=$number_minor revision=$number_minor lt_irix_increment=no ;; *) func_fatal_configuration "$modename: unknown library version type '$version_type'" ;; esac ;; no) current=$1 revision=$2 age=$3 ;; esac # Check that each of the things are valid numbers. case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "CURRENT '$current' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "REVISION '$revision' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) func_error "AGE '$age' must be a nonnegative integer" func_fatal_error "'$vinfo' is not valid version information" ;; esac if test "$age" -gt "$current"; then func_error "AGE '$age' is greater than the current interface number '$current'" func_fatal_error "'$vinfo' is not valid version information" fi # Calculate the version variables. major= versuffix= verstring= case $version_type in none) ;; darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision # Darwin ld doesn't like 0 for these options... func_arith $current + 1 minor_current=$func_arith_result xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" # On Darwin other compilers case $CC in nagfor*) verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" ;; *) verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; esac ;; freebsd-aout) major=.$current versuffix=.$current.$revision ;; freebsd-elf) func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; irix | nonstopux) if test no = "$lt_irix_increment"; then func_arith $current - $age else func_arith $current - $age + 1 fi major=$func_arith_result case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; esac verstring=$verstring_prefix$major.$revision # Add in all the interfaces that we are compatible with. loop=$revision while test 0 -ne "$loop"; do func_arith $revision - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring_prefix$major.$iface:$verstring done # Before this point, $major must not contain '.'. major=.$major versuffix=$major.$revision ;; linux) # correct to gnu/linux during the next big refactor func_arith $current - $age major=.$func_arith_result versuffix=$major.$age.$revision ;; osf) func_arith $current - $age major=.$func_arith_result versuffix=.$current.$age.$revision verstring=$current.$age.$revision # Add in all the interfaces that we are compatible with. loop=$age while test 0 -ne "$loop"; do func_arith $current - $loop iface=$func_arith_result func_arith $loop - 1 loop=$func_arith_result verstring=$verstring:$iface.0 done # Make executables depend on our current version. func_append verstring ":$current.0" ;; qnx) major=.$current versuffix=.$current ;; sco) major=.$current versuffix=.$current ;; sunos) major=.$current versuffix=.$current.$revision ;; windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 file systems. func_arith $current - $age major=$func_arith_result versuffix=-$major ;; *) func_fatal_configuration "unknown library version type '$version_type'" ;; esac # Clear the version info if we defaulted, and they specified a release. if test -z "$vinfo" && test -n "$release"; then major= case $version_type in darwin) # we can't check for "0.0" in archive_cmds due to quoting # problems, so we reset it completely verstring= ;; *) verstring=0.0 ;; esac if test no = "$need_version"; then versuffix= else versuffix=.0.0 fi fi # Remove version info from name if versioning should be avoided if test yes,no = "$avoid_version,$need_version"; then major= versuffix= verstring= fi # Check to see if the archive will have undefined symbols. if test yes = "$allow_undefined"; then if test unsupported = "$allow_undefined_flag"; then if test yes = "$build_old_libs"; then func_warning "undefined symbols not allowed in $host shared libraries; building static only" build_libtool_libs=no else func_fatal_error "can't build $host shared library unless -no-undefined is specified" fi fi else # Don't allow undefined symbols. allow_undefined_flag=$no_undefined_flag fi fi func_generate_dlsyms "$libname" "$libname" : func_append libobjs " $symfileobj" test " " = "$libobjs" && libobjs= if test relink != "$opt_mode"; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= tempremovelist=`$ECHO "$output_objdir/*"` for p in $tempremovelist; do case $p in *.$objext | *.gcno) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) if test -n "$precious_files_regex"; then if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 then continue fi fi func_append removelist " $p" ;; *) ;; esac done test -n "$removelist" && \ func_show_eval "${RM}r \$removelist" fi # Now set the variables for building old libraries. if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then func_append oldlibs " $output_objdir/$libname.$libext" # Transform .lo files to .o files. oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do func_replace_sysroot "$libdir" func_append temp_xrpath " -R$func_replace_sysroot_result" case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then dependency_libs="$temp_xrpath $dependency_libs" fi fi # Make sure dlfiles contains only unique files that won't be dlpreopened old_dlfiles=$dlfiles dlfiles= for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; *) func_append dlfiles " $lib" ;; esac done # Make sure dlprefiles contains only unique files old_dlprefiles=$dlprefiles dlprefiles= for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; *) func_append dlprefiles " $lib" ;; esac done if test yes = "$build_libtool_libs"; then if test -n "$rpath"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework func_append deplibs " System.ltframework" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) # Do not include libc due to us having libc/libc_r. ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; *) # Add libc to deplibs on all other systems if necessary. if test yes = "$build_libtool_need_lc"; then func_append deplibs " -lc" fi ;; esac fi # Transform deplibs into only deplibs that can be linked in shared. name_save=$name libname_save=$libname release_save=$release versuffix_save=$versuffix major_save=$major # I'm not sure if I'm treating the release correctly. I think # release should show up in the -l (ie -lgmp5) so we don't want to # add it in twice. Is that correct? release= versuffix= major= newdeplibs= droppeddeps=no case $deplibs_check_method in pass_all) # Don't check for shared/static. Everything works. # This might be a little naive. We might want to check # whether the library exists or not. But this is on # osf3 & osf4 and I'm not really sure... Just # implementing what was already the behavior. newdeplibs=$deplibs ;; test_compile) # This code stresses the "libraries are programs" paradigm to its # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. $opt_dry_run || $RM conftest.c cat > conftest.c </dev/null` $nocaseglob else potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` fi for potent_lib in $potential_libs; do # Follow soft links. if ls -lLd "$potent_lib" 2>/dev/null | $GREP " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an # endless loop below, in case of cyclic links. # We might still enter an endless loop, since a link # loop can be closed while we follow links, # but so what? potlib=$potent_lib while test -h "$potlib" 2>/dev/null; do potliblink=`ls -ld $potlib | $SED 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; esac done if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | $SED -e 10q | $EGREP "$file_magic_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for file magic test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a file magic. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; match_pattern*) set dummy $deplibs_check_method; shift match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` for a_deplib in $deplibs; do case $a_deplib in -l*) func_stripname -l '' "$a_deplib" name=$func_stripname_result if test yes = "$allow_libtool_libs_with_static_runtimes"; then case " $predeps $postdeps " in *" $a_deplib "*) func_append newdeplibs " $a_deplib" a_deplib= ;; esac fi if test -n "$a_deplib"; then libname=`eval "\\$ECHO \"$libname_spec\""` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib=$potent_lib # see symlink-check above in file_magic test if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ $EGREP "$match_pattern_regex" > /dev/null; then func_append newdeplibs " $a_deplib" a_deplib= break 2 fi done done fi if test -n "$a_deplib"; then droppeddeps=yes echo $ECHO "*** Warning: linker path does not have real file for library $a_deplib." echo "*** I have the capability to make that library automatically link in when" echo "*** you link to this library. But I can only do this if you have a" echo "*** shared version of the library, which you do not appear to have" echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib"; then $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" else $ECHO "*** with $libname and none of the candidates passed a file format test" $ECHO "*** using a regex pattern. Last file checked: $potlib" fi fi ;; *) # Add a -L argument. func_append newdeplibs " $a_deplib" ;; esac done # Gone through all deplibs. ;; none | unknown | *) newdeplibs= tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` if test yes = "$allow_libtool_libs_with_static_runtimes"; then for i in $predeps $postdeps; do # can't use Xsed below, because $i might contain '/' tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` done fi case $tmp_deplibs in *[!\ \ ]*) echo if test none = "$deplibs_check_method"; then echo "*** Warning: inter-library dependencies are not supported in this platform." else echo "*** Warning: inter-library dependencies are not known to be supported." fi echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes ;; esac ;; esac versuffix=$versuffix_save major=$major_save release=$release_save libname=$libname_save name=$name_save case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library with the System framework newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac if test yes = "$droppeddeps"; then if test yes = "$module"; then echo echo "*** Warning: libtool could not satisfy all declared inter-library" $ECHO "*** dependencies of module $libname. Therefore, libtool will create" echo "*** a static module, that should work as long as the dlopening" echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then echo echo "*** However, this would only work if libtool was able to extract symbol" echo "*** lists from a program, using 'nm' or equivalent, but libtool could" echo "*** not find such a program. So, this module is probably useless." echo "*** 'nm' from GNU binutils and a full rebuild may help." fi if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi else echo "*** The inter-library dependencies that have been dropped here will be" echo "*** automatically added whenever a program is linked with this library" echo "*** or is declared to -dlopen it." if test no = "$allow_undefined"; then echo echo "*** Since this library must not contain undefined symbols," echo "*** because either the platform does not support them or" echo "*** it was explicitly requested with -no-undefined," echo "*** libtool will only create a static version of it." if test no = "$build_old_libs"; then oldlibs=$output_objdir/$libname.$libext build_libtool_libs=module build_old_libs=yes else build_libtool_libs=no fi fi fi fi # Done checking deplibs! deplibs=$newdeplibs fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" case $host in *-*-darwin*) newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done deplibs=$new_libs # All the library-specific variables (install_libdir is set above). library_names= old_library= dlname= # Test again, we may have decided not to build it any more if test yes = "$build_libtool_libs"; then # Remove $wl instances when linking with ld. # FIXME: should test the right _cmds variable. case $archive_cmds in *\$LD\ *) wl= ;; esac if test yes = "$hardcode_into_libs"; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath=$finalize_rpath test relink = "$opt_mode" || rpath=$compile_rpath$rpath for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then func_replace_sysroot "$libdir" libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append dep_rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" fi shlibpath=$finalize_shlibpath test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi # Get the real and link names of the library. eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names shift realname=$1 shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" else soname=$realname fi if test -z "$dlname"; then dlname=$soname fi lib=$output_objdir/$realname linknames= for link do func_append linknames " $link" done # Use standard objects if they are pic test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` test "X$libobjs" = "X " && libobjs= delfiles= if test -n "$export_symbols" && test -n "$include_expsyms"; then $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" export_symbols=$output_objdir/$libname.uexp func_append delfiles " $export_symbols" fi orig_export_symbols= case $host_os in cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile func_dll_def_p "$export_symbols" || { # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. # export_symbols gets reassigned inside the "prepare # the list of exported symbols" if statement, so the # include_expsyms logic still works. orig_export_symbols=$export_symbols export_symbols= always_export_symbols=yes } fi ;; esac # Prepare the list of exported symbols if test -z "$export_symbols"; then if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols cmds=$export_symbols_cmds save_ifs=$IFS; IFS='~' for cmd1 in $cmds; do IFS=$save_ifs # Take the normal branch if the nm_file_list_spec branch # doesn't work or if tool conversion is not needed. case $nm_file_list_spec~$to_tool_file_cmd in *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) try_normal_branch=yes eval cmd=\"$cmd1\" func_len " $cmd" len=$func_len_result ;; *) try_normal_branch=no ;; esac if test yes = "$try_normal_branch" \ && { test "$len" -lt "$max_cmd_len" \ || test "$max_cmd_len" -le -1; } then func_show_eval "$cmd" 'exit $?' skipped_export=false elif test -n "$nm_file_list_spec"; then func_basename "$output" output_la=$func_basename_result save_libobjs=$libobjs save_output=$output output=$output_objdir/$output_la.nm func_to_tool_file "$output" libobjs=$nm_file_list_spec$func_to_tool_file_result func_append delfiles " $output" func_verbose "creating $NM input file list: $output" for obj in $save_libobjs; do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > "$output" eval cmd=\"$cmd1\" func_show_eval "$cmd" 'exit $?' output=$save_output libobjs=$save_libobjs skipped_export=false else # The command line is too long to execute in one step. func_verbose "using reloadable object file for export list..." skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS=$save_ifs if test -n "$export_symbols_regex" && test : != "$skipped_export"; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test : != "$skipped_export" && test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi tmp_deplibs= for test_deplib in $deplibs; do case " $convenience " in *" $test_deplib "*) ;; *) func_append tmp_deplibs " $test_deplib" ;; esac done deplibs=$tmp_deplibs if test -n "$convenience"; then if test -n "$whole_archive_flag_spec" && test yes = "$compiler_needs_object" && test -z "$libobjs"; then # extract the archives, so we have objects to list. # TODO: could optimize this to just extract one archive. whole_archive_flag_spec= fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= else gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $convenience func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi fi if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" func_append linker_flags " $flag" fi # Make a backup of the uninstalled library when relinking if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? fi # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then eval test_cmds=\"$module_expsym_cmds\" cmds=$module_expsym_cmds else eval test_cmds=\"$module_cmds\" cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then eval test_cmds=\"$archive_expsym_cmds\" cmds=$archive_expsym_cmds else eval test_cmds=\"$archive_cmds\" cmds=$archive_cmds fi fi if test : != "$skipped_export" && func_len " $test_cmds" && len=$func_len_result && test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else # The command line is too long to link in one step, link piecewise # or, if using GNU ld and skipped_export is not :, use a linker # script. # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we # want to use save_libobjs as it was before # whole_archive_flag_spec was expanded, because we can't # assume the linker understands whole_archive_flag_spec. # This may have to be revisited, in case too many # convenience libraries get linked in and end up exceeding # the spec. if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then save_libobjs=$libobjs fi save_output=$output func_basename "$output" output_la=$func_basename_result # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= last_robj= k=1 if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then output=$output_objdir/$output_la.lnkscript func_verbose "creating GNU ld script: $output" echo 'INPUT (' > $output for obj in $save_libobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done echo ')' >> $output func_append delfiles " $output" func_to_tool_file "$output" output=$func_to_tool_file_result elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then output=$output_objdir/$output_la.lnk func_verbose "creating linker input file list: $output" : > $output set x $save_libobjs shift firstobj= if test yes = "$compiler_needs_object"; then firstobj="$1 " shift fi for obj do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" >> $output done func_append delfiles " $output" func_to_tool_file "$output" output=$firstobj\"$file_list_spec$func_to_tool_file_result\" else if test -n "$save_libobjs"; then func_verbose "creating reloadable object files..." output=$output_objdir/$output_la-$k.$objext eval test_cmds=\"$reload_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 # Loop over the list of objects to be linked. for obj in $save_libobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result if test -z "$objlist" || test "$len" -lt "$max_cmd_len"; then func_append objlist " $obj" else # The command $test_cmds is almost too long, add a # command to the queue. if test 1 -eq "$k"; then # The first file doesn't have a previous command to add. reload_objs=$objlist eval concat_cmds=\"$reload_cmds\" else # All subsequent reloadable object files will link in # the last one created. reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" fi last_robj=$output_objdir/$output_la-$k.$objext func_arith $k + 1 k=$func_arith_result output=$output_objdir/$output_la-$k.$objext objlist=" $obj" func_len " $last_robj" func_arith $len0 + $func_len_result len=$func_arith_result fi done # Handle the remaining objects by creating one last # reloadable object file. All subsequent reloadable object # files will link in the last one created. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ reload_objs="$objlist $last_robj" eval concat_cmds=\"\$concat_cmds$reload_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi func_append delfiles " $output" else output= fi ${skipped_export-false} && { func_verbose "generating symbol list for '$libname.la'" export_symbols=$output_objdir/$libname.exp $opt_dry_run || $RM $export_symbols libobjs=$output # Append the command to create the export file. test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" if test -n "$last_robj"; then eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" fi } test -n "$save_libobjs" && func_verbose "creating a temporary reloadable object file: $output" # Loop through the commands generated above and execute them. save_ifs=$IFS; IFS='~' for cmd in $concat_cmds; do IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs if test -n "$export_symbols_regex" && ${skipped_export-false}; then func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' func_show_eval '$MV "${export_symbols}T" "$export_symbols"' fi fi ${skipped_export-false} && { if test -n "$export_symbols" && test -n "$include_expsyms"; then tmp_export_symbols=$export_symbols test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' fi if test -n "$orig_export_symbols"; then # The given exports_symbols file has to be filtered, so filter it. func_verbose "filter symbol list for '$libname.la' to tag DATA exports" # FIXME: $output_objdir/$libname.filter potentially contains lots of # 's' commands, which not all seds can handle. GNU sed should be fine # though. Also, the filter scales superlinearly with the number of # global variables. join(1) would be nice here, but unfortunately # isn't a blessed tool. $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter func_append delfiles " $export_symbols $output_objdir/$libname.filter" export_symbols=$output_objdir/$libname.def $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols fi } libobjs=$output # Restore the value of output. output=$save_output if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. # Do each of the archive commands. if test yes = "$module" && test -n "$module_cmds"; then if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then cmds=$module_expsym_cmds else cmds=$module_cmds fi else if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then cmds=$archive_expsym_cmds else cmds=$archive_cmds fi fi fi if test -n "$delfiles"; then # Append the command to remove temporary files to $cmds. eval cmds=\"\$cmds~\$RM $delfiles\" fi # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append libobjs " $func_extract_archives_result" test "X$libobjs" = "X " && libobjs= fi save_ifs=$IFS; IFS='~' for cmd in $cmds; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs $opt_quiet || { func_quote_for_expand "$cmd" eval "func_echo $func_quote_for_expand_result" } $opt_dry_run || eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit if test relink = "$opt_mode"; then ( cd "$output_objdir" && \ $RM "${realname}T" && \ $MV "${realname}U" "$realname" ) fi exit $lt_exit } done IFS=$save_ifs # Restore the uninstalled library and exit if test relink = "$opt_mode"; then $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then func_show_eval '${RM}r "$gentop"' fi fi exit $EXIT_SUCCESS fi # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' fi done # If -module or -export-dynamic was specified, set the dlname. if test yes = "$module" || test yes = "$export_dynamic"; then # On all known operating systems, these are identical. dlname=$soname fi fi ;; obj) if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then func_warning "'-dlopen' is ignored for objects" fi case " $deplibs" in *\ -l* | *\ -L*) func_warning "'-l' and '-L' are ignored for objects" ;; esac test -n "$rpath" && \ func_warning "'-rpath' is ignored for objects" test -n "$xrpath" && \ func_warning "'-R' is ignored for objects" test -n "$vinfo" && \ func_warning "'-version-info' is ignored for objects" test -n "$release" && \ func_warning "'-release' is ignored for objects" case $output in *.lo) test -n "$objs$old_deplibs" && \ func_fatal_error "cannot build library object '$output' from non-libtool objects" libobj=$output func_lo2o "$libobj" obj=$func_lo2o_result ;; *) libobj= obj=$output ;; esac # Delete the old objects. $opt_dry_run || $RM $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create # different ones for PIC/non-PIC, this we'll have to duplicate # the extraction. reload_conv_objs= gentop= # if reload_cmds runs $LD directly, get rid of -Wl from # whole_archive_flag_spec and hope we can get by with turning comma # into space. case $reload_cmds in *\$LD[\ \$]*) wl= ;; esac if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags else gentop=$output_objdir/${obj}x func_append generated " $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi # If we're not building shared, we need to use non_pic_objs test yes = "$build_libtool_libs" || libobjs=$non_pic_objects # Create the old-style object. reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs output=$obj func_execute_cmds "$reload_cmds" 'exit $?' # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS fi test yes = "$build_libtool_libs" || { if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS } if test -n "$pic_flag" || test default != "$pic_mode"; then # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output=$libobj func_execute_cmds "$reload_cmds" 'exit $?' fi if test -n "$gentop"; then func_show_eval '${RM}r "$gentop"' fi exit $EXIT_SUCCESS ;; prog) case $host in *cygwin*) func_stripname '' '.exe' "$output" output=$func_stripname_result.exe;; esac test -n "$vinfo" && \ func_warning "'-version-info' is ignored for programs" test -n "$release" && \ func_warning "'-release' is ignored for programs" $preload \ && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` ;; esac case $host in *-*-darwin*) # Don't allow lazy linking, it breaks C++ global constructors # But is supposedly fixed on 10.4 or later (yay!). if test CXX = "$tagname"; then case ${MACOSX_DEPLOYMENT_TARGET-10.0} in 10.[0123]) func_append compile_command " $wl-bind_at_load" func_append finalize_command " $wl-bind_at_load" ;; esac fi # Time to change all our "foo.ltframework" stuff back to "-framework foo" compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` ;; esac # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list new_libs= for path in $notinst_path; do case " $new_libs " in *" -L$path/$objdir "*) ;; *) case " $compile_deplibs " in *" -L$path/$objdir "*) func_append new_libs " -L$path/$objdir" ;; esac ;; esac done for deplib in $compile_deplibs; do case $deplib in -L*) case " $new_libs " in *" $deplib "*) ;; *) func_append new_libs " $deplib" ;; esac ;; *) func_append new_libs " $deplib" ;; esac done compile_deplibs=$new_libs func_append compile_command " $compile_deplibs" func_append finalize_command " $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. for libdir in $rpath $xrpath; do # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; *) func_append finalize_rpath " $libdir" ;; esac done fi # Now hardcode the library paths rpath= hardcode_libdirs= for libdir in $compile_rpath $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; *) func_append perm_rpath " $libdir" ;; esac fi case $host in *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; ::) dllsearchpath=$libdir;; *) func_append dllsearchpath ":$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi compile_rpath=$rpath rpath= hardcode_libdirs= for libdir in $finalize_rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then if test -z "$hardcode_libdirs"; then hardcode_libdirs=$libdir else # Just accumulate the unique libdirs. case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" func_append rpath " $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; *) func_append finalize_perm_rpath " $libdir" ;; esac fi done # Substitute the hardcoded libdirs into the rpath. if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir=$hardcode_libdirs eval rpath=\" $hardcode_libdir_flag_spec\" fi finalize_rpath=$rpath if test -n "$libobjs" && test yes = "$build_old_libs"; then # Transform all the library objects into standard objects. compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` fi func_generate_dlsyms "$outputname" "@PROGRAM@" false # template prelinking step if test -n "$prelink_cmds"; then func_execute_cmds "$prelink_cmds" 'exit $?' fi wrappers_required=: case $host in *cegcc* | *mingw32ce*) # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. wrappers_required=false ;; *cygwin* | *mingw* ) test yes = "$build_libtool_libs" || wrappers_required=false ;; *) if test no = "$need_relink" || test yes != "$build_libtool_libs"; then wrappers_required=false fi ;; esac $wrappers_required || { # Replace the output file specification. compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` link_command=$compile_command$compile_rpath # We have no uninstalled library dependencies, so finalize right now. exit_status=0 func_show_eval "$link_command" 'exit_status=$?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Delete the generated files. if test -f "$output_objdir/${outputname}S.$objext"; then func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' fi exit $exit_status } if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi if test -n "$finalize_shlibpath"; then finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" fi compile_var= finalize_var= if test -n "$runpath_var"; then if test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do func_append rpath "$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi if test -n "$finalize_perm_rpath"; then # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do func_append rpath "$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi fi if test yes = "$no_install"; then # We don't need to create a wrapper script. link_command=$compile_var$compile_command$compile_rpath # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. $opt_dry_run || $RM $output # Link the executable and exit func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi exit $EXIT_SUCCESS fi case $hardcode_action,$fast_install in relink,*) # Fast installation is not supported link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath func_warning "this platform does not like uninstalled shared libraries" func_warning "'$output' will be relinked during installation" ;; *,yes) link_command=$finalize_var$compile_command$finalize_rpath relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` ;; *,no) link_command=$compile_var$compile_command$compile_rpath relink_command=$finalize_var$finalize_command$finalize_rpath ;; *,needless) link_command=$finalize_var$compile_command$finalize_rpath relink_command= ;; esac # Replace the output file specification. link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname func_show_eval "$link_command" 'exit $?' if test -n "$postlink_cmds"; then func_to_tool_file "$output_objdir/$outputname" postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` func_execute_cmds "$postlink_cmds" 'exit $?' fi # Now create the wrapper script. func_verbose "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` fi # Only actually do things if not in dry run mode. $opt_dry_run || { # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in *.exe) func_stripname '' '.exe' "$output" output=$func_stripname_result ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe func_stripname '' '.exe' "$outputname" outputname=$func_stripname_result ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) func_dirname_and_basename "$output" "" "." output_name=$func_basename_result output_path=$func_dirname_result cwrappersource=$output_path/$objdir/lt-$output_name.c cwrapper=$output_path/$output_name.exe $RM $cwrappersource $cwrapper trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 func_emit_cwrapperexe_src > $cwrappersource # The wrapper executable is built using the $host compiler, # because it contains $host paths and files. If cross- # compiling, it, like the target executable, must be # executed on the $host or under an emulation environment. $opt_dry_run || { $LTCC $LTCFLAGS -o $cwrapper $cwrappersource $STRIP $cwrapper } # Now, create the wrapper script for func_source use: func_ltwrapper_scriptname $cwrapper $RM $func_ltwrapper_scriptname_result trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 $opt_dry_run || { # note: this script will not be executed, so do not chmod. if test "x$build" = "x$host"; then $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result else func_emit_wrapper no > $func_ltwrapper_scriptname_result fi } ;; * ) $RM $output trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 func_emit_wrapper no > $output chmod +x $output ;; esac } exit $EXIT_SUCCESS ;; esac # See if we need to build an old-fashioned archive. for oldlib in $oldlibs; do case $build_libtool_libs in convenience) oldobjs="$libobjs_save $symfileobj" addlibs=$convenience build_libtool_libs=no ;; module) oldobjs=$libobjs_save addlibs=$old_convenience build_libtool_libs=no ;; *) oldobjs="$old_deplibs $non_pic_objects" $preload && test -f "$symfileobj" \ && func_append oldobjs " $symfileobj" addlibs=$old_convenience ;; esac if test -n "$addlibs"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $addlibs func_append oldobjs " $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then cmds=$old_archive_from_new_cmds else # Add any objects from preloaded convenience libraries if test -n "$dlprefiles"; then gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_extract_archives $gentop $dlprefiles func_append oldobjs " $func_extract_archives_result" fi # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a # static archive out of a convenience library, or when linking # the entirety of a libtool archive into another (currently # not supported by libtool). if (for obj in $oldobjs do func_basename "$obj" $ECHO "$func_basename_result" done | sort | sort -uc >/dev/null 2>&1); then : else echo "copying selected object files to avoid basename conflicts..." gentop=$output_objdir/${outputname}x func_append generated " $gentop" func_mkdir_p "$gentop" save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do func_basename "$obj" objbase=$func_basename_result case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) while :; do # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase func_arith $counter + 1 counter=$func_arith_result case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" func_append oldobjs " $gentop/$newobj" ;; *) func_append oldobjs " $obj" ;; esac done fi func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result eval cmds=\"$old_archive_cmds\" func_len " $cmds" len=$func_len_result if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds elif test -n "$archiver_list_spec"; then func_verbose "using command file archive linking..." for obj in $oldobjs do func_to_tool_file "$obj" $ECHO "$func_to_tool_file_result" done > $output_objdir/$libname.libcmd func_to_tool_file "$output_objdir/$libname.libcmd" oldobjs=" $archiver_list_spec$func_to_tool_file_result" cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts func_verbose "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs oldobjs= # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done eval test_cmds=\"$old_archive_cmds\" func_len " $test_cmds" len0=$func_len_result len=$len0 for obj in $save_oldobjs do func_len " $obj" func_arith $len + $func_len_result len=$func_arith_result func_append objlist " $obj" if test "$len" -lt "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj"; then RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" objlist= len=$len0 fi done RANLIB=$save_RANLIB oldobjs=$objlist if test -z "$oldobjs"; then eval cmds=\"\$concat_cmds\" else eval cmds=\"\$concat_cmds~\$old_archive_cmds\" fi fi fi func_execute_cmds "$cmds" 'exit $?' done test -n "$generated" && \ func_show_eval "${RM}r$generated" # Now create the libtool archive. case $output in *.la) old_library= test yes = "$build_old_libs" && old_library=$libname.$libext func_verbose "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else func_quote_for_eval "$var_value" relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` if test yes = "$hardcode_automatic"; then relink_command= fi # Only create the output if not a dry run. $opt_dry_run || { for installed in no yes; do if test yes = "$installed"; then if test -z "$install_libdir"; then break fi output=$output_objdir/${outputname}i # Replace all uninstalled libtool libraries with the installed ones newdependency_libs= for deplib in $dependency_libs; do case $deplib in *.la) func_basename "$deplib" name=$func_basename_result func_resolve_sysroot "$deplib" eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` test -z "$libdir" && \ func_fatal_error "'$deplib' is not a valid libtool archive" func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" ;; -L*) func_stripname -L '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -L$func_replace_sysroot_result" ;; -R*) func_stripname -R '' "$deplib" func_replace_sysroot "$func_stripname_result" func_append newdependency_libs " -R$func_replace_sysroot_result" ;; *) func_append newdependency_libs " $deplib" ;; esac done dependency_libs=$newdependency_libs newdlfiles= for lib in $dlfiles; do case $lib in *.la) func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" ;; *) func_append newdlfiles " $lib" ;; esac done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in *.la) # Only pass preopened files to the pseudo-archive (for # eventual linking with the app. that links it) if we # didn't already link the preopened objects directly into # the library: func_basename "$lib" name=$func_basename_result eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` test -z "$libdir" && \ func_fatal_error "'$lib' is not a valid libtool archive" func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" ;; esac done dlprefiles=$newdlprefiles else newdlfiles= for lib in $dlfiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlfiles " $abs" done dlfiles=$newdlfiles newdlprefiles= for lib in $dlprefiles; do case $lib in [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; *) abs=`pwd`"/$lib" ;; esac func_append newdlprefiles " $abs" done dlprefiles=$newdlprefiles fi $RM $output # place dlname in correct position for cygwin # In fact, it would be nice if we could use this code for all target # systems that can't hard-code library paths into their executables # and that have no shared library path variable independent of PATH, # but it turns out we can't easily determine that from inspecting # libtool variables, so we have to hard-code the OSs to which it # applies here; at the moment, that means platforms that use the PE # object format with DLL files. See the long comment at the top of # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) # If a -bindir argument was supplied, place the dll there. if test -n "$bindir"; then func_relative_path "$install_libdir" "$bindir" tdlname=$func_relative_path_result/$dlname else # Otherwise fall back on heuristic. tdlname=../bin/$dlname fi ;; esac $ECHO > $output "\ # $outputname - a libtool library file # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # Please DO NOT delete this file! # It is necessary for linking the library. # The name that we can dlopen(3). dlname='$tdlname' # Names of this library. library_names='$library_names' # The name of the static archive. old_library='$old_library' # Linker flags that cannot go in dependency_libs. inherited_linker_flags='$new_inherited_linker_flags' # Libraries that this one depends upon. dependency_libs='$dependency_libs' # Names of additional weak libraries provided by this library weak_library_names='$weak_libs' # Version information for $libname. current=$current age=$age revision=$revision # Is this an already installed library? installed=$installed # Should we warn about portability when linking against -modules? shouldnotlink=$module # Files to dlopen/dlpreopen dlopen='$dlfiles' dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test no,yes = "$installed,$need_relink"; then $ECHO >> $output "\ relink_command=\"$relink_command\"" fi done } # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' ;; esac exit $EXIT_SUCCESS } if test link = "$opt_mode" || test relink = "$opt_mode"; then func_mode_link ${1+"$@"} fi # func_mode_uninstall arg... func_mode_uninstall () { $debug_cmd RM=$nonopt files= rmforce=false exit_status=0 # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic for arg do case $arg in -f) func_append RM " $arg"; rmforce=: ;; -*) func_append RM " $arg" ;; *) func_append files " $arg" ;; esac done test -z "$RM" && \ func_fatal_help "you must specify an RM program" rmdirs= for file in $files; do func_dirname "$file" "" "." dir=$func_dirname_result if test . = "$dir"; then odir=$objdir else odir=$dir/$objdir fi func_basename "$file" name=$func_basename_result test uninstall = "$opt_mode" && odir=$dir # Remember odir for removal later, being careful to avoid duplicates if test clean = "$opt_mode"; then case " $rmdirs " in *" $odir "*) ;; *) func_append rmdirs " $odir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. if { test -L "$file"; } >/dev/null 2>&1 || { test -h "$file"; } >/dev/null 2>&1 || test -f "$file"; then : elif test -d "$file"; then exit_status=1 continue elif $rmforce; then continue fi rmfiles=$file case $name in *.la) # Possibly a libtool archive, so verify it. if func_lalib_p "$file"; then func_source $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do func_append rmfiles " $odir/$n" done test -n "$old_library" && func_append rmfiles " $odir/$old_library" case $opt_mode in clean) case " $library_names " in *" $dlname "*) ;; *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; esac test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' fi # FIXME: should reinstall the best remaining shared library. ;; esac fi ;; *.lo) # Possibly a libtool object, so verify it. if func_lalib_p "$file"; then # Read the .lo file func_source $dir/$name # Add PIC object to the list of files to remove. if test -n "$pic_object" && test none != "$pic_object"; then func_append rmfiles " $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. if test -n "$non_pic_object" && test none != "$non_pic_object"; then func_append rmfiles " $dir/$non_pic_object" fi fi ;; *) if test clean = "$opt_mode"; then noexename=$name case $file in *.exe) func_stripname '' '.exe' "$file" file=$func_stripname_result func_stripname '' '.exe' "$name" noexename=$func_stripname_result # $file with .exe has already been added to rmfiles, # add $file without .exe func_append rmfiles " $file" ;; esac # Do a test to see if this is a libtool program. if func_ltwrapper_p "$file"; then if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" relink_command= func_source $func_ltwrapper_scriptname_result func_append rmfiles " $func_ltwrapper_scriptname_result" else relink_command= func_source $dir/$noexename fi # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles func_append rmfiles " $odir/$name $odir/${name}S.$objext" if test yes = "$fast_install" && test -n "$relink_command"; then func_append rmfiles " $odir/lt-$name" fi if test "X$noexename" != "X$name"; then func_append rmfiles " $odir/lt-$noexename.c" fi fi fi ;; esac func_show_eval "$RM $rmfiles" 'exit_status=1' done # Try to remove the $objdir's in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then func_show_eval "rmdir $dir >/dev/null 2>&1" fi done exit $exit_status } if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then func_mode_uninstall ${1+"$@"} fi test -z "$opt_mode" && { help=$generic_help func_fatal_help "you must specify a MODE" } test -z "$exec_cmd" && \ func_fatal_help "invalid operation mode '$opt_mode'" if test -n "$exec_cmd"; then eval exec "$exec_cmd" exit $EXIT_FAILURE fi exit $exit_status # The TAGs below are defined such that we never get into a situation # where we disable both kinds of libraries. Given conflicting # choices, we go for a static library, that is the most portable, # since we can't tell whether shared libraries were disabled because # the user asked for that or because the platform doesn't support # them. This is particularly important on AIX, because we don't # support having both static and shared libraries enabled at the same # time on that platform, so we default to a shared-only configuration. # If a disable-shared tag is given, we'll fallback to a static-only # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared build_libtool_libs=no build_old_libs=yes # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: libsidplayfp-2.6.0/build-aux/missing0000755000175100001770000001533614544470316014436 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1996-2021 Free Software Foundation, Inc. # Originally written 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 case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man 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 # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=https://www.perl.org/ flex_URL=https://github.com/westes/flex gnu_software_URL=https://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libsidplayfp-2.6.0/build-aux/test-driver0000755000175100001770000001141714544470316015231 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2018-03-07.03; # UTC # Copyright (C) 2011-2021 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. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <"$log_file" "$@" >>"$log_file" 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>"$log_file" # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libsidplayfp-2.6.0/build-aux/config.sub0000755000175100001770000010511614544470316015016 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-03' # 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 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # 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: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # 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. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -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 1992-2022 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 ;; *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 # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova*) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | 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* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # 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) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x$basic_os != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os in linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \ | linux-musl* | linux-relibc* | linux-uclibc* ) ;; uclinux-uclibc* ) ;; -dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 exit 1 ;; kfreebsd*-gnu* | kopensolaris*-gnu*) ;; vxworks-simlinux | vxworks-simwindows | vxworks-spe) ;; nto-qnx*) ;; os2-emx) ;; *-eabi* | *-gnueabi*) ;; -*) # Blank kernel with real OS is always fine. ;; *-*) echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$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 ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) 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 ;; esac echo "$cpu-$vendor-${kernel:+$kernel-}$os" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libsidplayfp-2.6.0/build-aux/install-sh0000755000175100001770000003577614544470316015055 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2020-11-14.01; # 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. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # 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_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly 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 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. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -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 By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Email bug reports to bug-automake@gnu.org. Automake home page: https://www.gnu.org/software/automake/ " 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 *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi 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 if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi 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=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi 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. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # 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 # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writeable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # 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 oIFS=$IFS IFS=/ set -f set fnord $dstdir shift 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=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_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 && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $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` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # 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 "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$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 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libsidplayfp-2.6.0/build-aux/config.guess0000755000175100001770000014051214544470316015352 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2022 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2022-01-09' # 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 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. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Options: -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 1992-2022 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 # Just in case it came from the environment. GUESS= # 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. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { 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" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver 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 } # 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 ; 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 case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # 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". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-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) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) 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 # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; 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/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 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. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) 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 test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; 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. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; 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'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; 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) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # 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:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) 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; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then 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 GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *: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 test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 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 test -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 test "$HP_ARCH" = ""; then 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 test "$HP_ARCH" = hppa2.0w then 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 GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) 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; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; 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*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; 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:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; 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/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 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/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` 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=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_X32 >/dev/null then LIBCABI=${LIBC}x32 fi fi GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; 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. GUESS=i386-sequent-sysv4 ;; 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. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; 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 GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; 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 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; 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 configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; 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*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; x86_64:Haiku:*:*) GUESS=x86_64-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$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 case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *: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 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #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 (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 #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #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; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&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 fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: libsidplayfp-2.6.0/build-aux/compile0000755000175100001770000001635014544470316014412 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2018-03-07.03; # UTC # Copyright (C) 1999-2021 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, 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. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= 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'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= 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 $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= 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 's|^.*[\\/]||; s|^[a-zA-Z]:||; 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 test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: libsidplayfp-2.6.0/NEWS0000644000175100001770000003425414544470307011644 000000000000002.6.0 2024-01-01 * residfp is now thread-safe (#71) * residfp: fixed SSE2 version of convolve (#105) * residfp: updated combined waveforms model (#97) * residfp: amplify the output by a model dependent scale factor (#78, #79) * a couple of autotools fixes (#103, #104, #108) 2.5.1 2023-12-23 * Check for {g,}od at configure time (#87) * residfp: fix a 6581 filter bug where values could actually go negative * Sync resid with upstream 2.5.0 2023-06-02 * residfp: reworked the combined waveforms model by separating pulldown effect from waveform generation * residfp: tweaked the 8580 filter parameters for increased volume and less distortion (#45) * Updated to latest resid * Use OpenMP to speedup LUTs initialization * CIA: minor rework based on chip reverse engineering * Use c++17 where available * Added sanity check for buffer size * Minor mixer optimizations * Other minor changes 2.4.2 2023-01-29 * Fixed a memory leak * Minor fixes 2.4.1 2022-11-19 * Fixed a memory leak introduced in 2.1.0 2.4.0 2022-11-06 * Use pkgconfig for UnitTest++ and libgcrypt support (#46) * residfp: correct 6581 volume gain based on schematics (issue #38) * residfp: fixed more PVS-Studio warnings. (issue #49) * residfp: refactoring, changes and cleanup * residfp: updated the combined waveform model * Synced resid with upstream * Fixed a comparison-with-wider-type alert in the MUS loader * Other minor changes 2.3.1 2021-12-07 * VIC II: check badline enabled condition on raster Y increment. Fixes CPU/shxy/shx-test * Disable digiboost for residfp when not required (issue #37) 2.3.0 2021-09-16 * residfp: fixed some PVS-Studio warnings. (issues #20 #21 #23 #28) * residfp: share dac tables between voices, saves a few Kb and some initialization time (issues #34 #26) * CIA: rework interrupt implementation based on Denise emu code, fixes CIA/dd0dtest/dd0dtest (issue #29) * c64: return pseudo random numbers when reading from the I/O Area as the VIC fetches are not emulated. Fixes C64/openio/gauntlet test * VIC-II: fix lightpen X coordinate calculation. Makes VICII/split-tests/lightpen/lightpen test pass 2.2.2 2021-08-07 * songlengthdb: fix possible corrupted data (issue #32) 2.2.1 2021-07-18 * VIC-II: fix NTSC badline timing and improve cycle skipping * CIA: minor refactoring * Fixed a few minor PVS-Studio flagged issues 2.2.0 2021-05-23 * reSIDfp: added NEON (by Christopher Snowhill) and SSE2 version of convolution function the configure option has been changed to --with-simd= * Exposed last values written to the SID registers. Based on patch by Stian Skjelstad * API additions: - Splitted ROM functions - Added CIA 6526 4485 model setting, mostly for testing - Added function for loading database from unicode path on Windows - Added function for loading tunes using a custom loader callback 2.1.2 2021-04-19 * configure: don't fail when --with-exsid is passed and libexsid is installed (issue #13) * songlength DB: fix parsing of milliseconds with leading zeroes 2.1.1 2021-02-27 * Fixed building hardsid support * reSIDfp: shift register regression fixes * Updated RAM init pattern similar to how it's done in VICE 2.1.0 2021-02-11 * Do not use smart pointers in public headers [bugs:#38] * Updated to exSID-driver v2.1 * Fixed static builds with external exSID libs * Trimmed down relocator code to the bare minimum required * resid/residfp: - use soft instead of hard clipping - rough implementation of bitfade * residfp: - better bandpass frequency calculation - updated 8580 resistor ratios based on schematics and adjusted voltage range - updated TTL values - assume a high impedance audio amplifier yielding an 1.6Hz high-pass 2.0.5 2020-10-24 * Fixed CIA SDR handling, code borrowed from Denise emulator * Fixed external filter coefficients calculation in resid/residfp * Update osc3 on waveform zero in resid/residfp 2.0.4 2020-06-22 * Further improved CPU/CIA/VICII emulation based on VICE testprogs (bug #27) * Fixed an envelope generator regression in resid/residfp (bug #31) * Improved noise+pulse interaction in resid/residfp (bug #28) 2.0.3 2020-05-15 * Avoid saturation of residfp 8580 filter * Fix some UBSan warnings 2.0.2 2020-04-25 * Adjusted residfp 6581 filter parameter range (bug #30) * Recalculate noise output when actually changed in residfp 2.0.1 2019-09-07 * Fix loading stereo mus tunes * Fix residfp envelope (bug #29) * Minor interrupt timing tweaks * Dirty hack to reduce overloading in 8580 filter (bug #29) 2.0.0 2019-07-30 * Cleaned up directory structure * Use c++11 features where supported * Added exSID USB support * Improved SID emulation with: - Proper 8580 filter model - More accurate envelope generator - Other minor fixes * Digiboost support * Do not use kernal calls in psid driver * Support libgcrypt for md5 computation * Interrupt playback on invalid opcode execution * Selectable CIA model * Do not expose event scheduler 1.8.8 2018-07-08 * Fix misspelling in error message (bug #26) * Correctly clock oscillators in silent mode * CIA timing fixes * Allow running VICE tests 1.8.7 2016-12-09 * Fix out of range tune selection * Reenable accidentally broken branch hints in residfp * Minor fix in VIC-II code ported from VICE 1.8.6 2016-04-15 * Fix an off-by-one error in mixer code * Slightly improve some combined waveforms 1.8.5 2016-04-09 * Fix a regression in VIC-II code * Improve combined waveforms emulation 1.8.4 2016-02-21 * Fix a possible crash when locking a sid device fails 1.8.3 2015-12-28 * Fix an overflow in resid/residfp for 8580 output, noticed in /MUSICIANS/L/Linus/64_Forever.sid * Use log1p in resid/residfp for improved precision of 6581 filter parameter calculation * Fix a warning in PSID model checking 1.8.2 2015-10-10 * Fix running with -b parameter * Attenuate second chip output by 3dB in 3SID mode as it is mixed in both channels * Fix uninitialized vars 1.8.1 2015-08-09 * Fix a regresion in MUS loader introduced in 1.8.0 * Fix a regresion in STIL 1.8.0 2015-07-09 * Rework and clean tune loading to be more portable * Add support for 3SID files (PSID v4) * Check if lightpen is really triggered before changing state * Define WIN32_LEAN_AND_MEAN when compiling on MinGW * Other minor fixes and improvements 1.7.2 2015-05-10 * Fix interpolation outside bounds in reSIDfp * Remove redundant code in PSID loader 1.7.1 2015-03-28 * Fix reported number of channels * Install psid driver before placing tune, fixes BASIC tunes and /MUSICIANS/L/Legg_Stephen/Steigar.sid * Apply volume to channels, not to chips output 1.7.0 2015-01-25 * Add an interface to access tune data * Remove generated files only for maintainer-clean target (bug #14) * Rework Makefile rules for generated files * Silence some warnings * Other minor changes in reSIDfp * Merge minor changes from zxtune fork 1.6.2 2014-12-08 * Fix a typo that broke MUSICIANS/M/Mixer/Vicious_SID_2-15638Hz.sid * Fix a regression in badline handling. Restores correct timing in /MUSICIANS/S/Swallow/Wonderland_XII-Digi_part_?.sid * Other minor fixes in VIC II emulation 1.6.1 2014-11-30 * Fix an undefined behaviour in SidDatabase * Remove an unused variable in reSIDfp * Set different SID bus TTL value for 8580 1.6.0 2014-10-11 * Make PSID loader adhere to spec when handling 2nd SID address * Improve PAL/NTSC switch handling * Reset rom descriptions if rom is not loaded * Fix a memory leak due to deleting auto_ptr to incomplete type (bug #13) * Fix Drean TOD frequency * Rework lightpen emulation based on VICE's code * Internal code refactoring 1.5.3 2014-09-06 * Copy poweron pattern in memory only if real c64 compatibility is needed, fixes /MUSICIANS/B/Brennan_Neil/Super_Pac-Man.sid 1.5.2 2014-08-31 * Restore original iomap function, fixes /MUSICIANS/C/Cooksey_Mark/Airwolf.sid 1.5.1 2014-08-24 * Correctly interpret second sid address from PSID tunes header, fixes /MUSICIANS/T/TSM/Fiki_Fiki_2SID.sid * Fix a signedness warning 1.5.0 2014-08-09 * Port CIA TOD fixes from VICE * Port some VIC-II changes from VICE * Check load address only for RSID tunes, fixes Hellbound from Shining 8 * Minor changes to reSIDfp * Other minor fixes and improvements 1.4.2 2014-05-01 * Fix a typo made during merging in VIC II code * Use vector instead of non-standard VLA 1.4.1 2014-04-19 * Fix crash when trying to open a directory on *NIX * Various VIC II fixes, makes /MUSICIANS/T/The_Power_Terminator/Act_of_Revenge.sid play at the right speed 1.4.0 2014-04-01 * Drive the CIA TOD counter using the actual power line frequency * Cleanup playing routine * Fix residfp's distorted sound on Mahoney's Kapla Caves * Rewrite residfp's interpolation routine using Fritsch-Carlson method to preserve monotonicity * Reduce size of some residfp's structures 1.3.0 2014-02-02 * Port some missing VIC-II changes from jsidplay2 * Port missing changes from reSID to reSIDfp * Fix a bug in psid driver that broke /DEMOS/G-L/Gott_Och_Blandat.sid * Fix building with --disable-inline * Other minor fixes and improvements 1.2.2 2014-01-12 * Extend the waveform TTL to about one second to fix /MUSICIANS/P/PVCF/Thomkat_with_Strange_End.sid * Fix 'invalid use of incomplete type' warnings on android * Reduce oversized array in reSIDfp 1.2.1 2013-12-31 * Fix a bug in VIC-II that broke DEMOS/S-Z/Still_Got_the_Booze_tune_5.sid * Fix some wrong values printed by the cpu debugger 1.2.0 2013-12-24 * Clean up includes with the help of IWYU (http://code.google.com/p/include-what-you-use/) * Improve checks for non-standard functions * Expand SidTuneInfo interface with parametrized methods. Mark the old ones as deprecated * Enable use of graphviz for doxygen documentation * Refactor mixer to be more clean and flexible * Improve the clock frequency calculation. Should fix the slightly off PAL-B clock * Some internal refactoring 1.1.0 2013-09-28 * Rework mixer to fix bug #7 * Rework VIC emulation to be more faithful to PAL-NTSC models difference * Sync reSID codebase to fix a couple of regressions (See VICE bug #290) 1.0.3 2013-07-06 * Fix missing constructor in ExtraSidBank.h * Fix a regression in resid's external filter 1.0.2 2013-04-25 * Fix saving the last CIA 1 Timer A value * Fix a crash with stereo prg files 1.0.1 2013-03-23 * Fix compiling on debian/stable * Make sure that song is reinitialized after stop 1.0.0 2013-01-27 * Dropped support for ancient formats * Removed unused functionalities * Removed embedded roms * Improved emulation * Reworked and cleaned up codebase * Merged builders in the main library * Added libstilview 0.3.8 2012-11-25 * Bail out at configure time if stdint.h is not found * Fix a fixed point overflow introduced in r702, reported to break /MUSICIANS/S/Surgeon/Dual_Mind.sid (bug ID: 3588984) 0.3.7 2012-08-28 * Actually use the fastSampling parameter * Increase the waveform TTL even more to fix games/s-z/Scruples.sid#2 0.3.6 2012-07-22 * Correctly report sid builders error messages * Fix unlocking SID emulation for PSID tunes which caused an error when changing subtune for PSID files * Port a PSIDv3 fix from sidplay2 for saving RSIDv3 files * Other minor fixes 0.3.5 2012-04-22 * Increase the waveform TTL in reSIDfp * Restore external filter high-pass resistor value to 1kOhm in reSIDfp 0.3.4 2012-03-26 * fixed possible crackling when muting and unmuting channels in reSID * removed useless dithering and implemented clipping with a single branch in reSIDfp * fixed various warnings * fixed PETSCII conversion table to show lowercase letters in testsuite * fixed debugging info 0.3.3 2012-01-21 * fixed CPU/VICII interaction which affected Rayden/Boot_Zak_v2 0.3.2 2012-01-12 * Zero (ground) bit 0 of triangle waveform in reSID * Enable channel muting for reSID and reSIDfp * Fix Voice 3 Off in reSIDfp * Do not reject RSID v3 tunes * Improve scheduling efficience of CPU and VIC 0.3.1 2011-10-02 * fixed undefined behaviour which causes miscompilation on MSVC * fixed initialization order of class members 0.3.0 2011-09-24 * integrated Lorenz testsuite * added doxygen documentation * simplified the Event Scheduler * ported the MOS6526 emulation from jsiplay2, passes the whole CIA suite * reworked the 6510 emulation, passes the whole Lorenz suite API changes: deprecated methods Event::cancel and Event::schedule in favor of EventContext::cancel and EventContext::schedule deprecated sidplay2::timebase, it always returns 1 0.2.0 2011-08-13 * ported reSIDfp engine from jsidplay2 featuring two pass resampler and triangular dithering and new filter model based on reSID's one * improved CIA emulation, fixes a bunch of tunes with digi samples * few fixes to the 6510 core based on Lorenz testuite * added support for PSIDv3 tunes * Updated reSID to the 1.0rc1 version (see the NEWS file in the resid dir) * Added version defines API changes: deprecated method filter(const sid_filter_t *filter) from reSID builder deprecated method filter(const sid_filterfp_t *filter) from reSIDfp builder added method bias(const double dac_bias) to the reSID builder The bias is given in millivolts, and a maximum reasonable control range is approximately -500 to 500 (Actually from testing the value seems to be in volts so dac_bias value should be in the range -0.5 - 0.5) added methods filter6581Curve(const double filterCurve) which sets the filter curve for 6581 chip filter in a range from 0.0 (light) to 1.0 (dark) (default 0.5) and filter8580Curve(const double filterCurve) which sets the filter frequency for 8580 chip (default 12500) SidDatabase.h does not include SidTuneMod.h anymore 0.1.1 2011-07-10 * add support for PSID v3 tunes (patch by hbekel) * minor fixes 0.1.0 2010-11-10 you can read a summary of changes from the original libsidplay2 at http://www.bel.fi/~alankila/c64-sw/index-cpp.html other changes includes: * audio output is now signed 16bit * added sampling method and fast sampling parameters and removed precision and samplingFormat from the sid_config_t structure * removed filter(const sid_filter_t*) from sidbuilder class and made it builder specific * removed optimization method from builders * rewritten ini parser to be locale agnostic and use it only internally * headers are now installed under $(includedir)/sidplayfp * libsidplay and libsidutils are merged in a single library * two resid builders (original and distortion patched) libsidplayfp-2.6.0/docs/0000755000175100001770000000000014544470322012142 500000000000000libsidplayfp-2.6.0/docs/mainpage.dox0000644000175100001770000000367214544470307014372 00000000000000/** \mainpage libsidplayfp A library to play Commodore 64 music.

Libsidplayfp is a C64 music player library which integrates the reSID SID chip emulation into a cycle-based emulator environment, constantly aiming to improve emulation of the C64 system and the SID chips.
Copyright (c) 2000-2001 Simon White
Copyright (c) 2007-2010 Antti Lankila
Copyright (c) 2010-2024 Leandro Nini <drfiemost@users.sourceforge.net>

STILView (or more precisely, the STIL class written in C++) is intended to be compiled with the various SID emulators available on many platforms to provide the capability of showing STIL and BUG information along with the given SID that is currently being played in the emulator. It requires HVSC v2.6 (post-update #12) or later to function correctly, but it will work with earlier versions to a limited extent. Copyright (C) 1998, 2002 LaLa
Copyright (C) 2012-2020 Leandro Nini <drfiemost@users.sourceforge.net>

Home page:
https://github.com/libsidplayfp/libsidplayfp ----------------------------------------------------------------------------- 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. ----------------------------------------------------------------------------- \example demo.cpp */ libsidplayfp-2.6.0/tests/0000755000175100001770000000000014544470322012354 500000000000000libsidplayfp-2.6.0/tests/TestPSID.cpp0000644000175100001770000002065014544470307014405 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2015 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporter.h" #include "../src/sidplayfp/SidTune.h" #include "../src/sidplayfp/SidTuneInfo.h" #include #include #define BUFFERSIZE 128 #define VERSION_LO 5 #define DATAOFFSET_HI 6 #define DATAOFFSET_LO 7 #define LOADADDRESS_HI 8 #define LOADADDRESS_LO 9 #define INITADDRESS_HI 10 #define INITADDRESS_LO 11 #define PLAYADDRESS_HI 12 #define PLAYADDRESS_LO 13 #define SONGS_HI 14 #define SONGS_LO 15 #define STARTSONG_LO 17 #define SPEED_LO_LO 21 #define FLAGS 119 #define STARTPAGE 120 #define PAGELENGTH 121 #define SECONDSIDADDRESS 122 #define THIRDSIDADDRESS 123 using namespace UnitTest; uint8_t const bufferRSID[BUFFERSIZE] = { 0x52, 0x53, 0x49, 0x44, // magicID 0x00, 0x02, // version 0x00, 0x7C, // dataOffset 0x00, 0x00, // loadAddress 0x00, 0x00, // initAddress 0x00, 0x00, // playAddress 0x00, 0x01, // songs 0x00, 0x00, // startSong 0x00, 0x00, 0x00, 0x00, // speed 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // name 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // author 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // released 0x00, 0x00, // flags 0x00, // startPage 0x00, // pageLength 0x00, // secondSIDAddress 0x00, // thirdSIDAddress 0xe8, 0x07, 0x00, 0x00 // data }; SUITE(RSID) { struct TestFixture { // Test setup TestFixture() { memcpy(data, bufferRSID, BUFFERSIZE); } uint8_t data[BUFFERSIZE]; }; /* * Check that unmodified data loads ok. */ TEST_FIXTURE(TestFixture, TestLoadOk) { SidTune tune(data, BUFFERSIZE); CHECK(tune.getStatus()); CHECK_EQUAL("No errors", tune.statusString()); } /* * Version must be at least 2 for RSID files. */ TEST_FIXTURE(TestFixture, TestUnsupportedVersion) { data[VERSION_LO] = 0x01; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("Unsupported RSID version", tune.statusString()); } /* * Load address must always be 0 for RSID files. */ TEST_FIXTURE(TestFixture, TestWrongLoadAddress) { data[LOADADDRESS_LO] = 0xff; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: File contains invalid data", tune.statusString()); } /* * Actual Load Address must NOT be less than $07E8 for RSID files. */ TEST_FIXTURE(TestFixture, TestWrongActualLoadAddress) { data[124] = 0xe7; data[125] = 0x07; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: Bad address data", tune.statusString()); } /* * PlayAddress must always be 0 for RSID files. */ TEST_FIXTURE(TestFixture, TestWrongPlayAddress) { data[PLAYADDRESS_LO] = 0xff; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: File contains invalid data", tune.statusString()); } /* * Speed must always be 0 for RSID files. */ TEST_FIXTURE(TestFixture, TestWrongSpeed) { data[SPEED_LO_LO] = 0xff; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: File contains invalid data", tune.statusString()); } /* * DataOffset must always be 0x007C for RSID files. */ TEST_FIXTURE(TestFixture, TestWrongDataOffset) { data[DATAOFFSET_LO] = 0x76; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: Bad address data", tune.statusString()); } /* * InitAddress must never point to a ROM area for RSID files. */ TEST_FIXTURE(TestFixture, TestWrongInitAddressRom) { data[INITADDRESS_HI] = 0xb0; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: Bad address data", tune.statusString()); } /* * InitAddress must never be lower than $07E8 for RSID files. */ TEST_FIXTURE(TestFixture, TestWrongInitAddressTooLow) { data[INITADDRESS_HI] = 0x07; data[INITADDRESS_LO] = 0xe7; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: Bad address data", tune.statusString()); } /* * The maximum number of songs is 256. */ TEST_FIXTURE(TestFixture, TestTooManySongs) { data[SONGS_HI] = 0x01; data[SONGS_LO] = 0x01; SidTune tune(data, BUFFERSIZE); //CHECK(!tune.getStatus()); //CHECK_EQUAL("SIDTUNE ERROR: ", tune.statusString()); CHECK_EQUAL(256, tune.getInfo()->songs()); } /* * The song number to be played by default has a default of 1. */ TEST_FIXTURE(TestFixture, TestDefaultStartSong) { SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(1, tune.getInfo()->startSong()); } /* * If 'startPage' is 0 or 0xFF, 'pageLength' must be set to 0. */ TEST_FIXTURE(TestFixture, TestWrongPageLength) { data[STARTPAGE] = 0xff; data[PAGELENGTH] = 0x77; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0, tune.getInfo()->relocPages()); } ///////////// // TEST v3 // ///////////// /* * $d420 is a valid second SID address. */ TEST_FIXTURE(TestFixture, TestSecondSIDAddressOk) { data[VERSION_LO] = 0x03; data[SECONDSIDADDRESS] = 0x42; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0xd420, tune.getInfo()->sidChipBase(1)); } /* * SecondSIDAddress: only even values are valid. */ TEST_FIXTURE(TestFixture, TestWrongSecondSIDAddressOdd) { data[VERSION_LO] = 0x03; data[SECONDSIDADDRESS] = 0x43; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0, tune.getInfo()->sidChipBase(1)); } /* * SecondSIDAddress: Ranges $00-$41 ($D000-$D410) and * $80-$DF ($D800-$DDF0) are invalid. */ TEST_FIXTURE(TestFixture, TestWrongSecondSIDAddressOutOfRange) { data[VERSION_LO] = 0x03; data[SECONDSIDADDRESS] = 0x80; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0, tune.getInfo()->sidChipBase(1)); } ///////////// // TEST v4 // ///////////// /* * $d500 is a valid third SID address. */ TEST_FIXTURE(TestFixture, TestThirdSIDAddressOk) { data[VERSION_LO] = 0x04; data[SECONDSIDADDRESS] = 0x42; data[THIRDSIDADDRESS] = 0x50; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0xd500, tune.getInfo()->sidChipBase(2)); } /* * ThirdSIDAddress: only even values are valid. */ TEST_FIXTURE(TestFixture, TestWrongThirdSIDAddressOdd) { data[VERSION_LO] = 0x04; data[SECONDSIDADDRESS] = 0x42; data[THIRDSIDADDRESS] = 0x43; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0, tune.getInfo()->sidChipBase(2)); } /* * ThirdSIDAddress: Ranges $00-$41 ($D000-$D410) and * $80-$DF ($D800-$DDF0) are invalid. */ TEST_FIXTURE(TestFixture, TestWrongThirdSIDAddressOutOfRange) { data[VERSION_LO] = 0x04; data[SECONDSIDADDRESS] = 0x42; data[THIRDSIDADDRESS] = 0x80; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0, tune.getInfo()->sidChipBase(2)); } /* * The address of the third SID cannot be the same as the second SID. */ TEST_FIXTURE(TestFixture, TestWrongThirdSIDAddressLikeSecond) { data[VERSION_LO] = 0x04; data[SECONDSIDADDRESS] = 0x42; data[THIRDSIDADDRESS] = 0x42; SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0, tune.getInfo()->sidChipBase(2)); } } libsidplayfp-2.6.0/tests/TestMos6510.cpp0000644000175100001770000002351514544470307014723 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2020 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporter.h" #include "../src/EventScheduler.h" #include "../src/EventScheduler.cpp" #define private protected #include "../src/c64/CPU/mos6510.h" #include "../src/c64/CPU/opcodes.h" #include "../src/c64/CPU/mos6510.cpp" #include #include using namespace UnitTest; using namespace libsidplayfp; class testcpu final : public MOS6510 { private: uint8_t mem[65536]; private: uint8_t getInstr() const { return cycleCount >> 3; } protected: uint8_t cpuRead(uint_least16_t addr) override { return mem[addr]; } void cpuWrite(uint_least16_t addr, uint8_t data) override { mem[addr] = data; } public: testcpu(EventScheduler &scheduler) : MOS6510(scheduler) { mem[0xFFFC] = 0x00; mem[0xFFFD] = 0x10; } void setMem(uint8_t offset, uint8_t opcode) { mem[0x1000+offset] = opcode; } void print() { std::cout << "-> " << std::hex << (int)getInstr() << std::endl; } bool check(uint8_t opcode) const { return getInstr() == opcode; } }; SUITE(mos6510) { struct TestFixture { // Test setup TestFixture() : cpu(scheduler) { scheduler.reset(); cpu.reset(); } EventScheduler scheduler; testcpu cpu; }; /* * Interrupt is recognized at T0 and triggered on the following T1 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=20&a=0010&d=58eaeaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=4&irq1=100&logmore=rdy,irq */ TEST_FIXTURE(TestFixture, TestNop) { cpu.setMem(0, CLIn); cpu.setMem(1, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is not recognized at T0 as the I flag is still set * It is recognized during the following opcode's T0 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=20&a=0010&d=7858eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=4&irq1=100&logmore=rdy,irq */ TEST_FIXTURE(TestFixture, TestCli) { cpu.setMem(0, SEIn); cpu.setMem(1, CLIn); cpu.setMem(2, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(NOPn)); scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is recognized at T0 during CLI * as the I flag is cleared while the CPU is stalled by RDY line * It is triggered on the following T1 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=20&a=0010&d=7858eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=4&irq1=100&logmore=rdy,irq&rdy0=6&rdy1=8 */ TEST_FIXTURE(TestFixture, TestCliRdy) { cpu.setMem(0, SEIn); cpu.setMem(1, CLIn); cpu.setMem(2, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 cpu.setRDY(false); scheduler.clock(); // CPU stalled but the I flag is being cleared cpu.setRDY(true); scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is recognized at T0 as the I flag is still cleared * It is triggered on the following T1 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=20&a=0010&d=5878eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=4&irq1=100&logmore=rdy,irq */ TEST_FIXTURE(TestFixture, TestSei) { cpu.setMem(0, CLIn); cpu.setMem(1, SEIn); cpu.setMem(2, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is recognized at T0 during SEI * even if the I flag is set while the CPU is stalled by RDY line * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=20&a=0010&d=5878eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=4&irq1=100&logmore=rdy,irq&rdy0=6&rdy1=8 */ TEST_FIXTURE(TestFixture, TestSeiRdy) { cpu.setMem(0, CLIn); cpu.setMem(1, SEIn); cpu.setMem(2, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 cpu.setRDY(false); scheduler.clock(); // CPU stalled but the I flag is being set cpu.setRDY(true); scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is not recognized at T0 during SEI * even if the I flag is set while the CPU is stalled by RDY line * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=20&a=0010&d=5878eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=6&irq1=100&logmore=rdy,irq&rdy0=6&rdy1=8 */ TEST_FIXTURE(TestFixture, TestSeiRdy2) { cpu.setMem(0, CLIn); cpu.setMem(1, SEIn); cpu.setMem(2, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 cpu.triggerIRQ(); cpu.setRDY(false); scheduler.clock(); // CPU stalled but the I flag is being set cpu.setRDY(true); scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(NOPn)); } /* * Interrupt is not recognized at T0 as the I flag is still set * It is recognized during the following opcode's T0 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=30&a=0010&d=58087828eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=14&irq1=100&logmore=rdy,irq */ TEST_FIXTURE(TestFixture, TestPlp1) { cpu.setMem(0, CLIn); cpu.setMem(1, PHPn); cpu.setMem(2, SEIn); cpu.setMem(3, PLPn); cpu.setMem(4, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T0 scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T3 scheduler.clock(); // T0 scheduler.clock(); // T1 CHECK(cpu.check(NOPn)); scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is not recognized at T0 as the I flag is still set * It is recognized during the following opcode's T0 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=30&a=0010&d=58087828eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=14&irq1=100&logmore=rdy,irq&rdy0=20&rdy1=22 */ TEST_FIXTURE(TestFixture, TestPlp1Rdy) { cpu.setMem(0, CLIn); cpu.setMem(1, PHPn); cpu.setMem(2, SEIn); cpu.setMem(3, PLPn); cpu.setMem(4, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T0 scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T3 cpu.setRDY(false); scheduler.clock(); // CPU stalled cpu.setRDY(true); scheduler.clock(); // T0 scheduler.clock(); // T1 CHECK(cpu.check(NOPn)); scheduler.clock(); // T0+T2 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is not recognized at T0 as the I flag is still set * It is recognized during the following opcode's T0 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=30&a=0010&d=78085828eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=14&irq1=100&logmore=rdy,irq */ TEST_FIXTURE(TestFixture, TestPlp2) { cpu.setMem(0, SEIn); cpu.setMem(1, PHPn); cpu.setMem(2, CLIn); cpu.setMem(3, PLPn); cpu.setMem(4, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T0 scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T3 scheduler.clock(); // T0 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } /* * Interrupt is not recognized at T0 as the I flag is still set * It is recognized during the following opcode's T0 * * http://visual6502.org/JSSim/expert.html?graphics=f&loglevel=2&steps=30&a=0010&d=78085828eaeaeaea&a=fffe&d=2000&a=0020&d=e840&r=0010&irq0=14&irq1=100&logmore=rdy,irq&rdy0=20&rdy1=22 */ TEST_FIXTURE(TestFixture, TestPlp2Rdy) { cpu.setMem(0, SEIn); cpu.setMem(1, PHPn); cpu.setMem(2, CLIn); cpu.setMem(3, PLPn); cpu.setMem(4, NOPn); scheduler.clock(); // T1 scheduler.clock(); // T0+T2 scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T0 scheduler.clock(); // T1 scheduler.clock(); // T0+T2 cpu.triggerIRQ(); scheduler.clock(); // T1 scheduler.clock(); // T2 scheduler.clock(); // T3 cpu.setRDY(false); scheduler.clock(); // CPU stalled cpu.setRDY(true); scheduler.clock(); // T0 scheduler.clock(); // T1 CHECK(cpu.check(BRKn)); } } libsidplayfp-2.6.0/tests/Makefile.in0000644000175100001770000012150514544470316014350 00000000000000# Makefile.in generated by automake 1.16.5 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2021 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__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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@ @ENABLE_TEST_TRUE@TESTS = TestEnvelopeGenerator$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestWaveformGenerator$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestSpline$(EXEEXT) TestDac$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestPSID$(EXEEXT) TestMUS$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestMos6510$(EXEEXT) @ENABLE_TEST_TRUE@check_PROGRAMS = $(am__EXEEXT_1) subdir = tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/src/builders/exsid-builder/driver/m4/ax_pthread.m4 \ $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_14.m4 \ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_17.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @ENABLE_TEST_TRUE@am__EXEEXT_1 = TestEnvelopeGenerator$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestWaveformGenerator$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestSpline$(EXEEXT) TestDac$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestPSID$(EXEEXT) TestMUS$(EXEEXT) \ @ENABLE_TEST_TRUE@ TestMos6510$(EXEEXT) am__TestDac_SOURCES_DIST = Main.cpp TestDac.cpp @ENABLE_TEST_TRUE@am_TestDac_OBJECTS = Main.$(OBJEXT) \ @ENABLE_TEST_TRUE@ TestDac.$(OBJEXT) TestDac_OBJECTS = $(am_TestDac_OBJECTS) TestDac_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = am__TestEnvelopeGenerator_SOURCES_DIST = Main.cpp \ TestEnvelopeGenerator.cpp @ENABLE_TEST_TRUE@am_TestEnvelopeGenerator_OBJECTS = Main.$(OBJEXT) \ @ENABLE_TEST_TRUE@ TestEnvelopeGenerator.$(OBJEXT) TestEnvelopeGenerator_OBJECTS = $(am_TestEnvelopeGenerator_OBJECTS) TestEnvelopeGenerator_LDADD = $(LDADD) am__TestMUS_SOURCES_DIST = Main.cpp TestMUS.cpp @ENABLE_TEST_TRUE@am_TestMUS_OBJECTS = Main.$(OBJEXT) \ @ENABLE_TEST_TRUE@ TestMUS.$(OBJEXT) TestMUS_OBJECTS = $(am_TestMUS_OBJECTS) @ENABLE_TEST_TRUE@TestMUS_DEPENDENCIES = \ @ENABLE_TEST_TRUE@ $(top_builddir)/src/libsidplayfp.la am__TestMos6510_SOURCES_DIST = Main.cpp TestMos6510.cpp @ENABLE_TEST_TRUE@am_TestMos6510_OBJECTS = Main.$(OBJEXT) \ @ENABLE_TEST_TRUE@ TestMos6510.$(OBJEXT) TestMos6510_OBJECTS = $(am_TestMos6510_OBJECTS) TestMos6510_LDADD = $(LDADD) am__TestPSID_SOURCES_DIST = Main.cpp TestPSID.cpp @ENABLE_TEST_TRUE@am_TestPSID_OBJECTS = Main.$(OBJEXT) \ @ENABLE_TEST_TRUE@ TestPSID.$(OBJEXT) TestPSID_OBJECTS = $(am_TestPSID_OBJECTS) @ENABLE_TEST_TRUE@TestPSID_DEPENDENCIES = \ @ENABLE_TEST_TRUE@ $(top_builddir)/src/libsidplayfp.la am__TestSpline_SOURCES_DIST = Main.cpp TestSpline.cpp @ENABLE_TEST_TRUE@am_TestSpline_OBJECTS = Main.$(OBJEXT) \ @ENABLE_TEST_TRUE@ TestSpline.$(OBJEXT) TestSpline_OBJECTS = $(am_TestSpline_OBJECTS) TestSpline_LDADD = $(LDADD) am__TestWaveformGenerator_SOURCES_DIST = Main.cpp \ TestWaveformGenerator.cpp @ENABLE_TEST_TRUE@am_TestWaveformGenerator_OBJECTS = Main.$(OBJEXT) \ @ENABLE_TEST_TRUE@ TestWaveformGenerator.$(OBJEXT) TestWaveformGenerator_OBJECTS = $(am_TestWaveformGenerator_OBJECTS) TestWaveformGenerator_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/Main.Po ./$(DEPDIR)/TestDac.Po \ ./$(DEPDIR)/TestEnvelopeGenerator.Po ./$(DEPDIR)/TestMUS.Po \ ./$(DEPDIR)/TestMos6510.Po ./$(DEPDIR)/TestPSID.Po \ ./$(DEPDIR)/TestSpline.Po ./$(DEPDIR)/TestWaveformGenerator.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(TestDac_SOURCES) $(TestEnvelopeGenerator_SOURCES) \ $(TestMUS_SOURCES) $(TestMos6510_SOURCES) $(TestPSID_SOURCES) \ $(TestSpline_SOURCES) $(TestWaveformGenerator_SOURCES) DIST_SOURCES = $(am__TestDac_SOURCES_DIST) \ $(am__TestEnvelopeGenerator_SOURCES_DIST) \ $(am__TestMUS_SOURCES_DIST) $(am__TestMos6510_SOURCES_DIST) \ $(am__TestPSID_SOURCES_DIST) $(am__TestSpline_SOURCES_DIST) \ $(am__TestWaveformGenerator_SOURCES_DIST) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } 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; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/build-aux/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/build-aux/depcomp \ $(top_srcdir)/build-aux/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DOT = @DOT@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ EXSID_CFLAGS = @EXSID_CFLAGS@ EXSID_LIBS = @EXSID_LIBS@ FGREP = @FGREP@ FTDI_CFLAGS = @FTDI_CFLAGS@ GREP = @GREP@ HAVE_BOOL = @HAVE_BOOL@ HAVE_BUILTIN_EXPECT = @HAVE_BUILTIN_EXPECT@ HAVE_CXX11 = @HAVE_CXX11@ HAVE_CXX14 = @HAVE_CXX14@ HAVE_CXX17 = @HAVE_CXX17@ HAVE_LOG1P = @HAVE_LOG1P@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@ LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBSIDPLAYVERSION = @LIBSIDPLAYVERSION@ LIBSTILVIEWVERSION = @LIBSTILVIEWVERSION@ LIBTOOL = @LIBTOOL@ LIB_LEVEL = @LIB_LEVEL@ LIB_MAJOR = @LIB_MAJOR@ LIB_MINOR = @LIB_MINOR@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NEW_8580_FILTER = @NEW_8580_FILTER@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OD = @OD@ OPENMP_CXXFLAGS = @OPENMP_CXXFLAGS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ 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@ PTHREAD_CC = @PTHREAD_CC@ PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ PTHREAD_LIBS = @PTHREAD_LIBS@ RANLIB = @RANLIB@ RESID_BRANCH_HINTS = @RESID_BRANCH_HINTS@ RESID_INLINE = @RESID_INLINE@ RESID_INLINING = @RESID_INLINING@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UNITTEST_CFLAGS = @UNITTEST_CFLAGS@ UNITTEST_LIBS = @UNITTEST_LIBS@ VERSION = @VERSION@ XA = @XA@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ ax_pthread_config = @ax_pthread_config@ 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@ debug_flags = @debug_flags@ 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@ 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@ runstatedir = @runstatedir@ 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@ AUTOMAKE_OPTIONS = foreign subdir-objects @ENABLE_TEST_TRUE@AM_CPPFLAGS = \ @ENABLE_TEST_TRUE@-I$(top_srcdir)/src \ @ENABLE_TEST_TRUE@-I$(top_builddir)/src/builders/residfp-builder/residfp \ @ENABLE_TEST_TRUE@$(UNITTEST_CFLAGS) @ENABLE_TEST_TRUE@AM_LDFLAGS = $(UNITTEST_LIBS) @ENABLE_TEST_TRUE@TestEnvelopeGenerator_SOURCES = \ @ENABLE_TEST_TRUE@Main.cpp \ @ENABLE_TEST_TRUE@TestEnvelopeGenerator.cpp @ENABLE_TEST_TRUE@TestWaveformGenerator_SOURCES = \ @ENABLE_TEST_TRUE@Main.cpp \ @ENABLE_TEST_TRUE@TestWaveformGenerator.cpp @ENABLE_TEST_TRUE@TestSpline_SOURCES = \ @ENABLE_TEST_TRUE@Main.cpp \ @ENABLE_TEST_TRUE@TestSpline.cpp @ENABLE_TEST_TRUE@TestDac_SOURCES = \ @ENABLE_TEST_TRUE@Main.cpp \ @ENABLE_TEST_TRUE@TestDac.cpp @ENABLE_TEST_TRUE@TestPSID_SOURCES = \ @ENABLE_TEST_TRUE@Main.cpp \ @ENABLE_TEST_TRUE@TestPSID.cpp @ENABLE_TEST_TRUE@TestPSID_LDADD = $(top_builddir)/src/libsidplayfp.la @ENABLE_TEST_TRUE@TestMUS_SOURCES = \ @ENABLE_TEST_TRUE@Main.cpp \ @ENABLE_TEST_TRUE@TestMUS.cpp @ENABLE_TEST_TRUE@TestMUS_LDADD = $(top_builddir)/src/libsidplayfp.la @ENABLE_TEST_TRUE@TestMos6510_SOURCES = \ @ENABLE_TEST_TRUE@Main.cpp \ @ENABLE_TEST_TRUE@TestMos6510.cpp all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(srcdir)/Makefile.in: $(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) --foreign tests/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign tests/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list TestDac$(EXEEXT): $(TestDac_OBJECTS) $(TestDac_DEPENDENCIES) $(EXTRA_TestDac_DEPENDENCIES) @rm -f TestDac$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TestDac_OBJECTS) $(TestDac_LDADD) $(LIBS) TestEnvelopeGenerator$(EXEEXT): $(TestEnvelopeGenerator_OBJECTS) $(TestEnvelopeGenerator_DEPENDENCIES) $(EXTRA_TestEnvelopeGenerator_DEPENDENCIES) @rm -f TestEnvelopeGenerator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TestEnvelopeGenerator_OBJECTS) $(TestEnvelopeGenerator_LDADD) $(LIBS) TestMUS$(EXEEXT): $(TestMUS_OBJECTS) $(TestMUS_DEPENDENCIES) $(EXTRA_TestMUS_DEPENDENCIES) @rm -f TestMUS$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TestMUS_OBJECTS) $(TestMUS_LDADD) $(LIBS) TestMos6510$(EXEEXT): $(TestMos6510_OBJECTS) $(TestMos6510_DEPENDENCIES) $(EXTRA_TestMos6510_DEPENDENCIES) @rm -f TestMos6510$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TestMos6510_OBJECTS) $(TestMos6510_LDADD) $(LIBS) TestPSID$(EXEEXT): $(TestPSID_OBJECTS) $(TestPSID_DEPENDENCIES) $(EXTRA_TestPSID_DEPENDENCIES) @rm -f TestPSID$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TestPSID_OBJECTS) $(TestPSID_LDADD) $(LIBS) TestSpline$(EXEEXT): $(TestSpline_OBJECTS) $(TestSpline_DEPENDENCIES) $(EXTRA_TestSpline_DEPENDENCIES) @rm -f TestSpline$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TestSpline_OBJECTS) $(TestSpline_LDADD) $(LIBS) TestWaveformGenerator$(EXEEXT): $(TestWaveformGenerator_OBJECTS) $(TestWaveformGenerator_DEPENDENCIES) $(EXTRA_TestWaveformGenerator_DEPENDENCIES) @rm -f TestWaveformGenerator$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(TestWaveformGenerator_OBJECTS) $(TestWaveformGenerator_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestDac.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestEnvelopeGenerator.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestMUS.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestMos6510.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestPSID.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestSpline.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/TestWaveformGenerator.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? TestEnvelopeGenerator.log: TestEnvelopeGenerator$(EXEEXT) @p='TestEnvelopeGenerator$(EXEEXT)'; \ b='TestEnvelopeGenerator'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TestWaveformGenerator.log: TestWaveformGenerator$(EXEEXT) @p='TestWaveformGenerator$(EXEEXT)'; \ b='TestWaveformGenerator'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TestSpline.log: TestSpline$(EXEEXT) @p='TestSpline$(EXEEXT)'; \ b='TestSpline'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TestDac.log: TestDac$(EXEEXT) @p='TestDac$(EXEEXT)'; \ b='TestDac'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TestPSID.log: TestPSID$(EXEEXT) @p='TestPSID$(EXEEXT)'; \ b='TestPSID'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TestMUS.log: TestMUS$(EXEEXT) @p='TestMUS$(EXEEXT)'; \ b='TestMUS'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) TestMos6510.log: TestMos6510$(EXEEXT) @p='TestMos6510$(EXEEXT)'; \ b='TestMos6510'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile 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: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) 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-checkPROGRAMS clean-generic clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/Main.Po -rm -f ./$(DEPDIR)/TestDac.Po -rm -f ./$(DEPDIR)/TestEnvelopeGenerator.Po -rm -f ./$(DEPDIR)/TestMUS.Po -rm -f ./$(DEPDIR)/TestMos6510.Po -rm -f ./$(DEPDIR)/TestPSID.Po -rm -f ./$(DEPDIR)/TestSpline.Po -rm -f ./$(DEPDIR)/TestWaveformGenerator.Po -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 -f ./$(DEPDIR)/Main.Po -rm -f ./$(DEPDIR)/TestDac.Po -rm -f ./$(DEPDIR)/TestEnvelopeGenerator.Po -rm -f ./$(DEPDIR)/TestMUS.Po -rm -f ./$(DEPDIR)/TestMos6510.Po -rm -f ./$(DEPDIR)/TestPSID.Po -rm -f ./$(DEPDIR)/TestSpline.Po -rm -f ./$(DEPDIR)/TestWaveformGenerator.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ check-am clean clean-checkPROGRAMS clean-generic clean-libtool \ cscopelist-am ctags ctags-am distclean distclean-compile \ distclean-generic distclean-libtool 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 mostlyclean-libtool pdf pdf-am ps ps-am \ recheck tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # 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: libsidplayfp-2.6.0/tests/TestDac.cpp0000644000175100001770000000340214544470307014331 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2014-2016 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporter.h" #include "../src/builders/residfp-builder/residfp/Dac.h" #include "../src/builders/residfp-builder/residfp/Dac.cpp" using namespace UnitTest; using namespace reSIDfp; #define DAC_BITS 8 SUITE(Dac) { void buildDac(float dac[], ChipModel chipModel) { Dac dacBuilder(DAC_BITS); dacBuilder.kinkedDac(chipModel); for (unsigned int i = 0; i < (1 << DAC_BITS); i++) { dac[i] = dacBuilder.getOutput(i); } } bool isDacLinear(ChipModel chipModel) { float dac[1 << DAC_BITS]; buildDac(dac, chipModel); for (int i = 1; i < (1 << DAC_BITS); i++) { if (dac[i] <= dac[i-1]) return false; } return true; } TEST(TestDac6581) { // Test the non-linearity of the 6581 DACs CHECK(!isDacLinear(MOS6581)); } TEST(TestDac8580) { // Test the linearity of the 8580 DACs CHECK(isDacLinear(MOS8580)); } } libsidplayfp-2.6.0/tests/TestSpline.cpp0000644000175100001770000000575614544470307015112 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2014-2022 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporter.h" #include #include #include "../src/builders/residfp-builder/residfp/Spline.h" #include "../src/builders/residfp-builder/residfp/Spline.cpp" using namespace UnitTest; using namespace reSIDfp; const unsigned int OPAMP_SIZE = 33; const Spline::Point opamp_voltage[OPAMP_SIZE] = { { 0.81, 10.31 }, // Approximate start of actual range { 2.40, 10.31 }, { 2.60, 10.30 }, { 2.70, 10.29 }, { 2.80, 10.26 }, { 2.90, 10.17 }, { 3.00, 10.04 }, { 3.10, 9.83 }, { 3.20, 9.58 }, { 3.30, 9.32 }, { 3.50, 8.69 }, { 3.70, 8.00 }, { 4.00, 6.89 }, { 4.40, 5.21 }, { 4.54, 4.54 }, // Working point (vi = vo) { 4.60, 4.19 }, { 4.80, 3.00 }, { 4.90, 2.30 }, // Change of curvature { 4.95, 2.03 }, { 5.00, 1.88 }, { 5.05, 1.77 }, { 5.10, 1.69 }, { 5.20, 1.58 }, { 5.40, 1.44 }, { 5.60, 1.33 }, { 5.80, 1.26 }, { 6.00, 1.21 }, { 6.40, 1.12 }, { 7.00, 1.02 }, { 7.50, 0.97 }, { 8.50, 0.89 }, { 10.00, 0.81 }, { 10.31, 0.81 }, // Approximate end of actual range }; SUITE(Spline) { TEST(TestMonotonicity) { Spline s(std::vector(std::begin(opamp_voltage), std::end(opamp_voltage))); double old = std::numeric_limits::max(); for (double x = 0.0; x < 12.0; x+=0.01) { Spline::Point out = s.evaluate(x); CHECK(out.x <= old); old = out.x; } } TEST(TestPoints) { Spline s(std::vector(std::begin(opamp_voltage), std::end(opamp_voltage))); for (int i = 0; i < OPAMP_SIZE; i++) { Spline::Point out = s.evaluate(opamp_voltage[i].x); CHECK_EQUAL(opamp_voltage[i].y, out.x); } } TEST(TestInterpolateOutsideBounds) { const Spline::Point values[5] = { { 10, 15 }, { 15, 20 }, { 20, 30 }, { 25, 40 }, { 30, 45 }, }; Spline s(std::vector(std::begin(values), std::end(values))); Spline::Point out; out = s.evaluate(5); CHECK_CLOSE(6.66667, out.x, 0.00001); out = s.evaluate(40); CHECK_CLOSE(75.0, out.x, 0.00001); } } libsidplayfp-2.6.0/tests/TestWaveformGenerator.cpp0000755000175100001770000001270014544470307017303 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2014-2023 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporter.h" #include "../src/builders/residfp-builder/residfp/WaveformCalculator.cpp" #include "../src/builders/residfp-builder/residfp/Dac.cpp" #include "../src/builders/residfp-builder/residfp/WaveformCalculator.h" #define private public #define protected public #define class struct #include "../src/builders/residfp-builder/residfp/WaveformGenerator.h" #include "../src/builders/residfp-builder/residfp/WaveformGenerator.cpp" using namespace UnitTest; SUITE(WaveformGenerator) { TEST(TestShiftRegisterInitValue) { reSIDfp::WaveformGenerator generator; generator.reset(); CHECK_EQUAL(0x3fffff, generator.shift_register); } TEST(TestClockShiftRegister) { reSIDfp::WaveformGenerator generator; generator.reset(); generator.shift_register = 0x35555e; // shift phase 1 generator.test_or_reset = false; generator.shift_latch = generator.shift_register; // shift phase 2 generator.shift_phase2(0, 0); CHECK_EQUAL(0x9e0, generator.noise_output); } TEST(TestNoiseOutput) { reSIDfp::WaveformGenerator generator; generator.reset(); generator.shift_register = 0x35555f; generator.set_noise_output(); CHECK_EQUAL(0xe20, generator.noise_output); } TEST(TestWriteShiftRegister) { reSIDfp::WaveformGenerator generator; generator.reset(); generator.waveform = 0xf; generator.write_shift_register(); CHECK_EQUAL(0x2dd6eb, generator.shift_register); } TEST(TestSetTestBit) { matrix_t* wavetables = reSIDfp::WaveformCalculator::getInstance()->getWaveTable(); matrix_t* tables = reSIDfp::WaveformCalculator::getInstance()->buildPulldownTable(reSIDfp::MOS6581); reSIDfp::WaveformGenerator generator; generator.reset(); generator.shift_register = 0x35555e; generator.setWaveformModels(wavetables); generator.setPulldownModels(tables); generator.writeCONTROL_REG(0x08); // set test bit generator.clock(); generator.writeCONTROL_REG(0x00); // unset test bit generator.clock(); CHECK_EQUAL(0x9f0, generator.noise_output); } TEST(TestNoiseWriteBack1) { matrix_t* wavetables = reSIDfp::WaveformCalculator::getInstance()->getWaveTable(); matrix_t* tables = reSIDfp::WaveformCalculator::getInstance()->buildPulldownTable(reSIDfp::MOS6581); reSIDfp::WaveformGenerator modulator; reSIDfp::WaveformGenerator generator; generator.setModel(true); //6581 generator.setWaveformModels(wavetables); generator.setPulldownModels(tables); generator.reset(); // switch from noise to noise+triangle generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x90); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0xfc, (int)generator.readOSC()); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0x6c, (int)generator.readOSC()); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0xd8, (int)generator.readOSC()); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0xb1, (int)generator.readOSC()); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0xd8, (int)generator.readOSC()); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0x6a, (int)generator.readOSC()); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0xb1, (int)generator.readOSC()); generator.writeCONTROL_REG(0x88); generator.clock(); generator.output(&modulator); generator.writeCONTROL_REG(0x80); generator.clock(); generator.output(&modulator); CHECK_EQUAL(0xf0, (int)generator.readOSC()); } } libsidplayfp-2.6.0/tests/Makefile.am0000644000175100001770000000150714544470307014336 00000000000000 AUTOMAKE_OPTIONS = foreign subdir-objects if ENABLE_TEST AM_CPPFLAGS = \ -I$(top_srcdir)/src \ -I$(top_builddir)/src/builders/residfp-builder/residfp \ $(UNITTEST_CFLAGS) AM_LDFLAGS = $(UNITTEST_LIBS) TESTS = \ TestEnvelopeGenerator \ TestWaveformGenerator \ TestSpline \ TestDac \ TestPSID \ TestMUS \ TestMos6510 check_PROGRAMS = $(TESTS) TestEnvelopeGenerator_SOURCES = \ Main.cpp \ TestEnvelopeGenerator.cpp TestWaveformGenerator_SOURCES = \ Main.cpp \ TestWaveformGenerator.cpp TestSpline_SOURCES = \ Main.cpp \ TestSpline.cpp TestDac_SOURCES = \ Main.cpp \ TestDac.cpp TestPSID_SOURCES = \ Main.cpp \ TestPSID.cpp TestPSID_LDADD = $(top_builddir)/src/libsidplayfp.la TestMUS_SOURCES = \ Main.cpp \ TestMUS.cpp TestMUS_LDADD = $(top_builddir)/src/libsidplayfp.la TestMos6510_SOURCES = \ Main.cpp \ TestMos6510.cpp endif libsidplayfp-2.6.0/tests/TestMUS.cpp0000644000175100001770000000435614544470307014317 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2015-2019 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporter.h" #include "../src/sidplayfp/SidTune.h" #include "../src/sidplayfp/SidTuneInfo.h" #include "../src/sidtune/MUS.h" #include #include #define BUFFERSIZE 26 #define LOADADDRESS_HI 1 #define LOADADDRESS_LO 0 #define VOICE1_LEN_HI 3 #define VOICE1_LEN_LO 2 using namespace UnitTest; uint8_t const bufferMUS[BUFFERSIZE] = { 0x52, 0x53, // load address 0x04, 0x00, // length of the data for Voice 1 0x04, 0x00, // length of the data for Voice 2 0x04, 0x00, // length of the data for Voice 3 0x00, 0x00, 0x01, 0x4F, // data for Voice 1 0x00, 0x00, 0x01, 0x4F, // data for Voice 2 0x00, 0x01, 0x01, 0x4F, // data for Voice 3 0x0d, 0x0d, 0x0d, 0x0d, 0x0d, 0x00, // text description }; SUITE(MUS) { struct TestFixture { // Test setup TestFixture() { memcpy(data, bufferMUS, BUFFERSIZE); } uint8_t data[BUFFERSIZE]; }; TEST_FIXTURE(TestFixture, TestPlayerAddress) { SidTune tune(data, BUFFERSIZE); CHECK_EQUAL(0xec60, tune.getInfo()->initAddr()); CHECK_EQUAL(0xec80, tune.getInfo()->playAddr()); } TEST_FIXTURE(TestFixture, TestWrongVoiceLength) { data[VOICE1_LEN_LO] = 0x76; SidTune tune(data, BUFFERSIZE); CHECK(!tune.getStatus()); CHECK_EQUAL("SIDTUNE ERROR: Could not determine file format", tune.statusString()); } } libsidplayfp-2.6.0/tests/Main.cpp0000644000175100001770000000173414544470307013674 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2014 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporterStdout.h" int main(int, char const *[]) { return UnitTest::RunAllTests(); } libsidplayfp-2.6.0/tests/TestEnvelopeGenerator.cpp0000644000175100001770000000757314544470307017303 00000000000000/* * This file is part of libsidplayfp, a SID player engine. * * Copyright (C) 2014-2020 Leandro Nini * * 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 */ #include "UnitTest++/UnitTest++.h" #include "UnitTest++/TestReporter.h" #include "../src/builders/residfp-builder/residfp/Dac.cpp" #define private public #define protected public #define class struct #include "../src/builders/residfp-builder/residfp/EnvelopeGenerator.h" #include "../src/builders/residfp-builder/residfp/EnvelopeGenerator.cpp" using namespace UnitTest; SUITE(EnvelopeGenerator) { struct TestFixture { // Test setup TestFixture() { generator.reset(); generator.envelope_counter = 0; } reSIDfp::EnvelopeGenerator generator; }; TEST_FIXTURE(TestFixture, TestADSRDelayBug) { // If the rate counter comparison value is set below the current value of the // rate counter, the counter will continue counting up until it wraps around // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the // envelope can constly be stepped. generator.writeATTACK_DECAY(0x70); generator.writeCONTROL_REG(0x01); // wait 200 cycles for (int i=0; i<200; i++) { generator.clock(); } CHECK_EQUAL(1, (int)generator.readENV()); // set lower Attack time // should theoretically clock after 63 cycles generator.writeATTACK_DECAY(0x20); // wait another 200 cycles for (int i=0; i<200; i++) { generator.clock(); } CHECK_EQUAL(1, (int)generator.readENV()); } TEST_FIXTURE(TestFixture, TestFlipFFto00) { // The envelope counter can flip from 0xff to 0x00 by changing state to // release, then to attack. The envelope counter is then frozen at // zero; to unlock this situation the state must be changed to release, // then to attack. generator.writeATTACK_DECAY(0x77); generator.writeSUSTAIN_RELEASE(0x77); generator.writeCONTROL_REG(0x01); do { generator.clock(); } while ((int)generator.readENV() != 0xff); generator.writeCONTROL_REG(0x00); // run for three clocks, accounting for state pipeline generator.clock(); generator.clock(); generator.clock(); generator.writeCONTROL_REG(0x01); // wait at least 313 cycles // so the counter is clocked once for (int i=0; i<315; i++) { generator.clock(); } CHECK_EQUAL(0, (int)generator.readENV()); } TEST_FIXTURE(TestFixture, TestFlip00toFF) { // The envelope counter can flip from 0x00 to 0xff by changing state to // attack, then to release. The envelope counter will then continue // counting down in the release state. generator.counter_enabled = false; generator.writeATTACK_DECAY(0x77); generator.writeSUSTAIN_RELEASE(0x77); generator.clock(); CHECK_EQUAL(0, (int)generator.readENV()); generator.writeCONTROL_REG(0x01); // run for three clocks, accounting for state pipeline generator.clock(); generator.clock(); generator.clock(); generator.writeCONTROL_REG(0x00); // wait at least 313 cycles // so the counter is clocked once for (int i=0; i<315; i++) { generator.clock(); } CHECK_EQUAL(0xff, (int)generator.readENV()); } } libsidplayfp-2.6.0/Doxyfile.in0000644000175100001770000033005414544470307013255 00000000000000# Doxyfile 1.8.17 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the configuration # file that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = @PACKAGE_NAME@ # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = @PACKAGE_VERSION@ # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = @builddir@/docs # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and # will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. # The default value is: NO. CREATE_SUBDIRS = NO # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, # Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), # Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, # Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, # Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, # Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, # Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all generated output in the proper direction. # Possible values are: None, LTR, RTL and Context. # The default value is: None. OUTPUT_TEXT_DIRECTION = None # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = NO # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = NO # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be # interpreted by doxygen. # The default value is: NO. JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 8 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:\n" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". You can put \n's in the value part of an alias to insert # newlines (in the resulting output). You can put ^^ in the value part of an # alias to insert a newline as if a physical newline was in the original file. # When you need a literal { or } or , in the value part of an alias you have to # escape them by means of a backslash (\), this can lead to conflicts with the # commands \{ and \} for these it is advised to use the version @{ and @} or use # a double escape (\\{ and \\}) ALIASES = # This tag can be used to specify a number of word-keyword mappings (TCL only). # A mapping has the form "name=value". For example adding "class=itcl::class" # will allow you to use the command class in the itcl::class meaning. TCL_SUBST = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that # language. For instance, namespaces will be presented as modules, types will be # separated into more groups, etc. # The default value is: NO. OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files), VHDL, tcl. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is # Fortran), use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 5 # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = YES # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = YES # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = NO # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = YES # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # names in lower-case letters. If set to YES, upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # (including Cygwin) ands Mac users are advised to set this option to NO. # The default value is: system dependent. CASE_SENSE_NAMES = YES # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = YES # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = YES # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some parameters # in a documented function, or documenting parameters that don't exist or using # markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong or incomplete # parameter documentation, but not about the absence of documentation. If # EXTRACT_ALL is set to YES then this flag will automatically be disabled. # The default value is: NO. WARN_NO_PARAMDOC = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = @srcdir@/src \ @srcdir@/docs # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: https://www.gnu.org/software/libiconv/) for the list of # possible encodings. # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment), # *.doc (to be provided as doxygen C comment), *.txt (to be provided as doxygen # C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f, *.for, *.tcl, *.vhd, # *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = src/builders/exsid-builder/driver # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = @srcdir@/test # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # cost of reduced performance. This can be particularly helpful with template # rich C++ code for which doxygen's built-in parser lacks the necessary type # information. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the # path to the compilation database (see: # http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files # were built. This is equivalent to specifying the "-p" option to a clang tool, # such as clang-check. These options will then be passed to the parser. # Note: The availability of this option depends on whether or not doxygen was # generated with the -Duse_libclang=ON option for CMake. CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = NO # The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in # which the alphabetical index list will be split. # Minimum value: 1, maximum value: 20, default value: 5. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all classes will # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # can be used to specify a prefix (or a list of prefixes) that should be ignored # while generating the index headers. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). For an example see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a colorwheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use grayscales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML # page will contain the date and time when the page was generated. Setting this # to YES can help to show when doxygen was last run and thus if the # documentation is up to date. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML # page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_MENUS = NO # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = NO # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: https://developer.apple.com/xcode/), introduced with OSX # 10.5 (Leopard). To create a documentation set, doxygen will generate a # Makefile in the HTML output directory. Running make will produce the docset in # that directory and running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on # Windows. # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the master .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location of Qt's # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = NO # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine-tune the look of the index. As an example, the default style # sheet generated by doxygen has an example that shows how to put an image at # the root of the tree instead of the PROJECT_NAME. Since the tree basically has # the same information as the tab index, you could consider setting # DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NONE # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 250 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 10 # Use the FORMULA_TRANSPARENT tag to determine whether or not the images # generated for formulas are transparent PNGs. Transparent PNGs are not # supported properly for IE 6.0, but are supported on all modern browsers. # # Note that when changing this option you need to delete any form_*.png files in # the HTML output directory before the changes have effect. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_TRANSPARENT = YES # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = NO # When MathJax is enabled you can set the default output format to be used for # the MathJax output. See the MathJax site (see: # http://docs.mathjax.org/en/latest/output.html) for more details. # Possible values are: HTML-CSS (which is slower, but has the best # compatibility), NativeMML (i.e. MathML) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. # The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /