Merge branch 'master' (early part) into medusa
jump to
@@ -50,6 +50,9 @@ - GBA Video: Add delay when enabling BGs (fixes mgba.io/i/744, mgba.io/i/752)
- GB Timer: Minor accuracy improvements - GB Audio: Clock frame events on DIV - GBA Timer: Fix timers sometimes being late (fixes mgba.io/i/1012) + - GBA Hardware: Fix RTC overriding light sensor (fixes mgba.io/i/1069) + - GBA Savedata: Fix savedata modified time updating when read-only + - GB Video: Fix enabling window when LY > WY (fixes mgba.io/i/409) Misc: - GBA Timer: Use global cycles for timers - GBA: Extend oddly-sized ROMs to full address space (fixes mgba.io/i/722)@@ -70,6 +73,10 @@ - GBA Memory: 64 MiB GBA Video cartridge support
- PSP2: Use system enter key by default - 3DS: Remove deprecated CSND interface - Qt: Options to mess around with layer placement + - GBA Savedata: Remove ability to disable realistic timing + - Qt: Add load alternate save option + - GB Audio: Improved audio quality + - GB, GBA Audio: Increase max audio volume 0.6.3: (2017-04-14) Bugfixes:
@@ -49,6 +49,7 @@ set(BUILD_GL ON CACHE STRING "Build with OpenGL")
set(BUILD_GLES2 OFF CACHE STRING "Build with OpenGL|ES 2") set(USE_EPOXY ON CACHE STRING "Build with libepoxy") set(DISABLE_DEPS OFF CACHE BOOL "Build without dependencies") +set(DISTBUILD OFF CACHE BOOL "Build distribution packages") if(WIN32) set(WIN32_UNIX_PATHS OFF CACHE BOOL "Use Unix-like paths") mark_as_advanced(WIN32_UNIX_PATHS)@@ -93,7 +94,7 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type (e.g. Release or Debug)" FORCE) endif() -if(NOT WIN32 OR WIN32_UNIX_PATHS) +if(UNIX OR WIN32_UNIX_PATHS) include(GNUInstallDirs) string(REPLACE "${PROJECT_NAME}" "${BINARY_NAME}" CMAKE_INSTALL_DOCDIR "${CMAKE_INSTALL_DOCDIR}") else()@@ -117,6 +118,11 @@ set(OE_LIBDIR "${LIBDIR}" CACHE PATH "Installed library directory (OpenEmu)")
mark_as_advanced(OE_LIBDIR) endif() +if (DISTBUILD) + set(EXTRA_LICENSES "" CACHE FILEPATH "Extra licenses to include in distribution packaages") + mark_as_advanced(EXTRA_LICENSES) +endif() +mark_as_advanced(DISTBUILD) set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIBDIR}")@@ -283,6 +289,7 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-format")
endif() if(DEFINED 3DS OR DEFINED PSP2 OR DEFINED WII) + set(IS_EMBEDDED ON) set(USE_DEBUGGERS OFF) set(USE_SQLITE3 OFF) endif()@@ -342,9 +349,11 @@ set(CMAKE_REQUIRED_FLAGS -Wl,--require-defined,setlocale)
check_function_exists(setlocale HAVE_SETLOCALE) unset(CMAKE_REQUIRED_FLAGS) endif() - if(NOT DEFINED 3DS AND NOT DEFINED PSP2 AND NOT DEFINED WII) + if(NOT IS_EMBEDDED) set(DISABLE_DEPS ON CACHE BOOL "This platform cannot build with dependencies" FORCE) endif() + set(BUILD_STATIC ON CACHE BOOL "" FORCE) + set(BUILD_SHARED OFF CACHE BOOL "" FORCE) set(DISABLE_FRONTENDS ON) set(MINIMAL_CORE ON) set(ENABLE_EXTRA ON)@@ -835,15 +844,15 @@
target_link_libraries(${BINARY_NAME} ${DEBUGGER_LIB} ${DEPENDENCY_LIB} ${OS_LIB}) install(TARGETS ${BINARY_NAME} LIBRARY DESTINATION ${LIBDIR} COMPONENT lib${BINARY_NAME} NAMELINK_SKIP ARCHIVE DESTINATION ${LIBDIR} RUNTIME DESTINATION ${LIBDIR} COMPONENT lib${BINARY_NAME}) if(UNIX AND NOT APPLE AND NOT HAIKU) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-16.png DESTINATION share/icons/hicolor/16x16/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-24.png DESTINATION share/icons/hicolor/24x24/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-32.png DESTINATION share/icons/hicolor/32x32/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-48.png DESTINATION share/icons/hicolor/48x48/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-64.png DESTINATION share/icons/hicolor/64x64/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-96.png DESTINATION share/icons/hicolor/96x96/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-128.png DESTINATION share/icons/hicolor/128x128/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-256.png DESTINATION share/icons/hicolor/256x256/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) - install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/${BINARY_NAME}-512.png DESTINATION share/icons/hicolor/512x512/apps RENAME ${BINARY_NAME}.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-16.png DESTINATION share/icons/hicolor/16x16/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-24.png DESTINATION share/icons/hicolor/24x24/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-32.png DESTINATION share/icons/hicolor/32x32/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-48.png DESTINATION share/icons/hicolor/48x48/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-64.png DESTINATION share/icons/hicolor/64x64/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-96.png DESTINATION share/icons/hicolor/96x96/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-128.png DESTINATION share/icons/hicolor/128x128/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-256.png DESTINATION share/icons/hicolor/256x256/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/res/mgba-512.png DESTINATION share/icons/hicolor/512x512/apps RENAME mgba.png COMPONENT lib${BINARY_NAME}) endif() else() set(BUILD_SHARED OFF)@@ -919,7 +928,7 @@
add_executable(${BINARY_NAME}-perf ${PERF_SRC}) target_link_libraries(${BINARY_NAME}-perf ${BINARY_NAME} ${PERF_LIB} ${OS_LIB}) set_target_properties(${BINARY_NAME}-perf PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") - install(TARGETS ${BINARY_NAME}-perf DESTINATION bin COMPONENT ${BINARY_NAME}-perf) + install(TARGETS ${BINARY_NAME}-perf DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-perf) install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/tools/perf.py DESTINATION "${LIBDIR}/${BINARY_NAME}" COMPONENT ${BINARY_NAME}-perf) endif()@@ -930,7 +939,7 @@ set_target_properties(${BINARY_NAME}-fuzz PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}")
add_executable(tbl-fuzz ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/test/tbl-fuzz-main.c) target_link_libraries(tbl-fuzz ${BINARY_NAME}) set_target_properties(tbl-fuzz PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") - install(TARGETS ${BINARY_NAME}-fuzz tbl-fuzz DESTINATION bin COMPONENT ${BINARY_NAME}-test) + install(TARGETS ${BINARY_NAME}-fuzz tbl-fuzz DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-test) endif() if(NOT USE_CMOCKA)@@ -971,6 +980,38 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/core/flags.h.in ${CMAKE_CURRENT_BINARY_DIR}/flags.h)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/flags.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/mgba COMPONENT lib${BINARY_NAME}) # Packaging +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/res/licenses DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME}) +if(EXTRA_LICENSES) + install(FILES ${EXTRA_LICENSES} DESTINATION ${CMAKE_INSTALL_DOCDIR}/licenses COMPONENT ${BINARY_NAME}) +endif() + +file(GLOB READMES ${CMAKE_CURRENT_SOURCE_DIR}/README*.md) + +find_program(DOS2UNIX NAMES dos2unix) +find_program(MARKDOWN NAMES markdown kramdown pandoc) + +if(UNIX OR NOT DOS2UNIX) + if(UNIX OR NOT MARKDOWN) + install(FILES ${READMES} DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME}) + endif() + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES" "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME}) +else() + add_custom_command(OUTPUT CHANGES.txt COMMAND ${DOS2UNIX} -n "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES" "${CMAKE_CURRENT_BINARY_DIR}/CHANGES.txt" MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/CHANGES") + add_custom_command(OUTPUT LICENSE.txt COMMAND ${DOS2UNIX} -n "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE" "${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt" MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") + add_custom_target(CHANGES ALL DEPENDS CHANGES.txt) + add_custom_target(LICENSE ALL DEPENDS LICENSE.txt) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CHANGES.txt ${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME}) +endif() + +if(MARKDOWN) + foreach(README ${READMES}) + get_filename_component(README_BASE "${README}" NAME_WE) + add_custom_command(OUTPUT ${README_BASE}.html COMMAND ${MARKDOWN} "${README}" > ${README_BASE}.html MAIN_DEPENDENCY "${README}") + add_custom_target(${README_BASE} ALL DEPENDS ${README_BASE}.html) + install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${README_BASE}.html DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT ${BINARY_NAME}) + endforeach() +endif() + set(CPACK_PACKAGE_VERSION ${VERSION_STRING}) set(CPACK_PACKAGE_VERSION_MAJOR ${LIB_VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${LIB_VERSION_MINOR})@@ -986,12 +1027,59 @@ set(CPACK_DEBIAN_PACKAGE_SECTION "games")
SET(CPACK_DEB_COMPONENT_INSTALL ON) -set(CPACK_STRIP_FILES ${BINARY_NAME}) +set(CPACK_STRIP_FILES ON) -file(GLOB READMES ${CMAKE_CURRENT_SOURCE_DIR}/README*.md) -install(FILES ${READMES} ${CMAKE_CURRENT_SOURCE_DIR}/CHANGES DESTINATION ${CMAKE_INSTALL_DOCDIR} COMPONENT lib${BINARY_NAME}) +if(DISTBUILD) + set(CPACK_ARCHIVE_COMPONENT_INSTALL ON) + if(WIN32 OR APPLE) + set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-qt ${BINARY_NAME}-sdl ${BINARY_NAME}-perf) + set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE) + elseif(3DS) + set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-3ds ${BINARY_NAME}-perf) + elseif(WII) + set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-wii) + elseif(PSP2) + set(CPACK_COMPONENTS_ALL ${BINARY_NAME} ${BINARY_NAME}-psp2) + endif() +endif() include(CPack) + +cpack_add_component_group(base) +cpack_add_component(${BINARY_NAME} GROUP base) + +cpack_add_component_group(dev PARENT_GROUP base) +if(BUILD_SHARED) + cpack_add_component(lib${BINARY_NAME} GROUP base) + if(BUILD_STATIC) + cpack_add_component(lib${BINARY_NAME}-static GROUP dev) + endif() +elseif(BUILD_STATIC) + cpack_add_component(lib${BINARY_NAME} GROUP dev) +endif() + +if(3DS) + cpack_add_component(${BINARY_NAME}-3ds GROUP base) +elseif(PSP2) + cpack_add_component(${BINARY_NAME}-psp2 GROUP base) +elseif(WII) + cpack_add_component(${BINARY_NAME}-wii GROUP base) +endif() + +if(BUILD_QT) + cpack_add_component_group(qt PARENT_GROUP base) + cpack_add_component(${BINARY_NAME}-qt GROUP qt DEPENDS base) +endif() + +if(BUILD_SDL) + cpack_add_component_group(sdl PARENT_GROUP base) + cpack_add_component(${BINARY_NAME}-sdl GROUP sdl DEPENDS base) +endif() + +cpack_add_component_group($test PARENT_GROUP dev) +cpack_add_component(${BINARY_NAME}-perf GROUP test DEPENDS dev) +cpack_add_component(${BINARY_NAME}-fuzz GROUP test DEPENDS dev) +cpack_add_component(tbl-fuzz GROUP test DEPENDS dev) # Summaries set(SUMMARY_GL_LIST)
@@ -119,13 +119,13 @@
#define STORE_32LE(SRC, ADDR, ARR) { \ uint32_t _addr = (ADDR); \ void* _ptr = (ARR); \ - __asm__("stwbrx %0, %1, %2" : : "r"(SRC), "b"(_ptr), "r"(_addr)); \ + __asm__("stwbrx %0, %1, %2" : : "r"(SRC), "b"(_ptr), "r"(_addr) : "memory"); \ } #define STORE_16LE(SRC, ADDR, ARR) { \ uint32_t _addr = (ADDR); \ void* _ptr = (ARR); \ - __asm__("sthbrx %0, %1, %2" : : "r"(SRC), "b"(_ptr), "r"(_addr)); \ + __asm__("sthbrx %0, %1, %2" : : "r"(SRC), "b"(_ptr), "r"(_addr) : "memory"); \ } #define LOAD_64LE(DEST, ADDR, ARR) { \@@ -141,7 +141,7 @@ const void* _ptr = (ARR); \
__asm__( \ "lwbrx %0, %2, %3 \n" \ "lwbrx %1, %2, %4 \n" \ - : "=r"(bswap->lo), "=r"(bswap->hi) : "b"(_ptr), "r"(_addr), "r"(_addr + 4)); \ + : "=&r"(bswap->lo), "=&r"(bswap->hi) : "b"(_ptr), "r"(_addr), "r"(_addr + 4)) ; \ } #define STORE_64LE(SRC, ADDR, ARR) { \@@ -157,7 +157,7 @@ const void* _ptr = (ARR); \
__asm__( \ "stwbrx %0, %2, %3 \n" \ "stwbrx %1, %2, %4 \n" \ - : : "r"(bswap->hi), "r"(bswap->lo), "b"(_ptr), "r"(_addr), "r"(_addr + 4)); \ + : : "r"(bswap->hi), "r"(bswap->lo), "b"(_ptr), "r"(_addr), "r"(_addr + 4) : "memory"); \ } #elif defined(__llvm__) || (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)@@ -192,10 +192,12 @@ #ifdef _MSC_VER
#define ATTRIBUTE_UNUSED #define ATTRIBUTE_ALIGN(X) #define ATTRIBUTE_FORMAT(X, Y, Z) +#define ATTRIBUTE_NOINLINE #else #define ATTRIBUTE_UNUSED __attribute__((unused)) #define ATTRIBUTE_ALIGN(X) __attribute__((aligned(X))) #define ATTRIBUTE_FORMAT(X, Y, Z) __attribute__((format(X, Y, Z))) +#define ATTRIBUTE_NOINLINE __attribute__((noinline)) #endif #define DECL_BITFIELD(NAME, TYPE) typedef TYPE NAME
@@ -161,6 +161,8 @@ struct blip_t* left;
struct blip_t* right; int16_t lastLeft; int16_t lastRight; + int32_t capLeft; + int32_t capRight; int clock; int32_t clockRate;
@@ -103,7 +103,8 @@ * | bit 4: Is channel 1 sweep enabled?
* | bit 5: Has channel 1 sweep occurred? * | bit 6: Is channel 3's memory readable? * | bit 7: Reserved - * | 0x000A8 - 0x000AF: Rserved + * | 0x000A8 - 0x000AB: Left capacitor charge + * | 0x000AC - 0x000AF: Right capacitor charge * | 0x000B0 - 0x000B3: Next sample * 0x000B4 - 0x000153: Video state * | 0x000B4 - 0x000B5: Current x@@ -302,7 +303,8 @@
struct { struct GBSerializedPSGState psg; GBSerializedAudioFlags flags; - int32_t reserved[2]; + int32_t capLeft; + int32_t capRight; uint32_t nextSample; } audio;
@@ -112,7 +112,6 @@ int idleDetectionFailures;
int32_t cachedRegisters[16]; bool taintedRegisters[16]; - bool realisticTiming; bool hardCrash; bool allowOpposingDirections;
@@ -87,7 +87,6 @@
uint8_t* currentBank; struct mTiming* timing; - bool realisticTiming; unsigned settling; struct mTimingEvent dust;@@ -105,10 +104,10 @@ void GBASavedataUnmask(struct GBASavedata* savedata);
size_t GBASavedataSize(const struct GBASavedata* savedata); bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out); bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in); -void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type, bool realisticTiming); +void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type); -void GBASavedataInitFlash(struct GBASavedata* savedata, bool realisticTiming); -void GBASavedataInitEEPROM(struct GBASavedata* savedata, bool realisticTiming); +void GBASavedataInitFlash(struct GBASavedata* savedata); +void GBASavedataInitEEPROM(struct GBASavedata* savedata); void GBASavedataInitSRAM(struct GBASavedata* savedata); uint8_t GBASavedataReadFlash(struct GBASavedata* savedata, uint16_t address);
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 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. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +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 and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, 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 library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete 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 distribute a copy of this License along with the +Library. + + 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 Library or any portion +of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +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 Library, 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 Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you 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. + + If distribution of 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 satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be 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. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library 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. + + 9. 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 Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +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 with +this License. + + 11. 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 Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library 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 Library. + +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. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library 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. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser 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 Library +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 Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +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 + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "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 +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. 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 LIBRARY 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 +LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. 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. + + <one line to give the library's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; 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. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + <signature of Ty Coon>, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + +
@@ -0,0 +1,27 @@
+ +The "inih" library is distributed under the New BSD license: + +Copyright (c) 2009, Ben Hoyt +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Ben Hoyt nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY BEN HOYT ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BEN HOYT BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -93,7 +93,7 @@ }
static inline uint32_t _printLine(struct CLIDebugger* debugger, uint32_t address, enum ExecutionMode mode) { struct CLIDebuggerBackend* be = debugger->backend; - char disassembly[48]; + char disassembly[64]; struct ARMInstructionInfo info; be->printf(be, "%08X: ", address); if (mode == MODE_ARM) {
@@ -8,7 +8,7 @@
#include <mgba/internal/arm/decoder-inlines.h> #define ADVANCE(AMOUNT) \ - if (AMOUNT > blen) { \ + if (AMOUNT >= blen) { \ buffer[blen - 1] = '\0'; \ return total; \ } \
@@ -185,15 +185,32 @@
// Instruction definitions // Beware pre-processor antics +ATTRIBUTE_NOINLINE static void _additionS(struct ARMCore* cpu, int32_t m, int32_t n, int32_t d) { + cpu->cpsr.n = ARM_SIGN(d); + cpu->cpsr.z = !d; + cpu->cpsr.c = ARM_CARRY_FROM(m, n, d); + cpu->cpsr.v = ARM_V_ADDITION(m, n, d); +} + +ATTRIBUTE_NOINLINE static void _subtractionS(struct ARMCore* cpu, int32_t m, int32_t n, int32_t d) { + cpu->cpsr.n = ARM_SIGN(d); + cpu->cpsr.z = !d; + cpu->cpsr.c = ARM_BORROW_FROM(m, n, d); + cpu->cpsr.v = ARM_V_SUBTRACTION(m, n, d); +} + +ATTRIBUTE_NOINLINE static void _neutralS(struct ARMCore* cpu, int32_t d) { + cpu->cpsr.n = ARM_SIGN(d); + cpu->cpsr.z = !d; \ + cpu->cpsr.c = cpu->shifterCarryOut; \ +} + #define ARM_ADDITION_S(M, N, D) \ if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \ cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - cpu->cpsr.n = ARM_SIGN(D); \ - cpu->cpsr.z = !(D); \ - cpu->cpsr.c = ARM_CARRY_FROM(M, N, D); \ - cpu->cpsr.v = ARM_V_ADDITION(M, N, D); \ + _additionS(cpu, M, N, D); \ } #define ARM_SUBTRACTION_S(M, N, D) \@@ -201,10 +218,7 @@ if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \
cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - cpu->cpsr.n = ARM_SIGN(D); \ - cpu->cpsr.z = !(D); \ - cpu->cpsr.c = ARM_BORROW_FROM(M, N, D); \ - cpu->cpsr.v = ARM_V_SUBTRACTION(M, N, D); \ + _subtractionS(cpu, M, N, D); \ } #define ARM_SUBTRACTION_CARRY_S(M, N, D, C) \@@ -223,9 +237,7 @@ if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \
cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - cpu->cpsr.n = ARM_SIGN(D); \ - cpu->cpsr.z = !(D); \ - cpu->cpsr.c = cpu->shifterCarryOut; \ + _neutralS(cpu, D); \ } #define ARM_NEUTRAL_HI_S(DLO, DHI) \
@@ -140,6 +140,8 @@ audio->frame = 0;
audio->sampleInterval = 128; audio->lastLeft = 0; audio->lastRight = 0; + audio->capLeft = 0; + audio->capRight = 0; audio->clock = 0; audio->volumeRight = 0; audio->volumeLeft = 0;@@ -212,7 +214,6 @@ if (GBAudioRegisterControlIsRestart(value << 8)) {
audio->playingCh1 = _resetEnvelope(&audio->ch1.envelope); if (audio->playingCh1) { - audio->ch1.control.hi = 0; _updateSquareSample(&audio->ch1); }@@ -227,8 +228,7 @@ if (audio->ch1.control.stop && !(audio->frame & 1)) {
--audio->ch1.control.length; } } - mTimingDeschedule(audio->timing, &audio->ch1Event); - if (audio->playingCh1 && audio->ch1.envelope.dead != 2) { + if (audio->playingCh1 && audio->ch1.envelope.dead != 2 && !mTimingIsScheduled(audio->timing, &audio->ch1Event)) { mTimingSchedule(audio->timing, &audio->ch1Event, 0); } }@@ -270,7 +270,6 @@ if (GBAudioRegisterControlIsRestart(value << 8)) {
audio->playingCh2 = _resetEnvelope(&audio->ch2.envelope); if (audio->playingCh2) { - audio->ch2.control.hi = 0; _updateSquareSample(&audio->ch2); }@@ -280,8 +279,7 @@ if (audio->ch2.control.stop && !(audio->frame & 1)) {
--audio->ch2.control.length; } } - mTimingDeschedule(audio->timing, &audio->ch2Event); - if (audio->playingCh2 && audio->ch2.envelope.dead != 2) { + if (audio->playingCh2 && audio->ch2.envelope.dead != 2 && !mTimingIsScheduled(audio->timing, &audio->ch2Event)) { mTimingSchedule(audio->timing, &audio->ch2Event, 0); } }@@ -397,8 +395,7 @@ if (audio->ch4.stop && !(audio->frame & 1)) {
--audio->ch4.length; } } - mTimingDeschedule(audio->timing, &audio->ch4Event); - if (audio->playingCh4 && audio->ch4.envelope.dead != 2) { + if (audio->playingCh4 && audio->ch4.envelope.dead != 2 && !mTimingIsScheduled(audio->timing, &audio->ch4Event)) { mTimingSchedule(audio->timing, &audio->ch4Event, 0); } }@@ -574,7 +571,7 @@
if (audio->playingCh4 && !audio->ch4.envelope.dead) { --audio->ch4.envelope.nextStep; if (audio->ch4.envelope.nextStep == 0) { - int8_t sample = (audio->ch4.sample >> 7) * 0x8; + int8_t sample = (audio->ch4.sample > 0) * 0x8; _updateEnvelope(&audio->ch4.envelope); if (audio->ch4.envelope.dead == 2) { mTimingDeschedule(timing, &audio->ch4Event);@@ -630,7 +627,7 @@ sampleRight += audio->ch4.sample;
} } - int dcOffset = audio->style == GB_AUDIO_GBA ? 0 : 0x1FC; + int dcOffset = audio->style == GB_AUDIO_GBA ? 0 : 0x20A; *left = (sampleLeft - dcOffset) * (1 + audio->volumeLeft); *right = (sampleRight - dcOffset) * (1 + audio->volumeRight); }@@ -640,16 +637,22 @@ struct GBAudio* audio = user;
int16_t sampleLeft = 0; int16_t sampleRight = 0; GBAudioSamplePSG(audio, &sampleLeft, &sampleRight); - sampleLeft = (sampleLeft * audio->masterVolume) >> 6; - sampleRight = (sampleRight * audio->masterVolume) >> 6; + sampleLeft = (sampleLeft * audio->masterVolume * 9) >> 7; + sampleRight = (sampleRight * audio->masterVolume * 9) >> 7; mCoreSyncLockAudio(audio->p->sync); unsigned produced; + + int16_t degradedLeft = sampleLeft - (audio->capLeft >> 16); + int16_t degradedRight = sampleRight - (audio->capRight >> 16); + audio->capLeft = (sampleLeft << 16) - degradedLeft * 65184; + audio->capRight = (sampleRight << 16) - degradedRight * 65184; + sampleLeft = degradedLeft; + sampleRight = degradedRight; + if ((size_t) blip_samples_avail(audio->left) < audio->samples) { blip_add_delta(audio->left, audio->clock, sampleLeft - audio->lastLeft); blip_add_delta(audio->right, audio->clock, sampleRight - audio->lastRight); - audio->lastLeft = sampleLeft; - audio->lastRight = sampleRight; audio->clock += audio->sampleInterval; if (audio->clock >= CLOCKS_PER_BLIP_FRAME) { blip_end_frame(audio->left, CLOCKS_PER_BLIP_FRAME);@@ -657,6 +660,8 @@ blip_end_frame(audio->right, CLOCKS_PER_BLIP_FRAME);
audio->clock -= CLOCKS_PER_BLIP_FRAME; } } + audio->lastLeft = sampleLeft; + audio->lastRight = sampleRight; produced = blip_samples_avail(audio->left); if (audio->p->stream && audio->p->stream->postAudioFrame) { audio->p->stream->postAudioFrame(audio->p->stream, sampleLeft, sampleRight);@@ -1025,11 +1030,15 @@ }
void GBAudioSerialize(const struct GBAudio* audio, struct GBSerializedState* state) { GBAudioPSGSerialize(audio, &state->audio.psg, &state->audio.flags); + STORE_32LE(audio->capLeft, 0, &state->audio.capLeft); + STORE_32LE(audio->capRight, 0, &state->audio.capRight); STORE_32LE(audio->sampleEvent.when - mTimingCurrentTime(audio->timing), 0, &state->audio.nextSample); } void GBAudioDeserialize(struct GBAudio* audio, const struct GBSerializedState* state) { GBAudioPSGDeserialize(audio, &state->audio.psg, &state->audio.flags); + LOAD_32LE(audio->capLeft, 0, &state->audio.capLeft); + LOAD_32LE(audio->capRight, 0, &state->audio.capRight); uint32_t when; LOAD_32LE(when, 0, &state->audio.nextSample); mTimingSchedule(audio->timing, &audio->sampleEvent, when);
@@ -229,7 +229,11 @@ renderer->currentWy -= renderer->lastY;
renderer->hasWindow = true; } else { if (!renderer->hasWindow) { - renderer->currentWy = renderer->lastY - renderer->wy; + if (renderer->lastY > renderer->wy) { + renderer->currentWy = GB_VIDEO_VERTICAL_PIXELS; + } else { + renderer->currentWy = renderer->lastY - renderer->wy; + } } else { renderer->currentWy += renderer->lastY; }
@@ -253,7 +253,7 @@ sample = 0x3FF;
} else if (sample < 0) { sample = 0; } - return ((sample - GBARegisterSOUNDBIASGetBias(audio->soundbias)) * audio->masterVolume) >> 3; + return ((sample - GBARegisterSOUNDBIASGetBias(audio->soundbias)) * audio->masterVolume) >> 2; } static void _sample(struct mTiming* timing, void* user, uint32_t cyclesLate) {
@@ -265,7 +265,7 @@ } else {
if (sourceRegion == REGION_CART2_EX && memory->savedata.type == SAVEDATA_EEPROM) { if (memory->savedata.type == SAVEDATA_AUTODETECT) { mLOG(GBA_MEM, INFO, "Detected EEPROM savegame"); - GBASavedataInitEEPROM(&memory->savedata, gba->realisticTiming); + GBASavedataInitEEPROM(&memory->savedata); } memory->dmaTransferRegister = GBASavedataReadEEPROM(&memory->savedata); } else {@@ -276,7 +276,7 @@ }
if (destRegion == REGION_CART2_EX) { if (memory->savedata.type == SAVEDATA_AUTODETECT) { mLOG(GBA_MEM, INFO, "Detected EEPROM savegame"); - GBASavedataInitEEPROM(&memory->savedata, gba->realisticTiming); + GBASavedataInitEEPROM(&memory->savedata); } GBASavedataWriteEEPROM(&memory->savedata, memory->dmaTransferRegister, wordsRemaining); } else {
@@ -105,7 +105,6 @@
gba->idleOptimization = IDLE_LOOP_REMOVE; gba->idleLoop = IDLE_LOOP_NONE; - gba->realisticTiming = true; gba->hardCrash = true; gba->allowOpposingDirections = true;
@@ -165,7 +165,6 @@ case 0:
if ((hw->pinState & 5) == 1) { hw->rtc.transferStep = 1; } - _outputPins(hw, 1); break; case 1: if ((hw->pinState & 5) == 5) {@@ -173,7 +172,6 @@ hw->rtc.transferStep = 2;
} else { hw->rtc.transferStep = 0; } - _outputPins(hw, 5); break; case 2: if (!(hw->pinState & 1)) {
@@ -895,7 +895,7 @@ break;
case REGION_CART2_EX: if (memory->savedata.type == SAVEDATA_AUTODETECT) { mLOG(GBA_MEM, INFO, "Detected EEPROM savegame"); - GBASavedataInitEEPROM(&memory->savedata, gba->realisticTiming); + GBASavedataInitEEPROM(&memory->savedata); } GBASavedataWriteEEPROM(&memory->savedata, value, 1); break;@@ -961,7 +961,7 @@ case REGION_CART_SRAM_MIRROR:
if (memory->savedata.type == SAVEDATA_AUTODETECT) { if (address == SAVEDATA_FLASH_BASE) { mLOG(GBA_MEM, INFO, "Detected Flash savegame"); - GBASavedataInitFlash(&memory->savedata, gba->realisticTiming); + GBASavedataInitFlash(&memory->savedata); } else { mLOG(GBA_MEM, INFO, "Detected SRAM savegame"); GBASavedataInitSRAM(&memory->savedata);
@@ -296,7 +296,7 @@ }
void GBAOverrideApply(struct GBA* gba, const struct GBACartridgeOverride* override) { if (override->savetype != SAVEDATA_AUTODETECT) { - GBASavedataForceType(&gba->memory.savedata, override->savetype, gba->realisticTiming); + GBASavedataForceType(&gba->memory.savedata, override->savetype); } if (override->hardware != HW_NO_OVERRIDE) {
@@ -91,7 +91,7 @@ GBASavedataDeinit(savedata);
savedata->vf = vf; savedata->mapMode = MAP_READ; savedata->maskWriteback = writeback; - GBASavedataForceType(savedata, type, savedata->realisticTiming); + GBASavedataForceType(savedata, type); } void GBASavedataUnmask(struct GBASavedata* savedata) {@@ -103,7 +103,7 @@ struct VFile* vf = savedata->vf;
GBASavedataDeinit(savedata); savedata->vf = savedata->realVf; savedata->mapMode = MAP_WRITE; - GBASavedataForceType(savedata, type, savedata->realisticTiming); + GBASavedataForceType(savedata, type); if (savedata->maskWriteback) { GBASavedataLoad(savedata, vf); savedata->maskWriteback = false;@@ -193,7 +193,7 @@ }
return true; } -void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type, bool realisticTiming) { +void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type) { if (savedata->type != SAVEDATA_AUTODETECT) { struct VFile* vf = savedata->vf; GBASavedataDeinit(savedata);@@ -203,10 +203,10 @@ switch (type) {
case SAVEDATA_FLASH512: case SAVEDATA_FLASH1M: savedata->type = type; - GBASavedataInitFlash(savedata, realisticTiming); + GBASavedataInitFlash(savedata); break; case SAVEDATA_EEPROM: - GBASavedataInitEEPROM(savedata, realisticTiming); + GBASavedataInitEEPROM(savedata); break; case SAVEDATA_SRAM: GBASavedataInitSRAM(savedata);@@ -219,7 +219,7 @@ break;
} } -void GBASavedataInitFlash(struct GBASavedata* savedata, bool realisticTiming) { +void GBASavedataInitFlash(struct GBASavedata* savedata) { if (savedata->type == SAVEDATA_AUTODETECT) { savedata->type = SAVEDATA_FLASH512; }@@ -244,13 +244,12 @@ savedata->data = savedata->vf->map(savedata->vf, flashSize, savedata->mapMode);
} savedata->currentBank = savedata->data; - savedata->realisticTiming = realisticTiming; if (end < SIZE_CART_FLASH512) { memset(&savedata->data[end], 0xFF, flashSize - end); } } -void GBASavedataInitEEPROM(struct GBASavedata* savedata, bool realisticTiming) { +void GBASavedataInitEEPROM(struct GBASavedata* savedata) { if (savedata->type == SAVEDATA_AUTODETECT) { savedata->type = SAVEDATA_EEPROM; } else {@@ -271,7 +270,6 @@ eepromSize = SIZE_CART_EEPROM;
} savedata->data = savedata->vf->map(savedata->vf, eepromSize, savedata->mapMode); } - savedata->realisticTiming = realisticTiming; if (end < SIZE_CART_EEPROM512) { memset(&savedata->data[end], 0xFF, SIZE_CART_EEPROM512 - end); }@@ -327,10 +325,8 @@ case FLASH_COMMAND_PROGRAM:
savedata->dirty |= SAVEDATA_DIRT_NEW; savedata->currentBank[address] = value; savedata->command = FLASH_COMMAND_NONE; - if (savedata->realisticTiming) { - mTimingDeschedule(savedata->timing, &savedata->dust); - mTimingSchedule(savedata->timing, &savedata->dust, FLASH_PROGRAM_CYCLES); - } + mTimingDeschedule(savedata->timing, &savedata->dust); + mTimingSchedule(savedata->timing, &savedata->dust, FLASH_PROGRAM_CYCLES); break; case FLASH_COMMAND_SWITCH_BANK: if (address == 0 && value < 2) {@@ -452,10 +448,8 @@ current &= ~(1 << (0x7 - (savedata->writeAddress & 0x7)));
current |= (value & 0x1) << (0x7 - (savedata->writeAddress & 0x7)); savedata->dirty |= SAVEDATA_DIRT_NEW; savedata->data[savedata->writeAddress >> 3] = current; - if (savedata->realisticTiming) { - mTimingDeschedule(savedata->timing, &savedata->dust); - mTimingSchedule(savedata->timing, &savedata->dust, EEPROM_SETTLE_CYCLES); - } + mTimingDeschedule(savedata->timing, &savedata->dust); + mTimingSchedule(savedata->timing, &savedata->dust, EEPROM_SETTLE_CYCLES); ++savedata->writeAddress; } else { mLOG(GBA_SAVE, GAME_ERROR, "Writing beyond end of EEPROM: %08X", (savedata->writeAddress >> 3));@@ -478,7 +472,7 @@ }
uint16_t GBASavedataReadEEPROM(struct GBASavedata* savedata) { if (savedata->command != EEPROM_COMMAND_READ) { - if (!savedata->realisticTiming || !mTimingIsScheduled(savedata->timing, &savedata->dust)) { + if (!mTimingIsScheduled(savedata->timing, &savedata->dust)) { return 1; } else { return 0;@@ -516,12 +510,14 @@ } else if ((savedata->dirty & SAVEDATA_DIRT_SEEN) && frameCount - savedata->dirtAge > CLEANUP_THRESHOLD) {
if (savedata->maskWriteback) { GBASavedataUnmask(savedata); } - size_t size = GBASavedataSize(savedata); - savedata->dirty = 0; - if (savedata->data && savedata->vf->sync(savedata->vf, savedata->data, size)) { - mLOG(GBA_SAVE, INFO, "Savedata synced"); - } else { - mLOG(GBA_SAVE, INFO, "Savedata failed to sync!"); + if (savedata->mapMode & MAP_WRITE) { + size_t size = GBASavedataSize(savedata); + savedata->dirty = 0; + if (savedata->data && savedata->vf->sync(savedata->vf, savedata->data, size)) { + mLOG(GBA_SAVE, INFO, "Savedata synced"); + } else { + mLOG(GBA_SAVE, INFO, "Savedata failed to sync!"); + } } } }@@ -549,7 +545,7 @@
void GBASavedataDeserialize(struct GBASavedata* savedata, const struct GBASerializedState* state) { if (savedata->type != state->savedata.type) { mLOG(GBA_SAVE, DEBUG, "Switching save types"); - GBASavedataForceType(savedata, state->savedata.type, savedata->realisticTiming); + GBASavedataForceType(savedata, state->savedata.type); } savedata->command = state->savedata.command; GBASerializedSavedataFlags flags = state->savedata.flags;@@ -607,9 +603,7 @@ if (savedata->type == SAVEDATA_FLASH1M) {
mLOG(GBA_SAVE, DEBUG, "Performing unknown sector-size erase at 0x%04x", sectorStart); } savedata->settling = sectorStart >> 12; - if (savedata->realisticTiming) { - mTimingDeschedule(savedata->timing, &savedata->dust); - mTimingSchedule(savedata->timing, &savedata->dust, FLASH_ERASE_CYCLES); - } + mTimingDeschedule(savedata->timing, &savedata->dust); + mTimingSchedule(savedata->timing, &savedata->dust, FLASH_ERASE_CYCLES); memset(&savedata->currentBank[sectorStart & ~(size - 1)], 0xFF, size); }
@@ -117,7 +117,7 @@ uint32_t copySize = size - 0x1C;
switch (gba->memory.savedata.type) { case SAVEDATA_FLASH512: if (copySize > SIZE_CART_FLASH512) { - GBASavedataForceType(&gba->memory.savedata, SAVEDATA_FLASH1M, gba->memory.savedata.realisticTiming); + GBASavedataForceType(&gba->memory.savedata, SAVEDATA_FLASH1M); } // Fall through default:
@@ -409,7 +409,7 @@ return decoder(opcode, info);
} #define ADVANCE(AMOUNT) \ - if (AMOUNT > blen) { \ + if (AMOUNT >= blen) { \ buffer[blen - 1] = '\0'; \ return total; \ } \
@@ -109,7 +109,7 @@ ${3DSXTOOL} ../${BINARY_NAME}-perf ${BINARY_NAME}-perf.3dsx --smdh=${BINARY_NAME}.smdh
DEPENDS ${BINARY_NAME}-perf ${BINARY_NAME}.smdh) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${BINARY_NAME}-perf.3dsx - DESTINATION . COMPONENT ${BINARY_NAME}-3ds) + DESTINATION . COMPONENT ${BINARY_NAME}-perf) endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cia.rsf.in ${CMAKE_CURRENT_BINARY_DIR}/cia.rsf)
@@ -133,7 +133,7 @@ activeTexture = texture;
C3D_TexBind(0, activeTexture); C3D_TexEnv* env = C3D_GetTexEnv(0); - C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvInit(env); if (texture->fmt < GPU_LA8) { C3D_TexEnvSrc(env, C3D_Both, GPU_TEXTURE0, GPU_PRIMARY_COLOR, 0); C3D_TexEnvFunc(env, C3D_Both, GPU_MODULATE);@@ -144,11 +144,11 @@ C3D_TexEnvFunc(env, C3D_RGB, GPU_REPLACE);
C3D_TexEnvFunc(env, C3D_Alpha, GPU_MODULATE); } env = C3D_GetTexEnv(1); - C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvInit(env); C3D_TexEnvSrc(env, C3D_Both, GPU_PREVIOUS, 0, 0); C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE); env = C3D_GetTexEnv(2); - C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvInit(env); C3D_TexEnvSrc(env, C3D_Both, GPU_PREVIOUS, 0, 0); C3D_TexEnvFunc(env, C3D_Both, GPU_REPLACE);@@ -164,14 +164,14 @@ }
void ctrTextureMultiply(void) { C3D_TexEnv* env = C3D_GetTexEnv(1); - C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvInit(env); C3D_TexEnvSrc(env, C3D_Both, GPU_PREVIOUS, GPU_TEXTURE0, 0); C3D_TexEnvFunc(env, C3D_Both, GPU_MODULATE); } void ctrTextureBias(u32 color) { C3D_TexEnv* env = C3D_GetTexEnv(2); - C3D_TexEnvOp(env, C3D_Both, 0, 0, 0); + C3D_TexEnvInit(env); C3D_TexEnvSrc(env, C3D_Both, GPU_PREVIOUS, GPU_CONSTANT, 0); C3D_TexEnvFunc(env, C3D_Both, GPU_ADD); C3D_TexEnvColor(env, color);
@@ -87,7 +87,6 @@ // TODO: Move into context
static void* outputBuffer; static struct mAVStream stream; static int16_t* audioLeft = 0; -static int16_t* audioRight = 0; static size_t audioPos = 0; static C3D_Tex outputTexture; static ndspWaveBuf dspBuffer[DSP_BUFFERS];@@ -127,8 +126,6 @@ upscaleBuffer = C3D_RenderTargetCreateFromTex(&upscaleBufferTex, GPU_TEXFACE_2D, 0, 0);
if (!upscaleBuffer) { return false; } - - C3D_RenderTargetSetClear(upscaleBuffer, C3D_CLEAR_COLOR, 0, 0); return ctrInitGpu(); }@@ -183,6 +180,8 @@
static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* right); static void _drawStart(void) { + C3D_FrameBufClear(&bottomScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); + C3D_FrameBufClear(&topScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); } static void _frameStart(void) {@@ -199,9 +198,6 @@ tickCounter = svcGetSystemTick();
} } C3D_FrameBegin(flags); - // Mark both buffers used to make sure they get cleared - C3D_FrameDrawOn(topScreen[doubleBuffer]); - C3D_FrameDrawOn(bottomScreen[doubleBuffer]); ctrStartFrame(); }@@ -216,8 +212,6 @@ C3D_FrameEnd(GX_CMDLIST_FLUSH);
frameStarted = false; doubleBuffer ^= 1; - C3D_FrameBufClear(&bottomScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); - C3D_FrameBufClear(&topScreen[doubleBuffer]->frameBuf, C3D_CLEAR_COLOR, 0, 0); } static int _batteryState(void) {@@ -555,7 +549,7 @@
C3D_Tex* tex = &outputTexture; GSPGPU_FlushDataCache(outputBuffer, 256 * VIDEO_VERTICAL_PIXELS * 2); - C3D_SafeDisplayTransfer( + C3D_SyncDisplayTransfer( outputBuffer, GX_BUFFER_DIM(256, VIDEO_VERTICAL_PIXELS), tex->data, GX_BUFFER_DIM(256, 256), GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB565) |@@ -567,7 +561,6 @@ blip_clear(runner->core->getAudioChannel(runner->core, 0));
blip_clear(runner->core->getAudioChannel(runner->core, 1)); } - gspWaitForPPF(); _drawTex(runner->core, faded); }@@ -584,13 +577,12 @@ memset(&newPixels[y * 256 + width], 0, (256 - width) * sizeof(color_t));
} GSPGPU_FlushDataCache(newPixels, 256 * height * sizeof(u32)); - C3D_SafeDisplayTransfer( + C3D_SyncDisplayTransfer( (u32*) newPixels, GX_BUFFER_DIM(256, height), tex->data, GX_BUFFER_DIM(256, 256), GX_TRANSFER_IN_FORMAT(GX_TRANSFER_FMT_RGB565) | GX_TRANSFER_OUT_FORMAT(GX_TRANSFER_FMT_RGB565) | GX_TRANSFER_OUT_TILED(1) | GX_TRANSFER_FLIP_VERT(1)); - gspWaitForPPF(); linearFree(newPixels); _drawTex(runner->core, faded);
@@ -279,9 +279,21 @@ list(APPEND QT_LIBRARIES Qt5::Widgets)
if(BUILD_GL OR BUILD_GLES2) list(APPEND QT_LIBRARIES Qt5::OpenGL ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY}) endif() -if(WIN32 AND QT_STATIC) - list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport) - set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "qtpcre2;version;winmm;ws2_32") +if(QT_STATIC) + find_library(QTPCRE NAMES qtpcre2 qtpcre) + if(WIN32) + list(APPEND QT_LIBRARIES qwindows dwmapi imm32 uxtheme Qt5EventDispatcherSupport Qt5FontDatabaseSupport Qt5ThemeSupport) + set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};version;winmm;ws2_32") + elseif(APPLE) + find_package(Cups) + find_package(Qt5PrintSupport) + find_library(QTFREETYPE NAMES qtfreetype) + find_library(QTHARFBUZZ NAMES qtharfbuzzng qtharfbuzz) + find_library(QTPLATFORMSUPPORT NAMES Qt5PlatformSupport) + list(APPEND QT_LIBRARIES Cups Qt5::PrintSupport Qt5::QCocoaIntegrationPlugin Qt5::CoreAudioPlugin Qt5::AVFServicePlugin Qt5::QCocoaPrinterSupportPlugin ${QTPLATFORMSUPPORT} "-framework AVFoundation" "-framework CoreMedia") + set_target_properties(Qt5::Core PROPERTIES INTERFACE_LINK_LIBRARIES "${QTPCRE};${QTHARFBUZZ};${QTFREETYPE}") + link_directories() + endif() endif() target_link_libraries(${BINARY_NAME}-qt ${PLATFORM_LIBRARY} ${BINARY_NAME} ${QT_LIBRARIES}) set(CPACK_DEBIAN_PACKAGE_DEPENDS "${CPACK_DEBIAN_PACKAGE_DEPENDS}" PARENT_SCOPE)
@@ -1046,6 +1046,11 @@ addControlledAction(fileMenu, fileMenu->addAction(tr("Add folder to library..."), this, SLOT(addDirToLibrary())),
"addDirToLibrary"); #endif + QAction* loadAlternateSave = new QAction(tr("Load alternate save..."), fileMenu); + connect(loadAlternateSave, &QAction::triggered, [this]() { this->selectSave(false); }); + m_gameActions.append(loadAlternateSave); + addControlledAction(fileMenu, loadAlternateSave, "loadAlternateSave"); + QAction* loadTemporarySave = new QAction(tr("Load temporary save..."), fileMenu); connect(loadTemporarySave, &QAction::triggered, [this]() { this->selectSave(true); }); m_gameActions.append(loadTemporarySave);
@@ -19,11 +19,17 @@ #include <QTranslator>
#ifdef QT_STATIC #include <QtPlugin> -#ifdef _WIN32 +#ifdef Q_OS_WIN Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin); #ifdef BUILD_QT_MULTIMEDIA Q_IMPORT_PLUGIN(QWindowsAudioPlugin); Q_IMPORT_PLUGIN(DSServicePlugin); +#endif +#elif defined(Q_OS_MAC) +Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin); +#ifdef BUILD_QT_MULTIMEDIA +Q_IMPORT_PLUGIN(CoreAudioPlugin); +Q_IMPORT_PLUGIN(AVFServicePlugin); #endif #endif #endif
@@ -1105,6 +1105,34 @@ <translation>OBJ exportieren</translation>
</message> </context> <context> + <name>PlacementControl</name> + <message> + <location filename="../PlacementControl.ui" line="20"/> + <source>Adjust placement</source> + <translation>Lage anpassen</translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="26"/> + <source>All</source> + <translation>Alle</translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="65"/> + <source>Offset</source> + <translation>Versatz</translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="72"/> + <source>X</source> + <translation>X</translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="79"/> + <source>Y</source> + <translation>Y</translation> + </message> +</context> +<context> <name>PrinterView</name> <message> <location filename="../PrinterView.ui" line="14"/>@@ -3149,7 +3177,7 @@ </context>
<context> <name>QGBA::Window</name> <message> - <location filename="../Window.cpp" line="255"/> + <location filename="../Window.cpp" line="264"/> <source>Game Boy Advance ROMs (%1)</source> <translation>Game Boy Advance-ROMs (%1)</translation> </message>@@ -3159,67 +3187,67 @@ <source>DS ROMs (%1)</source>
<translation>DS-ROMs (%1)</translation> </message> <message> - <location filename="../Window.cpp" line="270"/> + <location filename="../Window.cpp" line="280"/> <source>Game Boy ROMs (%1)</source> <translation>Game Boy-ROMs (%1)</translation> </message> <message> - <location filename="../Window.cpp" line="275"/> + <location filename="../Window.cpp" line="284"/> <source>All ROMs (%1)</source> <translation>Alle ROMs (%1)</translation> </message> <message> - <location filename="../Window.cpp" line="276"/> + <location filename="../Window.cpp" line="285"/> <source>%1 Video Logs (*.mvl)</source> <translation>%1 Video-Logs (*.mvl)</translation> </message> <message> - <location filename="../Window.cpp" line="291"/> + <location filename="../Window.cpp" line="300"/> <source>Archives (%1)</source> <translation>Archive (%1)</translation> </message> <message> - <location filename="../Window.cpp" line="296"/> - <location filename="../Window.cpp" line="304"/> - <location filename="../Window.cpp" line="331"/> + <location filename="../Window.cpp" line="305"/> + <location filename="../Window.cpp" line="313"/> + <location filename="../Window.cpp" line="340"/> <source>Select ROM</source> <translation>ROM auswählen</translation> </message> <message> - <location filename="../Window.cpp" line="339"/> + <location filename="../Window.cpp" line="348"/> <source>Game Boy Advance save files (%1)</source> <translation>Game Boy Advance-Speicherdateien (%1)</translation> </message> <message> - <location filename="../Window.cpp" line="340"/> - <location filename="../Window.cpp" line="385"/> - <location filename="../Window.cpp" line="392"/> + <location filename="../Window.cpp" line="349"/> + <location filename="../Window.cpp" line="394"/> + <location filename="../Window.cpp" line="401"/> <source>Select save</source> <translation>Speicherdatei wählen</translation> </message> <message> - <location filename="../Window.cpp" line="361"/> + <location filename="../Window.cpp" line="370"/> <source>Select patch</source> <translation>Patch wählen</translation> </message> <message> - <location filename="../Window.cpp" line="361"/> + <location filename="../Window.cpp" line="370"/> <source>Patches (*.ips *.ups *.bps)</source> <translation>Patches (*.ips *.ups *.bps)</translation> </message> <message> - <location filename="../Window.cpp" line="378"/> + <location filename="../Window.cpp" line="387"/> <source>Select image</source> <translation>Bild auswählen</translation> </message> <message> - <location filename="../Window.cpp" line="378"/> + <location filename="../Window.cpp" line="387"/> <source>Image file (*.png *.gif *.jpg *.jpeg);;All files (*)</source> <translation>Bild-Datei (*.png *.gif *.jpg *.jpeg);;Alle Dateien (*)</translation> </message> <message> - <location filename="../Window.cpp" line="385"/> - <location filename="../Window.cpp" line="392"/> + <location filename="../Window.cpp" line="394"/> + <location filename="../Window.cpp" line="401"/> <source>GameShark saves (*.sps *.xps)</source> <translation>GameShark-Speicherdaten (*.sps *.xps)</translation> </message>@@ -3239,17 +3267,17 @@ <source>Select video log</source>
<translation>Video-Log auswählen</translation> </message> <message> - <location filename="../Window.cpp" line="415"/> + <location filename="../Window.cpp" line="426"/> <source>Video logs (*.mvl)</source> <translation>Video-Logs (*.mvl)</translation> </message> <message> - <location filename="../Window.cpp" line="759"/> + <location filename="../Window.cpp" line="768"/> <source>Crash</source> <translation>Absturz</translation> </message> <message> - <location filename="../Window.cpp" line="760"/> + <location filename="../Window.cpp" line="769"/> <source>The game has crashed with the following error: %1</source>@@ -3258,528 +3286,538 @@
%1</translation> </message> <message> - <location filename="../Window.cpp" line="768"/> + <location filename="../Window.cpp" line="777"/> <source>Couldn't Load</source> <translation>Konnte nicht geladen werden</translation> </message> <message> - <location filename="../Window.cpp" line="769"/> + <location filename="../Window.cpp" line="778"/> <source>Could not load game. Are you sure it's in the correct format?</source> <translation>Konnte das Spiel nicht laden. Sind Sie sicher, dass es im korrekten Format vorliegt?</translation> </message> <message> - <location filename="../Window.cpp" line="782"/> + <location filename="../Window.cpp" line="791"/> <source>Unimplemented BIOS call</source> <translation>Nicht implementierter BIOS-Aufruf</translation> </message> <message> - <location filename="../Window.cpp" line="783"/> + <location filename="../Window.cpp" line="792"/> <source>This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience.</source> <translation>Dieses Spiel verwendet einen BIOS-Aufruf, der nicht implementiert ist. Bitte verwenden Sie für die beste Spielerfahrung das offizielle BIOS.</translation> </message> <message> - <location filename="../Window.cpp" line="858"/> + <location filename="../Window.cpp" line="873"/> <source>Really make portable?</source> <translation>Portablen Modus wirklich aktivieren?</translation> </message> <message> - <location filename="../Window.cpp" line="859"/> + <location filename="../Window.cpp" line="874"/> <source>This will make the emulator load its configuration from the same directory as the executable. Do you want to continue?</source> <translation>Diese Einstellung wird den Emulator so konfigurieren, dass er seine Konfiguration aus dem gleichen Verzeichnis wie die Programmdatei lädt. Möchten Sie fortfahren?</translation> </message> <message> - <location filename="../Window.cpp" line="867"/> + <location filename="../Window.cpp" line="882"/> <source>Restart needed</source> <translation>Neustart benötigt</translation> </message> <message> - <location filename="../Window.cpp" line="868"/> + <location filename="../Window.cpp" line="883"/> <source>Some changes will not take effect until the emulator is restarted.</source> <translation>Einige Änderungen werden erst übernommen, wenn der Emulator neu gestartet wurde.</translation> </message> <message> - <location filename="../Window.cpp" line="914"/> + <location filename="../Window.cpp" line="929"/> <source> - Player %1 of %2</source> <translation> - Spieler %1 von %2</translation> </message> <message> - <location filename="../Window.cpp" line="925"/> + <location filename="../Window.cpp" line="940"/> <source>%1 - %2</source> <translation>%1 - %2</translation> </message> <message> - <location filename="../Window.cpp" line="927"/> + <location filename="../Window.cpp" line="942"/> <source>%1 - %2 - %3</source> <translation>%1 - %2 - %3</translation> </message> <message> - <location filename="../Window.cpp" line="929"/> + <location filename="../Window.cpp" line="944"/> <source>%1 - %2 (%3 fps) - %4</source> <translation>%1 - %2 (%3 Bilder/Sekunde) - %4</translation> </message> <message> - <location filename="../Window.cpp" line="964"/> + <location filename="../Window.cpp" line="980"/> <source>&File</source> <translation>&Datei</translation> </message> <message> - <location filename="../Window.cpp" line="967"/> + <location filename="../Window.cpp" line="983"/> <source>Load &ROM...</source> <translation>&ROM laden...</translation> </message> <message> - <location filename="../Window.cpp" line="970"/> + <location filename="../Window.cpp" line="986"/> <source>Load ROM in archive...</source> <translation>ROM aus Archiv laden...</translation> </message> <message> - <location filename="../Window.cpp" line="976"/> + <location filename="../Window.cpp" line="992"/> + <source>Load alternate save...</source> + <translation>Alternative Speicherdatei laden...</translation> + </message> + <message> + <location filename="../Window.cpp" line="997"/> <source>Load temporary save...</source> <translation>Temporäre Speicherdatei laden...</translation> </message> <message> - <location filename="../Window.cpp" line="981"/> + <location filename="../Window.cpp" line="1002"/> <source>Load &patch...</source> <translation>&Patch laden...</translation> </message> <message> - <location filename="../Window.cpp" line="984"/> + <location filename="../Window.cpp" line="1005"/> <source>Boot BIOS</source> <translation>BIOS booten</translation> </message> <message> - <location filename="../Window.cpp" line="991"/> + <location filename="../Window.cpp" line="1012"/> <source>Replace ROM...</source> <translation>ROM ersetzen...</translation> </message> <message> - <location filename="../Window.cpp" line="993"/> + <location filename="../Window.cpp" line="1014"/> <source>ROM &info...</source> <translation>ROM-&Informationen...</translation> </message> <message> - <location filename="../Window.cpp" line="998"/> + <location filename="../Window.cpp" line="1019"/> <source>Recent</source> <translation>Zuletzt verwendet</translation> </message> <message> - <location filename="../Window.cpp" line="1002"/> + <location filename="../Window.cpp" line="1023"/> <source>Make portable</source> <translation>Portablen Modus aktivieren</translation> </message> <message> - <location filename="../Window.cpp" line="1006"/> + <location filename="../Window.cpp" line="1027"/> <source>&Load state</source> <translation>Savestate (aktueller Zustand) &laden</translation> </message> <message> - <location filename="../Window.cpp" line="1007"/> + <location filename="../Window.cpp" line="1028"/> <source>F10</source> <translation>F10</translation> </message> <message> - <location filename="../Window.cpp" line="1013"/> + <location filename="../Window.cpp" line="1034"/> <source>&Save state</source> <translation>Savestate (aktueller Zustand) &speichern</translation> </message> <message> - <location filename="../Window.cpp" line="1014"/> + <location filename="../Window.cpp" line="1035"/> <source>Shift+F10</source> <translation>Umschalt+F10</translation> </message> <message> - <location filename="../Window.cpp" line="1020"/> + <location filename="../Window.cpp" line="1041"/> <source>Quick load</source> <translation>Schnell laden</translation> </message> <message> - <location filename="../Window.cpp" line="1021"/> + <location filename="../Window.cpp" line="1042"/> <source>Quick save</source> <translation>Schnell speichern</translation> </message> <message> - <location filename="../Window.cpp" line="1025"/> + <location filename="../Window.cpp" line="1046"/> <source>Load recent</source> <translation>Lade zuletzt gespeicherten Savestate</translation> </message> <message> - <location filename="../Window.cpp" line="1033"/> + <location filename="../Window.cpp" line="1054"/> <source>Save recent</source> <translation>Speichere aktuellen Zustand</translation> </message> <message> - <location filename="../Window.cpp" line="1044"/> + <location filename="../Window.cpp" line="1065"/> <source>Undo load state</source> <translation>Laden des Savestate rückgängig machen</translation> </message> <message> - <location filename="../Window.cpp" line="1045"/> + <location filename="../Window.cpp" line="1066"/> <source>F11</source> <translation>F11</translation> </message> <message> - <location filename="../Window.cpp" line="1053"/> + <location filename="../Window.cpp" line="1074"/> <source>Undo save state</source> <translation>Speichern des Savestate rückgängig machen</translation> </message> <message> - <location filename="../Window.cpp" line="1054"/> + <location filename="../Window.cpp" line="1075"/> <source>Shift+F11</source> <translation>Umschalt+F11</translation> </message> <message> - <location filename="../Window.cpp" line="1067"/> - <location filename="../Window.cpp" line="1076"/> + <location filename="../Window.cpp" line="1088"/> + <location filename="../Window.cpp" line="1097"/> <source>State &%1</source> <translation>Savestate &%1</translation> </message> <message> - <location filename="../Window.cpp" line="1068"/> + <location filename="../Window.cpp" line="1089"/> <source>F%1</source> <translation>F%1</translation> </message> <message> - <location filename="../Window.cpp" line="1077"/> + <location filename="../Window.cpp" line="1098"/> <source>Shift+F%1</source> <translation>Umschalt+F%1</translation> </message> <message> - <location filename="../Window.cpp" line="1087"/> + <location filename="../Window.cpp" line="1108"/> <source>Load camera image...</source> <translation>Lade Kamerabild...</translation> </message> <message> - <location filename="../Window.cpp" line="1093"/> + <location filename="../Window.cpp" line="1114"/> <source>Import GameShark Save</source> <translation>Importiere GameShark-Speicherstand</translation> </message> <message> - <location filename="../Window.cpp" line="1099"/> + <location filename="../Window.cpp" line="1120"/> <source>Export GameShark Save</source> <translation>Exportiere GameShark-Speicherstand</translation> </message> <message> - <location filename="../Window.cpp" line="1107"/> + <location filename="../Window.cpp" line="1128"/> <source>New multiplayer window</source> <translation>Neues Multiplayer-Fenster</translation> </message> <message> - <location filename="../Window.cpp" line="1117"/> + <location filename="../Window.cpp" line="1138"/> <source>About</source> <translation>Über</translation> </message> <message> - <location filename="../Window.cpp" line="1122"/> + <location filename="../Window.cpp" line="1143"/> <source>E&xit</source> <translation>&Beenden</translation> </message> <message> - <location filename="../Window.cpp" line="1125"/> + <location filename="../Window.cpp" line="1146"/> <source>&Emulation</source> <translation>&Emulation</translation> </message> <message> - <location filename="../Window.cpp" line="1127"/> + <location filename="../Window.cpp" line="1148"/> <source>&Reset</source> <translation>Zu&rücksetzen</translation> </message> <message> - <location filename="../Window.cpp" line="1128"/> + <location filename="../Window.cpp" line="1149"/> <source>Ctrl+R</source> <translation>Strg+R</translation> </message> <message> - <location filename="../Window.cpp" line="1135"/> + <location filename="../Window.cpp" line="1156"/> <source>Sh&utdown</source> <translation>Schli&eßen</translation> </message> <message> - <location filename="../Window.cpp" line="1143"/> + <location filename="../Window.cpp" line="1164"/> <source>Yank game pak</source> <translation>Spielmodul herausziehen</translation> </message> <message> - <location filename="../Window.cpp" line="1153"/> + <location filename="../Window.cpp" line="1174"/> <source>&Pause</source> <translation>&Pause</translation> </message> <message> - <location filename="../Window.cpp" line="1156"/> + <location filename="../Window.cpp" line="1177"/> <source>Ctrl+P</source> <translation>Strg+P</translation> </message> <message> - <location filename="../Window.cpp" line="1166"/> + <location filename="../Window.cpp" line="1187"/> <source>&Next frame</source> <translation>&Nächstes Bild</translation> </message> <message> - <location filename="../Window.cpp" line="1167"/> + <location filename="../Window.cpp" line="1188"/> <source>Ctrl+N</source> <translation>Strg+N</translation> </message> <message> - <location filename="../Window.cpp" line="1184"/> + <location filename="../Window.cpp" line="1205"/> <source>Fast forward (held)</source> <translation>Schneller Vorlauf (gehalten)</translation> </message> <message> - <location filename="../Window.cpp" line="1186"/> + <location filename="../Window.cpp" line="1207"/> <source>&Fast forward</source> <translation>Schneller &Vorlauf</translation> </message> <message> - <location filename="../Window.cpp" line="1189"/> + <location filename="../Window.cpp" line="1210"/> <source>Shift+Tab</source> <translation>Umschalt+Tab</translation> </message> <message> - <location filename="../Window.cpp" line="1196"/> + <location filename="../Window.cpp" line="1217"/> <source>Fast forward speed</source> <translation>Vorlauf-Geschwindigkeit</translation> </message> <message> - <location filename="../Window.cpp" line="1201"/> + <location filename="../Window.cpp" line="1222"/> <source>Unbounded</source> <translation>Unbegrenzt</translation> </message> <message> - <location filename="../Window.cpp" line="1205"/> + <location filename="../Window.cpp" line="1226"/> <source>%0x</source> <translation>%0x</translation> </message> <message> - <location filename="../Window.cpp" line="1217"/> + <location filename="../Window.cpp" line="1238"/> <source>Rewind (held)</source> <translation>Zurückspulen (gehalten)</translation> </message> <message> - <location filename="../Window.cpp" line="1219"/> + <location filename="../Window.cpp" line="1240"/> <source>Re&wind</source> <translation>Zur&ückspulen</translation> </message> <message> - <location filename="../Window.cpp" line="1220"/> + <location filename="../Window.cpp" line="1241"/> <source>~</source> <translation>~</translation> </message> <message> - <location filename="../Window.cpp" line="1228"/> + <location filename="../Window.cpp" line="1249"/> <source>Step backwards</source> <translation>Schrittweiser Rücklauf</translation> </message> <message> - <location filename="../Window.cpp" line="1229"/> + <location filename="../Window.cpp" line="1250"/> <source>Ctrl+B</source> <translation>Strg+B</translation> </message> <message> - <location filename="../Window.cpp" line="1238"/> + <location filename="../Window.cpp" line="1259"/> <source>Sync to &video</source> <translation>Mit &Video synchronisieren</translation> </message> <message> - <location filename="../Window.cpp" line="1245"/> + <location filename="../Window.cpp" line="1266"/> <source>Sync to &audio</source> <translation>Mit &Audio synchronisieren</translation> </message> <message> - <location filename="../Window.cpp" line="1253"/> + <location filename="../Window.cpp" line="1274"/> <source>Solar sensor</source> <translation>Solar-Sensor</translation> </message> <message> - <location filename="../Window.cpp" line="1255"/> + <location filename="../Window.cpp" line="1276"/> <source>Increase solar level</source> <translation>Sonnen-Level erhöhen</translation> </message> <message> - <location filename="../Window.cpp" line="1259"/> + <location filename="../Window.cpp" line="1280"/> <source>Decrease solar level</source> <translation>Sonnen-Level verringern</translation> </message> <message> - <location filename="../Window.cpp" line="1263"/> + <location filename="../Window.cpp" line="1284"/> <source>Brightest solar level</source> <translation>Hellster Sonnen-Level</translation> </message> <message> - <location filename="../Window.cpp" line="1267"/> + <location filename="../Window.cpp" line="1288"/> <source>Darkest solar level</source> <translation>Dunkelster Sonnen-Level</translation> </message> <message> - <location filename="../Window.cpp" line="1273"/> + <location filename="../Window.cpp" line="1294"/> <source>Brightness %1</source> <translation>Helligkeit %1</translation> </message> <message> - <location filename="../Window.cpp" line="1280"/> + <location filename="../Window.cpp" line="1301"/> <source>Audio/&Video</source> <translation>Audio/&Video</translation> </message> <message> - <location filename="../Window.cpp" line="1282"/> + <location filename="../Window.cpp" line="1303"/> <source>Frame size</source> <translation>Bildgröße</translation> </message> <message> - <location filename="../Window.cpp" line="1285"/> + <location filename="../Window.cpp" line="1306"/> <source>%1x</source> <translation>%1x</translation> </message> <message> - <location filename="../Window.cpp" line="1313"/> + <location filename="../Window.cpp" line="1334"/> <source>Toggle fullscreen</source> <translation>Vollbildmodus umschalten</translation> </message> <message> - <location filename="../Window.cpp" line="1316"/> + <location filename="../Window.cpp" line="1337"/> <source>Lock aspect ratio</source> <translation>Seitenverhältnis korrigieren</translation> </message> <message> - <location filename="../Window.cpp" line="1326"/> + <location filename="../Window.cpp" line="1347"/> <source>Force integer scaling</source> <translation>Pixelgenaue Skalierung (Integer scaling)</translation> </message> <message> - <location filename="../Window.cpp" line="1342"/> + <location filename="../Window.cpp" line="1363"/> <source>Frame&skip</source> <translation>Frame&skip</translation> </message> <message> - <location filename="../Window.cpp" line="1355"/> + <location filename="../Window.cpp" line="1376"/> <source>Mute</source> <translation>Stummschalten</translation> </message> <message> - <location filename="../Window.cpp" line="1362"/> + <location filename="../Window.cpp" line="1383"/> <source>FPS target</source> <translation>Bildwiederholrate</translation> </message> <message> - <location filename="../Window.cpp" line="1367"/> + <location filename="../Window.cpp" line="1388"/> <source>15</source> <translation>15</translation> </message> <message> - <location filename="../Window.cpp" line="1368"/> + <location filename="../Window.cpp" line="1389"/> <source>30</source> <translation>30</translation> </message> <message> - <location filename="../Window.cpp" line="1369"/> + <location filename="../Window.cpp" line="1390"/> <source>45</source> <translation>45</translation> </message> <message> - <location filename="../Window.cpp" line="1370"/> + <location filename="../Window.cpp" line="1391"/> <source>Native (59.7)</source> <translation>Nativ (59.7)</translation> </message> <message> - <location filename="../Window.cpp" line="1371"/> + <location filename="../Window.cpp" line="1392"/> <source>60</source> <translation>60</translation> </message> <message> - <location filename="../Window.cpp" line="1372"/> + <location filename="../Window.cpp" line="1393"/> <source>90</source> <translation>90</translation> </message> <message> - <location filename="../Window.cpp" line="1373"/> + <location filename="../Window.cpp" line="1394"/> <source>120</source> <translation>120</translation> </message> <message> - <location filename="../Window.cpp" line="1374"/> + <location filename="../Window.cpp" line="1395"/> <source>240</source> <translation>240</translation> </message> <message> - <location filename="../Window.cpp" line="1380"/> + <location filename="../Window.cpp" line="1401"/> <source>Take &screenshot</source> <translation>&Screenshot erstellen</translation> </message> <message> - <location filename="../Window.cpp" line="1381"/> + <location filename="../Window.cpp" line="1402"/> <source>F12</source> <translation>F12</translation> </message> <message> - <location filename="../Window.cpp" line="1390"/> + <location filename="../Window.cpp" line="1411"/> <source>Record output...</source> <translation>Ausgabe aufzeichen...</translation> </message> <message> - <location filename="../Window.cpp" line="1397"/> + <location filename="../Window.cpp" line="1418"/> <source>Record GIF...</source> <translation>GIF aufzeichen...</translation> </message> <message> - <location filename="../Window.cpp" line="1402"/> + <location filename="../Window.cpp" line="1423"/> <source>Record video log...</source> <translation>Video-Log aufzeichnen...</translation> </message> <message> - <location filename="../Window.cpp" line="1407"/> + <location filename="../Window.cpp" line="1428"/> <source>Stop video log</source> <translation>Video-Log beenden</translation> </message> <message> - <location filename="../Window.cpp" line="1415"/> + <location filename="../Window.cpp" line="1436"/> <source>Game Boy Printer...</source> <translation>Game Boy Printer...</translation> </message> <message> - <location filename="../Window.cpp" line="1427"/> + <location filename="../Window.cpp" line="1448"/> <source>Video layers</source> <translation>Video-Ebenen</translation> </message> <message> - <location filename="../Window.cpp" line="1430"/> + <location filename="../Window.cpp" line="1451"/> <source>Audio channels</source> <translation>Audio-Kanäle</translation> </message> <message> - <location filename="../Window.cpp" line="1433"/> + <location filename="../Window.cpp" line="1454"/> + <source>Adjust layer placement...</source> + <translation>Lage der Bildebenen anpassen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1459"/> <source>&Tools</source> <translation>&Werkzeuge</translation> </message> <message> - <location filename="../Window.cpp" line="1435"/> + <location filename="../Window.cpp" line="1461"/> <source>View &logs...</source> <translation>&Logs ansehen...</translation> </message> <message> - <location filename="../Window.cpp" line="1439"/> + <location filename="../Window.cpp" line="1465"/> <source>Game &overrides...</source> <translation>Spiel-&Überschreibungen...</translation> </message> <message> - <location filename="../Window.cpp" line="1453"/> + <location filename="../Window.cpp" line="1479"/> <source>Game &Pak sensors...</source> <translation>Game &Pak-Sensoren...</translation> </message> <message> - <location filename="../Window.cpp" line="1466"/> + <location filename="../Window.cpp" line="1492"/> <source>&Cheats...</source> <translation>&Cheats...</translation> </message> <message> - <location filename="../Window.cpp" line="1478"/> + <location filename="../Window.cpp" line="1504"/> <source>Open debugger console...</source> <translation>Debugger-Konsole äffnen...</translation> </message> <message> - <location filename="../Window.cpp" line="1484"/> + <location filename="../Window.cpp" line="1510"/> <source>Start &GDB server...</source> <translation>&GDB-Server starten...</translation> </message> <message> - <location filename="../Window.cpp" line="1472"/> + <location filename="../Window.cpp" line="1498"/> <source>Settings...</source> <translation>Einstellungen...</translation> </message>@@ -3804,37 +3842,37 @@ <source>Select folder</source>
<translation>Ordner auswählen</translation> </message> <message> - <location filename="../Window.cpp" line="972"/> + <location filename="../Window.cpp" line="988"/> <source>Add folder to library...</source> <translation>Ordner zur Bibliothek hinzufügen...</translation> </message> <message> - <location filename="../Window.cpp" line="1336"/> + <location filename="../Window.cpp" line="1357"/> <source>Bilinear filtering</source> <translation>Bilineare Filterung</translation> </message> <message> - <location filename="../Window.cpp" line="1492"/> + <location filename="../Window.cpp" line="1518"/> <source>View &palette...</source> <translation>&Palette betrachten...</translation> </message> <message> - <location filename="../Window.cpp" line="1497"/> + <location filename="../Window.cpp" line="1523"/> <source>View &sprites...</source> <translation>&Sprites betrachten...</translation> </message> <message> - <location filename="../Window.cpp" line="1502"/> + <location filename="../Window.cpp" line="1528"/> <source>View &tiles...</source> <translation>&Tiles betrachten...</translation> </message> <message> - <location filename="../Window.cpp" line="1507"/> + <location filename="../Window.cpp" line="1533"/> <source>View &map...</source> <translation>&Map betrachten...</translation> </message> <message> - <location filename="../Window.cpp" line="1512"/> + <location filename="../Window.cpp" line="1538"/> <source>View memory...</source> <translation>Speicher betrachten...</translation> </message>@@ -3849,72 +3887,72 @@ <source>Search memory...</source>
<translation>Speicher durchsuchen...</translation> </message> <message> - <location filename="../Window.cpp" line="1523"/> + <location filename="../Window.cpp" line="1549"/> <source>View &I/O registers...</source> <translation>&I/O-Register betrachten...</translation> </message> <message> - <location filename="../Window.cpp" line="1601"/> + <location filename="../Window.cpp" line="1627"/> <source>Exit fullscreen</source> <translation>Vollbildmodus beenden</translation> </message> <message> - <location filename="../Window.cpp" line="1614"/> + <location filename="../Window.cpp" line="1640"/> <source>GameShark Button (held)</source> <translation>GameShark-Taste (gehalten)</translation> </message> <message> - <location filename="../Window.cpp" line="1616"/> + <location filename="../Window.cpp" line="1642"/> <source>Autofire</source> <translation>Autofeuer</translation> </message> <message> - <location filename="../Window.cpp" line="1623"/> + <location filename="../Window.cpp" line="1649"/> <source>Autofire A</source> <translation>Autofeuer A</translation> </message> <message> - <location filename="../Window.cpp" line="1629"/> + <location filename="../Window.cpp" line="1655"/> <source>Autofire B</source> <translation>Autofeuer B</translation> </message> <message> - <location filename="../Window.cpp" line="1635"/> + <location filename="../Window.cpp" line="1661"/> <source>Autofire L</source> <translation>Autofeuer L</translation> </message> <message> - <location filename="../Window.cpp" line="1641"/> + <location filename="../Window.cpp" line="1667"/> <source>Autofire R</source> <translation>Autofeuer R</translation> </message> <message> - <location filename="../Window.cpp" line="1647"/> + <location filename="../Window.cpp" line="1673"/> <source>Autofire Start</source> <translation>Autofeuer Start</translation> </message> <message> - <location filename="../Window.cpp" line="1653"/> + <location filename="../Window.cpp" line="1679"/> <source>Autofire Select</source> <translation>Autofeuer Select</translation> </message> <message> - <location filename="../Window.cpp" line="1659"/> + <location filename="../Window.cpp" line="1685"/> <source>Autofire Up</source> <translation>Autofeuer nach oben</translation> </message> <message> - <location filename="../Window.cpp" line="1665"/> + <location filename="../Window.cpp" line="1691"/> <source>Autofire Right</source> <translation>Autofeuer rechts</translation> </message> <message> - <location filename="../Window.cpp" line="1671"/> + <location filename="../Window.cpp" line="1697"/> <source>Autofire Down</source> <translation>Autofeuer nach unten</translation> </message> <message> - <location filename="../Window.cpp" line="1677"/> + <location filename="../Window.cpp" line="1703"/> <source>Autofire Left</source> <translation>Autofeuer links</translation> </message>
@@ -64,8 +64,8 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fgnu89-inline")
add_executable(${BINARY_NAME}-rpi ${PLATFORM_SRC} ${MAIN_SRC}) set_target_properties(${BINARY_NAME}-rpi PROPERTIES COMPILE_DEFINITIONS "${FEATURE_DEFINES};${FUNCTION_DEFINES}") target_link_libraries(${BINARY_NAME}-rpi ${BINARY_NAME} ${PLATFORM_LIBRARY} ${OPENGLES2_LIBRARY}) - install(TARGETS ${BINARY_NAME}-rpi DESTINATION bin COMPONENT ${BINARY_NAME}-rpi) - unset(OPENGLES2_INCLUDE_DIR} CACHE) # Clear NOTFOUND + install(TARGETS ${BINARY_NAME}-rpi DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-rpi) + unset(OPENGLES2_INCLUDE_DIR CACHE) # Clear NOTFOUND endif() if(BUILD_PANDORA)
@@ -17,17 +17,17 @@
while [ $# -gt 0 ]; do DEB=$1 dpkg-deb -R $DEB deb-temp - mv $DEB $DEB~ - sed -i~ s/mgba-// deb-temp/DEBIAN/control PKG=`head -n1 deb-temp/DEBIAN/control | cut -f2 -d ' '` - echo Found pacakge $PKG + echo Found package $PKG case $PKG in - lib$BINARY) + *-base) + PKG=lib$BINARY rmdep sdl rmdep qt ;; - $BINARY-qt) + *-qt) + PKG=$BINARY-qt rmdep libav rmdep libedit rmdep libpng@@ -37,7 +37,8 @@ rmdep libswscale
rmdep zlib adddep lib$BINARY ;; - $BINARY-sdl) + *-sdl) + PKG=$BINARY-sdl rmdep libav rmdep libedit rmdep libpng@@ -55,10 +56,11 @@
sed -i~ "s/,,*/,/g" deb-temp/DEBIAN/control sed -i~ "s/,$//g" deb-temp/DEBIAN/control sed -i~ "/^[^:]*: $/d" deb-temp/DEBIAN/control + sed -i~ "s/^Package: .*$/Package: $PKG/" deb-temp/DEBIAN/control rm deb-temp/DEBIAN/control~ chmod 644 deb-temp/DEBIAN/md5sums chown -R root:root deb-temp - dpkg-deb -b deb-temp $DEB + dpkg-deb -b deb-temp $PKG.deb rm -rf deb-temp shift done