diff --git a/CHANGES b/CHANGES index f3a8cc539..68638bb67 100644 --- a/CHANGES +++ b/CHANGES @@ -18,9 +18,12 @@ Emulation fixes: Other fixes: - Core: Fix inconsistencies with setting game-specific overrides (fixes mgba.io/i/2963) - Debugger: Fix writing to specific segment in command-line debugger - - GB Serialize: Prevent loading invalid states where LY >= 144 in modes other than 1 - - GBA Hardware: Fix loading states unconditionally overwriting GPIO memory + - FFmpeg: Fix failing to record videos with CRF video (fixes mgba.io/i/3368) + - GB Core: Fix cloning savedata when backing file is outdated (fixes mgba.io/i/3388) - GBA: Fix getting game info for multiboot ROMs + - GBA Core: Fix booting into BIOS when skip BIOS is enabled + - GBA Hardware: Fix loading states unconditionally overwriting GPIO memory + - mGUI: Load parent directory if last used directory is missing (fixes mgba.io/i/3379) - Qt: Fix savestate preview sizes with different scales (fixes mgba.io/i/2560) - Qt: Fix potential crash when configuring shortcuts Misc: @@ -38,13 +41,16 @@ Misc: - Libretro: Add Super Game Boy Color support (closes mgba.io/i/3188) - mGUI: Enable auto-softpatching (closes mgba.io/i/2899) - mGUI: Persist fast forwarding after closing menu (fixes mgba.io/i/2414) + - mGUI: Wrap around menu cursor when navigating past end (closes mgba.io/i/3356) - Qt: Handle multiple save game files for disparate games separately (fixes mgba.io/i/2887) - Qt: Remove maligned double-click-to-fullscreen shortcut (closes mgba.io/i/2632) - Qt: Pass logging context through to video proxy thread (fixes mgba.io/i/3095) - Qt: Show maker code and game version in ROM info - Qt: Show a dummy shader settings tab if shaders aren't supported + - Qt: Allow passing multiple games on command line for multiplayer (closes mgba.io/i/3061) - Res: Port NSO-gba-colors shader (closes mgba.io/i/2834) - Scripting: Add `callbacks:oneshot` for single-call callbacks + - Updater: Fix rewriting folders and files on Windows (fixes mgba.io/i/3384) 0.10.4: (2024-12-07) Emulation fixes: diff --git a/CMakeLists.txt b/CMakeLists.txt index 5daa78976..42712e91c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -72,7 +72,7 @@ if(NOT LIBMGBA_ONLY) set(BUILD_TEST OFF CACHE BOOL "Build testing harness") set(BUILD_SUITE OFF CACHE BOOL "Build test suite") set(BUILD_CINEMA OFF CACHE BOOL "Build video tests suite") - set(BUILD_ROM_TEST OFF CACHE BOOL "Build ROM test tool") + set(BUILD_HEADLESS OFF CACHE BOOL "Build headless tool") set(BUILD_EXAMPLE OFF CACHE BOOL "Build example frontends") set(BUILD_PYTHON OFF CACHE BOOL "Build Python bindings") set(BUILD_STATIC OFF CACHE BOOL "Build a static library") @@ -158,6 +158,7 @@ endif() include(FindFeature) include(FindFunction) +include(DebugStrip) # Version information add_custom_target(${BINARY_NAME}-version-info ALL @@ -948,6 +949,14 @@ if(NOT SKIP_LIBRARY) file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/mgba-util) + if(BUILD_STATIC) + # Some versions of CMake are remarkably bad about deduplicating this list, + # leading to issues with static linking. Let's do it manually. + list(REVERSE DEPENDENCY_LIB) + list(REMOVE_DUPLICATES DEPENDENCY_LIB) + list(REVERSE DEPENDENCY_LIB) + endif() + 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(BUILD_SHARED) @@ -1037,6 +1046,14 @@ if(BUILD_QT) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/platform/qt ${CMAKE_CURRENT_BINARY_DIR}/qt) endif() +if(BUILD_HEADLESS) + add_executable(${BINARY_NAME}-headless ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/headless-main.c) + target_link_libraries(${BINARY_NAME}-headless ${PLATFORM_LIBRARY} ${BINARY_NAME}) + debug_strip(${BINARY_NAME}-headless) + target_compile_definitions(${BINARY_NAME}-headless PRIVATE "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") + install(TARGETS ${BINARY_NAME}-headless DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-headless) +endif() + if(NOT USE_CMOCKA) set(BUILD_SUITE OFF) endif() @@ -1234,6 +1251,11 @@ if(SDL_FOUND) cpack_add_component(${BINARY_NAME}-sdl GROUP sdl) endif() +if(BUILD_HEADLESS) + cpack_add_component_group(headless PARENT_GROUP base) + cpack_add_component(${BINARY_NAME}-headless GROUP headless) +endif() + if(DISTBUILD) cpack_add_component_group(debug PARENT_GROUP dev) if(BUILD_SHARED AND NOT IS_EMBEDDED) @@ -1248,6 +1270,9 @@ if(DISTBUILD) if(SDL_FOUND) cpack_add_component(${BINARY_NAME}-sdl-dbg GROUP debug) endif() + if(BUILD_HEADLESS) + cpack_add_component(${BINARY_NAME}-headless-dbg GROUP debug) + endif() if(WIN32) cpack_add_component_group(installer PARENT_GROUP base) endif() @@ -1318,6 +1343,7 @@ if(NOT QUIET AND NOT LIBMGBA_ONLY) message(STATUS "Frontends:") message(STATUS " Qt: ${BUILD_QT}") message(STATUS " SDL (${SDL_VERSION}): ${BUILD_SDL}") + message(STATUS " Headless: ${BUILD_HEADLESS}") message(STATUS " Python bindings: ${BUILD_PYTHON}") message(STATUS " Examples: ${BUILD_EXAMPLE}") message(STATUS "Test tools:") @@ -1325,7 +1351,6 @@ if(NOT QUIET AND NOT LIBMGBA_ONLY) message(STATUS " Test harness: ${BUILD_TEST}") message(STATUS " Test suite: ${BUILD_SUITE}") message(STATUS " Video test suite: ${BUILD_CINEMA}") - message(STATUS " ROM tester: ${BUILD_ROM_TEST}") message(STATUS "Cores:") message(STATUS " Libretro core: ${BUILD_LIBRETRO}") message(STATUS "Libraries:") diff --git a/include/mgba-util/common.h b/include/mgba-util/common.h index c5008e01f..04018faf4 100644 --- a/include/mgba-util/common.h +++ b/include/mgba-util/common.h @@ -17,7 +17,9 @@ CXX_GUARD_START #ifdef _WIN32 +#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN +#endif // Require Windows 7 or newer #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0601 diff --git a/include/mgba-util/gui/menu.h b/include/mgba-util/gui/menu.h index 399ddd8c3..4a1c3651a 100644 --- a/include/mgba-util/gui/menu.h +++ b/include/mgba-util/gui/menu.h @@ -10,9 +10,12 @@ CXX_GUARD_START +#include #include #include +mLOG_DECLARE_CATEGORY(GUI_MENU); + #define GUI_V_V (struct GUIVariant) { .type = GUI_VARIANT_VOID } #define GUI_V_U(U) (struct GUIVariant) { .type = GUI_VARIANT_UNSIGNED, .v.u = (U) } #define GUI_V_I(I) (struct GUIVariant) { .type = GUI_VARIANT_INT, .v.i = (I) } diff --git a/include/mgba/feature/commandline.h b/include/mgba/feature/commandline.h index 17af655fe..9ce118fd2 100644 --- a/include/mgba/feature/commandline.h +++ b/include/mgba/feature/commandline.h @@ -44,6 +44,7 @@ struct mSubParser { bool (*parse)(struct mSubParser* parser, int option, const char* arg); bool (*parseLong)(struct mSubParser* parser, const char* option, const char* arg); void (*apply)(struct mSubParser* parser, struct mCoreConfig* config); + bool (*handleExtraArg)(struct mSubParser* parser, const char* arg); const char* extraOptions; const struct mOption* longOptions; void* opts; diff --git a/src/core/scripting.c b/src/core/scripting.c index 9e46b619c..20659f0bc 100644 --- a/src/core/scripting.c +++ b/src/core/scripting.c @@ -350,6 +350,9 @@ static struct mScriptValue* _mScriptCoreChecksum(const struct mCore* core, int t case mCHECKSUM_CRC32: size = 4; break; + case mCHECKSUM_MD5: + size = 16; + break; } if (!size) { return &mScriptValueNull; @@ -769,7 +772,7 @@ static int64_t _addCallbackToBreakpoint(struct mScriptDebugger* debugger, struct return cbid; } -static void _runCallbacks(struct mScriptDebugger* debugger, struct mScriptBreakpoint* point) { +static void _runCallbacks(struct mScriptDebugger* debugger, struct mScriptBreakpoint* point, struct mScriptValue* info) { struct TableIterator iter; if (!HashTableIteratorStart(&point->callbacks, &iter)) { return; @@ -778,6 +781,7 @@ static void _runCallbacks(struct mScriptDebugger* debugger, struct mScriptBreakp struct mScriptValue* fn = HashTableIteratorGetValue(&point->callbacks, &iter); struct mScriptFrame frame; mScriptFrameInit(&frame); + mSCRIPT_PUSH(&frame.stack, WTABLE, info); mScriptContextInvoke(debugger->p->context, fn, &frame); mScriptFrameDeinit(&frame); } while (HashTableIteratorNext(&point->callbacks, &iter)); @@ -826,7 +830,50 @@ static void _scriptDebuggerEntered(struct mDebuggerModule* debugger, enum mDebug return; } - _runCallbacks(scriptDebugger, point); + struct mScriptValue cbInfo = { + .refs = mSCRIPT_VALUE_UNREF, + .flags = 0, + .type = mSCRIPT_TYPE_MS_TABLE, + }; + cbInfo.type->alloc(&cbInfo); + + static struct mScriptValue keyAddress = mSCRIPT_CHARP("address"); + static struct mScriptValue keyWidth = mSCRIPT_CHARP("width"); + static struct mScriptValue keySegment = mSCRIPT_CHARP("segment"); + static struct mScriptValue keyOldValue = mSCRIPT_CHARP("oldValue"); + static struct mScriptValue keyNewValue = mSCRIPT_CHARP("newValue"); + static struct mScriptValue keyAccessType = mSCRIPT_CHARP("accessType"); + + struct mScriptValue valAddress = mSCRIPT_MAKE_U32(info->address); + struct mScriptValue valWidth = mSCRIPT_MAKE_S32(info->width); + struct mScriptValue valSegment = mSCRIPT_MAKE_S32(info->segment); + struct mScriptValue valOldValue; + struct mScriptValue valNewValue; + struct mScriptValue valAccessType; + + mScriptTableInsert(&cbInfo, &keyAddress, &valAddress); + if (info->width > 0) { + mScriptTableInsert(&cbInfo, &keyWidth, &valWidth); + } + if (info->segment >= 0) { + mScriptTableInsert(&cbInfo, &keySegment, &valSegment); + } + + if (reason == DEBUGGER_ENTER_WATCHPOINT) { + valOldValue = mSCRIPT_MAKE_S32(info->type.wp.oldValue); + valNewValue = mSCRIPT_MAKE_S32(info->type.wp.newValue); + valAccessType = mSCRIPT_MAKE_S32(info->type.wp.accessType); + + mScriptTableInsert(&cbInfo, &keyOldValue, &valOldValue); + if (info->type.wp.accessType != WATCHPOINT_READ) { + mScriptTableInsert(&cbInfo, &keyNewValue, &valNewValue); + } + mScriptTableInsert(&cbInfo, &keyAccessType, &valAccessType); + } + + _runCallbacks(scriptDebugger, point, &cbInfo); + + cbInfo.type->free(&cbInfo); debugger->isPaused = false; } @@ -1296,6 +1343,24 @@ static uint8_t _readLuminance(struct GBALuminanceSource* luminance) { } #endif +#define CALLBACK(NAME) _mScriptCoreCallback ## NAME +#define DEFINE_CALLBACK(NAME) \ + void CALLBACK(NAME) (void* context) { \ + struct mScriptContext* scriptContext = context; \ + if (!scriptContext) { \ + return; \ + } \ + mScriptContextTriggerCallback(scriptContext, #NAME, NULL); \ + } + +DEFINE_CALLBACK(frame) +DEFINE_CALLBACK(crashed) +DEFINE_CALLBACK(sleep) +DEFINE_CALLBACK(stop) +DEFINE_CALLBACK(keysRead) +DEFINE_CALLBACK(savedataUpdated) +DEFINE_CALLBACK(alarm) + void mScriptContextAttachCore(struct mScriptContext* context, struct mCore* core) { struct mScriptValue* coreValue = mScriptValueAlloc(mSCRIPT_TYPE_MS_S(mScriptCoreAdapter)); struct mScriptCoreAdapter* adapter = calloc(1, sizeof(*adapter)); @@ -1328,6 +1393,18 @@ void mScriptContextAttachCore(struct mScriptContext* context, struct mCore* core } #endif + struct mCoreCallbacks callbacks = { + .videoFrameEnded = CALLBACK(frame), + .coreCrashed = CALLBACK(crashed), + .sleep = CALLBACK(sleep), + .shutdown = CALLBACK(stop), + .keysRead = CALLBACK(keysRead), + .savedataUpdated = CALLBACK(savedataUpdated), + .alarm = CALLBACK(alarm), + .context = context + }; + core->addCoreCallbacks(core, &callbacks); + _rebuildMemoryMap(context, adapter); coreValue->value.opaque = adapter; diff --git a/src/core/serialize.c b/src/core/serialize.c index 4f7c07a4a..90f066b85 100644 --- a/src/core/serialize.c +++ b/src/core/serialize.c @@ -249,9 +249,16 @@ static int _loadPNGChunkHandler(png_structp png, png_unknown_chunkp chunk) { } const uint8_t* data = chunk->data; data += sizeof(uint32_t) * 2; - uncompress((Bytef*) item.data, &len, data, chunk->size); - item.size = len; - mStateExtdataPut(extdata, tag, &item); + if (uncompress((Bytef*) item.data, &len, data, chunk->size) == Z_OK) { + if ((uLongf) item.size != len) { + mLOG(SAVESTATE, WARN, "Mismatched decompressed extdata %i size (%d vs %u)", tag, item.size, (uint32_t) len); + item.size = len; + } + mStateExtdataPut(extdata, tag, &item); + } else { + mLOG(SAVESTATE, WARN, "Failed to decompress extdata chunk"); + free(item.data); + } return 1; } return 0; @@ -320,7 +327,7 @@ static void* _loadPNGState(struct mCore* core, struct VFile* vf, struct mStateEx return state; } -static bool _loadPNGExtadata(struct VFile* vf, struct mStateExtdata* extdata) { +static bool _loadPNGExtdata(struct VFile* vf, struct mStateExtdata* extdata) { png_structp png = PNGReadOpen(vf, PNG_HEADER_BYTES); png_infop info = png_create_info_struct(png); png_infop end = png_create_info_struct(png); @@ -511,7 +518,7 @@ void* mCoreExtractState(struct mCore* core, struct VFile* vf, struct mStateExtda bool mCoreExtractExtdata(struct mCore* core, struct VFile* vf, struct mStateExtdata* extdata) { #ifdef USE_PNG if (isPNG(vf)) { - return _loadPNGExtadata(vf, extdata); + return _loadPNGExtdata(vf, extdata); } #endif if (!core) { diff --git a/src/core/test/scripting.c b/src/core/test/scripting.c index 63927effe..16692fc14 100644 --- a/src/core/test/scripting.c +++ b/src/core/test/scripting.c @@ -365,8 +365,10 @@ M_TEST_DEFINE(basicBreakpointGBA) { TEST_PROGRAM( "hit = 0\n" - "function bkpt()\n" + "address = nil\n" + "function bkpt(info)\n" " hit = hit + 1\n" + " address = info.address\n" "end" ); TEST_PROGRAM("cbid = emu:setBreakpoint(bkpt, 0x020000C4)"); @@ -379,6 +381,7 @@ M_TEST_DEFINE(basicBreakpointGBA) { assert_int_equal(debugger.state, DEBUGGER_RUNNING); TEST_PROGRAM("assert(hit >= 1)"); + TEST_PROGRAM("assert(address == 0x020000C4)"); mScriptContextDeinit(&context); TEARDOWN_CORE; @@ -404,8 +407,10 @@ M_TEST_DEFINE(basicBreakpointGB) { TEST_PROGRAM( "hit = 0\n" - "function bkpt()\n" + "address = nil\n" + "function bkpt(info)\n" " hit = hit + 1\n" + " address = info.address\n" "end" ); TEST_PROGRAM("cbid = emu:setBreakpoint(bkpt, 0xF0)"); @@ -418,6 +423,7 @@ M_TEST_DEFINE(basicBreakpointGB) { assert_int_equal(debugger.state, DEBUGGER_RUNNING); TEST_PROGRAM("assert(hit >= 1)"); + TEST_PROGRAM("assert(address == 0xF0)"); mScriptContextDeinit(&context); TEARDOWN_CORE; @@ -441,11 +447,22 @@ M_TEST_DEFINE(multipleBreakpoint) { TEST_PROGRAM( "hit = 0\n" - "function bkpt1()\n" + "address = nil\n" + "function bkpt1(info)\n" " hit = hit + 1\n" + " if address then\n" + " address = (address + info.address) / 2\n" + " else\n" + " address = info.address\n" + " end\n" "end\n" - "function bkpt2()\n" + "function bkpt2(info)\n" " hit = hit + 100\n" + " if address then\n" + " address = (address + info.address) / 2\n" + " else\n" + " address = info.address\n" + " end\n" "end" ); #ifdef M_CORE_GBA @@ -465,6 +482,13 @@ M_TEST_DEFINE(multipleBreakpoint) { assert_int_equal(debugger.state, DEBUGGER_RUNNING); TEST_PROGRAM("assert(hit >= 101)"); +#ifdef M_CORE_GBA + TEST_PROGRAM("assert(address >= 0x020000C4)"); + TEST_PROGRAM("assert(address <= 0x020000C8)"); +#else + TEST_PROGRAM("assert(address >= 0xF0)"); + TEST_PROGRAM("assert(address <= 0xF1)"); +#endif mScriptContextDeinit(&context); TEARDOWN_CORE; @@ -479,13 +503,28 @@ M_TEST_DEFINE(basicWatchpoint) { core->reset(core); mScriptContextAttachCore(&context, core); + int i; + for (i = 0; i < 4; ++i) { + core->busWrite8(core, RAM_BASE + i, i + 1); + } + mDebuggerInit(&debugger); mDebuggerAttach(&debugger, core); TEST_PROGRAM( "hit = 0\n" - "function bkpt()\n" + "address = nil\n" + "width = nil\n" + "oldValue = nil\n" + "newValue = nil\n" + "accessType = nil\n" + "function bkpt(info)\n" " hit = hit + 1\n" + " address = info.address\n" + " width = info.width\n" + " oldValue = info.oldValue\n" + " newValue = info.newValue\n" + " accessType = info.accessType\n" "end" ); struct mScriptValue base = mSCRIPT_MAKE_S32(RAM_BASE); @@ -499,7 +538,13 @@ M_TEST_DEFINE(basicWatchpoint) { uint8_t value; // Read - TEST_PROGRAM("hit = 0"); + TEST_PROGRAM( + "hit = 0\n" + "address = nil\n" + "width = nil\n" + "oldValue = nil\n" + "newValue = nil\n" + "accessType = nil\n"); value = core->rawRead8(core, RAM_BASE, -1); TEST_PROGRAM("assert(hit == 0)"); core->busRead8(core, RAM_BASE); @@ -508,31 +553,71 @@ M_TEST_DEFINE(basicWatchpoint) { TEST_PROGRAM("assert(hit == 1)"); core->busWrite8(core, RAM_BASE, ~value); TEST_PROGRAM("assert(hit == 1)"); + TEST_PROGRAM("assert(address == base)"); + TEST_PROGRAM("assert(width == 1)"); + TEST_PROGRAM("assert(oldValue == 1)"); + TEST_PROGRAM("assert(newValue == nil)"); + TEST_PROGRAM("assert(accessType == C.WATCHPOINT_TYPE.READ)"); // Write - TEST_PROGRAM("hit = 0"); + TEST_PROGRAM( + "hit = 0\n" + "address = nil\n" + "width = nil\n" + "oldValue = nil\n" + "newValue = nil\n" + "accessType = nil\n"); value = core->rawRead8(core, RAM_BASE + 1, -1); TEST_PROGRAM("assert(hit == 0)"); core->busRead8(core, RAM_BASE + 1); TEST_PROGRAM("assert(hit == 0)"); core->busWrite8(core, RAM_BASE + 1, value); TEST_PROGRAM("assert(hit == 1)"); + TEST_PROGRAM("assert(oldValue == 2)"); + TEST_PROGRAM("assert(newValue == 2)"); core->busWrite8(core, RAM_BASE + 1, ~value); TEST_PROGRAM("assert(hit == 2)"); + TEST_PROGRAM("assert(address == base + 1)"); + TEST_PROGRAM("assert(width == 1)"); + TEST_PROGRAM("assert(oldValue == 2)"); + TEST_PROGRAM("assert(newValue == -3)"); + TEST_PROGRAM("assert(accessType == C.WATCHPOINT_TYPE.WRITE)"); // RW - TEST_PROGRAM("hit = 0"); + TEST_PROGRAM( + "hit = 0\n" + "address = nil\n" + "width = nil\n" + "oldValue = nil\n" + "newValue = nil\n" + "accessType = nil\n"); value = core->rawRead8(core, RAM_BASE + 2, -1); TEST_PROGRAM("assert(hit == 0)"); core->busRead8(core, RAM_BASE + 2); + TEST_PROGRAM("assert(accessType == C.WATCHPOINT_TYPE.READ)"); TEST_PROGRAM("assert(hit == 1)"); + TEST_PROGRAM("assert(oldValue == 3)"); + TEST_PROGRAM("assert(newValue == nil)"); core->busWrite8(core, RAM_BASE + 2, value); TEST_PROGRAM("assert(hit == 2)"); + TEST_PROGRAM("assert(oldValue == 3)"); + TEST_PROGRAM("assert(newValue == 3)"); core->busWrite8(core, RAM_BASE + 2, ~value); TEST_PROGRAM("assert(hit == 3)"); + TEST_PROGRAM("assert(address == base + 2)"); + TEST_PROGRAM("assert(width == 1)"); + TEST_PROGRAM("assert(oldValue == 3)"); + TEST_PROGRAM("assert(newValue == -4)"); + TEST_PROGRAM("assert(accessType == C.WATCHPOINT_TYPE.WRITE)"); // Change - TEST_PROGRAM("hit = 0"); + TEST_PROGRAM( + "hit = 0\n" + "address = nil\n" + "width = nil\n" + "oldValue = nil\n" + "newValue = nil\n" + "accessType = nil\n"); value = core->rawRead8(core, RAM_BASE + 3, -1); TEST_PROGRAM("assert(hit == 0)"); core->busRead8(core, RAM_BASE + 3); @@ -541,6 +626,11 @@ M_TEST_DEFINE(basicWatchpoint) { TEST_PROGRAM("assert(hit == 0)"); core->busWrite8(core, RAM_BASE + 3, ~value); TEST_PROGRAM("assert(hit == 1)"); + TEST_PROGRAM("assert(address == base + 3)"); + TEST_PROGRAM("assert(width == 1)"); + TEST_PROGRAM("assert(oldValue == 4)"); + TEST_PROGRAM("assert(newValue == -5)"); + TEST_PROGRAM("assert(accessType == C.WATCHPOINT_TYPE.WRITE)"); mScriptContextDeinit(&context); TEARDOWN_CORE; @@ -728,8 +818,10 @@ M_TEST_DEFINE(rangeWatchpoint) { TEST_PROGRAM( "hit = 0\n" - "function bkpt()\n" + "address = nil\n" + "function bkpt(info)\n" " hit = hit + 1\n" + " address = info.address\n" "end" ); struct mScriptValue base = mSCRIPT_MAKE_S32(RAM_BASE); @@ -741,10 +833,13 @@ M_TEST_DEFINE(rangeWatchpoint) { TEST_PROGRAM("assert(hit == 0)"); core->busRead8(core, RAM_BASE); TEST_PROGRAM("assert(hit == 1)"); + TEST_PROGRAM("assert(address == base)"); core->busRead8(core, RAM_BASE + 1); TEST_PROGRAM("assert(hit == 3)"); + TEST_PROGRAM("assert(address == base + 1)"); core->busRead8(core, RAM_BASE + 2); TEST_PROGRAM("assert(hit == 4)"); + TEST_PROGRAM("assert(address == base + 2)"); mScriptContextDeinit(&context); TEARDOWN_CORE; diff --git a/src/core/thread.c b/src/core/thread.c index 2b16a03c7..988ce0848 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -198,42 +198,6 @@ void _coreShutdown(void* context) { MutexUnlock(&thread->impl->stateMutex); } -#ifdef ENABLE_SCRIPTING -#define ADD_CALLBACK(NAME) \ -void _script_ ## NAME(void* context) { \ - struct mCoreThread* threadContext = context; \ - if (!threadContext->scriptContext) { \ - return; \ - } \ - mScriptContextTriggerCallback(threadContext->scriptContext, #NAME, NULL); \ -} - -ADD_CALLBACK(frame) -ADD_CALLBACK(crashed) -ADD_CALLBACK(sleep) -ADD_CALLBACK(stop) -ADD_CALLBACK(keysRead) -ADD_CALLBACK(savedataUpdated) -ADD_CALLBACK(alarm) - -#undef ADD_CALLBACK -#define SCRIPT(NAME) _script_ ## NAME - -static void _mCoreThreadAddCallbacks(struct mCoreThread* threadContext) { - struct mCoreCallbacks callbacks = { - .videoFrameEnded = SCRIPT(frame), - .coreCrashed = SCRIPT(crashed), - .sleep = SCRIPT(sleep), - .shutdown = SCRIPT(stop), - .keysRead = SCRIPT(keysRead), - .savedataUpdated = SCRIPT(savedataUpdated), - .alarm = SCRIPT(alarm), - .context = threadContext - }; - threadContext->core->addCoreCallbacks(threadContext->core, &callbacks); -} -#endif - static THREAD_ENTRY _mCoreThreadRun(void* context) { struct mCoreThread* threadContext = context; #ifdef USE_PTHREADS @@ -279,7 +243,6 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { struct mScriptContext* scriptContext = threadContext->scriptContext; if (scriptContext) { mScriptContextAttachCore(scriptContext, core); - _mCoreThreadAddCallbacks(threadContext); } #endif @@ -289,12 +252,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } #ifdef ENABLE_SCRIPTING // startCallback could add a script context - if (scriptContext != threadContext->scriptContext) { - scriptContext = threadContext->scriptContext; - if (scriptContext) { - _mCoreThreadAddCallbacks(threadContext); - } - } + scriptContext = threadContext->scriptContext; if (scriptContext) { mScriptContextTriggerCallback(scriptContext, "start", NULL); } @@ -312,12 +270,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { #ifdef ENABLE_SCRIPTING // resetCallback could add a script context - if (scriptContext != threadContext->scriptContext) { - scriptContext = threadContext->scriptContext; - if (scriptContext) { - _mCoreThreadAddCallbacks(threadContext); - } - } + scriptContext = threadContext->scriptContext; if (scriptContext) { mScriptContextTriggerCallback(scriptContext, "reset", NULL); } @@ -372,12 +325,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } } #ifdef ENABLE_SCRIPTING - if (scriptContext != threadContext->scriptContext) { - scriptContext = threadContext->scriptContext; - if (scriptContext) { - _mCoreThreadAddCallbacks(threadContext); - } - } + scriptContext = threadContext->scriptContext; #endif if (wasPaused && !(impl->requested & mTHREAD_REQ_PAUSE)) { break; diff --git a/src/feature/commandline.c b/src/feature/commandline.c index fca5c7747..1e22a4f2c 100644 --- a/src/feature/commandline.c +++ b/src/feature/commandline.c @@ -187,7 +187,21 @@ bool mArgumentsParse(struct mArguments* args, int argc, char* const* argv, struc argc -= optind; argv += optind; if (argc > 1) { - return false; + for (j = 0; j < argc; ++j) { + bool handled = false; + for (i = 0; i < nSubparsers; ++i) { + if (!subparsers[i].handleExtraArg) { + continue; + } + handled = subparsers[i].handleExtraArg(&subparsers[i], argv[j]); + if (handled) { + break; + } + } + if (!handled) { + return false; + } + } } else if (argc == 1) { args->fname = strdup(argv[0]); } else { @@ -303,6 +317,7 @@ void mSubParserGraphicsInit(struct mSubParser* parser, struct mGraphicsOpts* opt parser->apply = _applyGraphicsArgs; parser->extraOptions = GRAPHICS_OPTIONS; parser->longOptions = _graphicsLongOpts; + parser->handleExtraArg = NULL; opts->multiplier = 0; opts->fullscreen = false; } diff --git a/src/feature/ffmpeg/ffmpeg-common.h b/src/feature/ffmpeg/ffmpeg-common.h index 299d5167d..2476ea575 100644 --- a/src/feature/ffmpeg/ffmpeg-common.h +++ b/src/feature/ffmpeg/ffmpeg-common.h @@ -38,6 +38,10 @@ CXX_GUARD_START #define FFMPEG_USE_NEW_CH_LAYOUT #endif +#if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(61, 13, 100) +#define FFMPEG_USE_GET_SUPPORTED_CONFIG +#endif + static inline enum AVPixelFormat mColorFormatToFFmpegPixFmt(enum mColorFormat format) { switch (format) { #ifndef USE_LIBAV diff --git a/src/feature/ffmpeg/ffmpeg-encoder.c b/src/feature/ffmpeg/ffmpeg-encoder.c index 6202e0fcd..0286b6eeb 100644 --- a/src/feature/ffmpeg/ffmpeg-encoder.c +++ b/src/feature/ffmpeg/ffmpeg-encoder.c @@ -134,18 +134,28 @@ bool FFmpegEncoderSetAudio(struct FFmpegEncoder* encoder, const char* acodec, un return false; } - if (!codec->sample_fmts) { + const enum AVSampleFormat* formats = NULL; +#ifdef FFMPEG_USE_GET_SUPPORTED_CONFIG + if (avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_SAMPLE_FORMAT, 0, (const void**) &formats, NULL) < 0) { return false; } +#else + formats = codec->sample_fmts; +#endif + + if (!formats) { + return false; + } + size_t i; size_t j; int priority = INT_MAX; encoder->sampleFormat = AV_SAMPLE_FMT_NONE; - for (i = 0; codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; ++i) { + for (i = 0; formats[i] != AV_SAMPLE_FMT_NONE; ++i) { for (j = 0; j < sizeof(priorities) / sizeof(*priorities); ++j) { - if (codec->sample_fmts[i] == priorities[j].format && priority > priorities[j].priority) { + if (formats[i] == priorities[j].format && priority > priorities[j].priority) { priority = priorities[j].priority; - encoder->sampleFormat = codec->sample_fmts[i]; + encoder->sampleFormat = formats[i]; } } } @@ -153,18 +163,29 @@ bool FFmpegEncoderSetAudio(struct FFmpegEncoder* encoder, const char* acodec, un return false; } encoder->sampleRate = encoder->isampleRate; - if (codec->supported_samplerates) { + + + + const int* sampleRates = NULL; +#ifdef FFMPEG_USE_GET_SUPPORTED_CONFIG + if (avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_SAMPLE_RATE, 0, (const void**) &sampleRates, NULL) < 0) { + return false; + } +#else + sampleRates = codec->supported_samplerates; +#endif + if (sampleRates) { bool gotSampleRate = false; int highestSampleRate = 0; - for (i = 0; codec->supported_samplerates[i]; ++i) { - if (codec->supported_samplerates[i] > highestSampleRate) { - highestSampleRate = codec->supported_samplerates[i]; + for (i = 0; sampleRates[i]; ++i) { + if (sampleRates[i] > highestSampleRate) { + highestSampleRate = sampleRates[i]; } - if (codec->supported_samplerates[i] < encoder->isampleRate) { + if (sampleRates[i] < encoder->isampleRate) { continue; } - if (!gotSampleRate || encoder->sampleRate > codec->supported_samplerates[i]) { - encoder->sampleRate = codec->supported_samplerates[i]; + if (!gotSampleRate || encoder->sampleRate > sampleRates[i]) { + encoder->sampleRate = sampleRates[i]; gotSampleRate = true; } } @@ -231,11 +252,19 @@ bool FFmpegEncoderSetVideo(struct FFmpegEncoder* encoder, const char* vcodec, in size_t j; int priority = INT_MAX; encoder->pixFormat = AV_PIX_FMT_NONE; - for (i = 0; codec->pix_fmts[i] != AV_PIX_FMT_NONE; ++i) { + const enum AVPixelFormat* formats; +#ifdef FFMPEG_USE_GET_SUPPORTED_CONFIG + if (avcodec_get_supported_config(NULL, codec, AV_CODEC_CONFIG_PIX_FORMAT, 0, (const void**) &formats, NULL) < 0) { + return false; + } +#else + formats = codec->pix_fmts; +#endif + for (i = 0; formats[i] != AV_PIX_FMT_NONE; ++i) { for (j = 0; j < sizeof(priorities) / sizeof(*priorities); ++j) { - if (codec->pix_fmts[i] == priorities[j].format && priority > priorities[j].priority) { + if (formats[i] == priorities[j].format && priority > priorities[j].priority) { priority = priorities[j].priority; - encoder->pixFormat = codec->pix_fmts[i]; + encoder->pixFormat = formats[i]; } } } @@ -384,7 +413,9 @@ bool FFmpegEncoderOpen(struct FFmpegEncoder* encoder, const char* outfile) { encoder->videoStream = avformat_new_stream(encoder->context, vcodec); encoder->video = encoder->videoStream->codec; #endif - encoder->video->bit_rate = encoder->videoBitrate; + if (encoder->videoBitrate >= 0) { + encoder->video->bit_rate = encoder->videoBitrate; + } encoder->video->width = encoder->width; encoder->video->height = encoder->height; encoder->video->time_base = (AVRational) { encoder->frameCycles * encoder->frameskip, encoder->cycles }; diff --git a/src/gb/core.c b/src/gb/core.c index b97e1ee25..f71b570e0 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -1167,19 +1167,32 @@ static struct mCheatDevice* _GBCoreCheatDevice(struct mCore* core) { static size_t _GBCoreSavedataClone(struct mCore* core, void** sram) { struct GB* gb = core->board; - struct VFile* vf = gb->sramVf; - if (vf) { - *sram = malloc(vf->size(vf)); - vf->seek(vf, 0, SEEK_SET); - return vf->read(vf, *sram, vf->size(vf)); + size_t sramSize = gb->sramSize; + size_t vfSize = 0; + size_t size = sramSize; + uint8_t* view = NULL; + + if (gb->sramVf) { + vfSize = gb->sramVf->size(gb->sramVf); + if (vfSize > size) { + size = vfSize; + } } - if (gb->sramSize) { - *sram = malloc(gb->sramSize); - memcpy(*sram, gb->memory.sram, gb->sramSize); - return gb->sramSize; + if (!size) { + *sram = NULL; + return 0; } - *sram = NULL; - return 0; + + view = malloc(size); + if (sramSize) { + memcpy(view, gb->memory.sram, gb->sramSize); + } + if (vfSize > sramSize) { + gb->sramVf->seek(gb->sramVf, sramSize, SEEK_SET); + gb->sramVf->read(gb->sramVf, &view[sramSize], vfSize - sramSize); + } + *sram = view; + return size; } static bool _GBCoreSavedataRestore(struct mCore* core, const void* sram, size_t size, bool writeback) { diff --git a/src/gba/core.c b/src/gba/core.c index 1d3fffb9e..da782d06c 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -801,7 +801,7 @@ static void _GBACoreReset(struct mCore* core) { #endif ARMReset(core->cpu); - bool forceSkip = gba->mbVf || core->opts.skipBios; + bool forceSkip = gba->mbVf || (core->opts.skipBios && (gba->romVf || gba->memory.rom)); if (!forceSkip && (gba->romVf || gba->memory.rom) && gba->pristineRomSize >= 0xA0 && gba->biosVf) { uint32_t crc = doCrc32(&gba->memory.rom[1], 0x9C); if (crc != LOGO_CRC32) { diff --git a/src/gba/savedata.c b/src/gba/savedata.c index c0d2c889a..50d2be381 100644 --- a/src/gba/savedata.c +++ b/src/gba/savedata.c @@ -702,7 +702,7 @@ void GBASavedataRTCRead(struct GBASavedata* savedata) { savedata->gpio->rtc.offset = savedata->gpio->rtc.lastLatch - rtcTime; - mLOG(GBA_SAVE, ERROR, "Savegame time offset set to %li", savedata->gpio->rtc.offset); + mLOG(GBA_SAVE, DEBUG, "Savegame time offset set to %li", savedata->gpio->rtc.offset); } void GBASavedataSerialize(const struct GBASavedata* savedata, struct GBASerializedState* state) { diff --git a/src/platform/cmake/DebugStrip.cmake b/src/platform/cmake/DebugStrip.cmake new file mode 100644 index 000000000..7e2b842a4 --- /dev/null +++ b/src/platform/cmake/DebugStrip.cmake @@ -0,0 +1,12 @@ +function(debug_strip TARGET) + if(DISTBUILD AND NOT APPLE) + if(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$" "$.debug") + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND "${STRIP}" "$") + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND "${OBJCOPY}" --add-gnu-debuglink "$.debug" "$") + install(FILES "$.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${TARGET}-dbg) + elseif(BUILD_STATIC AND (CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")) + add_custom_command(TARGET ${TARGET} POST_BUILD COMMAND "${STRIP}" "$") + endif() + endif() +endfunction() diff --git a/src/platform/test/rom-test-main.c b/src/platform/headless-main.c similarity index 61% rename from src/platform/test/rom-test-main.c rename to src/platform/headless-main.c index be9f36e8e..61110b1e8 100644 --- a/src/platform/test/rom-test-main.c +++ b/src/platform/headless-main.c @@ -17,29 +17,40 @@ #ifdef M_CORE_GB #include #endif +#ifdef ENABLE_SCRIPTING +#include +#include +#endif #include +#include #include #include #include -#define ROM_TEST_OPTIONS "S:R:" -#define ROM_TEST_USAGE \ - "Additional options:\n" \ - " -S SWI Run until specified SWI call before exiting\n" \ - " -R REGISTER General purpose register to return as exit code\n" \ +#define HEADLESS_OPTIONS "S:R:" +static const char* const headlessUsage = + "Additional options:\n" + " -S SWI Run until specified SWI call before exiting\n" + " -R REGISTER General purpose register to return as exit code\n" +#ifdef ENABLE_SCRIPTING + " --script FILE Run a script on start. Can be passed multiple times\n" +#endif + ; -struct RomTestOpts { +struct HeadlessOpts { int exitSwiImmediate; char* returnCodeRegister; + struct StringList scripts; }; -static void _romTestShutdown(int signal); -static bool _parseRomTestOpts(struct mSubParser* parser, int option, const char* arg); +static void _headlessShutdown(int signal); +static bool _parseHeadlessOpts(struct mSubParser* parser, int option, const char* arg); +static bool _parseLongHeadlessOpts(struct mSubParser* parser, const char* option, const char* arg); static bool _parseSwi(const char* regStr, int* oSwi); -static bool _romTestCheckResiger(void); +static bool _headlessCheckResiger(void); static struct mCore* core; @@ -47,10 +58,10 @@ static bool _dispatchExiting = false; static int _exitCode = 0; static struct mStandardLogger _logger; -static void _romTestCallback(void* context); +static void _headlessCallback(void* context); #ifdef M_CORE_GBA -static void _romTestSwi16(struct ARMCore* cpu, int immediate); -static void _romTestSwi32(struct ARMCore* cpu, int immediate); +static void _headlessSwi16(struct ARMCore* cpu, int immediate); +static void _headlessSwi32(struct ARMCore* cpu, int immediate); static int _exitSwiImmediate; static char* _returnCodeRegister; @@ -60,14 +71,27 @@ void (*_armSwi32)(struct ARMCore* cpu, int immediate); #endif int main(int argc, char * argv[]) { - signal(SIGINT, _romTestShutdown); + signal(SIGINT, _headlessShutdown); - struct RomTestOpts romTestOpts = { 3, NULL }; + bool cleanExit = false; + int uncleanExit = 1; + size_t i; + + struct HeadlessOpts headlessOpts = { 3, NULL }; + StringListInit(&headlessOpts.scripts, 0); struct mSubParser subparser = { - .usage = ROM_TEST_USAGE, - .parse = _parseRomTestOpts, - .extraOptions = ROM_TEST_OPTIONS, - .opts = &romTestOpts + .usage = headlessUsage, + .parse = _parseHeadlessOpts, + .parseLong = _parseLongHeadlessOpts, + .extraOptions = HEADLESS_OPTIONS, + .longOptions = (struct mOption[]) { + { + .name = "script", + .arg = true, + }, + {0} + }, + .opts = &headlessOpts }; struct mArguments args; @@ -77,18 +101,20 @@ int main(int argc, char * argv[]) { } if (!parsed || args.showHelp) { usage(argv[0], NULL, NULL, &subparser, 1); - return !parsed; + uncleanExit = !parsed; + goto argsExit; } if (args.showVersion) { version(argv[0]); - return 0; + uncleanExit = 0; + goto argsExit; } core = mCoreFind(args.fname); if (!core) { - return 1; + goto argsExit; } core->init(core); - mCoreInitConfig(core, "romTest"); + mCoreInitConfig(core, "headless"); mArgumentsApply(&args, NULL, 0, &core->config); mCoreConfigSetDefaultValue(&core->config, "idleOptimization", "remove"); @@ -99,11 +125,10 @@ int main(int argc, char * argv[]) { mStandardLoggerConfig(&_logger, &core->config); mLogSetDefaultLogger(&_logger.d); - bool cleanExit = false; struct mCoreCallbacks callbacks = {0}; - _returnCodeRegister = romTestOpts.returnCodeRegister; - if (!_romTestCheckResiger()) { + _returnCodeRegister = headlessOpts.returnCodeRegister; + if (!_headlessCheckResiger()) { goto loadError; } @@ -111,24 +136,24 @@ int main(int argc, char * argv[]) { #ifdef M_CORE_GBA case mPLATFORM_GBA: ((struct GBA*) core->board)->hardCrash = false; - _exitSwiImmediate = romTestOpts.exitSwiImmediate; + _exitSwiImmediate = headlessOpts.exitSwiImmediate; if (_exitSwiImmediate == 3) { // Hook into SWI 3 (shutdown) - callbacks.shutdown = _romTestCallback; + callbacks.shutdown = _headlessCallback; core->addCoreCallbacks(core, &callbacks); } else { // Custom SWI hooks _armSwi16 = ((struct GBA*) core->board)->cpu->irqh.swi16; - ((struct GBA*) core->board)->cpu->irqh.swi16 = _romTestSwi16; + ((struct GBA*) core->board)->cpu->irqh.swi16 = _headlessSwi16; _armSwi32 = ((struct GBA*) core->board)->cpu->irqh.swi32; - ((struct GBA*) core->board)->cpu->irqh.swi32 = _romTestSwi32; + ((struct GBA*) core->board)->cpu->irqh.swi32 = _headlessSwi32; } break; #endif #ifdef M_CORE_GB case mPLATFORM_GB: - callbacks.shutdown = _romTestCallback; + callbacks.shutdown = _headlessCallback; core->addCoreCallbacks(core, &callbacks); break; #endif @@ -166,6 +191,31 @@ int main(int argc, char * argv[]) { savestate->close(savestate); } +#ifdef ENABLE_SCRIPTING + struct mScriptContext scriptContext; + + if (StringListSize(&headlessOpts.scripts)) { + mScriptContextInit(&scriptContext); + mScriptContextAttachStdlib(&scriptContext); + mScriptContextAttachImage(&scriptContext); + mScriptContextAttachLogger(&scriptContext, NULL); + mScriptContextAttachSocket(&scriptContext); +#ifdef USE_JSON_C + mScriptContextAttachStorage(&scriptContext); +#endif + mScriptContextRegisterEngines(&scriptContext); + + mScriptContextAttachCore(&scriptContext, core); + + for (i = 0; i < StringListSize(&headlessOpts.scripts); ++i) { + if (!mScriptContextLoadFile(&scriptContext, *StringListGetPointer(&headlessOpts.scripts, i))) { + mLOG(STATUS, ERROR, "Failed to load script \"%s\"", *StringListGetPointer(&headlessOpts.scripts, i)); + goto scriptsError; + } + } + } +#endif + #ifdef ENABLE_DEBUGGERS if (hasDebugger) { do { @@ -176,19 +226,25 @@ int main(int argc, char * argv[]) { do { core->runLoop(core); } while (!_dispatchExiting); + cleanExit = true; +scriptsError: core->unloadROM(core); +#ifdef ENABLE_SCRIPTING + if (StringListSize(&headlessOpts.scripts)) { + mScriptContextDeinit(&scriptContext); + } +#endif + #ifdef ENABLE_DEBUGGERS if (hasDebugger) { core->detachDebugger(core); mDebuggerDeinit(&debugger); } #endif - cleanExit = true; loadError: - mArgumentsDeinit(&args); mStandardLoggerDeinit(&_logger); mCoreConfigDeinit(&core->config); core->deinit(core); @@ -196,15 +252,22 @@ loadError: free(_returnCodeRegister); } - return cleanExit ? _exitCode : 1; +argsExit: + for (i = 0; i < StringListSize(&headlessOpts.scripts); ++i) { + free(*StringListGetPointer(&headlessOpts.scripts, i)); + } + StringListDeinit(&headlessOpts.scripts); + mArgumentsDeinit(&args); + + return cleanExit ? _exitCode : uncleanExit; } -static void _romTestShutdown(int signal) { +static void _headlessShutdown(int signal) { UNUSED(signal); _dispatchExiting = true; } -static bool _romTestCheckResiger(void) { +static bool _headlessCheckResiger(void) { if (!_returnCodeRegister) { return true; } @@ -250,7 +313,7 @@ static bool _romTestCheckResiger(void) { return true; } -static void _romTestCallback(void* context) { +static void _headlessCallback(void* context) { UNUSED(context); if (_returnCodeRegister) { core->readRegister(core, _returnCodeRegister, &_exitCode); @@ -259,7 +322,7 @@ static void _romTestCallback(void* context) { } #ifdef M_CORE_GBA -static void _romTestSwi16(struct ARMCore* cpu, int immediate) { +static void _headlessSwi16(struct ARMCore* cpu, int immediate) { if (immediate == _exitSwiImmediate) { if (_returnCodeRegister) { core->readRegister(core, _returnCodeRegister, &_exitCode); @@ -270,7 +333,7 @@ static void _romTestSwi16(struct ARMCore* cpu, int immediate) { _armSwi16(cpu, immediate); } -static void _romTestSwi32(struct ARMCore* cpu, int immediate) { +static void _headlessSwi32(struct ARMCore* cpu, int immediate) { if (immediate == _exitSwiImmediate) { if (_returnCodeRegister) { core->readRegister(core, _returnCodeRegister, &_exitCode); @@ -282,8 +345,8 @@ static void _romTestSwi32(struct ARMCore* cpu, int immediate) { } #endif -static bool _parseRomTestOpts(struct mSubParser* parser, int option, const char* arg) { - struct RomTestOpts* opts = parser->opts; +static bool _parseHeadlessOpts(struct mSubParser* parser, int option, const char* arg) { + struct HeadlessOpts* opts = parser->opts; errno = 0; switch (option) { case 'S': @@ -296,6 +359,15 @@ static bool _parseRomTestOpts(struct mSubParser* parser, int option, const char* } } +static bool _parseLongHeadlessOpts(struct mSubParser* parser, const char* option, const char* arg) { + struct HeadlessOpts* opts = parser->opts; + if (strcmp(option, "script") == 0) { + *StringListAppend(&opts->scripts) = strdup(arg); + return true; + } + return false; +} + static bool _parseSwi(const char* swiStr, int* oSwi) { char* parseEnd; long swi = strtol(swiStr, &parseEnd, 0); diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 3134512f2..910ab9b57 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -261,6 +261,7 @@ if(ENABLE_DEBUGGERS) DebuggerController.cpp DebuggerConsole.cpp DebuggerConsoleController.cpp + MemoryAccessLogController.cpp MemoryAccessLogView.cpp) endif() @@ -517,7 +518,7 @@ if(APPLE) set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -R "${CROSS_ROOT}") endif() if($ENV{CODESIGN_IDENTITY}) - set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -s "$ENV{CODESIGN_IDENTITY}" -E "${PROJECT_SOURCE_DIR}/res/entitlements.xml") + set(DEPLOY_OPTIONS ${DEPLOY_OPTIONS} -s "$ENV{CODESIGN_IDENTITY}" -E "${PROJECT_SOURCE_DIR}/res/entitlements.plist") endif() install(CODE "execute_process(COMMAND \"${PROJECT_SOURCE_DIR}/tools/deploy-mac.py\" -v ${DEPLOY_OPTIONS} \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${APPDIR}/${PROJECT_NAME}.app\")") endif() @@ -536,17 +537,7 @@ elseif(WIN32) endif() endif() -if(DISTBUILD AND NOT APPLE) - if(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$" "$.debug") - add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$") - add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${OBJCOPY}" --add-gnu-debuglink "$.debug" "$") - install(FILES "$.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt-dbg) - elseif(BUILD_STATIC AND (CMAKE_BUILD_TYPE STREQUAL "Release" OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")) - add_custom_command(TARGET ${BINARY_NAME}-qt POST_BUILD COMMAND "${STRIP}" "$") - endif() -endif() - +debug_strip(${BINARY_NAME}-qt) install(TARGETS ${BINARY_NAME}-qt RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-qt BUNDLE DESTINATION ${APPDIR} COMPONENT ${BINARY_NAME}-qt) diff --git a/src/platform/qt/ConfigController.cpp b/src/platform/qt/ConfigController.cpp index 819b2479d..a12768709 100644 --- a/src/platform/qt/ConfigController.cpp +++ b/src/platform/qt/ConfigController.cpp @@ -158,8 +158,7 @@ ConfigController::ConfigController(QObject* parent) " Can be passed multiple times for multiple cards\n" " --mb FILE Boot a multiboot image with FILE inserted into the ROM slot" #ifdef ENABLE_SCRIPTING - "\n --script FILE Script file to load on start\n" - " Can be passed multiple times\n" + "\n --script FILE Run a script on start. Can be passed multiple times\n" #endif ; @@ -197,6 +196,14 @@ ConfigController::ConfigController(QObject* parent) m_subparsers[1].extraOptions = nullptr; m_subparsers[1].longOptions = s_frontendOptions; m_subparsers[1].opts = this; + m_subparsers[1].handleExtraArg = [](struct mSubParser* parser, const char* arg) { + ConfigController* self = static_cast(parser->opts); + if (self->m_fnames.count() >= MAX_GBAS) { + return false; + } + self->m_fnames.append(QString::fromUtf8(arg)); + return true; + }; } ConfigController::~ConfigController() { diff --git a/src/platform/qt/ConfigController.h b/src/platform/qt/ConfigController.h index 4325a46ba..5aa9b7ac2 100644 --- a/src/platform/qt/ConfigController.h +++ b/src/platform/qt/ConfigController.h @@ -102,6 +102,7 @@ public: const mArguments* args() const { return &m_args; } const mGraphicsOpts* graphicsOpts() const { return &m_graphicsOpts; } + QStringList fileNames() const { return m_fnames; } void usage(const char* arg0) const; static const QString& configDir(); @@ -129,6 +130,7 @@ private: mArguments m_args{}; mGraphicsOpts m_graphicsOpts{}; std::array m_subparsers; + QStringList m_fnames; bool m_parsed = false; QHash m_argvOptions; diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 2496f8039..152efc222 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -8,6 +8,7 @@ #include "ConfigController.h" #include "InputController.h" #include "LogController.h" +#include "MemoryAccessLogController.h" #include "MultiplayerController.h" #include "Override.h" @@ -459,6 +460,15 @@ void CoreController::setLogger(LogController* logger) { connect(this, &CoreController::logPosted, m_log, &LogController::postLog); } +#ifdef ENABLE_DEBUGGERS +std::weak_ptr CoreController::memoryAccessLogController() { + if (!m_malController) { + m_malController = std::make_shared(this); + } + return m_malController; +} +#endif + void CoreController::start() { QSize size(screenDimensions()); m_activeBuffer.resize(size.width() * size.height() * sizeof(mColor)); @@ -479,6 +489,10 @@ void CoreController::start() { void CoreController::stop() { setSync(false); #ifdef ENABLE_DEBUGGERS + if (m_malController) { + m_malController->stop(); + } + detachDebugger(); #endif setPaused(false); diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 57eb9ffe0..a2ebe410e 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -40,6 +40,7 @@ namespace QGBA { class ConfigController; class InputController; class LogController; +class MemoryAccessLogController; class MultiplayerController; class Override; @@ -113,6 +114,8 @@ public: void detachDebugger(); void attachDebuggerModule(mDebuggerModule*, bool interrupt = true); void detachDebuggerModule(mDebuggerModule*); + + std::weak_ptr memoryAccessLogController(); #endif void setMultiplayerController(MultiplayerController*); @@ -326,6 +329,10 @@ private: GBASIODolphin m_dolphin; #endif +#ifdef ENABLE_DEBUGGERS + std::shared_ptr m_malController; +#endif + mVideoLogContext* m_vl = nullptr; VFile* m_vlVf = nullptr; diff --git a/src/platform/qt/DisplayQt.cpp b/src/platform/qt/DisplayQt.cpp index b71147c43..3f46872f4 100644 --- a/src/platform/qt/DisplayQt.cpp +++ b/src/platform/qt/DisplayQt.cpp @@ -209,7 +209,7 @@ void DisplayQt::deinit(struct VideoBackend*) { void DisplayQt::setLayerDimensions(struct VideoBackend* v, enum VideoLayer layer, const struct mRectangle* dims) { DisplayQt* self = static_cast(v->user); - if (layer > self->m_layerDims.size()) { + if (layer >= self->m_layerDims.size()) { return; } self->m_layerDims[layer] = QRect(dims->x, dims->y, dims->width, dims->height); @@ -217,7 +217,7 @@ void DisplayQt::setLayerDimensions(struct VideoBackend* v, enum VideoLayer layer void DisplayQt::layerDimensions(const struct VideoBackend* v, enum VideoLayer layer, struct mRectangle* dims) { DisplayQt* self = static_cast(v->user); - if (layer > self->m_layerDims.size()) { + if (layer >= self->m_layerDims.size()) { return; } QRect rect = self->m_layerDims[layer]; @@ -238,7 +238,7 @@ void DisplayQt::contextResized(struct VideoBackend*, unsigned, unsigned, unsigne void DisplayQt::setImageSize(struct VideoBackend* v, enum VideoLayer layer, int w, int h) { DisplayQt* self = static_cast(v->user); - if (layer > self->m_layers.size()) { + if (layer >= self->m_layers.size()) { return; } self->m_layers[layer] = QImage(w, h, QImage::Format_ARGB32); @@ -246,7 +246,7 @@ void DisplayQt::setImageSize(struct VideoBackend* v, enum VideoLayer layer, int void DisplayQt::imageSize(struct VideoBackend* v, enum VideoLayer layer, int* w, int* h) { DisplayQt* self = static_cast(v->user); - if (layer > self->m_layers.size()) { + if (layer >= self->m_layers.size()) { return; } *w = self->m_layers[layer].width(); @@ -255,7 +255,7 @@ void DisplayQt::imageSize(struct VideoBackend* v, enum VideoLayer layer, int* w, void DisplayQt::setImage(struct VideoBackend* v, enum VideoLayer layer, const void* frame) { DisplayQt* self = static_cast(v->user); - if (layer > self->m_layers.size()) { + if (layer >= self->m_layers.size()) { return; } QImage& image = self->m_layers[layer]; diff --git a/src/platform/qt/GBAApp.cpp b/src/platform/qt/GBAApp.cpp index 90fc89170..258df9f0c 100644 --- a/src/platform/qt/GBAApp.cpp +++ b/src/platform/qt/GBAApp.cpp @@ -397,6 +397,26 @@ void GBAApp::finishJob(qint64 jobId) { m_workerJobCallbacks.remove(jobId); } +void GBAApp::initMultiplayer() { + QStringList fnames = m_configController->fileNames(); + if (fnames.count() < 2) { + return; + } + + Window* w = m_windows[0]; + for (const auto& fname : fnames) { + if (!w) { + w = newWindow(); + } + if (!w) { + break; + } + CoreController* core = m_manager.loadGame(fname); + w->setController(core, fname); + w = nullptr; + } +} + GBAApp::WorkerJob::WorkerJob(qint64 id, std::function&& job, GBAApp* owner) : m_id(id) , m_job(std::move(job)) diff --git a/src/platform/qt/GBAApp.h b/src/platform/qt/GBAApp.h index 2388bc297..43848b183 100644 --- a/src/platform/qt/GBAApp.h +++ b/src/platform/qt/GBAApp.h @@ -82,6 +82,8 @@ public: ApplicationUpdater* updater() { return &m_updater; } QString invokeOnExit() { return m_invokeOnExit; } + void initMultiplayer(); + public slots: void restartForUpdate(); Window* newWindow(); diff --git a/src/platform/qt/MemoryAccessLogController.cpp b/src/platform/qt/MemoryAccessLogController.cpp new file mode 100644 index 000000000..95200e53e --- /dev/null +++ b/src/platform/qt/MemoryAccessLogController.cpp @@ -0,0 +1,118 @@ +/* Copyright (c) 2013-2025 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "MemoryAccessLogController.h" + +#include "GBAApp.h" +#include "LogController.h" +#include "utils.h" +#include "VFileDevice.h" + +using namespace QGBA; + +MemoryAccessLogController::MemoryAccessLogController(CoreController* controller, QObject* parent) + : QObject(parent) + , m_controller(controller) +{ + mCore* core = m_controller->thread()->core; + const mCoreMemoryBlock* info; + size_t nBlocks = core->listMemoryBlocks(core, &info); + + for (size_t i = 0; i < nBlocks; ++i) { + if (!(info[i].flags & mCORE_MEMORY_MAPPED)) { + continue; + } + m_regions.append({ + QString::fromUtf8(info[i].longName), + QString::fromUtf8(info[i].internalName) + }); + } +} + +MemoryAccessLogController::~MemoryAccessLogController() { + stop(); +} + +bool MemoryAccessLogController::canExport() const { + return m_regionMapping.contains("cart0"); +} + +void MemoryAccessLogController::updateRegion(const QString& internalName, bool checked) { + if (checked) { + m_watchedRegions += internalName; + } else { + m_watchedRegions -= internalName; + } + if (!m_active) { + return; + } + m_regionMapping[internalName] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, internalName.toUtf8().constData(), activeFlags()); + emit regionMappingChanged(internalName, checked); +} + +void MemoryAccessLogController::setFile(const QString& path) { + m_path = path; +} + +void MemoryAccessLogController::start(bool loadExisting, bool logExtra) { + int flags = O_CREAT | O_RDWR; + if (!loadExisting) { + flags |= O_TRUNC; + } + VFile* vf = VFileDevice::open(m_path, flags); + if (!vf) { + LOG(QT, ERROR) << tr("Failed to open memory log file"); + return; + } + m_logExtra = logExtra; + + mDebuggerAccessLoggerInit(&m_logger); + CoreController::Interrupter interrupter(m_controller); + m_controller->attachDebuggerModule(&m_logger.d); + if (!mDebuggerAccessLoggerOpen(&m_logger, vf, flags)) { + mDebuggerAccessLoggerDeinit(&m_logger); + LOG(QT, ERROR) << tr("Failed to open memory log file"); + return; + } + + m_active = true; + emit loggingChanged(true); + for (const auto& region : m_watchedRegions) { + m_regionMapping[region] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, region.toUtf8().constData(), activeFlags()); + } + interrupter.resume(); +} + +void MemoryAccessLogController::stop() { + if (!m_active) { + return; + } + CoreController::Interrupter interrupter(m_controller); + m_controller->detachDebuggerModule(&m_logger.d); + mDebuggerAccessLoggerDeinit(&m_logger); + emit loggingChanged(false); + interrupter.resume(); + m_active = false; +} + +mDebuggerAccessLogRegionFlags MemoryAccessLogController::activeFlags() const { + mDebuggerAccessLogRegionFlags loggerFlags = 0; + if (m_logExtra) { + loggerFlags = mDebuggerAccessLogRegionFlagsFillHasExBlock(loggerFlags); + } + return loggerFlags; +} + +void MemoryAccessLogController::exportFile(const QString& filename) { + VFile* vf = VFileDevice::open(filename, O_CREAT | O_TRUNC | O_WRONLY); + if (!vf) { + // log error + return; + } + + CoreController::Interrupter interrupter(m_controller); + mDebuggerAccessLoggerCreateShadowFile(&m_logger, m_regionMapping[QString("cart0")], vf, 0); + vf->close(vf); +} diff --git a/src/platform/qt/MemoryAccessLogController.h b/src/platform/qt/MemoryAccessLogController.h new file mode 100644 index 000000000..42ef655c3 --- /dev/null +++ b/src/platform/qt/MemoryAccessLogController.h @@ -0,0 +1,66 @@ +/* Copyright (c) 2013-2025 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#pragma once + +#include +#include + +#include + +#include "CoreController.h" + +#include + +namespace QGBA { + +class MemoryAccessLogController : public QObject { +Q_OBJECT + +public: + struct Region { + QString longName; + QString internalName; + }; + + MemoryAccessLogController(CoreController* controller, QObject* parent = nullptr); + ~MemoryAccessLogController(); + + QVector listRegions() const { return m_regions; } + QSet watchedRegions() const { return m_watchedRegions; } + + bool canExport() const; + mPlatform platform() const { return m_controller->platform(); } + + QString file() const { return m_path; } + bool active() const { return m_active; } + +public slots: + void updateRegion(const QString& internalName, bool enable); + void setFile(const QString& path); + + void start(bool loadExisting, bool logExtra); + void stop(); + + void exportFile(const QString& filename); + +signals: + void loggingChanged(bool active); + void regionMappingChanged(const QString& internalName, bool active); + +private: + bool m_logExtra = false; + QString m_path; + CoreController* m_controller; + QSet m_watchedRegions; + QHash m_regionMapping; + QVector m_regions; + struct mDebuggerAccessLogger m_logger{}; + bool m_active = false; + + mDebuggerAccessLogRegionFlags activeFlags() const; +}; + +} diff --git a/src/platform/qt/MemoryAccessLogView.cpp b/src/platform/qt/MemoryAccessLogView.cpp index 3c846b440..97a0c932e 100644 --- a/src/platform/qt/MemoryAccessLogView.cpp +++ b/src/platform/qt/MemoryAccessLogView.cpp @@ -9,104 +9,66 @@ #include "GBAApp.h" #include "LogController.h" +#include "MemoryAccessLogController.h" #include "utils.h" #include "VFileDevice.h" using namespace QGBA; -MemoryAccessLogView::MemoryAccessLogView(std::shared_ptr controller, QWidget* parent) +MemoryAccessLogView::MemoryAccessLogView(std::weak_ptr controller, QWidget* parent) : QWidget(parent) - , m_controller(std::move(controller)) + , m_controller(controller) { m_ui.setupUi(this); + std::shared_ptr controllerPtr = m_controller.lock(); connect(m_ui.browse, &QAbstractButton::clicked, this, &MemoryAccessLogView::selectFile); connect(m_ui.exportButton, &QAbstractButton::clicked, this, &MemoryAccessLogView::exportFile); - connect(this, &MemoryAccessLogView::loggingChanged, m_ui.start, &QWidget::setDisabled); - connect(this, &MemoryAccessLogView::loggingChanged, m_ui.stop, &QWidget::setEnabled); - connect(this, &MemoryAccessLogView::loggingChanged, m_ui.filename, &QWidget::setDisabled); - connect(this, &MemoryAccessLogView::loggingChanged, m_ui.browse, &QWidget::setDisabled); + connect(controllerPtr.get(), &MemoryAccessLogController::regionMappingChanged, this, &MemoryAccessLogView::updateRegion); + connect(controllerPtr.get(), &MemoryAccessLogController::loggingChanged, this, &MemoryAccessLogView::handleStartStop); - mCore* core = m_controller->thread()->core; - const mCoreMemoryBlock* info; - size_t nBlocks = core->listMemoryBlocks(core, &info); + bool active = controllerPtr->active(); + auto watchedRegions = controllerPtr->watchedRegions(); QVBoxLayout* regionBox = static_cast(m_ui.regionBox->layout()); - for (size_t i = 0; i < nBlocks; ++i) { - if (!(info[i].flags & mCORE_MEMORY_MAPPED)) { - continue; - } - QCheckBox* region = new QCheckBox(QString::fromUtf8(info[i].longName)); + for (const auto& info : controllerPtr->listRegions()) { + QCheckBox* region = new QCheckBox(info.longName); regionBox->addWidget(region); - QString name(QString::fromUtf8(info[i].internalName)); + QString name(info.internalName); m_regionBoxes[name] = region; connect(region, &QAbstractButton::toggled, this, [this, name](bool checked) { - updateRegion(name, checked); + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { + return; + } + controllerPtr->updateRegion(name, checked); }); } + + handleStartStop(active); } -MemoryAccessLogView::~MemoryAccessLogView() { - stop(); -} - -void MemoryAccessLogView::updateRegion(const QString& internalName, bool checked) { - if (checked) { - m_watchedRegions += internalName; - } else { - m_watchedRegions -= internalName; - } - if (!m_active) { - return; - } +void MemoryAccessLogView::updateRegion(const QString& internalName, bool) { m_regionBoxes[internalName]->setEnabled(false); - m_regionMapping[internalName] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, internalName.toUtf8().constData(), activeFlags()); } void MemoryAccessLogView::start() { - int flags = O_CREAT | O_RDWR; - if (!m_ui.loadExisting->isChecked()) { - flags |= O_TRUNC; - } - VFile* vf = VFileDevice::open(m_ui.filename->text(), flags); - if (!vf) { - // log error + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { return; } - mDebuggerAccessLoggerInit(&m_logger); - CoreController::Interrupter interrupter(m_controller); - m_controller->attachDebuggerModule(&m_logger.d); - if (!mDebuggerAccessLoggerOpen(&m_logger, vf, flags)) { - mDebuggerAccessLoggerDeinit(&m_logger); - LOG(QT, ERROR) << tr("Failed to open memory log file"); - return; - } - - m_active = true; - emit loggingChanged(true); - for (const auto& region : m_watchedRegions) { - m_regionBoxes[region]->setEnabled(false); - m_regionMapping[region] = mDebuggerAccessLoggerWatchMemoryBlockName(&m_logger, region.toUtf8().constData(), activeFlags()); - } - interrupter.resume(); - - if (m_watchedRegions.contains(QString("cart0"))) { - m_ui.exportButton->setEnabled(true); - } + controllerPtr->setFile(m_ui.filename->text()); + controllerPtr->start(m_ui.loadExisting->isChecked(), m_ui.logExtra->isChecked()); } void MemoryAccessLogView::stop() { - if (!m_active) { + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { return; } - CoreController::Interrupter interrupter(m_controller); - m_controller->detachDebuggerModule(&m_logger.d); - mDebuggerAccessLoggerDeinit(&m_logger); - emit loggingChanged(false); - interrupter.resume(); - - for (const auto& region : m_watchedRegions) { + controllerPtr->stop(); + for (const auto& region : controllerPtr->watchedRegions()) { m_regionBoxes[region]->setEnabled(true); } m_ui.exportButton->setEnabled(false); @@ -119,30 +81,41 @@ void MemoryAccessLogView::selectFile() { } } -mDebuggerAccessLogRegionFlags MemoryAccessLogView::activeFlags() const { - mDebuggerAccessLogRegionFlags loggerFlags = 0; - if (m_ui.logExtra->isChecked()) { - loggerFlags = mDebuggerAccessLogRegionFlagsFillHasExBlock(loggerFlags); - } - return loggerFlags; -} - void MemoryAccessLogView::exportFile() { - if (!m_regionMapping.contains("cart0")) { + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { + return; + } + if (!controllerPtr->canExport()) { return; } - QString filename = GBAApp::app()->getSaveFileName(this, tr("Select access log file"), romFilters(false, m_controller->platform(), true)); + QString filename = GBAApp::app()->getSaveFileName(this, tr("Select access log file"), romFilters(false, controllerPtr->platform(), true)); if (filename.isEmpty()) { return; } - VFile* vf = VFileDevice::open(filename, O_CREAT | O_TRUNC | O_WRONLY); - if (!vf) { - // log error + controllerPtr->exportFile(filename); +} + +void MemoryAccessLogView::handleStartStop(bool start) { + std::shared_ptr controllerPtr = m_controller.lock(); + if (!controllerPtr) { return; } + m_ui.filename->setText(controllerPtr->file()); - CoreController::Interrupter interrupter(m_controller); - mDebuggerAccessLoggerCreateShadowFile(&m_logger, m_regionMapping[QString("cart0")], vf, 0); - vf->close(vf); + auto watchedRegions = controllerPtr->watchedRegions(); + for (const auto& region : watchedRegions) { + m_regionBoxes[region]->setDisabled(start); + m_regionBoxes[region]->setChecked(true); + } + + if (watchedRegions.contains(QString("cart0"))) { + m_ui.exportButton->setEnabled(start); + } + + m_ui.start->setDisabled(start); + m_ui.stop->setEnabled(start); + m_ui.filename->setDisabled(start); + m_ui.browse->setDisabled(start); } diff --git a/src/platform/qt/MemoryAccessLogView.h b/src/platform/qt/MemoryAccessLogView.h index ffe31cc43..e221a5d9d 100644 --- a/src/platform/qt/MemoryAccessLogView.h +++ b/src/platform/qt/MemoryAccessLogView.h @@ -18,12 +18,14 @@ namespace QGBA { +class MemoryAccessLogController; + class MemoryAccessLogView : public QWidget { Q_OBJECT public: - MemoryAccessLogView(std::shared_ptr controller, QWidget* parent = nullptr); - ~MemoryAccessLogView(); + MemoryAccessLogView(std::weak_ptr controller, QWidget* parent = nullptr); + ~MemoryAccessLogView() = default; private slots: void updateRegion(const QString& internalName, bool enable); @@ -34,20 +36,13 @@ private slots: void exportFile(); -signals: - void loggingChanged(bool active); + void handleStartStop(bool start); private: Ui::MemoryAccessLogView m_ui; - std::shared_ptr m_controller; - QSet m_watchedRegions; + std::weak_ptr m_controller; QHash m_regionBoxes; - QHash m_regionMapping; - struct mDebuggerAccessLogger m_logger{}; - bool m_active = false; - - mDebuggerAccessLogRegionFlags activeFlags() const; }; } diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index a72bf0d7b..f4eea01db 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -364,7 +364,7 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC continue; } QLocale locale(name.remove(QString("%0-").arg(binaryName)).remove(".qm")); - if (locale.language() == QLocale::English) { + if (locale.language() == QLocale::English || locale.language() == QLocale::C) { continue; } QString endonym = locale.nativeLanguageName(); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index bc956fcc4..1be4a998c 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -1767,7 +1767,12 @@ void Window::setupMenu(QMenuBar* menubar) { addGameAction(tr("View &I/O registers..."), "ioViewer", openControllerTView(), "stateViews"); #ifdef ENABLE_DEBUGGERS - addGameAction(tr("Log memory &accesses..."), "memoryAccessView", openControllerTView(), "tools"); + addGameAction(tr("Log memory &accesses..."), "memoryAccessView", [this]() { + std::weak_ptr controller = m_controller->memoryAccessLogController(); + MemoryAccessLogView* view = new MemoryAccessLogView(controller); + connect(m_controller.get(), &CoreController::stopping, view, &QWidget::close); + openView(view); + }, "tools"); #endif #if defined(USE_FFMPEG) && defined(M_CORE_GBA) diff --git a/src/platform/qt/main.cpp b/src/platform/qt/main.cpp index f98d2cd88..48f1984f7 100644 --- a/src/platform/qt/main.cpp +++ b/src/platform/qt/main.cpp @@ -131,10 +131,9 @@ int main(int argc, char* argv[]) { } Window* w = application.newWindow(); - w->loadConfig(); w->argumentsPassed(); - w->show(); + application.initMultiplayer(); int ret = application.exec(); if (ret != 0) { diff --git a/src/platform/qt/ts/mgba-ar.ts b/src/platform/qt/ts/mgba-ar.ts index 63159e7ec..80bd96e3a 100644 --- a/src/platform/qt/ts/mgba-ar.ts +++ b/src/platform/qt/ts/mgba-ar.ts @@ -1,25 +1,25 @@ - + QGBA - + Game Boy Advance ROMs (%1) رومات غيم بوي أدفانس (%1) - + Game Boy ROMs (%1) رومات غيم بوي (%1) - + All ROMs (%1) كل الرومات (%1) - + %1 Video Logs (*.mvl) @@ -130,7 +130,7 @@ Download size: %3 مجهول - + (None) @@ -191,17 +191,17 @@ Download size: %3 QGBA::AudioDevice - + Can't set format of context-less audio device - + Audio device is missing its core - + Writing data to read-only audio device @@ -209,7 +209,7 @@ Download size: %3 QGBA::AudioProcessorQt - + Can't start an audio processor without input @@ -285,28 +285,28 @@ Download size: %3 - + BattleChip data missing - + BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? - - + + Select deck file - + Incompatible deck - + The selected deck is not compatible with this Chip Gate @@ -354,12 +354,12 @@ Download size: %3 Save - + حفظ Load - + شحن @@ -367,19 +367,19 @@ Download size: %3 - - + + Autodetect (recommended) - - + + Select cheats file - + Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. @@ -387,48 +387,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -436,17 +436,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 - + Could not load game. Are you sure it's in the correct format? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -472,11 +472,19 @@ Download size: %3 QGBA::DebuggerConsoleController - + Could not open CLI history for writing + + QGBA::DisplayGL + + + Failed to create an OpenGL 3 context, trying old-style... + + + QGBA::DolphinConnector @@ -713,6 +721,11 @@ Download size: %3 Select an image + + + Image files (*.png *.jpg *.bmp) + + QGBA::FrameView @@ -752,52 +765,52 @@ Download size: %3 - + Export frame - + Portable Network Graphics (*.png) - + None - + Background - + Window - + Objwin - + Sprite - + Backdrop - + Frame - + %1 %2 @@ -813,22 +826,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh - + Set all @@ -2951,7 +2964,7 @@ Download size: %3 Unknown - + مجهول @@ -2969,13 +2982,13 @@ Download size: %3 Red - + أحمر Blue - + أزرق @@ -3001,26 +3014,11 @@ Download size: %3 QGBA::KeyEditor - - + + --- - - - Super (L) - - - - - Super (R) - - - - - Menu - - QGBA::LibraryTree @@ -3094,7 +3092,7 @@ Download size: %3 1 - + 1 @@ -3104,7 +3102,7 @@ Download size: %3 7 - + 7 @@ -3368,43 +3366,111 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + + + QGBA::MemoryAccessLogView + + + Memory access logging + + + + + Log file + + + + + Browse + + + + + Log additional information (uses 3× space) + + + + + Load existing file if present + + + + + Regions + + + + + Export ROM snapshot + + + + + Start + + + + + Stop + + + + + + Select access log file + + + + + Memory access logs (*.mal) + + + QGBA::MemoryDump @@ -3458,7 +3524,7 @@ Download size: %3 Load - + شحن @@ -3511,7 +3577,7 @@ Download size: %3 Address - + عنوان @@ -3651,22 +3717,22 @@ Download size: %3 - + (%0/%1×) - + (⅟%0×) - + (%0×) - + %1 byte%2 @@ -3746,7 +3812,7 @@ Download size: %3 Load - + شحن @@ -3757,6 +3823,34 @@ Download size: %3 + + QGBA::MultiplayerController + + + Trying to detach a multiplayer player that's not attached + + + + + Clearing invalid save ID + + + + + Clearing invalid preferred ID + + + + + Trying to get player ID for a multiplayer player that's not attached + + + + + Trying to get save ID for a multiplayer player that's not attached + + + QGBA::ObjView @@ -3767,7 +3861,7 @@ Download size: %3 Address - + عنوان @@ -4111,17 +4205,17 @@ Download size: %3 Red - + أحمر Green - + أخضر Blue - + أزرق @@ -4149,35 +4243,35 @@ Download size: %3 - + #%0 - + 0x%0 + + - - 0x%0 (%1) - + 0x%0 (%1) - + Export palette - + Windows PAL (*.pal);;Adobe Color Table (*.act) - + Failed to open output palette file: %1 @@ -4251,20 +4345,21 @@ Download size: %3 QGBA::ROMInfo - - - - + + + + + (unknown) - + bytes - + (no database present) @@ -4274,27 +4369,57 @@ Download size: %3 - + + File information + + + + Game name: - + + MD5 + + + + + Save file: + + + + + ROM header + + + + Internal name: - + Game ID: - + + Maker Code: + + + + + Revision: + + + + File size: - + CRC32: @@ -4302,12 +4427,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -4329,7 +4454,7 @@ Download size: %3 Save - + حفظ @@ -4350,62 +4475,62 @@ Download size: %3 QGBA::SaveConverter - + Save games and save states (%1) - + Select save game or save state - + Save games (%1) - + Select save game - + Conversion failed - + Failed to convert the save game. This is probably a bug. - + No file selected - + Could not open file - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4431,92 +4556,97 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - - %1 SRAM + RTC - - - - - %1 SRAM + + + RTC - packed MBC2 + %1 SRAM + RTC - unpacked MBC2 + %1 SRAM - MBC6 flash + packed MBC2 + unpacked MBC2 + + + + + MBC6 flash + + + + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game - + %1 SharkPort %2 save game - + %1 GameShark Advance SP %2 save game @@ -4524,7 +4654,7 @@ Download size: %3 QGBA::ScriptingTextBuffer - + Untitled buffer @@ -4552,32 +4682,37 @@ Download size: %3 - + Load script... - + + &Load most recent + + + + &Reset - + 0 - + Select script to load - + Lua scripts (*.lua) - + All files (*.*) @@ -4670,105 +4805,134 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) - - + + OpenGL - + OpenGL (force version 1.x) - + None - + None (Still Image) - + Keyboard - + Controllers - + Shortcuts - + Shaders are not supported when the display driver is not OpenGL. + +If it is set to OpenGL and you still see this, your graphics card or drivers may be too old. + + + + + + + Shaders - + Select BIOS - + Select directory - + + Select image + + + + + Image file (*.png *.jpg *.jpeg) + + + + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago + + + + + - + %n day(s) ago + + + + + @@ -4963,7 +5127,7 @@ Download size: %3 - + frames @@ -5051,77 +5215,77 @@ Download size: %3 - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5216,58 +5380,68 @@ Download size: %3 - + + Custom border: + + + + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + + Rewind speed: + + + + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory @@ -5288,42 +5462,42 @@ Download size: %3 - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: @@ -5340,154 +5514,150 @@ Download size: %3 - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL enhancements - + High-resolution scale: - + (240×160) - - XQ GBA audio (experimental) - - - - + GB BIOS file: - - - - + + + + - - - - + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders @@ -5495,32 +5665,48 @@ Download size: %3 QGBA::ShaderSelector - + No shader active - + + Load shader - + + mGBA Shaders + + + + + Error loading shader + + + + + The shader "%1" could not be loaded successfully. + + + + No shader loaded - + by %1 - + Preprocessing - + Pass %1 @@ -5563,17 +5749,17 @@ Download size: %3 QGBA::ShortcutModel - + Action - + Keyboard - + Gamepad @@ -5693,17 +5879,17 @@ Download size: %3 QGBA::VideoView - + Failed to open output video file: %1 - + Native (%0x%1) - + Select output file @@ -5744,13 +5930,11 @@ Download size: %3 - WebM - MP4 @@ -5789,82 +5973,6 @@ Download size: %3 Format - - - MKV - - - - - AVI - - - - - HEVC - - - - - HEVC (NVENC) - - - - - VP8 - - - - - VP9 - - - - - FFV1 - - - - - - None - - - - - FLAC - - - - - WavPack - - - - - Opus - - - - - Vorbis - - - - - MP3 - - - - - AAC - - - - - Uncompressed - - Bitrate (kbps) @@ -5875,16 +5983,6 @@ Download size: %3 ABR - - - H.264 - - - - - H.264 (NVENC) - - VBR @@ -5914,769 +6012,789 @@ Download size: %3 QGBA::Window - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Import GameShark Save... - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + + Increase fast forward speed + + + + + Decrease fast forward speed + + + + Rewind (held) - + Re&wind - + Step backwards - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - - Lock aspect ratio - - - - - Force integer scaling - - - - - Interframe blending - - - - - Bilinear filtering - - - - - Frame&skip - - - - - Mute - - - - - FPS target - - - - - Native (59.7275) - - - - - Take &screenshot - - - - - F12 - - - - - Record A/V... + + &Lock frame size - Record GIF/WebP/APNG... - - - - - Video layers - - - - - Audio channels - - - - - Adjust layer placement... - - - - - &Tools - - - - - View &logs... + Lock aspect ratio - Game &overrides... + Force integer scaling - Game Pak sensors... + Interframe blending - - &Cheats... - - - - - Create forwarder... - - - - - Settings... - - - - - Open debugger console... + + Bilinear filtering - Start &GDB server... + Frame&skip - - Scripting... + + Mute - - Game state views + + FPS target - - View &palette... + + Native (59.7275) - - View &sprites... - - - - - View &tiles... - - - - - View &map... - - - - - &Frame inspector... - - - - - View memory... - - - - - Search memory... - - - - - View &I/O registers... - - - - - Record debug video log... - - - - - Stop debug video log + + Take &screenshot - Exit fullscreen + F12 - - GameShark Button (held) + + Record A/V... - - Autofire + + Record GIF/WebP/APNG... - Autofire A + Video layers + + + + + Audio channels + + + + + Adjust layer placement... - Autofire B + &Tools - - Autofire L + + View &logs... - - Autofire R + + Game &overrides... - Autofire Start + Game Pak sensors... - - Autofire Select + + &Cheats... + + + + + Create forwarder... - Autofire Up + Settings... - Autofire Right + Open debugger console... - - Autofire Down + + Start &GDB server... + + + + + Scripting... + Game state views + + + + + View &palette... + + + + + View &sprites... + + + + + View &tiles... + + + + + View &map... + + + + + &Frame inspector... + + + + + View memory... + + + + + Search memory... + + + + + View &I/O registers... + + + + + Log memory &accesses... + + + + + Record debug video log... + + + + + Stop debug video log + + + + + Exit fullscreen + + + + + GameShark Button (held) + + + + + Autofire + + + + + Autofire A + + + + + Autofire B + + + + + Autofire L + + + + + Autofire R + + + + + Autofire Start + + + + + Autofire Select + + + + + Autofire Up + + + + + Autofire Right + + + + + Autofire Down + + + + Autofire Left - + Clear @@ -6684,55 +6802,70 @@ Download size: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? ؟ + + + Super (L) + + + + + Super (R) + + + + + Menu + + QShortcut - + Shift - + Control - + Alt - + Meta diff --git a/src/platform/qt/ts/mgba-bg.ts b/src/platform/qt/ts/mgba-bg.ts index e119fb6b0..dc8790f3d 100644 --- a/src/platform/qt/ts/mgba-bg.ts +++ b/src/platform/qt/ts/mgba-bg.ts @@ -1,1178 +1,62 @@ - + - AboutScreen + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + + + QGBA::AboutScreen About - Относно + Относно <a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a> - <a href="http://mgba.io/">Уебсайт</a> • <a href="https://forums.mgba.io/">Форуми / Поддръжка</a> • <a href="https://patreon.com/mgba">Дареte</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Код</a> + <a href="http://mgba.io/">Уебсайт</a> • <a href="https://forums.mgba.io/">Форуми / Поддръжка</a> • <a href="https://patreon.com/mgba">Дареte</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Код</a> Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> - Клон: <tt>{gitBranch}</tt><br/>Ревизия: <tt>{gitCommit}</tt> + Клон: <tt>{gitBranch}</tt><br/>Ревизия: <tt>{gitCommit}</tt> {projectName} would like to thank the following patrons from Patreon: - {projectName} би искал да благодари на следните патрони от Patreon: + {projectName} би искал да благодари на следните патрони от Patreon: © 2013 – {year} Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - © 2013 - {year} Jeffrey Pfau, лицензирано под Публичния Лиценз на Mozilla, версия 2.0 + © 2013 - {year} Jeffrey Pfau, лицензирано под Публичния Лиценз на Mozilla, версия 2.0 Game Boy Advance е регистрирана търговска марка на Nintendo Co., Ltd. {projectName} is an open-source Game Boy Advance emulator - {projectName} е емулатор на Game Boy Advance с отворен код - - - - ApplicationUpdatePrompt - - - An update is available - Налична е актуализация - - - - ArchiveInspector - - - Open in archive... - Отвари в архива... - - - - Loading... - Зареждане... - - - - AssetTile - - - Tile # - Плочка # - - - - Palette # - Палитра # - - - - Address - Адрес - - - - Red - Червено - - - - Green - Зелено - - - - Blue - Синъо - - - - BattleChipView - - - BattleChip Gate - BattleChip Врата - - - - Chip name - Име на чипа - - - - Insert - Вмъкване - - - - Save - Запазване - - - - Load - Зареждане - - - - Add - Добави - - - - Remove - Премахване - - - - Gate type - Тип на вратата - - - - Inserted - Вкарано - - - - Chip ID - Идентификатор на чипа - - - - Update Chip data - Актуализиране на данните за чипа - - - - Show advanced - Показване на разширения - - - - CheatsView - - - Cheats - Измами - - - - Add New Code - Добави нов код - - - - Remove - Премахване - - - - Add Lines - Добави линии - - - - Code type - Тип на кода - - - - Save - Запази - - - - Load - Зареди - - - - Enter codes here... - Въведете кодовете тук... - - - - DebuggerConsole - - - Debugger - Дебъгер - - - - Enter command (try `help` for more info) - Въведете команда (опитайте с `help` за повече информация) - - - - Break - Прекъсване - - - - DolphinConnector - - - Connect to Dolphin - Свързване към Dolphin - - - - Local computer - Местен компютър - - - - IP address - IP адрес - - - - Connect - Свързване - - - - Disconnect - Изключване - - - - Close - Затвори - - - - Reset on connect - Нулиране при свързване - - - - FrameView - - - Inspect frame - Изследване на кадъра - - - - Magnification - Увеличаване - - - - Freeze frame - Замръзи кадъра - - - - Backdrop color - Цвят на фона - - - - Disable scanline effects - Деактивиране на ефектите на сканиращата линия - - - - Export - Износи - - - - Reset - Рестартирай - - - - GIFView - - - Record GIF/WebP/APNG - Запис в формат GIF/WebP/APNG - - - - Loop - Цикъл - - - - Start - - - - - Stop - - - - - Select File - - - - - APNG - - - - - GIF - - - - - WebP - - - - - Frameskip - - - - - IOViewer - - - I/O Viewer - - - - - 0x0000 - - - - - B - - - - - LibraryTree - - - Name - - - - - Location - - - - - Platform - - - - - Size - - - - - CRC32 - - - - - LoadSaveState - - - - %1 State - - - - - - - - - - - - - No Save - - - - - 5 - - - - - 6 - - - - - 8 - - - - - 4 - - - - - 1 - - - - - 3 - - - - - 7 - - - - - 9 - - - - - 2 - - - - - Cancel - - - - - LogView - - - Logs - - - - - Enabled Levels - - - - - Debug - - - - - Stub - - - - - Info - - - - - Warning - - - - - Error - - - - - Fatal - - - - - Game Error - - - - - Advanced settings - - - - - Clear - - - - - Max Lines - - - - - MapView - - - Maps - - - - - Magnification - - - - - Export - - - - - Copy - - - - - MemoryDump - - - Save Memory Range - - - - - Start Address: - - - - - Byte Count: - - - - - Dump across banks - - - - - MemorySearch - - - Memory Search - - - - - Address - - - - - Current Value - - - - - - Type - - - - - Value - - - - - Numeric - - - - - Text - - - - - Width - - - - - - Guess - - - - - 1 Byte (8-bit) - - - - - 2 Bytes (16-bit) - - - - - 4 Bytes (32-bit) - - - - - Number type - - - - - Decimal - - - - - Hexadecimal - - - - - Search type - - - - - Equal to value - - - - - Greater than value - - - - - Less than value - - - - - Unknown/changed - - - - - Changed by value - - - - - Unchanged - - - - - Increased - - - - - Decreased - - - - - Search ROM - - - - - New Search - - - - - Search Within - - - - - Open in Memory Viewer - - - - - Refresh - - - - - MemoryView - - - Memory - - - - - Inspect Address: - - - - - Set Alignment: - - - - - &1 Byte - - - - - &2 Bytes - - - - - &4 Bytes - - - - - Unsigned Integer: - - - - - Signed Integer: - - - - - String: - - - - - Load TBL - - - - - Copy Selection - - - - - Paste - - - - - Save Selection - - - - - Save Range - - - - - Load - - - - - ObjView - - - Sprites - - - - - Address - - - - - Copy - - - - - Magnification - - - - - Geometry - - - - - Position - - - - - Dimensions - - - - - Matrix - - - - - Export - - - - - Attributes - - - - - Transform - - - - - Off - - - - - Palette - - - - - Double Size - - - - - - - Return, Ctrl+R - - - - - Flipped - - - - - H - Short for horizontal - - - - - V - Short for vertical - - - - - Mode - - - - - Normal - - - - - Mosaic - - - - - Enabled - - - - - Priority - - - - - Tile - - - - - OverrideView - - - Game Overrides - - - - - Game Boy Advance - - - - - - - - Autodetect - - - - - Realtime clock - - - - - Gyroscope - - - - - Tilt - - - - - Light sensor - - - - - Rumble - - - - - Save type - - - - - None - - - - - SRAM - - - - - Flash 512kb - - - - - Flash 1Mb - - - - - EEPROM 8kB - - - - - EEPROM 512 bytes - - - - - SRAM 64kB (bootlegs only) - - - - - Idle loop - - - - - Game Boy Player features - - - - - VBA bug compatibility mode - - - - - Game Boy - - - - - Game Boy model - - - - - Memory bank controller - - - - - Background Colors - - - - - Sprite Colors 1 - - - - - Sprite Colors 2 - - - - - Palette preset - - - - - PaletteView - - - Palette - - - - - Background - - - - - Objects - - - - - Selection - - - - - Red - - - - - Green - - - - - Blue - - - - - 16-bit value - - - - - Hex code - - - - - Palette index - - - - - Export BG - - - - - Export OBJ - - - - - PlacementControl - - - Adjust placement - - - - - All - - - - - Offset - - - - - X - - - - - Y - - - - - PrinterView - - - Game Boy Printer - - - - - Hurry up! - - - - - Tear off - - - - - Magnification - - - - - Copy - + {projectName} е емулатор на Game Boy Advance с отворен код @@ -1184,72 +68,243 @@ Game Boy Advance е регистрирана търговска марка на - + Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + Auto-update is not available on this platform. If you wish to update you will need to do it manually. - + Current version: %1 New version: %2 Download size: %3 - + Downloading update... - + Downloading failed. Please update manually. - + Downloading done. Press OK to restart %1 and install the update. + + + An update is available + Налична е актуализация + QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) + + QGBA::ArchiveInspector + + + Open in archive... + Отвари в архива... + + + + Loading... + Зареждане... + + QGBA::AssetTile - - - + + + 0x%0 (%1) + + + Tile # + Плочка # + + + + Palette # + Палитра # + + + + Address + Адрес + + + + Red + Червено + + + + Green + Зелено + + + + Blue + Синъо + + + + QGBA::AudioDevice + + + Can't set format of context-less audio device + + + + + Audio device is missing its core + + + + + Writing data to read-only audio device + + + + + QGBA::AudioProcessorQt + + + Can't start an audio processor without input + + + + + QGBA::AudioProcessorSDL + + + Can't start an audio processor without input + + + + + QGBA::BattleChipView + + + BattleChip Gate + BattleChip Врата + + + + Chip name + Име на чипа + + + + Insert + Вмъкване + + + + Save + + + + + Load + + + + + Add + Добави + + + + Remove + Премахване + + + + Gate type + Тип на вратата + + + + Inserted + Вкарано + + + + Chip ID + Идентификатор на чипа + + + + Update Chip data + Актуализиране на данните за чипа + + + + Show advanced + Показване на разширения + + + + BattleChip data missing + + + + + BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? + + + + + + Select deck file + + + + + Incompatible deck + + + + + The selected deck is not compatible with this Chip Gate + + QGBA::CheatsModel @@ -1267,63 +322,108 @@ Download size: %3 QGBA::CheatsView - - + + Autodetect (recommended) - - + + Select cheats file + + + Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. + + + + + Cheats + Измами + + + + Add New Code + Добави нов код + + + + Load + + + + + Save + + + + + Remove + Премахване + + + + Enter codes here... + Въведете кодовете тук... + + + + Add Lines + Добави линии + + + + Code type + Тип на кода + QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -1331,86 +431,389 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 - + Could not load game. Are you sure it's in the correct format? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + + QGBA::DebuggerConsole + + + Debugger + Дебъгер + + + + Enter command (try `help` for more info) + Въведете команда (опитайте с `help` за повече информация) + + + + Break + Прекъсване + + QGBA::DebuggerConsoleController - + Could not open CLI history for writing + + QGBA::DisplayGL + + + Failed to create an OpenGL 3 context, trying old-style... + + + + + QGBA::DolphinConnector + + + Connect to Dolphin + Свързване към Dolphin + + + + Local computer + Местен компютър + + + + IP address + IP адрес + + + + Connect + Свързване + + + + Disconnect + Изключване + + + + Close + Затвори + + + + Reset on connect + Нулиране при свързване + + + + Couldn't Connect + + + + + Could not connect to Dolphin. + + + + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + + + Image files (*.png *.jpg *.bmp) + + + QGBA::FrameView - + Export frame - + Portable Network Graphics (*.png) - + None - + Background - + Window - + Objwin - + Sprite - + Backdrop - + Frame - + %1 %2 + + + Inspect frame + Изследване на кадъра + + + + Magnification + Увеличаване + + + + Freeze frame + Замръзи кадъра + + + + Backdrop color + Цвят на фона + + + + Disable scanline effects + Деактивиране на ефектите на сканиращата линия + + + + Export + Износи + + + + Reset + Рестартирай + QGBA::GBAApp - + Enable Discord Rich Presence @@ -1418,22 +821,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh - + Set all @@ -1478,7 +881,7 @@ Download size: %3 Break - + Прекъсване @@ -1518,6 +921,220 @@ Download size: %3 Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) + + + Record GIF/WebP/APNG + Запис в формат GIF/WebP/APNG + + + + Loop + Цикъл + + + + Start + + + + + Stop + + + + + Select File + + + + + APNG + + + + + GIF + + + + + WebP + + + + + Frameskip + + + + + QGBA::GameBoy + + + + Autodetect + + + + + Game Boy (DMG) + + + + + Game Boy Pocket (MGB) + + + + + Super Game Boy (SGB) + + + + + Super Game Boy 2 (SGB) + + + + + Game Boy Color (CGB) + + + + + Game Boy Advance (AGB) + + + + + Super Game Boy Color (SGB + CGB) + + + + + ROM Only + + + + + MBC1 + + + + + MBC2 + + + + + MBC3 + + + + + MBC3 + RTC + + + + + MBC5 + + + + + MBC5 + Rumble + + + + + MBC6 + + + + + MBC7 (Tilt) + + + + + MMM01 + + + + + HuC-1 + + + + + HuC-3 + + + + + Pocket Cam + + + + + TAMA5 + + + + + Wisdom Tree + + + + + NT (old 1) + + + + + NT (old 2) + + + + + NT (new) + + + + + Pokémon Jade/Diamond + + + + + BBD + + + + + Hitek + + + + + GGB-81 + + + + + Li Cheng + + + + + Sachen (MMC1) + + + + + Sachen (MMC2) + + QGBA::IOViewer @@ -2145,7 +1762,7 @@ Download size: %3 Reset - + Рестартирай @@ -2782,6 +2399,17 @@ Download size: %3 + + I/O Viewer + + + + + 0x0000 + + + + B @@ -3349,13 +2977,13 @@ Download size: %3 Red - + Червено Blue - + Синъо @@ -3381,54 +3009,136 @@ Download size: %3 QGBA::KeyEditor - - + + --- + + + QGBA::LibraryTree - - Super (L) + + Name - - Super (R) + + Location - - Menu + + Platform + + + + + Size + + + + + CRC32 QGBA::LoadSaveState - + Load State - + Save State - + Empty - + Corrupted - + Slot %1 + + + + %1 State + + + + + + + + + + + + + No Save + + + + + 5 + + + + + 6 + + + + + 8 + + + + + 4 + + + + + 1 + + + + + 3 + + + + + 7 + + + + + 9 + + + + + 2 + + + + + Cancel + + QGBA::LogConfigModel @@ -3477,133 +3187,284 @@ Download size: %3 QGBA::LogController - + [%1] %2: %3 - + An error occurred - + DEBUG - + STUB - + INFO - + WARN - + ERROR - + FATAL - + GAME ERROR + + QGBA::LogView + + + Logs + + + + + Enabled Levels + + + + + Debug + + + + + Stub + + + + + Info + + + + + Warning + + + + + Error + + + + + Fatal + + + + + Game Error + + + + + Advanced settings + + + + + Clear + + + + + Max Lines + + + QGBA::MapView - + Priority - - + + Map base - - + + Tile base - + Size - - + + Offset - + Xform - + Map Addr. - + Mirror - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) + + + Maps + + + + + Magnification + Увеличаване + + + + Export + Износи + + + + Copy + + + + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + + + QGBA::MemoryAccessLogView + + + Memory access logging + + + + + Log file + + + + + Browse + + + + + Log additional information (uses 3× space) + + + + + Load existing file if present + + + + + Regions + + + + + Export ROM snapshot + + + + + Start + + + + + Stop + + + + + + Select access log file + + + + + Memory access logs (*.mal) + + QGBA::MemoryDump @@ -3617,6 +3478,26 @@ Download size: %3 Failed to open output file: %1 + + + Save Memory Range + + + + + Start Address: + + + + + Byte Count: + + + + + Dump across banks + + QGBA::MemoryModel @@ -3641,42 +3522,42 @@ Download size: %3 - + All - + Load TBL - + Save selected memory - + Failed to open output file: %1 - + Load memory - + Failed to open input file: %1 - + TBL - + ISO-8859-1 @@ -3684,25 +3565,250 @@ Download size: %3 QGBA::MemorySearch - + (%0/%1×) - + (⅟%0×) - + (%0×) - + %1 byte%2 + + + Memory Search + + + + + Address + Адрес + + + + Current Value + + + + + + Type + + + + + Value + + + + + Numeric + + + + + Text + + + + + Width + + + + + + Guess + + + + + 1 Byte (8-bit) + + + + + 2 Bytes (16-bit) + + + + + 4 Bytes (32-bit) + + + + + Number type + + + + + Decimal + + + + + Hexadecimal + + + + + Search type + + + + + Equal to value + + + + + Greater than value + + + + + Less than value + + + + + Unknown/changed + + + + + Changed by value + + + + + Unchanged + + + + + Increased + + + + + Decreased + + + + + Search ROM + + + + + New Search + + + + + Search Within + + + + + Open in Memory Viewer + + + + + Refresh + + + + + QGBA::MemoryView + + + Memory + + + + + Inspect Address: + + + + + Set Alignment: + + + + + &1 Byte + + + + + &2 Bytes + + + + + &4 Bytes + + + + + Unsigned Integer: + + + + + Signed Integer: + + + + + String: + + + + + Load TBL + + + + + Copy Selection + + + + + Paste + + + + + Save Selection + + + + + Save Range + + + + + Load + + QGBA::MessagePainter @@ -3712,64 +3818,208 @@ Download size: %3 + + QGBA::MultiplayerController + + + Trying to detach a multiplayer player that's not attached + + + + + Clearing invalid save ID + + + + + Clearing invalid preferred ID + + + + + Trying to get player ID for a multiplayer player that's not attached + + + + + Trying to get save ID for a multiplayer player that's not attached + + + QGBA::ObjView - - + + 0x%0 - + + Sprites + + + + + Address + Адрес + + + + Copy + + + + + Magnification + Увеличаване + + + + Geometry + + + + + Position + + + + + Dimensions + + + + + Matrix + + + + + Export + Износи + + + + Attributes + + + + + Transform + + + + + Off - - + + Palette + + + + + Double Size + + + + + Flipped + + + + + H + Short for horizontal + + + + + + + Return, Ctrl+R + + + + + V + Short for vertical + + + + + Mode + + + + + Mosaic + + + + + Enabled + + + + + Priority + + + + + Tile + + + - - - + + + + + --- - + + Normal - + Trans - + OBJWIN - + Invalid - - + + N/A - + Export sprite - + Portable Network Graphics (*.png) @@ -3791,1200 +4041,396 @@ Download size: %3 Unlicensed MBCs + + + Game Overrides + + + + + Game Boy Advance + + + + + + + + Autodetect + + + + + Realtime clock + + + + + Gyroscope + + + + + Tilt + + + + + Light sensor + + + + + Rumble + + + + + Save type + + + + + None + + + + + SRAM + + + + + Flash 512kb + + + + + Flash 1Mb + + + + + EEPROM 8kB + + + + + EEPROM 512 bytes + + + + + SRAM 64kB (bootlegs only) + + + + + Idle loop + + + + + Game Boy Player features + + + + + VBA bug compatibility mode + + + + + Game Boy + + + + + Game Boy model + + + + + Memory bank controller + + + + + Background Colors + + + + + Sprite Colors 1 + + + + + Sprite Colors 2 + + + + + Palette preset + + QGBA::PaletteView - + #%0 - + 0x%0 + + - - 0x%0 (%1) - + Export palette - + Windows PAL (*.pal);;Adobe Color Table (*.act) - + Failed to open output palette file: %1 + + + Palette + + + + + Background + + + + + Objects + + + + + Selection + + + + + Red + Червено + + + + Green + Зелено + + + + Blue + Синъо + + + + 16-bit value + + + + + Hex code + + + + + Palette index + + + + + Export BG + + + + + Export OBJ + + + + + QGBA::PlacementControl + + + Adjust placement + + + + + All + + + + + Offset + + + + + X + + + + + Y + + + + + QGBA::PrinterView + + + Game Boy Printer + + + + + Hurry up! + + + + + Tear off + + + + + Magnification + Увеличаване + + + + Copy + + + + + Save Printout + + + + + Portable Network Graphics (*.png) + + QGBA::ROMInfo - + + + - - (unknown) - - + bytes - + (no database present) - - - QGBA::ReportView - - - Bug report archive - - - - - ZIP archive (*.zip) - - - - - QGBA::SaveConverter - - - Save games and save states (%1) - - - - - Select save game or save state - - - - - Save games (%1) - - - - - Select save game - - - - - Conversion failed - - - - - Failed to convert the save game. This is probably a bug. - - - - - No file selected - - - - - Could not open file - - - - - No valid formats found - - - - - Please select a valid input file - - - - - No valid conversions found - - - - - Cannot convert save games between platforms - - - - - QGBA::SettingsView - - - - Qt Multimedia - - - - - SDL - - - - - Software (Qt) - - - - - OpenGL - - - - - OpenGL (force version 1.x) - - - - - None - - - - - None (Still Image) - - - - - Keyboard - - - - - Controllers - - - - - Shortcuts - - - - - - Shaders - - - - - Select BIOS - - - - - Select directory - - - - - (%1×%2) - - - - - Never - - - - - Just now - - - - - Less than an hour ago - - - - - %n hour(s) ago - - - - - - - %n day(s) ago - - - - - - - QGBA::ShaderSelector - - - No shader active - - - - - Load shader - - - - - No shader loaded - - - - - by %1 - - - - - Preprocessing - - - - - Pass %1 - - - - - QGBA::ShortcutModel - - - Action - - - - - Keyboard - - - - - Gamepad - - - - - QGBA::TileView - - - Export tiles - - - - - - Portable Network Graphics (*.png) - - - - - Export tile - - - - - QGBA::VideoView - - - Failed to open output video file: %1 - - - - - Native (%0x%1) - - - - - Select output file - - - - - QGBA::Window - - - Game Boy Advance ROMs (%1) - - - - - Game Boy ROMs (%1) - - - - - All ROMs (%1) - - - - - %1 Video Logs (*.mvl) - - - - - Archives (%1) - - - - - - - Select ROM - - - - - Select folder - - - - - - Select save - - - - - Select patch - - - - - Patches (*.ips *.ups *.bps) - - - - - Select e-Reader dotcode - - - - - e-Reader card (*.raw *.bin *.bmp) - - - - - Select image - - - - - Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - - - - - GameShark saves (*.sps *.xps) - - - - - Select video log - - - - - Video logs (*.mvl) - - - - - Crash - - - - - The game has crashed with the following error: - -%1 - - - - - Couldn't Start - - - - - Could not start game. - - - - - Unimplemented BIOS call - - - - - This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - - - - - Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - - - - - Really make portable? - - - - - This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - - - - - Restart needed - - - - - Some changes will not take effect until the emulator is restarted. - - - - - - Player %1 of %2 - - - - - %1 - %2 - - - - - %1 - %2 - %3 - - - - - %1 - %2 (%3 fps) - %4 - - - - - &File - - - - - Load &ROM... - - - - - Load ROM in archive... - - - - - Add folder to library... - - - - - Save games (%1) - - - - - Select save game - - - - - mGBA save state files (%1) - - - - - - Select save state - - - - - Select e-Reader card images - - - - - Image file (*.png *.jpg *.jpeg) - - - - - Conversion finished - - - - - %1 of %2 e-Reader cards converted successfully. - - - - - Load alternate save game... - - - - - Load temporary save game... - - - - - Load &patch... - - - - - Boot BIOS - - - - - Replace ROM... - - - - - Scan e-Reader dotcodes... - - - - - Convert e-Reader card image to raw... - - - - - ROM &info... - - - - - Recent - - - - - Make portable - - - - - &Load state - - - - - Load state file... - - - - - &Save state - - - - - Save state file... - - - - - Quick load - - - - - Quick save - - - - - Load recent - - - - - Save recent - - - - - Undo load state - - - - - Undo save state - - - - - - State &%1 - - - - - Load camera image... - - - - - Convert save game... - - - - - GameShark saves (*.gsv *.sps *.xps) - - - - - Reset needed - - - - - Some changes will not take effect until the game is reset. - - - - - Save games - - - - - Import GameShark Save... - - - - - Export GameShark Save... - - - - - Automatically determine - - - - - Use player %0 save game - - - - - New multiplayer window - - - - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset - - - - - Sh&utdown - - - - - Yank game pak - - - - - &Pause - - - - - &Next frame - - - - - Fast forward (held) - - - - - &Fast forward - - - - - Fast forward speed - - - - - Unbounded - - - - - %0x - - - - - Rewind (held) - - - - - Re&wind - - - - - Step backwards - - - - - Solar sensor - - - - - Increase solar level - - - - - Decrease solar level - - - - - Brightest solar level - - - - - Darkest solar level - - - - - Brightness %1 - - - - - Game Boy Printer... - - - - - BattleChip Gate... - - - - - Audio/&Video - - - - - Frame size - - - - - %1× - - - - - Toggle fullscreen - - - - - Lock aspect ratio - - - - - Force integer scaling - - - - - Interframe blending - - - - - Bilinear filtering - - - - - Frame&skip - - - - - Mute - - - - - FPS target - - - - - Native (59.7275) - - - - - Take &screenshot - - - - - F12 - - - - - Record A/V... - - - - - Record GIF/WebP/APNG... - - - - - Video layers - - - - - Audio channels - - - - - Adjust layer placement... - - - - - &Tools - - - - - View &logs... - - - - - Game &overrides... - - - - - Game Pak sensors... - - - - - &Cheats... - - - - - Settings... - - - - - Open debugger console... - - - - - Start &GDB server... - - - - - View &palette... - - - - - View &sprites... - - - - - View &tiles... - - - - - View &map... - - - - - &Frame inspector... - - - - - View memory... - - - - - Search memory... - - - - - View &I/O registers... - - - - - Record debug video log... - - - - - Stop debug video log - - - - - Exit fullscreen - - - - - GameShark Button (held) - - - - - Autofire - - - - - Autofire A - - - - - Autofire B - - - - - Autofire L - - - - - Autofire R - - - - - Autofire Start - - - - - Autofire Select - - - - - Autofire Up - - - - - Autofire Right - - - - - Autofire Down - - - - - Autofire Left - - - - - Clear - - - - - QObject - - - %1 byte - - - - - %1 kiB - - - - - %1 MiB - - - - - GBA - - - - - GB - - - - - ? - - - - - QShortcut - - - Shift - - - - - Control - - - - - Alt - - - - - Meta - - - - - ROMInfo ROM Info - + + File information + + + + Game name: - - Internal name: - - - - - Game ID: - - - - + File size: - + CRC32: + + + MD5 + + + + + Save file: + + + + + ROM header + + + + + Internal name: + + + + + Game ID: + + + + + Maker Code: + + + + + Revision: + + - ReportView + QGBA::ReportView + + + Bug report archive + + + + + ZIP archive (*.zip) + + Generate Bug Report @@ -5022,7 +4468,162 @@ Download size: %3 - SaveConverter + QGBA::SaveConverter + + + Save games and save states (%1) + + + + + Select save game or save state + + + + + Save games (%1) + + + + + Select save game + + + + + Conversion failed + + + + + Failed to convert the save game. This is probably a bug. + + + + + No file selected + + + + + Could not open file + + + + + No valid formats found + + + + + Please select a valid input file + + + + + No valid conversions found + + + + + %1 %2 save game + + + + + little endian + + + + + big endian + + + + + SRAM + + + + + %1 flash + + + + + %1 EEPROM + + + + + + RTC + + + + + %1 SRAM + RTC + + + + + %1 SRAM + + + + + packed MBC2 + + + + + unpacked MBC2 + + + + + MBC6 flash + + + + + MBC6 combined SRAM + flash + + + + + MBC6 SRAM + + + + + TAMA5 + + + + + %1 (%2) + + + + + %1 save state with embedded %2 save game + + + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + + + + Cannot convert save games between platforms + + Convert/Extract Save Game @@ -5044,99 +4645,75 @@ Download size: %3 Output file + + + QGBA::ScriptingTextBuffer - - %1 %2 save game - - - - - little endian - - - - - big endian - - - - - SRAM - - - - - %1 flash - - - - - %1 EEPROM - - - - - %1 SRAM + RTC - - - - - %1 SRAM - - - - - packed MBC2 - - - - - unpacked MBC2 - - - - - MBC6 flash - - - - - MBC6 combined SRAM + flash - - - - - MBC6 SRAM - - - - - TAMA5 - - - - - %1 (%2) - - - - - %1 save state with embedded %2 save game - - - - - %1 SharkPort %2 save game - - - - - %1 GameShark Advance SP %2 save game + + Untitled buffer - SensorView + QGBA::ScriptingView + + + Scripting + + + + + Run + + + + + File + + + + + Load recent script + + + + + Load script... + + + + + &Load most recent + + + + + &Reset + + + + + 0 + + + + + Select script to load + + + + + Lua scripts (*.lua) + + + + + All files (*.*) + + + + + QGBA::SensorView Sensors @@ -5149,69 +4726,95 @@ Download size: %3 - Fixed time - - - - System time - - Start time at + + Fixed time - + Now - + + Offset time + + + + + sec + + + + + Start time at + + + + MM/dd/yy hh:mm:ss AP - + Light sensor - + Brightness - + Tilt sensor - - + + Set Y - - + + Set X - + Gyroscope - + Sensitivity - SettingsView + QGBA::SettingsView + + + + Qt Multimedia + + + + + SDL + + + + + Software (Qt) + + Settings @@ -5224,710 +4827,876 @@ Download size: %3 - Interface + Gameplay - Update + Interface - Emulation + Update - Enhancements + Emulation - BIOS + Enhancements - Paths + BIOS - Logging + Paths + Logging + + + + Game Boy - - Audio driver: - - - - - Audio buffer: - - - - - - 1536 - - - - - 512 - - - - - 768 - - - - - 1024 - - - - - 2048 - - - - - 3072 - - - - - 4096 - - - - - samples - - - - - Sample rate: - - - - - - 44100 - - - - - 22050 - - - - - 32000 - - - - - 48000 - - - - - Hz - - - - - Volume: - - - - - - - - Mute - - - - - Fast forward volume: - - - - - Audio in multiplayer: - - - - - All windows - - - - - Player 1 window only - - - - - Currently active player window - - - - - Display driver: - - - - - Frameskip: - - - - - Skip every - - - - - - frames - - - - - FPS target: - - - - - frames per second - - - - - Sync: - - - - - Video - - - - + + Audio - + + Audio driver: + + + + + Audio buffer: + + + + + + 1536 + + + + + 512 + + + + + 768 + + + + + 1024 + + + + + 2048 + + + + + 3072 + + + + + 4096 + + + + + samples + + + + + Sample rate: + + + + + + 44100 + + + + + 22050 + + + + + 32000 + + + + + 48000 + + + + + Hz + + + + + Volume: + + + + + + + + Mute + + + + + Fast forward volume: + + + + + Audio in multiplayer: + + + + + All windows + + + + + Player 1 window only + + + + + Currently active player window + + + + + + Video + + + + + Display driver: + + + + + Frameskip: + + + + + Skip every + + + + + + frames + + + + Lock aspect ratio - + Force integer scaling - - Bilinear filtering - - - - - Show filename instead of ROM name in library view - - - - - - Pause - - - - - When inactive: - - - - - When minimized: - - - - - Current channel: - - - - - Current version: - - - - - Update channel: - - - - - Available version: - - - - - (Unknown) - - - - - Last checked: - - - - - Automatically check on start - - - - - Check now - - - - - Default color palette only - - - - - SGB color palette if available - - - - - GBC color palette if available - - - - - SGB (preferred) or GBC color palette if available - - - - - Game Boy Camera - - - - - Driver: - - - - - Source: - - - - - Native (59.7275) - - - - + Interframe blending - - Language + + Bilinear filtering - - Library: + + FPS target: - - List view + + frames per second - - Tree view + + Native (59.7275) - - Show when no game open + + Sync: - - Clear cache + + On loading a game: - - Allow opposing input directions + + Load last state - - Suspend screensaver + + Load cheats - - Dynamically update window title + + Periodically autosave state - - Show filename instead of ROM name in title bar + + Save entered cheats - - Show OSD messages - - - - - Enable Discord Rich Presence - - - - - Automatically save state - - - - - Automatically load state - - - - - Automatically save cheats - - - - - Automatically load cheats - - - - - Show FPS in title bar - - - - - Show frame count in OSD - - - - - Show emulation info on reset - - - - - Fast forward speed: - - - - - - Unbounded - - - - - Fast forward (held) speed: - - - - - Autofire interval: - - - - - Enable rewind - - - - - Rewind history: - - - - - Idle loops: - - - - - Run all - - - - - Remove known - - - - - Detect and remove - - - - - Preload entire ROM into memory - - - - + Save state extra data: - - - Save game - - - - - Load state extra data: - - - - - Models - - - - - GB only: - - - - - SGB compatible: - - - - - GBC only: - - - - - GBC compatible: - - - - - SGB and GBC compatible: - - - - - Game Boy palette - - - - - Preset: - - - - - + + Screenshot - - + + + Save game + + + + + Cheat codes - - Enable Game Boy Player features by default + + Load state extra data: - - Enable VBA bug compatibility in ROM hacks + + Enable Discord Rich Presence - - Video renderer: + + Language - - Software + + Library: - - OpenGL + + List view - - OpenGL enhancements + + Tree view - - High-resolution scale: + + Show when no game open - - (240×160) + + Show filename instead of ROM name in library view - - XQ GBA audio (experimental) + + Clear cache - - GB BIOS file: + + Allow opposing input directions - - - - - - + + Suspend screensaver + + + + + When inactive: + + + + + + Pause + + + + + When minimized: + + + + + Dynamically update window title + + + + + Show FPS in title bar + + + + + Show filename instead of ROM name in title bar + + + + + Show OSD messages + + + + + Show frame count in OSD + + + + + Show emulation info on reset + + + + + + + + + + Browse - - Use BIOS file if found + + Custom border: - - Skip BIOS intro + + Current channel: - - GBA BIOS file: + + Current version: - - GBC BIOS file: + + Update channel: - + + Available version: + + + + + (Unknown) + + + + + Last checked: + + + + + Automatically check on start + + + + + Check now + + + + + Fast forward speed: + + + + + + Unbounded + + + + + Fast forward (held) speed: + + + + + Autofire interval: + + + + + Enable rewind + + + + + Rewind history: + + + + + Rewind speed: + + + + + Idle loops: + + + + + Run all + + + + + Remove known + + + + + Detect and remove + + + + + Preload entire ROM into memory + + + + + Enable Game Boy Player features by default + + + + + Enable VBA bug compatibility in ROM hacks + + + + + Video renderer: + + + + + Software + + + + + + OpenGL + + + + + OpenGL enhancements + + + + + High-resolution scale: + + + + + (240×160) + + + + + GB BIOS file: + + + + SGB BIOS file: - - Save games + + GBC BIOS file: + + + + + GBA BIOS file: + + + + + Use BIOS file if found - - - - - Same directory as the ROM - - - - - Save states + Skip BIOS intro - Screenshots + Save games + + + + + + + + + Same directory as the ROM - Patches + Save states - Cheats + Screenshots - + + Patches + + + + + Cheats + Измами + + + Log to file - + Log to console - + Select Log File - + + Models + + + + + GB only: + + + + + SGB compatible: + + + + + GBC only: + + + + + GBC compatible: + + + + + SGB and GBC compatible: + + + + + Super Game Boy borders + + + + + Game Boy palette + + + + + Preset: + + + + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - - Super Game Boy borders + + SGB color palette if available + + + Default color palette only + + + + + GBC color palette if available + + + + + SGB (preferred) or GBC color palette if available + + + + + Game Boy Camera + + + + + Driver: + + + + + Source: + + + + + OpenGL (force version 1.x) + + + + + None + + + + + None (Still Image) + + + + + Keyboard + + + + + Controllers + + + + + Shortcuts + + + + + Shaders are not supported when the display driver is not OpenGL. + +If it is set to OpenGL and you still see this, your graphics card or drivers may be too old. + + + + + + + + Shaders + + + + + Select BIOS + + + + + Select directory + + + + + Select image + + + + + Image file (*.png *.jpg *.jpeg) + + + + + (%1×%2) + + + + + Never + + + + + Just now + + + + + Less than an hour ago + + + + + %n hour(s) ago + + + + + + + + %n day(s) ago + + + + + - ShaderSelector + QGBA::ShaderSelector + + + No shader active + + + + + + Load shader + + + + + mGBA Shaders + + + + + Error loading shader + + + + + The shader "%1" could not be loaded successfully. + + + + + No shader loaded + + + + + by %1 + + + + + Preprocessing + + + + + Pass %1 + + Shaders @@ -5965,7 +5734,25 @@ Download size: %3 - ShortcutView + QGBA::ShortcutModel + + + Action + + + + + Keyboard + + + + + Gamepad + + + + + QGBA::ShortcutView Edit Shortcuts @@ -5988,36 +5775,42 @@ Download size: %3 - TileView + QGBA::TileView + + + Export tiles + + + + + + Portable Network Graphics (*.png) + + + + + Export tile + + Tiles - - - Export Selected - - - - - Export All - - - - - 256 colors - - Palette + + + 256 colors + + Magnification - + Увеличаване @@ -6054,14 +5847,39 @@ Download size: %3 Copy Selected + + + Export Selected + + Copy All + + + Export All + + - VideoView + QGBA::VideoView + + + Failed to open output video file: %1 + + + + + Native (%0x%1) + + + + + Select output file + + Record Video @@ -6099,13 +5917,11 @@ Download size: %3 - WebM - MP4 @@ -6145,119 +5961,899 @@ Download size: %3 - - MKV - - - - - AVI - - - - - HEVC - - - - - HEVC (NVENC) - - - - - VP8 - - - - - VP9 - - - - - FFV1 - - - - - - None - - - - - FLAC - - - - - Opus - - - - - Vorbis - - - - - MP3 - - - - - AAC - - - - - Uncompressed - - - - + Bitrate (kbps) - + ABR - - H.264 - - - - - H.264 (NVENC) - - - - + VBR - + CRF - + Dimensions - + Lock aspect ratio - + Show advanced + Показване на разширения + + + + QGBA::Window + + + Archives (%1) + + + + + + + Select ROM + + + + + Select folder + + + + + + Select save + + + + + Select patch + + + + + Patches (*.ips *.ups *.bps) + + + + + Select e-Reader dotcode + + + + + e-Reader card (*.raw *.bin *.bmp) + + + + + Select image + + + + + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) + + + + + GameShark saves (*.sps *.xps) + + + + + Select video log + + + + + Video logs (*.mvl) + + + + + Crash + + + + + The game has crashed with the following error: + +%1 + + + + + Couldn't Start + + + + + Could not start game. + + + + + Unimplemented BIOS call + + + + + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. + + + + + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. + + + + + Really make portable? + + + + + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? + + + + + Restart needed + + + + + Some changes will not take effect until the emulator is restarted. + + + + + - Player %1 of %2 + + + + + %1 - %2 + + + + + %1 - %2 - %3 + + + + + %1 - %2 (%3 fps) - %4 + + + + + &File + + + + + Load &ROM... + + + + + Load ROM in archive... + + + + + Add folder to library... + + + + + Save games (%1) + + + + + Select save game + + + + + mGBA save state files (%1) + + + + + + Select save state + + + + + Select e-Reader card images + + + + + Image file (*.png *.jpg *.jpeg) + + + + + Conversion finished + + + + + %1 of %2 e-Reader cards converted successfully. + + + + + Load alternate save game... + + + + + Load temporary save game... + + + + + Load &patch... + + + + + Boot BIOS + + + + + Replace ROM... + + + + + Scan e-Reader dotcodes... + + + + + Convert e-Reader card image to raw... + + + + + ROM &info... + + + + + Recent + + + + + Make portable + + + + + &Load state + + + + + Load state file... + + + + + &Save state + + + + + Save state file... + + + + + Quick load + + + + + Quick save + + + + + Load recent + + + + + Save recent + + + + + Undo load state + + + + + Undo save state + + + + + + State &%1 + + + + + Load camera image... + + + + + Convert save game... + + + + + GameShark saves (*.gsv *.sps *.xps) + + + + + Reset needed + + + + + Some changes will not take effect until the game is reset. + + + + + Save games + + + + + Import GameShark Save... + + + + + Export GameShark Save... + + + + + Automatically determine + + + + + Use player %0 save game + + + + + New multiplayer window + + + + + Connect to Dolphin... + + + + + Report bug... + + + + + About... + + + + + E&xit + + + + + &Emulation + + + + + &Reset + + + + + Sh&utdown + + + + + Yank game pak + + + + + &Pause + + + + + &Next frame + + + + + Fast forward (held) + + + + + &Fast forward + + + + + Fast forward speed + + + + + Unbounded + + + + + %0x + + + + + Increase fast forward speed + + + + + Decrease fast forward speed + + + + + Rewind (held) + + + + + Re&wind + + + + + Step backwards + + + + + Solar sensor + + + + + Increase solar level + + + + + Decrease solar level + + + + + Brightest solar level + + + + + Darkest solar level + + + + + Brightness %1 + + + + + Game Boy Printer... + + + + + BattleChip Gate... + + + + + Audio/&Video + + + + + Frame size + + + + + %1× + + + + + Toggle fullscreen + + + + + &Lock frame size + + + + + Lock aspect ratio + + + + + Force integer scaling + + + + + Interframe blending + + + + + Bilinear filtering + + + + + Frame&skip + + + + + Mute + + + + + FPS target + + + + + Native (59.7275) + + + + + Take &screenshot + + + + + F12 + + + + + Record A/V... + + + + + Record GIF/WebP/APNG... + + + + + Video layers + + + + + Audio channels + + + + + Adjust layer placement... + + + + + &Tools + + + + + View &logs... + + + + + Game &overrides... + + + + + Game Pak sensors... + + + + + &Cheats... + + + + + Scripting... + + + + + Create forwarder... + + + + + Settings... + + + + + Open debugger console... + + + + + Start &GDB server... + + + + + Game state views + + + + + View &palette... + + + + + View &sprites... + + + + + View &tiles... + + + + + View &map... + + + + + &Frame inspector... + + + + + View memory... + + + + + Search memory... + + + + + View &I/O registers... + + + + + Log memory &accesses... + + + + + Record debug video log... + + + + + Stop debug video log + + + + + Exit fullscreen + + + + + GameShark Button (held) + + + + + Autofire + + + + + Autofire A + + + + + Autofire B + + + + + Autofire L + + + + + Autofire R + + + + + Autofire Start + + + + + Autofire Select + + + + + Autofire Up + + + + + Autofire Right + + + + + Autofire Down + + + + + Autofire Left + + + + + Clear + + + + + QObject + + + %1 byte + + + + + %1 kiB + + + + + %1 MiB + + + + + GBA + + + + + GB + + + + + ? + + + + + Super (L) + + + + + Super (R) + + + + + Menu + + + + + QShortcut + + + Shift + + + + + Control + + + + + Alt + + + + + Meta diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index b430e2758..726f511d6 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -387,48 +387,48 @@ Download-Größe: %3 QGBA::CoreController - + Reset r%1-%2 %3 r%1-%2 %3 zurücksetzen - - + + Rewinding not currently enabled Zurückspulen ist derzeit nicht aktiviert - + Reset the game? Spiel zurücksetzen? - + Most games will require a reset to load the new save. Do you want to reset now? Die meisten Spiele müssen zurückgesetzt werden, um einen neuen Spielstand zu laden. Möchtest Du das Spiel jetzt zurücksetzen? - + Failed to open save file: %1 Fehler beim Öffnen der Speicherdatei: %1 - + Failed to open game file: %1 Fehler beim Öffnen der Spieldatei: %1 - + Can't yank pack in unexpected platform! Das GamePak kann nur auf unterstützten Plattformen herausgezogen werden! - + Failed to open snapshot file for reading: %1 Konnte Snapshot-Datei %1 nicht zum Lesen öffnen - + Failed to open snapshot file for writing: %1 Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen @@ -3403,6 +3403,15 @@ Download-Größe: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Download-Größe: %3 Stopp - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6187,7 +6191,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may ROM ersetzen... - + Convert e-Reader card image to raw... Lesegerät-Kartenbild in Rohdaten umwandeln … @@ -6498,7 +6502,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Clear Leeren @@ -6714,77 +6718,77 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may &I/O-Register betrachten... - + Record debug video log... Video-Protokoll aufzeichnen... - + Stop debug video log Aufzeichnen des Video-Protokolls beenden - + Exit fullscreen Vollbildmodus beenden - + GameShark Button (held) GameShark-Taste (gehalten) - + Autofire Autofeuer - + Autofire A Autofeuer A - + Autofire B Autofeuer B - + Autofire L Autofeuer L - + Autofire R Autofeuer R - + Autofire Start Autofeuer Start - + Autofire Select Autofeuer Select - + Autofire Up Autofeuer nach oben - + Autofire Right Autofeuer rechts - + Autofire Down Autofeuer nach unten - + Autofire Left Autofeuer links diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index 316c5d2c3..20b0fe65b 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -381,48 +381,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3397,6 +3397,15 @@ Download size: %3 + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3445,18 +3454,13 @@ Download size: %3 - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6230,7 +6234,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Convert e-Reader card image to raw... @@ -6701,82 +6705,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-es.ts b/src/platform/qt/ts/mgba-es.ts index d1701d571..6aa86cb78 100644 --- a/src/platform/qt/ts/mgba-es.ts +++ b/src/platform/qt/ts/mgba-es.ts @@ -387,48 +387,48 @@ Tamaño de descarga: %3 QGBA::CoreController - + Reset r%1-%2 %3 Reiniciar r%1-%2 %3 - - + + Rewinding not currently enabled Rebobinado desactivado actualmente - + Reset the game? ¿Reiniciar el juego? - + Most games will require a reset to load the new save. Do you want to reset now? La mayoría de juegos requieren reiniciar para cargar la nueva partida guardada. ¿Quieres reiniciar ahora? - + Failed to open save file: %1 Error al abrir el archivo de guardado: %1 - + Failed to open game file: %1 Error al abrir el archivo del juego: %1 - + Can't yank pack in unexpected platform! ¡No se puede quitar el cartucho en esta plataforma! - + Failed to open snapshot file for reading: %1 Error al leer del archivo de captura: %1 - + Failed to open snapshot file for writing: %1 Error al escribir al archivo de captura: %1 @@ -3403,6 +3403,15 @@ Tamaño de descarga: %3 Gráficos de red portátiles (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + Error al abrir el archivo de registro de memoria + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Tamaño de descarga: %3 Detener - - Failed to open memory log file - Error al abrir el archivo de registro de memoria - - - - + + Select access log file Seleccionar archivo de registro de acceso - + Memory access logs (*.mal) Archivos de registro de memoria (*.mal) @@ -6224,7 +6228,7 @@ Si está configurado como OpenGL y estás viendo esto, tu tarjeta gráfica o con Sensores del cartucho... - + Clear Limpiar @@ -6285,7 +6289,7 @@ Si está configurado como OpenGL y estás viendo esto, tu tarjeta gráfica o con Cargar partida guardada temporal... - + Convert e-Reader card image to raw... Convertir imagen de tarjeta e-Reader a archivo en bruto... @@ -6716,77 +6720,77 @@ Si está configurado como OpenGL y estás viendo esto, tu tarjeta gráfica o con Registrar &accesoa la memoria… - + Record debug video log... Grabar registro de depuración de vídeo... - + Stop debug video log Detener registro de depuración de vídeo - + Exit fullscreen Salir de pantalla completa - + GameShark Button (held) Botón GameShark (mantener) - + Autofire Disparo automático - + Autofire A Disparo automático A - + Autofire B Disparo automático B - + Autofire L Disparo automático L - + Autofire R Disparo automático R - + Autofire Start Disparo automático Start - + Autofire Select Disparo automático Select - + Autofire Up Disparo automático arriba - + Autofire Right Disparo automático derecha - + Autofire Down Disparo automático abajo - + Autofire Left Disparo automático izquierda diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index c9f9aefd1..2131a26bc 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -91,22 +114,22 @@ Latauksen koko: %3 QGBA::ApplicationUpdater - + Stable Vakaa - + Development Kehitysversio - + Unknown Tuntematon - + (None) (Ei mitään) @@ -167,17 +190,17 @@ Latauksen koko: %3 QGBA::AudioDevice - + Can't set format of context-less audio device - + Audio device is missing its core - + Writing data to read-only audio device @@ -185,7 +208,7 @@ Latauksen koko: %3 QGBA::AudioProcessorQt - + Can't start an audio processor without input @@ -261,28 +284,28 @@ Latauksen koko: %3 - + BattleChip data missing - + BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? - - + + Select deck file - + Incompatible deck - + The selected deck is not compatible with this Chip Gate @@ -343,19 +366,19 @@ Latauksen koko: %3 Laita koodit tähän... - - + + Autodetect (recommended) - - + + Select cheats file - + Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. @@ -363,48 +386,48 @@ Latauksen koko: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -412,17 +435,17 @@ Latauksen koko: %3 QGBA::CoreManager - + Failed to open game file: %1 - + Could not load game. Are you sure it's in the correct format? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -448,11 +471,19 @@ Latauksen koko: %3 QGBA::DebuggerConsoleController - + Could not open CLI history for writing + + QGBA::DisplayGL + + + Failed to create an OpenGL 3 context, trying old-style... + + + QGBA::DolphinConnector @@ -501,6 +532,200 @@ Latauksen koko: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + + + Image files (*.png *.jpg *.bmp) + + + QGBA::FrameView @@ -539,52 +764,52 @@ Latauksen koko: %3 - + Export frame - + Portable Network Graphics (*.png) - + None - + Background - + Window - + Objwin - + Sprite - + Backdrop - + Frame - + %1 %2 @@ -592,7 +817,7 @@ Latauksen koko: %3 QGBA::GBAApp - + Enable Discord Rich Presence @@ -600,22 +825,22 @@ Latauksen koko: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh - + Set all @@ -749,148 +974,168 @@ Latauksen koko: %3 QGBA::GameBoy - - + + Autodetect - + Game Boy (DMG) Game Boy (DMG) - + Game Boy Pocket (MGB) Game Boy Pocket (MGB) - + Super Game Boy (SGB) Super Game Boy (SGB) - + Super Game Boy 2 (SGB) Super Game Boy 2 (SGB) - + Game Boy Color (CGB) Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2718,7 +2963,7 @@ Latauksen koko: %3 Unknown - + Tuntematon @@ -2768,26 +3013,11 @@ Latauksen koko: %3 QGBA::KeyEditor - - + + --- - - - Super (L) - - - - - Super (R) - - - - - Menu - - QGBA::LibraryTree @@ -2909,7 +3139,7 @@ Latauksen koko: %3 - + Slot %1 @@ -3135,43 +3365,111 @@ Latauksen koko: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + + + QGBA::MemoryAccessLogView + + + Memory access logging + + + + + Log file + + + + + Browse + + + + + Log additional information (uses 3× space) + + + + + Load existing file if present + + + + + Regions + + + + + Export ROM snapshot + + + + + Start + + + + + Stop + + + + + + Select access log file + + + + + Memory access logs (*.mal) + + + QGBA::MemoryDump @@ -3418,22 +3716,22 @@ Latauksen koko: %3 - + (%0/%1×) - + (⅟%0×) - + (%0×) - + %1 byte%2 @@ -3524,6 +3822,34 @@ Latauksen koko: %3 + + QGBA::MultiplayerController + + + Trying to detach a multiplayer player that's not attached + + + + + Clearing invalid save ID + + + + + Clearing invalid preferred ID + + + + + Trying to get player ID for a multiplayer player that's not attached + + + + + Trying to get save ID for a multiplayer player that's not attached + + + QGBA::ObjView @@ -3916,35 +4242,35 @@ Latauksen koko: %3 - + #%0 - + 0x%0 + + - - 0x%0 (%1) - + Export palette - + Windows PAL (*.pal);;Adobe Color Table (*.act) - + Failed to open output palette file: %1 @@ -4018,20 +4344,21 @@ Latauksen koko: %3 QGBA::ROMInfo - - - - + + + + + (unknown) - + bytes - + (no database present) @@ -4041,27 +4368,57 @@ Latauksen koko: %3 - + + File information + + + + Game name: - + + MD5 + + + + + Save file: + + + + + ROM header + + + + Internal name: - + Game ID: - + + Maker Code: + + + + + Revision: + + + + File size: - + CRC32: @@ -4117,62 +4474,62 @@ Latauksen koko: %3 QGBA::SaveConverter - + Save games and save states (%1) - + Select save game or save state - + Save games (%1) - + Select save game - + Conversion failed - + Failed to convert the save game. This is probably a bug. - + No file selected - + Could not open file - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4198,92 +4555,97 @@ Latauksen koko: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - - %1 SRAM + RTC - - - - - %1 SRAM + + + RTC - packed MBC2 + %1 SRAM + RTC - unpacked MBC2 + %1 SRAM - MBC6 flash + packed MBC2 + unpacked MBC2 + + + + + MBC6 flash + + + + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game - + %1 SharkPort %2 save game - + %1 GameShark Advance SP %2 save game @@ -4291,7 +4653,7 @@ Latauksen koko: %3 QGBA::ScriptingTextBuffer - + Untitled buffer @@ -4319,32 +4681,37 @@ Latauksen koko: %3 - + Load script... - + + &Load most recent + + + + &Reset - + 0 - + Select script to load - + Lua scripts (*.lua) - + All files (*.*) @@ -4437,95 +4804,114 @@ Latauksen koko: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) - - + + OpenGL - + OpenGL (force version 1.x) - + None - + None (Still Image) - + Keyboard - + Controllers - + Shortcuts - - + + Shaders are not supported when the display driver is not OpenGL. + +If it is set to OpenGL and you still see this, your graphics card or drivers may be too old. + + + + + + + Shaders - + Select BIOS - + Select directory - + + Select image + + + + + Image file (*.png *.jpg *.jpeg) + + + + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -4533,7 +4919,7 @@ Latauksen koko: %3 - + %n day(s) ago @@ -4732,7 +5118,7 @@ Latauksen koko: %3 - + frames @@ -4820,77 +5206,77 @@ Latauksen koko: %3 - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -4985,58 +5371,68 @@ Latauksen koko: %3 - + + Custom border: + + + + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + + Rewind speed: + + + + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory @@ -5057,42 +5453,42 @@ Latauksen koko: %3 - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: @@ -5109,154 +5505,150 @@ Latauksen koko: %3 - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL enhancements - + High-resolution scale: - + (240×160) - - XQ GBA audio (experimental) - - - - + GB BIOS file: - - - - + + + + - - - - + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats Huijaukset - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders @@ -5264,32 +5656,48 @@ Latauksen koko: %3 QGBA::ShaderSelector - + No shader active - + + Load shader - + + mGBA Shaders + + + + + Error loading shader + + + + + The shader "%1" could not be loaded successfully. + + + + No shader loaded - + by %1 - + Preprocessing - + Pass %1 @@ -5332,17 +5740,17 @@ Latauksen koko: %3 QGBA::ShortcutModel - + Action - + Keyboard - + Gamepad @@ -5462,17 +5870,17 @@ Latauksen koko: %3 QGBA::VideoView - + Failed to open output video file: %1 - + Native (%0x%1) - + Select output file @@ -5513,13 +5921,11 @@ Latauksen koko: %3 - WebM - MP4 @@ -5558,82 +5964,6 @@ Latauksen koko: %3 Format - - - MKV - - - - - AVI - - - - - HEVC - - - - - HEVC (NVENC) - - - - - VP8 - - - - - VP9 - - - - - FFV1 - - - - - - None - - - - - FLAC - - - - - WavPack - - - - - Opus - - - - - Vorbis - - - - - MP3 - - - - - AAC - - - - - Uncompressed - - Bitrate (kbps) @@ -5644,16 +5974,6 @@ Latauksen koko: %3 ABR - - - H.264 - - - - - H.264 (NVENC) - - VBR @@ -5683,784 +6003,789 @@ Latauksen koko: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - - - - - Game Boy ROMs (%1) - - - - - All ROMs (%1) - - - - - %1 Video Logs (*.mvl) - - - - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + GameShark saves (*.gsv *.sps *.xps) - + Convert e-Reader card image to raw... - + Import GameShark Save... - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - - Rewind (held) + + Increase fast forward speed - - Re&wind - - - - - Step backwards - - - - - Solar sensor - - - - - Increase solar level - - - - - Decrease solar level - - - - - Brightest solar level - - - - - Darkest solar level + + Decrease fast forward speed - Brightness %1 + Rewind (held) - - Game Boy Printer... + + Re&wind - BattleChip Gate... - - - - - Audio/&Video - - - - - Frame size + Step backwards + Solar sensor + + + + + Increase solar level + + + + + Decrease solar level + + + + + Brightest solar level + + + + + Darkest solar level + + + + + Brightness %1 + + + + + Game Boy Printer... + + + + + BattleChip Gate... + + + + + Audio/&Video + + + + + Frame size + + + + %1× - + Toggle fullscreen - + + &Lock frame size + + + + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + + Create forwarder... + + + + Settings... - + Open debugger console... - + Start &GDB server... - + Scripting... - + Game state views - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + + Log memory &accesses... + + + + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear @@ -6468,55 +6793,70 @@ Latauksen koko: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? + + + Super (L) + + + + + Super (R) + + + + + Menu + + QShortcut - + Shift - + Control - + Alt - + Meta diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index 04411e5c3..628941e50 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -388,48 +388,48 @@ Taille du téléchargement : %3 QGBA::CoreController - + Reset r%1-%2 %3 Réinitialiser r%1-%2 %3 - - + + Rewinding not currently enabled Le rembobinage n'est pas actuellement activé - + Reset the game? Réinitialiser le jeu ? - + Most games will require a reset to load the new save. Do you want to reset now? La plupart des jeux nécessitent une réinitialisation pour charger la nouvelle sauvegarde. Voulez-vous réinitialiser maintenant ? - + Failed to open save file: %1 Échec de l'ouverture du fichier de sauvegarde : %1 - + Failed to open game file: %1 Échec de l'ouverture du fichier de jeu : %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Échec de l'ouverture de l'instantané pour lire : %1 - + Failed to open snapshot file for writing: %1 Échec de l'ouverture de l'instantané pour écrire : %1 @@ -3421,6 +3421,15 @@ Taille du téléchargement : %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3469,18 +3478,13 @@ Taille du téléchargement : %3 Arrêter - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6241,7 +6245,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Convert e-Reader card image to raw... @@ -6728,82 +6732,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Voir les registres d'&E/S... - + Record debug video log... Enregistrer le journal vidéo de débogage... - + Stop debug video log Arrêter le journal vidéo de débogage - + Exit fullscreen Quitter le plein écran - + GameShark Button (held) Bouton GameShark (maintenir) - + Autofire Tir automatique - + Autofire A Tir automatique A - + Autofire B Tir automatique B - + Autofire L Tir automatique L - + Autofire R Tir automatique R - + Autofire Start Tir automatique Start - + Autofire Select Tir automatique Select - + Autofire Up Tir automatique Up - + Autofire Right Tir automatique Right - + Autofire Down Tir automatique Down - + Autofire Left Tir automatique Gauche - + Clear Vider diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index b7da40d8c..95f654c8a 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -388,48 +388,48 @@ Letöltendő adat: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled Visszatekerés jelenleg nem engedélyezett - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 Nem sikerült a mentésfájl megnyitása: %1 - + Failed to open game file: %1 Nem sikerült a játékfájl megnyitása: %1 - + Can't yank pack in unexpected platform! A játékkazettát nem lehet kirántani ismeretlen platformon! - + Failed to open snapshot file for reading: %1 A pillanatkép fájljának olvasásra való megnyitása sikertelen: %1 - + Failed to open snapshot file for writing: %1 A pillanatkép fájljának írásra való megnyitása sikertelen: %1 @@ -3404,6 +3404,15 @@ Letöltendő adat: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3452,18 +3461,13 @@ Letöltendő adat: %3 - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6235,7 +6239,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Convert e-Reader card image to raw... @@ -6706,82 +6710,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Napló törlése diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index 6aaf5d809..f12794bb1 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -387,48 +387,48 @@ Dimensione del download: %3 QGBA::CoreController - + Reset r%1-%2 %3 Reset r%1-%2 %3 - - + + Rewinding not currently enabled La funzione 'riavvolgi' non è attualmente abilitata - + Reset the game? Riavviare il gioco? - + Most games will require a reset to load the new save. Do you want to reset now? La maggior parte dei giochi richiede un riavvio per caricare il nuovo salvataggio. Vuoi riavviare ora? - + Failed to open save file: %1 Impossibile aprire il file di salvataggio: %1 - + Failed to open game file: %1 Impossibile aprire il file di gioco: %1 - + Can't yank pack in unexpected platform! Non riesco a strappare il pacchetto in una piattaforma inaspettata! - + Failed to open snapshot file for reading: %1 Impossibile aprire il file snapshot per la lettura: %1 - + Failed to open snapshot file for writing: %1 Impossibile aprire il file snapshot per la scrittura: %1 @@ -3403,6 +3403,15 @@ Dimensione del download: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + Impossibile aprire il file di registro della memoria + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Dimensione del download: %3 Ferma - - Failed to open memory log file - Impossibile aprire il file di registro della memoria - - - - + + Select access log file Seleziona il file di registro di accesso - + Memory access logs (*.mal) Registri degli accessi alla memoria (*.mal) @@ -6187,7 +6191,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Scansiona e-Reader dotcode... - + Convert e-Reader card image to raw... Converti immagini carte e-Reader in raw... @@ -6709,82 +6713,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Registra memoria &accessi... - + Record debug video log... Salva registro video di debug... - + Stop debug video log Ferma registro video di debug - + Exit fullscreen Esci da Schermo Intero - + GameShark Button (held) Pulsante GameShark (tieni premuto) - + Autofire Pulsanti Autofire - + Autofire A Autofire A - + Autofire B Autofire B - + Autofire L Autofire L - + Autofire R Autofire R - + Autofire Start Autofire Start - + Autofire Select Autofire Select - + Autofire Up Autofire Su - + Autofire Right AAutofire Destra - + Autofire Down Autofire Giù - + Autofire Left Autofire Sinistra - + Clear Pulisci diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index 8a2425753..5d4fa2a78 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -387,48 +387,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 セーブファイルを開けませんでした: %1 - + Failed to open game file: %1 ゲームファイルを開けませんでした: %1 - + Can't yank pack in unexpected platform! 予期しないプラットフォームでパックをヤンクすることはできません! - + Failed to open snapshot file for reading: %1 読み取り用のスナップショットファイルを開けませんでした: %1 - + Failed to open snapshot file for writing: %1 書き込み用のスナップショットファイルを開けませんでした: %1 @@ -3403,6 +3403,15 @@ Download size: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Download size: %3 停止 - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6225,7 +6229,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may カートリッジセンサー... - + Clear 消去 @@ -6286,7 +6290,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Convert e-Reader card image to raw... @@ -6712,77 +6716,77 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... デバッグビデオログ... - + Stop debug video log デバッグビデオログを停止 - + Exit fullscreen 全画面表示を終了 - + GameShark Button (held) GameSharkボタン(押し) - + Autofire 連打 - + Autofire A 連打 A - + Autofire B 連打 B - + Autofire L 連打 L - + Autofire R 連打 R - + Autofire Start 連打 Start - + Autofire Select 連打 Select - + Autofire Up 連打 上 - + Autofire Right 連打 右 - + Autofire Down 連打 下 - + Autofire Left 連打 左 diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index e6363dd49..18fc7ea44 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -387,48 +387,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 r%1-%2 %3 재설정 - - + + Rewinding not currently enabled 현재 활성화되지 않은 되감기 - + Reset the game? 게임을 재설정하겠습니까? - + Most games will require a reset to load the new save. Do you want to reset now? 대부분의 게임은 새로운 저장을 로드하려면 재설정이 필요합니다. 지금 재설정하겠습니까? - + Failed to open save file: %1 저장 파일을 열지 못했습니다: %1 - + Failed to open game file: %1 게임 파일을 열지 못했습니다: %1 - + Can't yank pack in unexpected platform! 예기치 않은 플랫폼에서 팩을 잡아당길 수 없습니다! - + Failed to open snapshot file for reading: %1 읽기 용 스냅샷 파일을 열지 못했습니다: %1 - + Failed to open snapshot file for writing: %1 쓰기 용 스냅샷 파일을 열지 못했습니다: %1 @@ -3403,6 +3403,15 @@ Download size: %3 휴대용 네트워크 그래픽 (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + 메모리 로그 파일을 열 수 없음 + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Download size: %3 정지 - - Failed to open memory log file - 메모리 로그 파일을 열 수 없음 - - - - + + Select access log file 접속 파일 선택 - + Memory access logs (*.mal) 메모리 접속 로그 (*.mal) @@ -6215,7 +6219,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may 게임 상태 보기 - + Convert e-Reader card image to raw... e-리더 카드 이미지를 원시 데이터로 변환... @@ -6707,82 +6711,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may 메모리 및 접속 기록... - + Record debug video log... 디버그 비디오 로그 녹화... - + Stop debug video log 디버그 비디오 로그 중지 - + Exit fullscreen 전체화면 종료 - + GameShark Button (held) 게임샤크 버튼 (누름) - + Autofire 연사 - + Autofire A 연사 A - + Autofire B 연사 B - + Autofire L 연사 L - + Autofire R 연사 R - + Autofire Start 연사 시작 - + Autofire Select 연사 선택 - + Clear 지움 - + Autofire Up 연사 위쪽 - + Autofire Right 연사 오른쪽 - + Autofire Down 연사 아래쪽 - + Autofire Left 연사 왼쪽 diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index d8b2f9b09..077aad1e6 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -381,48 +381,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 Gagal membuka fail tersimpan: %1 - + Failed to open game file: %1 Gagal membuka fail permainan: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Gagal membuka fail snapshot untuk baca: %1 - + Failed to open snapshot file for writing: %1 Gagal membuka fail snapshot untuk menulis: %1 @@ -3397,6 +3397,15 @@ Download size: %3 Grafik Rangkaian Mudah Alih (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3445,18 +3454,13 @@ Download size: %3 Henti - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6230,7 +6234,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Convert e-Reader card image to raw... @@ -6701,82 +6705,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... Rakam log video nyahpepijat... - + Stop debug video log Henti log video nyahpepijat - + Exit fullscreen Keluar skrinpenuh - + GameShark Button (held) Butang GameShark (pegang) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Kosongkan diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index f62f3793a..3042bccf2 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -385,48 +385,48 @@ Nedlastningsstørrelse: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? Vil du starte spillet på nytt? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 Klarte ikke å åpne spillfil: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3401,6 +3401,15 @@ Nedlastningsstørrelse: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3449,18 +3458,13 @@ Nedlastningsstørrelse: %3 Stopp - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6234,7 +6238,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Skann e-Reader-punktkoder... - + Convert e-Reader card image to raw... @@ -6705,82 +6709,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... - + Stop debug video log - + Exit fullscreen Gå ut av fullskjerm - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear Tøm diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index f57681d77..bc0b2c768 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -86,22 +109,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -162,17 +185,17 @@ Download size: %3 QGBA::AudioDevice - + Can't set format of context-less audio device - + Audio device is missing its core - + Writing data to read-only audio device @@ -180,7 +203,7 @@ Download size: %3 QGBA::AudioProcessorQt - + Can't start an audio processor without input @@ -256,28 +279,28 @@ Download size: %3 Geavanceerd tonen - + BattleChip data missing - + BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? - - + + Select deck file - + Incompatible deck - + The selected deck is not compatible with this Chip Gate @@ -338,19 +361,19 @@ Download size: %3 Hier code ingeven... - - + + Autodetect (recommended) - - + + Select cheats file - + Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. @@ -358,48 +381,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -407,17 +430,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 - + Could not load game. Are you sure it's in the correct format? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -443,11 +466,19 @@ Download size: %3 QGBA::DebuggerConsoleController - + Could not open CLI history for writing + + QGBA::DisplayGL + + + Failed to create an OpenGL 3 context, trying old-style... + + + QGBA::DolphinConnector @@ -496,6 +527,200 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + + + Image files (*.png *.jpg *.bmp) + + + QGBA::FrameView @@ -534,52 +759,52 @@ Download size: %3 Resetten - + Export frame - + Portable Network Graphics (*.png) - + None - + Background - + Window - + Objwin - + Sprite - + Backdrop - + Frame - + %1 %2 @@ -587,7 +812,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence @@ -595,22 +820,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh - + Set all @@ -744,148 +969,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2763,26 +3008,11 @@ Download size: %3 QGBA::KeyEditor - - + + --- - - - Super (L) - - - - - Super (R) - - - - - Menu - - QGBA::LibraryTree @@ -2904,7 +3134,7 @@ Download size: %3 - + Slot %1 @@ -3130,43 +3360,111 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + + + QGBA::MemoryAccessLogView + + + Memory access logging + + + + + Log file + + + + + Browse + + + + + Log additional information (uses 3× space) + + + + + Load existing file if present + + + + + Regions + + + + + Export ROM snapshot + + + + + Start + Start + + + + Stop + Stop + + + + + Select access log file + + + + + Memory access logs (*.mal) + + + QGBA::MemoryDump @@ -3413,22 +3711,22 @@ Download size: %3 - + (%0/%1×) - + (⅟%0×) - + (%0×) - + %1 byte%2 @@ -3519,6 +3817,34 @@ Download size: %3 + + QGBA::MultiplayerController + + + Trying to detach a multiplayer player that's not attached + + + + + Clearing invalid save ID + + + + + Clearing invalid preferred ID + + + + + Trying to get player ID for a multiplayer player that's not attached + + + + + Trying to get save ID for a multiplayer player that's not attached + + + QGBA::ObjView @@ -3911,35 +4237,35 @@ Download size: %3 - + #%0 - + 0x%0 + + - - 0x%0 (%1) - + Export palette - + Windows PAL (*.pal);;Adobe Color Table (*.act) - + Failed to open output palette file: %1 @@ -4013,20 +4339,21 @@ Download size: %3 QGBA::ROMInfo - - - - + + + + + (unknown) - + bytes - + (no database present) @@ -4036,27 +4363,57 @@ Download size: %3 - + + File information + + + + Game name: - + + MD5 + + + + + Save file: + + + + + ROM header + + + + Internal name: - + Game ID: - + + Maker Code: + + + + + Revision: + + + + File size: - + CRC32: CRC32: @@ -4112,62 +4469,62 @@ Download size: %3 QGBA::SaveConverter - + Save games and save states (%1) - + Select save game or save state - + Save games (%1) - + Select save game - + Conversion failed - + Failed to convert the save game. This is probably a bug. - + No file selected - + Could not open file - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4193,92 +4550,97 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - - %1 SRAM + RTC - - - - - %1 SRAM + + + RTC - packed MBC2 + %1 SRAM + RTC - unpacked MBC2 + %1 SRAM - MBC6 flash + packed MBC2 + unpacked MBC2 + + + + + MBC6 flash + + + + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game - + %1 SharkPort %2 save game - + %1 GameShark Advance SP %2 save game @@ -4286,7 +4648,7 @@ Download size: %3 QGBA::ScriptingTextBuffer - + Untitled buffer @@ -4314,32 +4676,37 @@ Download size: %3 - + Load script... - + + &Load most recent + + + + &Reset - + 0 0 - + Select script to load - + Lua scripts (*.lua) - + All files (*.*) @@ -4432,95 +4799,114 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) - - + + OpenGL - + OpenGL (force version 1.x) - + None - + None (Still Image) - + Keyboard - + Controllers - + Shortcuts - - + + Shaders are not supported when the display driver is not OpenGL. + +If it is set to OpenGL and you still see this, your graphics card or drivers may be too old. + + + + + + + Shaders - + Select BIOS - + Select directory - + + Select image + + + + + Image file (*.png *.jpg *.jpeg) + + + + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -4528,7 +4914,7 @@ Download size: %3 - + %n day(s) ago @@ -4727,7 +5113,7 @@ Download size: %3 - + frames @@ -4825,112 +5211,122 @@ Download size: %3 - + + Custom border: + + + + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + + Rewind speed: + + + + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -5016,12 +5412,12 @@ Download size: %3 - + Enable VBA bug compatibility in ROM hacks - + Preset: @@ -5041,58 +5437,58 @@ Download size: %3 - + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory @@ -5109,149 +5505,145 @@ Download size: %3 - + Enable Game Boy Player features by default - + Video renderer: - + Software - + OpenGL enhancements - + High-resolution scale: - + (240×160) - - XQ GBA audio (experimental) - - - - + GB BIOS file: - - - - + + + + - - - - + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats Cheats - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Super Game Boy borders - + Default sprite colors 1: - + Default sprite colors 2: @@ -5259,32 +5651,48 @@ Download size: %3 QGBA::ShaderSelector - + No shader active - + + Load shader - + + mGBA Shaders + + + + + Error loading shader + + + + + The shader "%1" could not be loaded successfully. + + + + No shader loaded - + by %1 - + Preprocessing - + Pass %1 @@ -5327,17 +5735,17 @@ Download size: %3 QGBA::ShortcutModel - + Action - + Keyboard - + Gamepad @@ -5457,17 +5865,17 @@ Download size: %3 QGBA::VideoView - + Failed to open output video file: %1 - + Native (%0x%1) - + Select output file @@ -5508,7 +5916,6 @@ Download size: %3 - WebM @@ -5542,19 +5949,8 @@ Download size: %3 Format - - - MKV - - - - - AVI - - - MP4 @@ -5563,72 +5959,6 @@ Download size: %3 4K 4K - - - HEVC - - - - - HEVC (NVENC) - - - - - VP8 - - - - - VP9 - - - - - FFV1 - - - - - - None - - - - - FLAC - - - - - WavPack - - - - - Opus - - - - - Vorbis - - - - - MP3 - - - - - AAC - - - - - Uncompressed - - Bitrate (kbps) @@ -5639,16 +5969,6 @@ Download size: %3 ABR - - - H.264 - - - - - H.264 (NVENC) - - VBR @@ -5678,784 +5998,789 @@ Download size: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - - - - - Game Boy ROMs (%1) - - - - - All ROMs (%1) - - - - - %1 Video Logs (*.mvl) - - - - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Import GameShark Save... - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - - Rewind (held) + + Increase fast forward speed - - Re&wind - - - - - Step backwards - - - - - Solar sensor - - - - - Increase solar level - - - - - Decrease solar level - - - - - Brightest solar level - - - - - Darkest solar level + + Decrease fast forward speed - Brightness %1 + Rewind (held) - - Game Boy Printer... + + Re&wind - BattleChip Gate... - - - - - Audio/&Video - - - - - Frame size + Step backwards + Solar sensor + + + + + Increase solar level + + + + + Decrease solar level + + + + + Brightest solar level + + + + + Darkest solar level + + + + + Brightness %1 + + + + + Game Boy Printer... + + + + + BattleChip Gate... + + + + + Audio/&Video + + + + + Frame size + + + + %1× - + Toggle fullscreen - + + &Lock frame size + + + + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + + Create forwarder... + + + + Settings... - + Open debugger console... - + Start &GDB server... - + Scripting... - + Game state views - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + + Log memory &accesses... + + + + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear @@ -6463,55 +6788,70 @@ Download size: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? + + + Super (L) + + + + + Super (R) + + + + + Menu + + QShortcut - + Shift - + Control - + Alt - + Meta diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index e50eb3d4c..15b04da90 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -387,48 +387,48 @@ Rozmiar pobierania: %3 QGBA::CoreController - + Reset r%1-%2 %3 Reset r%1-%2 %3 - - + + Rewinding not currently enabled Przewijanie nie jest obecnie włączone - + Reset the game? Zresetować grę? - + Most games will require a reset to load the new save. Do you want to reset now? Większość gier wymaga zresetowania, aby wczytać nowy zapis. Czy chcesz teraz zresetować? - + Failed to open save file: %1 Nie udało się otworzyć pliku zapisu: %1 - + Failed to open game file: %1 Nie udało się otworzyć pliku gry: %1 - + Can't yank pack in unexpected platform! Nie można wyciągnąć pack na nieoczekiwanej platformie! - + Failed to open snapshot file for reading: %1 Nie udało się otworzyć pliku snapshot do odczytu: %1 - + Failed to open snapshot file for writing: %1 Nie udało się otworzyć pliku snapshot do zapisu: %1 @@ -3403,6 +3403,15 @@ Rozmiar pobierania: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + Błąd odczytu pliku logów pamięci + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Rozmiar pobierania: %3 Stop - - Failed to open memory log file - Błąd odczytu pliku logów pamięci - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6240,7 +6244,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Skanuj kody kropkowe czytnika e-Reader... - + Convert e-Reader card image to raw... Konwertuj obraz karty czytnika e-Reader na surowy... @@ -6711,82 +6715,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... Nagraj dziennik wideo debugowania... - + Stop debug video log Zatrzymaj dziennik wideo debugowania - + Exit fullscreen Wyłączyć tryb pełnoekranowy - + GameShark Button (held) Przycisk GameShark (przytrzymany) - + Autofire Turbo - + Autofire A Turbo A - + Autofire B Turbo B - + Autofire L Turbo L - + Autofire R Turbo R - + Autofire Start Turbo Start - + Autofire Select Turbo Select - + Autofire Up Turbo Góra - + Autofire Right Turbo Prawo - + Autofire Down Turbo Dół - + Autofire Left Turbo Lewo - + Clear Wyczyść diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index 5b15cbc6f..ab2a3e9c1 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -387,48 +387,48 @@ Tamanho do download: %3 QGBA::CoreController - + Reset r%1-%2 %3 Resetar r%1-%2 %3 - - + + Rewinding not currently enabled O rebobinamento não está ativado atualmente - + Reset the game? Resetar o jogo? - + Most games will require a reset to load the new save. Do you want to reset now? A maioria dos jogos requerirão um reset pra carregar o novo save. Você quer resetar agora? - + Failed to open save file: %1 Falhou em abrir o arquivo do save: %1 - + Failed to open game file: %1 Falhou em abrir o arquivo do jogo: %1 - + Can't yank pack in unexpected platform! Não pode arrancar o pacote numa plataforma inesperada! - + Failed to open snapshot file for reading: %1 Falhou em abrir o arquivo do snapshot pra leitura: %1 - + Failed to open snapshot file for writing: %1 Falhou em abrir o arquivo do snapshot pra gravação: %1 @@ -3403,6 +3403,15 @@ Tamanho do download: %3 Gráficos Portáteis da Rede (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + Falhou em abrir o arquivo do registro da memória + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Tamanho do download: %3 Parar - - Failed to open memory log file - Falhou em abrir o arquivo do registro da memória - - - - + + Select access log file Selecionar o arquivo de registro do acesso - + Memory access logs (*.mal) Registros de acesso a memória (*.mal) @@ -6224,7 +6228,7 @@ Se ele está definido como OpenGL e você ainda ver isto sua placa gráfica ou d Sensores do Game Pak... - + Clear Limpar @@ -6285,7 +6289,7 @@ Se ele está definido como OpenGL e você ainda ver isto sua placa gráfica ou d Carregar save temporário do jogo... - + Convert e-Reader card image to raw... Converter a imagem do cartão do e-Reader pro natural... @@ -6716,77 +6720,77 @@ Se ele está definido como OpenGL e você ainda ver isto sua placa gráfica ou d Registrar os acessos a &memória... - + Record debug video log... Gravar registro do vídeo de debug... - + Stop debug video log Parar o registro do vídeo de debug - + Exit fullscreen Sair da tela cheia - + GameShark Button (held) Botão do GameShark (pressionado) - + Autofire Auto-disparar - + Autofire A Auto-disparar A - + Autofire B Auto-disparar B - + Autofire L Auto-disparar L - + Autofire R Auto-disparar R - + Autofire Start Auto-disparar Start - + Autofire Select Auto-disparar Select - + Autofire Up Auto-disparar Pra Cima - + Autofire Right Auto-disparar Direita - + Autofire Down Auto-disparar Pra Baixo - + Autofire Left Auto-disparar Esquerda diff --git a/src/platform/qt/ts/mgba-pt_PT.ts b/src/platform/qt/ts/mgba-pt_PT.ts index 5f4a2e76f..7953a6d35 100644 --- a/src/platform/qt/ts/mgba-pt_PT.ts +++ b/src/platform/qt/ts/mgba-pt_PT.ts @@ -387,48 +387,48 @@ Tamanho da descarga: %3 QGBA::CoreController - + Reset r%1-%2 %3 Resetar r%1-%2 %3 - - + + Rewinding not currently enabled O rebobinamento não está ativado atualmente - + Reset the game? Resetar o jogo? - + Most games will require a reset to load the new save. Do you want to reset now? A maioria dos jogos requerirão um reset para carregar o novo save. Quer resetar agora? - + Failed to open save file: %1 Falha ao abrir o ficheiro dde gravação: %1 - + Failed to open game file: %1 Falha ao abrir o ficheiro do jogo: %1 - + Can't yank pack in unexpected platform! Não pode arrancar o pacote numa plataforma inesperada! - + Failed to open snapshot file for reading: %1 Falha ao abrir o ficheiro do snapshot para leitura: %1 - + Failed to open snapshot file for writing: %1 Falha ao abrir o ficheiro do snapshot para gravação: %1 @@ -3403,6 +3403,15 @@ Tamanho da descarga: %3 Gráficos Portáteis da Rede (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Tamanho da descarga: %3 Parar - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6238,7 +6242,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Escanear dotcodes do e-Reader... - + Convert e-Reader card image to raw... Converter imagem do cartão do e-Reader para natural... @@ -6709,82 +6713,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... Gravar registo do vídeo de debug... - + Stop debug video log Parar o registo do vídeo de debug - + Exit fullscreen Sair do ecrã inteiro - + GameShark Button (held) Botão do GameShark (segurado) - + Autofire Auto-disparar - + Autofire A Auto-disparar A - + Autofire B Auto-disparar B - + Autofire L Auto-disparar L - + Autofire R Auto-disparar R - + Autofire Start Auto-disparar Start - + Autofire Select Auto-disparar Select - + Autofire Up Auto-disparar Para Cima - + Autofire Right Auto-disparar Direita - + Autofire Down Auto-disparar Para Baixo - + Autofire Left Auto-disparar Esquerda - + Clear Limpar diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 35b3f0ecb..40cd31946 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -387,48 +387,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 Сброс r%1-%2 %3 - - + + Rewinding not currently enabled Обратная перемотка выключена - + Reset the game? Перезагрузить игру? - + Most games will require a reset to load the new save. Do you want to reset now? Большинству игр нужна перезагрузка, чтобы загрузить новое сохранение. Перезагрузить сейчас? - + Failed to open save file: %1 Не удалось открыть файл сохранения: %1 - + Failed to open game file: %1 Не удалось открыть файл игры: %1 - + Can't yank pack in unexpected platform! Невозможно пнуть картридж на неожиданной платформе! - + Failed to open snapshot file for reading: %1 Не удалось открыть файл изображения для считывания: %1 - + Failed to open snapshot file for writing: %1 Не удалось открыть файл изображения для записи: %1 @@ -3403,6 +3403,15 @@ Download size: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Download size: %3 - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6240,7 +6244,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Сканировать dot-коды e-Reader... - + Convert e-Reader card image to raw... Конвертировать карту e-Reader в raw... @@ -6711,82 +6715,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... Запись отладочного видеожурнала... - + Stop debug video log Закончить запись отладочного видеожурнала - + Exit fullscreen Выйти из полноэкранного режима - + GameShark Button (held) Кнопка GameShark (удерживается) - + Autofire Автострельба - + Autofire A A (автострельба) - + Autofire B B (автострельба) - + Autofire L L (автострельба) - + Autofire R R (автострельба) - + Autofire Start Start (автострельба) - + Autofire Select Select (автострельба) - + Autofire Up Вверх (автострельба) - + Autofire Right Вправо (автострельба) - + Autofire Down Вниз (автострельба) - + Autofire Left Влево (автострельба) - + Clear Очистить diff --git a/src/platform/qt/ts/mgba-si.ts b/src/platform/qt/ts/mgba-si.ts index 1df3d0018..735a942f9 100644 --- a/src/platform/qt/ts/mgba-si.ts +++ b/src/platform/qt/ts/mgba-si.ts @@ -2,11 +2,34 @@ - AboutScreen + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + + + QGBA::AboutScreen About - පිළිබඳව + පිළිබඳව @@ -36,7 +59,47 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - ApplicationUpdatePrompt + QGBA::ApplicationUpdatePrompt + + + An update to %1 is available. + + + + + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + + + + + Current version: %1 +New version: %2 +Download size: %3 + + + + + Downloading update... + + + + + Downloading failed. Please update manually. + + + + + Downloading done. Press OK to restart %1 and install the update. + + An update is available @@ -44,7 +107,30 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - ArchiveInspector + QGBA::ApplicationUpdater + + + Stable + + + + + Development + + + + + Unknown + + + + + (None) + + + + + QGBA::ArchiveInspector Open in archive... @@ -53,11 +139,18 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Loading... - පූරණය වෙමින් ... + පූරණය වෙමින් ... - AssetTile + QGBA::AssetTile + + + + + 0x%0 (%1) + + Tile # @@ -71,26 +164,60 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Address - ලිපිනය + ලිපිනය Red - රතු + රතු Green - කොළ + කොළ Blue - නිල් + නිල් - BattleChipView + QGBA::AudioDevice + + + Can't set format of context-less audio device + + + + + Audio device is missing its core + + + + + Writing data to read-only audio device + + + + + QGBA::AudioProcessorQt + + + Can't start an audio processor without input + + + + + QGBA::AudioProcessorSDL + + + Can't start an audio processor without input + + + + + QGBA::BattleChipView BattleChip Gate @@ -104,32 +231,32 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Insert - ඇතුළු කරන්න + ඇතුළු කරන්න Save - සුරකින්න + සුරකින්න Load - පූරණය කරන්න + පූරණය කරන්න Add - එකතු කරන්න + එකතු කරන්න Remove - ඉවත් කරන්න + ඉවත් කරන්න Gate type - කඩුලු වර්ගය + කඩුලු වර්ගය @@ -151,9 +278,65 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Show advanced + + + BattleChip data missing + + + + + BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? + + + + + + Select deck file + + + + + Incompatible deck + + + + + The selected deck is not compatible with this Chip Gate + + - CheatsView + QGBA::CheatsModel + + + (untitled) + + + + + Failed to open cheats file: %1 + + + + + QGBA::CheatsView + + + + Autodetect (recommended) + + + + + + Select cheats file + + + + + Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. + + Cheats @@ -164,10 +347,25 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Add New Code + + + Load + පූරණය කරන්න + + + + Save + සුරකින්න + Remove - ඉවත් කරන්න + ඉවත් කරන්න + + + + Enter codes here... + @@ -179,24 +377,76 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Code type + + + QGBA::CoreController - - Save - සුරකින්න + + Reset r%1-%2 %3 + - - Load - පූරණය කරන්න + + + Rewinding not currently enabled + - - Enter codes here... + + Reset the game? + + + + + Most games will require a reset to load the new save. Do you want to reset now? + + + + + Failed to open save file: %1 + + + + + Failed to open game file: %1 + + + + + Can't yank pack in unexpected platform! + + + + + Failed to open snapshot file for reading: %1 + + + + + Failed to open snapshot file for writing: %1 - DebuggerConsole + QGBA::CoreManager + + + Failed to open game file: %1 + + + + + Could not load game. Are you sure it's in the correct format? + + + + + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + + + + + QGBA::DebuggerConsole Debugger @@ -214,7 +464,23 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - DolphinConnector + QGBA::DebuggerConsoleController + + + Could not open CLI history for writing + + + + + QGBA::DisplayGL + + + Failed to create an OpenGL 3 context, trying old-style... + + + + + QGBA::DolphinConnector Connect to Dolphin @@ -250,9 +516,263 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Reset on connect + + + Couldn't Connect + + + + + Could not connect to Dolphin. + + - FrameView + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + + + Image files (*.png *.jpg *.bmp) + + + + + QGBA::FrameView + + + Export frame + + + + + Portable Network Graphics (*.png) + + + + + None + + + + + Background + + + + + Window + + + + + Objwin + + + + + Sprite + + + + + Backdrop + + + + + Frame + + + + + %1 %2 + + Inspect frame @@ -290,7 +810,116 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - GIFView + QGBA::GBAApp + + + Enable Discord Rich Presence + + + + + QGBA::GBAKeyEditor + + + Clear Button + + + + + Clear Analog + + + + + Refresh + + + + + Set all + + + + + QGBA::GDBWindow + + + Server settings + + + + + Local port + + + + + Bind address + + + + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + + Break + + + + + Stop + + + + + Start + + + + + Crash + + + + + Could not start GDB server + + + + + QGBA::GIFView + + + Failed to open output file: %1 + + + + + Select output file + + + + + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) + + Record GIF/WebP/APNG @@ -338,1157 +967,171 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - IOViewer + QGBA::GameBoy - - I/O Viewer - - - - - 0x0000 - - - - - B - - - - - LibraryTree - - - Name - - - - - Location - - - - - Platform - - - - - Size - - - - - CRC32 - - - - - LoadSaveState - - - - %1 State - - - - - - - - - - - - - No Save - - - - - 5 - - - - - 6 - - - - - 8 - - - - - 4 - - - - - 1 - - - - - 3 - - - - - 7 - - - - - 9 - - - - - 2 - - - - - Cancel - - - - - LogView - - - Logs - - - - - Enabled Levels - - - - - Debug - - - - - Stub - - - - - Info - - - - - Warning - - - - - Error - - - - - Fatal - - - - - Game Error - - - - - Advanced settings - - - - - Clear - - - - - Max Lines - - - - - MapView - - - Maps - - - - - Magnification - - - - - Export - - - - - Copy - - - - - MemoryDump - - - Save Memory Range - - - - - Start Address: - - - - - Byte Count: - - - - - Dump across banks - - - - - MemorySearch - - - Memory Search - - - - - Address - ලිපිනය - - - - Current Value - - - - - - Type - - - - - Value - - - - - Numeric - - - - - Text - - - - - Width - - - - - - Guess - - - - - 1 Byte (8-bit) - - - - - 2 Bytes (16-bit) - - - - - 4 Bytes (32-bit) - - - - - Number type - - - - - Decimal - - - - - Hexadecimal - - - - - Search type - - - - - Equal to value - - - - - Greater than value - - - - - Less than value - - - - - Unknown/changed - - - - - Changed by value - - - - - Unchanged - - - - - Increased - - - - - Decreased - - - - - Search ROM - - - - - New Search - - - - - Search Within - - - - - Open in Memory Viewer - - - - - Refresh - - - - - MemoryView - - - Memory - - - - - Inspect Address: - - - - - Set Alignment: - - - - - &1 Byte - - - - - &2 Bytes - - - - - &4 Bytes - - - - - Unsigned Integer: - - - - - Signed Integer: - - - - - String: - - - - - Load TBL - - - - - Copy Selection - - - - - Paste - - - - - Save Selection - - - - - Save Range - - - - - Load - පූරණය කරන්න - - - - ObjView - - - Sprites - - - - - Address - ලිපිනය - - - - Copy - - - - - Magnification - - - - - Geometry - - - - - Position - - - - - , - - - - - Dimensions - - - - - × - - - - - Matrix - - - - - Export - - - - - Attributes - - - - - Transform - - - - - Off - - - - - Palette - - - - - Double Size - - - - - - - Return, Ctrl+R - - - - - Flipped - - - - - H - Short for horizontal - - - - - V - Short for vertical - - - - - Mode - - - - - Normal - - - - - Mosaic - - - - - Enabled - - - - - Priority - - - - - Tile - - - - - OverrideView - - - Game Overrides - - - - - Game Boy Advance - - - - - - - + + Autodetect - - Realtime clock + + Game Boy (DMG) - - Gyroscope + + Game Boy Pocket (MGB) - - Tilt + + Super Game Boy (SGB) - - Light sensor + + Super Game Boy 2 (SGB) - - Rumble + + Game Boy Color (CGB) - - Save type + + Game Boy Advance (AGB) - - None + + Super Game Boy Color (SGB + CGB) - - SRAM + + ROM Only - - Flash 512kb + + MBC1 - - Flash 1Mb + + MBC2 - - EEPROM 8kB + + MBC3 - - EEPROM 512 bytes + + MBC3 + RTC - - SRAM 64kB (bootlegs only) + + MBC5 - - Idle loop + + MBC5 + Rumble - - Game Boy Player features + + MBC6 - - VBA bug compatibility mode + + MBC7 (Tilt) - - Game Boy + + MMM01 - - Game Boy model + + HuC-1 - - Memory bank controller + + HuC-3 - - Background Colors + + Pocket Cam - - Sprite Colors 1 + + TAMA5 - - Sprite Colors 2 + + Wisdom Tree - - Palette preset + + NT (old 1) - - - PaletteView - - Palette + + NT (old 2) - - Background + + NT (new) - - Objects + + Pokémon Jade/Diamond - - Selection + + BBD - - Red - රතු - - - - Green - කොළ - - - - Blue - නිල් - - - - 16-bit value - - - - - Hex code - - - - - Palette index - - - - - Export BG - - - - - Export OBJ - - - - - PlacementControl - - - Adjust placement - - - - - All - - - - - Offset - - - - - X - - - - - Y - - - - - PrinterView - - - Game Boy Printer - - - - - Hurry up! - - - - - Tear off - - - - - Magnification - - - - - Copy - - - - - QGBA::AboutScreen - - - 2021 - - - - - QGBA::ApplicationUpdatePrompt - - - An update to %1 is available. - - - - - - -Do you want to download and install it now? You will need to restart the emulator when the download is complete. - - - - - -Auto-update is not available on this platform. If you wish to update you will need to do it manually. - - - - - Current version: %1 -New version: %2 -Download size: %3 - - - - - Downloading update... - - - - - Downloading failed. Please update manually. - - - - - Downloading done. Press OK to restart %1 and install the update. - - - - - QGBA::ApplicationUpdater - - - Stable - - - - - Development - - - - - Unknown - - - - - (None) - - - - - QGBA::AssetTile - - - %0%1%2 - - - - - - - 0x%0 (%1) - - - - - QGBA::CheatsModel - - - (untitled) - - - - - Failed to open cheats file: %1 - - - - - QGBA::CheatsView - - - - Autodetect (recommended) - - - - - - Select cheats file - - - - - QGBA::CoreController - - - Failed to open save file: %1 - - - - - Failed to open game file: %1 - - - - - Can't yank pack in unexpected platform! - - - - - Failed to open snapshot file for reading: %1 - - - - - Failed to open snapshot file for writing: %1 - - - - - QGBA::CoreManager - - - Failed to open game file: %1 - - - - - Could not load game. Are you sure it's in the correct format? - - - - - Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). - - - - - QGBA::FrameView - - - Export frame - - - - - Portable Network Graphics (*.png) - - - - - None - - - - - Background - - - - - Window - - - - - Objwin - - - - - Sprite - - - - - Backdrop - - - - - Frame - - - - - %1 %2 - - - - - QGBA::GBAApp - - - Enable Discord Rich Presence - - - - - QGBA::GBAKeyEditor - - - Clear Button - - - - - Clear Analog - - - - - Refresh - - - - - Set all - - - - - QGBA::GDBWindow - - - Server settings - - - - - Local port - - - - - Bind address - - - - - Break - - - - - Stop - - - - - Start - - - - - Crash + + Hitek - - Could not start GDB server + + GGB-81 - - - QGBA::GIFView - - Failed to open output file: %1 + + Li Cheng - - Select output file + + Sachen (MMC1) - - Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) + + Sachen (MMC2) @@ -2755,6 +2398,17 @@ Download size: %3 + + I/O Viewer + + + + + 0x0000 + + + + B @@ -3354,54 +3008,136 @@ Download size: %3 QGBA::KeyEditor - - + + --- + + + QGBA::LibraryTree - - Super (L) + + Name - - Super (R) + + Location - - Menu + + Platform + + + + + Size + + + + + CRC32 QGBA::LoadSaveState - + Load State - + Save State - + Empty - + Corrupted - + Slot %1 + + + + %1 State + + + + + + + + + + + + + No Save + + + + + 5 + + + + + 6 + + + + + 8 + + + + + 4 + + + + + 1 + + + + + 3 + + + + + 7 + + + + + 9 + + + + + 2 + + + + + Cancel + + QGBA::LogConfigModel @@ -3450,133 +3186,284 @@ Download size: %3 QGBA::LogController - + [%1] %2: %3 - + An error occurred - + DEBUG - + STUB - + INFO - + WARN - + ERROR - + FATAL - + GAME ERROR + + QGBA::LogView + + + Logs + + + + + Enabled Levels + + + + + Debug + + + + + Stub + + + + + Info + + + + + Warning + + + + + Error + + + + + Fatal + + + + + Game Error + + + + + Advanced settings + + + + + Clear + + + + + Max Lines + + + QGBA::MapView - + Priority - - + + Map base - - + + Tile base - + Size - - + + Offset - + Xform - + Map Addr. - + Mirror - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) + + + Maps + + + + + Magnification + + + + + Export + + + + + Copy + + + + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + + + QGBA::MemoryAccessLogView + + + Memory access logging + + + + + Log file + + + + + Browse + + + + + Log additional information (uses 3× space) + + + + + Load existing file if present + + + + + Regions + + + + + Export ROM snapshot + + + + + Start + + + + + Stop + + + + + + Select access log file + + + + + Memory access logs (*.mal) + + QGBA::MemoryDump @@ -3590,6 +3477,26 @@ Download size: %3 Failed to open output file: %1 + + + Save Memory Range + + + + + Start Address: + + + + + Byte Count: + + + + + Dump across banks + + QGBA::MemoryModel @@ -3614,42 +3521,42 @@ Download size: %3 පූරණය කරන්න - + All - + Load TBL - + Save selected memory - + Failed to open output file: %1 - + Load memory - + Failed to open input file: %1 - + TBL - + ISO-8859-1 @@ -3657,84 +3564,461 @@ Download size: %3 QGBA::MemorySearch - + (%0/%1×) - + (⅟%0×) - + (%0×) - + %1 byte%2 + + + Memory Search + + + + + Address + ලිපිනය + + + + Current Value + + + + + + Type + + + + + Value + + + + + Numeric + + + + + Text + + + + + Width + + + + + + Guess + + + + + 1 Byte (8-bit) + + + + + 2 Bytes (16-bit) + + + + + 4 Bytes (32-bit) + + + + + Number type + + + + + Decimal + + + + + Hexadecimal + + + + + Search type + + + + + Equal to value + + + + + Greater than value + + + + + Less than value + + + + + Unknown/changed + + + + + Changed by value + + + + + Unchanged + + + + + Increased + + + + + Decreased + + + + + Search ROM + + + + + New Search + + + + + Search Within + + + + + Open in Memory Viewer + + + + + Refresh + + + + + QGBA::MemoryView + + + Memory + + + + + Inspect Address: + + + + + Set Alignment: + + + + + &1 Byte + + + + + &2 Bytes + + + + + &4 Bytes + + + + + Unsigned Integer: + + + + + Signed Integer: + + + + + String: + + + + + Load TBL + + + + + Copy Selection + + + + + Paste + + + + + Save Selection + + + + + Save Range + + + + + Load + පූරණය කරන්න + + + + QGBA::MessagePainter + + + Frame %1 + + + + + QGBA::MultiplayerController + + + Trying to detach a multiplayer player that's not attached + + + + + Clearing invalid save ID + + + + + Clearing invalid preferred ID + + + + + Trying to get player ID for a multiplayer player that's not attached + + + + + Trying to get save ID for a multiplayer player that's not attached + + QGBA::ObjView - - + + 0x%0 - + + Sprites + + + + + Address + ලිපිනය + + + + Copy + + + + + Magnification + + + + + Geometry + + + + + Position + + + + + Dimensions + + + + + Matrix + + + + + Export + + + + + Attributes + + + + + Transform + + + + + Off - - + + Palette + + + + + Double Size + + + + + Flipped + + + + + H + Short for horizontal + + + + + + + Return, Ctrl+R + + + + + V + Short for vertical + + + + + Mode + + + + + Mosaic + + + + + Enabled + + + + + Priority + + + + + Tile + + + - - - + + + + + --- - + + Normal - + Trans - + OBJWIN - + Invalid - - + + N/A - + Export sprite - + Portable Network Graphics (*.png) @@ -3756,1187 +4040,396 @@ Download size: %3 Unlicensed MBCs + + + Game Overrides + + + + + Game Boy Advance + + + + + + + + Autodetect + + + + + Realtime clock + + + + + Gyroscope + + + + + Tilt + + + + + Light sensor + + + + + Rumble + + + + + Save type + + + + + None + + + + + SRAM + + + + + Flash 512kb + + + + + Flash 1Mb + + + + + EEPROM 8kB + + + + + EEPROM 512 bytes + + + + + SRAM 64kB (bootlegs only) + + + + + Idle loop + + + + + Game Boy Player features + + + + + VBA bug compatibility mode + + + + + Game Boy + + + + + Game Boy model + + + + + Memory bank controller + + + + + Background Colors + + + + + Sprite Colors 1 + + + + + Sprite Colors 2 + + + + + Palette preset + + QGBA::PaletteView - + #%0 - + 0x%0 + + - - 0x%0 (%1) - + Export palette - + Windows PAL (*.pal);;Adobe Color Table (*.act) - + Failed to open output palette file: %1 + + + Palette + + + + + Background + + + + + Objects + + + + + Selection + + + + + Red + රතු + + + + Green + කොළ + + + + Blue + නිල් + + + + 16-bit value + + + + + Hex code + + + + + Palette index + + + + + Export BG + + + + + Export OBJ + + + + + QGBA::PlacementControl + + + Adjust placement + + + + + All + + + + + Offset + + + + + X + + + + + Y + + + + + QGBA::PrinterView + + + Game Boy Printer + + + + + Hurry up! + + + + + Tear off + + + + + Magnification + + + + + Copy + + + + + Save Printout + + + + + Portable Network Graphics (*.png) + + QGBA::ROMInfo - + + + - - (unknown) - - + bytes - + (no database present) - - - QGBA::ReportView - - - Bug report archive - - - - - ZIP archive (*.zip) - - - - - QGBA::SaveConverter - - - Save games and save states (%1) - - - - - Select save game or save state - - - - - Save games (%1) - - - - - Select save game - - - - - Conversion failed - - - - - Failed to convert the save game. This is probably a bug. - - - - - No file selected - - - - - Could not open file - - - - - No valid formats found - - - - - Please select a valid input file - - - - - No valid conversions found - - - - - Cannot convert save games between platforms - - - - - QGBA::SettingsView - - - - Qt Multimedia - - - - - SDL - - - - - Software (Qt) - - - - - OpenGL - - - - - OpenGL (force version 1.x) - - - - - None - - - - - None (Still Image) - - - - - Keyboard - - - - - Controllers - - - - - Shortcuts - - - - - - Shaders - - - - - Select BIOS - - - - - Select directory - - - - - (%1×%2) - - - - - Never - - - - - Just now - - - - - Less than an hour ago - - - - - %n hour(s) ago - - - - - - - - %n day(s) ago - - - - - - - - QGBA::ShaderSelector - - - No shader active - - - - - Load shader - - - - - No shader loaded - - - - - by %1 - - - - - Preprocessing - - - - - Pass %1 - - - - - QGBA::ShortcutModel - - - Action - - - - - Keyboard - - - - - Gamepad - - - - - QGBA::TileView - - - Export tiles - - - - - - Portable Network Graphics (*.png) - - - - - Export tile - - - - - QGBA::VideoView - - - Failed to open output video file: %1 - - - - - Native (%0x%1) - - - - - Select output file - - - - - QGBA::Window - - - Game Boy Advance ROMs (%1) - - - - - Game Boy ROMs (%1) - - - - - All ROMs (%1) - - - - - %1 Video Logs (*.mvl) - - - - - Archives (%1) - - - - - - - Select ROM - - - - - Select folder - - - - - - Select save - - - - - Select patch - - - - - Patches (*.ips *.ups *.bps) - - - - - Select e-Reader dotcode - - - - - e-Reader card (*.raw *.bin *.bmp) - - - - - Select image - - - - - Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - - - - - GameShark saves (*.sps *.xps) - - - - - Select video log - - - - - Video logs (*.mvl) - - - - - Crash - - - - - The game has crashed with the following error: - -%1 - - - - - Couldn't Start - - - - - Could not start game. - - - - - Unimplemented BIOS call - - - - - This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - - - - - Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - - - - - Really make portable? - - - - - This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - - - - - Restart needed - - - - - Some changes will not take effect until the emulator is restarted. - - - - - - Player %1 of %2 - - - - - %1 - %2 - - - - - %1 - %2 - %3 - - - - - %1 - %2 (%3 fps) - %4 - - - - - &File - - - - - Load &ROM... - - - - - Load ROM in archive... - - - - - Add folder to library... - - - - - Save games (%1) - - - - - Select save game - - - - - mGBA save state files (%1) - - - - - - Select save state - - - - - Select e-Reader card images - - - - - Image file (*.png *.jpg *.jpeg) - - - - - Conversion finished - - - - - %1 of %2 e-Reader cards converted successfully. - - - - - Load alternate save game... - - - - - Load temporary save game... - - - - - Load &patch... - - - - - Boot BIOS - - - - - Replace ROM... - - - - - Scan e-Reader dotcodes... - - - - - Convert e-Reader card image to raw... - - - - - ROM &info... - - - - - Recent - - - - - Make portable - - - - - &Load state - - - - - Load state file... - - - - - &Save state - - - - - Save state file... - - - - - Quick load - - - - - Quick save - - - - - Load recent - - - - - Save recent - - - - - Undo load state - - - - - Undo save state - - - - - - State &%1 - - - - - Load camera image... - - - - - Convert save game... - - - - - GameShark saves (*.gsv *.sps *.xps) - - - - - Import GameShark Save... - - - - - Export GameShark Save... - - - - - New multiplayer window - - - - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset - - - - - Sh&utdown - - - - - Yank game pak - - - - - &Pause - - - - - &Next frame - - - - - Fast forward (held) - - - - - &Fast forward - - - - - Fast forward speed - - - - - Unbounded - - - - - %0x - - - - - Rewind (held) - - - - - Re&wind - - - - - Step backwards - - - - - Sync to &video - - - - - Sync to &audio - - - - - Solar sensor - - - - - Increase solar level - - - - - Decrease solar level - - - - - Brightest solar level - - - - - Darkest solar level - - - - - Brightness %1 - - - - - Game Boy Printer... - - - - - BattleChip Gate... - - - - - Audio/&Video - - - - - Frame size - - - - - %1× - - - - - Toggle fullscreen - - - - - Lock aspect ratio - - - - - Force integer scaling - - - - - Interframe blending - - - - - Bilinear filtering - - - - - Frame&skip - - - - - Mute - - - - - FPS target - - - - - Native (59.7275) - - - - - Take &screenshot - - - - - F12 - - - - - Record A/V... - - - - - Record GIF/WebP/APNG... - - - - - Video layers - - - - - Audio channels - - - - - Adjust layer placement... - - - - - &Tools - - - - - View &logs... - - - - - Game &overrides... - - - - - Game Pak sensors... - - - - - &Cheats... - - - - - Settings... - - - - - Open debugger console... - - - - - Start &GDB server... - - - - - View &palette... - - - - - View &sprites... - - - - - View &tiles... - - - - - View &map... - - - - - &Frame inspector... - - - - - View memory... - - - - - Search memory... - - - - - View &I/O registers... - - - - - Record debug video log... - - - - - Stop debug video log - - - - - Exit fullscreen - - - - - GameShark Button (held) - - - - - Autofire - - - - - Autofire A - - - - - Autofire B - - - - - Autofire L - - - - - Autofire R - - - - - Autofire Start - - - - - Autofire Select - - - - - Autofire Up - - - - - Autofire Right - - - - - Autofire Down - - - - - Autofire Left - - - - - Clear - - - - - QObject - - - %1 byte - - - - - %1 kiB - - - - - %1 MiB - - - - - GBA - - - - - GB - - - - - ? - - - - - QShortcut - - - Shift - - - - - Control - - - - - Alt - - - - - Meta - - - - - ROMInfo ROM Info - + + File information + + + + Game name: - - Internal name: - - - - - Game ID: - - - - + File size: - + CRC32: + + + MD5 + + + + + Save file: + + + + + ROM header + + + + + Internal name: + + + + + Game ID: + + + + + Maker Code: + + + + + Revision: + + - ReportView + QGBA::ReportView + + + Bug report archive + + + + + ZIP archive (*.zip) + + Generate Bug Report @@ -4974,7 +4467,162 @@ Download size: %3 - SaveConverter + QGBA::SaveConverter + + + Save games and save states (%1) + + + + + Select save game or save state + + + + + Save games (%1) + + + + + Select save game + + + + + Conversion failed + + + + + Failed to convert the save game. This is probably a bug. + + + + + No file selected + + + + + Could not open file + + + + + No valid formats found + + + + + Please select a valid input file + + + + + No valid conversions found + + + + + %1 %2 save game + + + + + little endian + + + + + big endian + + + + + SRAM + + + + + %1 flash + + + + + %1 EEPROM + + + + + + RTC + + + + + %1 SRAM + RTC + + + + + %1 SRAM + + + + + packed MBC2 + + + + + unpacked MBC2 + + + + + MBC6 flash + + + + + MBC6 combined SRAM + flash + + + + + MBC6 SRAM + + + + + TAMA5 + + + + + %1 (%2) + + + + + %1 save state with embedded %2 save game + + + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + + + + Cannot convert save games between platforms + + Convert/Extract Save Game @@ -4996,99 +4644,75 @@ Download size: %3 Output file + + + QGBA::ScriptingTextBuffer - - %1 %2 save game - - - - - little endian - - - - - big endian - - - - - SRAM - - - - - %1 flash - - - - - %1 EEPROM - - - - - %1 SRAM + RTC - - - - - %1 SRAM - - - - - packed MBC2 - - - - - unpacked MBC2 - - - - - MBC6 flash - - - - - MBC6 combined SRAM + flash - - - - - MBC6 SRAM - - - - - TAMA5 - - - - - %1 (%2) - - - - - %1 save state with embedded %2 save game - - - - - %1 SharkPort %2 save game - - - - - %1 GameShark Advance SP %2 save game + + Untitled buffer - SensorView + QGBA::ScriptingView + + + Scripting + + + + + Run + + + + + File + + + + + Load recent script + + + + + Load script... + + + + + &Load most recent + + + + + &Reset + + + + + 0 + + + + + Select script to load + + + + + Lua scripts (*.lua) + + + + + All files (*.*) + + + + + QGBA::SensorView Sensors @@ -5101,69 +4725,95 @@ Download size: %3 - Fixed time - - - - System time - - Start time at + + Fixed time - + Now - + + Offset time + + + + + sec + + + + + Start time at + + + + MM/dd/yy hh:mm:ss AP - + Light sensor - + Brightness - + Tilt sensor - - + + Set Y - - + + Set X - + Gyroscope - + Sensitivity - SettingsView + QGBA::SettingsView + + + + Qt Multimedia + + + + + SDL + + + + + Software (Qt) + + Settings @@ -5176,695 +4826,876 @@ Download size: %3 - Interface + Gameplay - Update + Interface - Emulation + Update - Enhancements + Emulation - BIOS + Enhancements - Paths + BIOS - Logging + Paths + Logging + + + + Game Boy - - Audio driver: - - - - - Audio buffer: - - - - - - 1536 - - - - - 512 - - - - - 768 - - - - - 1024 - - - - - 2048 - - - - - 3072 - - - - - 4096 - - - - - samples - - - - - Sample rate: - - - - - - 44100 - - - - - 22050 - - - - - 32000 - - - - - 48000 - - - - - Hz - - - - - Volume: - - - - - - - - Mute - - - - - Fast forward volume: - - - - - Audio in multiplayer: - - - - - All windows - - - - - Player 1 window only - - - - - Currently active player window - - - - - Display driver: - - - - - Frameskip: - - - - - Skip every - - - - - - frames - - - - - FPS target: - - - - - frames per second - - - - - Sync: - - - - - Video - - - - + + Audio - + + Audio driver: + + + + + Audio buffer: + + + + + + 1536 + + + + + 512 + + + + + 768 + + + + + 1024 + + + + + 2048 + + + + + 3072 + + + + + 4096 + + + + + samples + + + + + Sample rate: + + + + + + 44100 + + + + + 22050 + + + + + 32000 + + + + + 48000 + + + + + Hz + + + + + Volume: + + + + + + + + Mute + + + + + Fast forward volume: + + + + + Audio in multiplayer: + + + + + All windows + + + + + Player 1 window only + + + + + Currently active player window + + + + + + Video + + + + + Display driver: + + + + + Frameskip: + + + + + Skip every + + + + + + frames + + + + Lock aspect ratio - + Force integer scaling - - Bilinear filtering - - - - - - Pause - - - - - When inactive: - - - - - When minimized: - - - - - Current channel: - - - - - Current version: - - - - - Update channel: - - - - - Available version: - - - - - (Unknown) - - - - - Last checked: - - - - - Automatically check on start - - - - - Check now - - - - - Default color palette only - - - - - SGB color palette if available - - - - - GBC color palette if available - - - - - SGB (preferred) or GBC color palette if available - - - - - Game Boy Camera - - - - - Driver: - - - - - Source: - - - - - Native (59.7275) - - - - + Interframe blending - - Language + + Bilinear filtering - - Library: + + FPS target: - - List view + + frames per second - - Tree view + + Native (59.7275) - - Show when no game open + + Sync: - - Clear cache + + On loading a game: - - Allow opposing input directions + + Load last state - - Suspend screensaver + + Load cheats - - Dynamically update window title + + Periodically autosave state - - Show filename instead of ROM name in title bar + + Save entered cheats - - Show OSD messages - - - - - Enable Discord Rich Presence - - - - - Automatically save state - - - - - Automatically load state - - - - - Automatically save cheats - - - - - Automatically load cheats - - - - - Show FPS in title bar - - - - - Fast forward speed: - - - - - - Unbounded - - - - - Fast forward (held) speed: - - - - - Autofire interval: - - - - - Enable rewind - - - - - Rewind history: - - - - - Idle loops: - - - - - Run all - - - - - Remove known - - - - - Detect and remove - - - - - Preload entire ROM into memory - - - - + Save state extra data: - - - Save game - - - - - Load state extra data: - - - - - Models - - - - - GB only: - - - - - SGB compatible: - - - - - GBC only: - - - - - GBC compatible: - - - - - SGB and GBC compatible: - - - - - Game Boy palette - - - - - Preset: - - - - - + + Screenshot - - + + + Save game + + + + + Cheat codes - - Enable Game Boy Player features by default + + Load state extra data: - - Enable VBA bug compatibility in ROM hacks + + Enable Discord Rich Presence - - Video renderer: + + Language - - Software + + Library: - - OpenGL + + List view - - OpenGL enhancements + + Tree view - - High-resolution scale: + + Show when no game open - - (240×160) + + Show filename instead of ROM name in library view - - XQ GBA audio (experimental) + + Clear cache - - GB BIOS file: + + Allow opposing input directions - - - - - - - - - + + Suspend screensaver + + + + + When inactive: + + + + + + Pause + + + + + When minimized: + + + + + Dynamically update window title + + + + + Show FPS in title bar + + + + + Show filename instead of ROM name in title bar + + + + + Show OSD messages + + + + + Show frame count in OSD + + + + + Show emulation info on reset + + + + + + + + + + + + + Browse - - Use BIOS file if found + + Custom border: - - Skip BIOS intro + + Current channel: - - GBA BIOS file: + + Current version: - - GBC BIOS file: + + Update channel: - + + Available version: + + + + + (Unknown) + + + + + Last checked: + + + + + Automatically check on start + + + + + Check now + + + + + Fast forward speed: + + + + + + Unbounded + + + + + Fast forward (held) speed: + + + + + Autofire interval: + + + + + Enable rewind + + + + + Rewind history: + + + + + Rewind speed: + + + + + Idle loops: + + + + + Run all + + + + + Remove known + + + + + Detect and remove + + + + + Preload entire ROM into memory + + + + + Enable Game Boy Player features by default + + + + + Enable VBA bug compatibility in ROM hacks + + + + + Video renderer: + + + + + Software + + + + + + OpenGL + + + + + OpenGL enhancements + + + + + High-resolution scale: + + + + + (240×160) + + + + + GB BIOS file: + + + + SGB BIOS file: - + + GBC BIOS file: + + + + + GBA BIOS file: + + + + + Use BIOS file if found + + + + + Skip BIOS intro + + + + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats - + Log to file - + Log to console - + Select Log File - + + Models + + + + + GB only: + + + + + SGB compatible: + + + + + GBC only: + + + + + GBC compatible: + + + + + SGB and GBC compatible: + + + + + Super Game Boy borders + + + + + Game Boy palette + + + + + Preset: + + + + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - - Super Game Boy borders + + SGB color palette if available + + + Default color palette only + + + + + GBC color palette if available + + + + + SGB (preferred) or GBC color palette if available + + + + + Game Boy Camera + + + + + Driver: + + + + + Source: + + + + + OpenGL (force version 1.x) + + + + + None + + + + + None (Still Image) + + + + + Keyboard + + + + + Controllers + + + + + Shortcuts + + + + + Shaders are not supported when the display driver is not OpenGL. + +If it is set to OpenGL and you still see this, your graphics card or drivers may be too old. + + + + + + + + Shaders + + + + + Select BIOS + + + + + Select directory + + + + + Select image + + + + + Image file (*.png *.jpg *.jpeg) + + + + + (%1×%2) + + + + + Never + + + + + Just now + + + + + Less than an hour ago + + + + + %n hour(s) ago + + + + + + + + %n day(s) ago + + + + + - ShaderSelector + QGBA::ShaderSelector + + + No shader active + + + + + + Load shader + + + + + mGBA Shaders + + + + + Error loading shader + + + + + The shader "%1" could not be loaded successfully. + + + + + No shader loaded + + + + + by %1 + + + + + Preprocessing + + + + + Pass %1 + + Shaders @@ -5902,7 +5733,25 @@ Download size: %3 - ShortcutView + QGBA::ShortcutModel + + + Action + + + + + Keyboard + + + + + Gamepad + + + + + QGBA::ShortcutView Edit Shortcuts @@ -5925,55 +5774,111 @@ Download size: %3 - TileView + QGBA::TileView + + + Export tiles + + + + + + Portable Network Graphics (*.png) + + + + + Export tile + + Tiles - - Export Selected + + Palette - - Export All - - - - + 256 colors - + Magnification - + Tiles per row - + Fit to window - + + Displayed tiles + + + + + Only BG tiles + + + + + Only OBJ tiles + + + + + Both + + + + Copy Selected - + + Export Selected + + + + Copy All + + + Export All + + - VideoView + QGBA::VideoView + + + Failed to open output video file: %1 + + + + + Native (%0x%1) + + + + + Select output file + + Record Video @@ -6011,13 +5916,11 @@ Download size: %3 - WebM - MP4 @@ -6057,120 +5960,900 @@ Download size: %3 - - MKV - - - - - AVI - - - - - HEVC - - - - - HEVC (NVENC) - - - - - VP8 - - - - - VP9 - - - - - FFV1 - - - - - - None - - - - - FLAC - - - - - Opus - - - - - Vorbis - - - - - MP3 - - - - - AAC - - - - - Uncompressed - - - - + Bitrate (kbps) - + ABR - - H.264 - - - - - H.264 (NVENC) - - - - + VBR - + CRF - + Dimensions - + Lock aspect ratio - + Show advanced + + QGBA::Window + + + Archives (%1) + + + + + + + Select ROM + + + + + Select folder + + + + + + Select save + + + + + Select patch + + + + + Patches (*.ips *.ups *.bps) + + + + + Select e-Reader dotcode + + + + + e-Reader card (*.raw *.bin *.bmp) + + + + + Select image + + + + + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) + + + + + GameShark saves (*.sps *.xps) + + + + + Select video log + + + + + Video logs (*.mvl) + + + + + Crash + + + + + The game has crashed with the following error: + +%1 + + + + + Couldn't Start + + + + + Could not start game. + + + + + Unimplemented BIOS call + + + + + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. + + + + + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. + + + + + Really make portable? + + + + + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? + + + + + Restart needed + + + + + Some changes will not take effect until the emulator is restarted. + + + + + Reset needed + + + + + Some changes will not take effect until the game is reset. + + + + + - Player %1 of %2 + + + + + %1 - %2 + + + + + %1 - %2 - %3 + + + + + %1 - %2 (%3 fps) - %4 + + + + + &File + + + + + Load &ROM... + + + + + Load ROM in archive... + + + + + Add folder to library... + + + + + Save games (%1) + + + + + Select save game + + + + + mGBA save state files (%1) + + + + + + Select save state + + + + + Select e-Reader card images + + + + + Image file (*.png *.jpg *.jpeg) + + + + + Conversion finished + + + + + %1 of %2 e-Reader cards converted successfully. + + + + + Load alternate save game... + + + + + Load temporary save game... + + + + + Load &patch... + + + + + Boot BIOS + + + + + Replace ROM... + + + + + Scan e-Reader dotcodes... + + + + + Convert e-Reader card image to raw... + + + + + ROM &info... + + + + + Recent + + + + + Make portable + + + + + &Load state + + + + + Load state file... + + + + + &Save state + + + + + Save state file... + + + + + Quick load + + + + + Quick save + + + + + Load recent + + + + + Save recent + + + + + Undo load state + + + + + Undo save state + + + + + + State &%1 + + + + + Load camera image... + + + + + Convert save game... + + + + + GameShark saves (*.gsv *.sps *.xps) + + + + + Save games + + + + + Import GameShark Save... + + + + + Export GameShark Save... + + + + + Automatically determine + + + + + Use player %0 save game + + + + + New multiplayer window + + + + + Connect to Dolphin... + + + + + Report bug... + + + + + About... + + + + + E&xit + + + + + &Emulation + + + + + &Reset + + + + + Sh&utdown + + + + + Yank game pak + + + + + &Pause + + + + + &Next frame + + + + + Fast forward (held) + + + + + &Fast forward + + + + + Fast forward speed + + + + + Unbounded + + + + + %0x + + + + + Increase fast forward speed + + + + + Decrease fast forward speed + + + + + Rewind (held) + + + + + Re&wind + + + + + Step backwards + + + + + Solar sensor + + + + + Increase solar level + + + + + Decrease solar level + + + + + Brightest solar level + + + + + Darkest solar level + + + + + Brightness %1 + + + + + Game Boy Printer... + + + + + BattleChip Gate... + + + + + Audio/&Video + + + + + Frame size + + + + + %1× + + + + + Toggle fullscreen + + + + + &Lock frame size + + + + + Lock aspect ratio + + + + + Force integer scaling + + + + + Interframe blending + + + + + Bilinear filtering + + + + + Frame&skip + + + + + Mute + + + + + FPS target + + + + + Native (59.7275) + + + + + Take &screenshot + + + + + F12 + + + + + Record A/V... + + + + + Record GIF/WebP/APNG... + + + + + Video layers + + + + + Audio channels + + + + + Adjust layer placement... + + + + + &Tools + + + + + View &logs... + + + + + Game &overrides... + + + + + Game Pak sensors... + + + + + &Cheats... + + + + + Scripting... + + + + + Create forwarder... + + + + + Settings... + + + + + Open debugger console... + + + + + Start &GDB server... + + + + + Game state views + + + + + View &palette... + + + + + View &sprites... + + + + + View &tiles... + + + + + View &map... + + + + + &Frame inspector... + + + + + View memory... + + + + + Search memory... + + + + + View &I/O registers... + + + + + Log memory &accesses... + + + + + Record debug video log... + + + + + Stop debug video log + + + + + Exit fullscreen + + + + + GameShark Button (held) + + + + + Autofire + + + + + Autofire A + + + + + Autofire B + + + + + Autofire L + + + + + Autofire R + + + + + Autofire Start + + + + + Autofire Select + + + + + Autofire Up + + + + + Autofire Right + + + + + Autofire Down + + + + + Autofire Left + + + + + Clear + + + + + QObject + + + %1 byte + + + + + %1 kiB + + + + + %1 MiB + + + + + GBA + + + + + GB + + + + + ? + + + + + Super (L) + + + + + Super (R) + + + + + Menu + + + + + QShortcut + + + Shift + + + + + Control + + + + + Alt + + + + + Meta + + + diff --git a/src/platform/qt/ts/mgba-sv.ts b/src/platform/qt/ts/mgba-sv.ts index bd6bfb078..49fdcb432 100644 --- a/src/platform/qt/ts/mgba-sv.ts +++ b/src/platform/qt/ts/mgba-sv.ts @@ -387,48 +387,48 @@ Hämtningsstorlek: %3 QGBA::CoreController - + Reset r%1-%2 %3 Starta om r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? Starta om spelet? - + Most games will require a reset to load the new save. Do you want to reset now? De flesta spel kommer att kräva en omstart för att läsa in ny sparning. Vill du starta om nu? - + Failed to open save file: %1 Misslyckades med att öppna sparad fil: %1 - + Failed to open game file: %1 Misslyckades med att öppna spelfil: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Misslyckades med att öppna ögonblicksfil för läsning: %1 - + Failed to open snapshot file for writing: %1 Misslyckades med att öppna ögonblicksfil för skrivning: %1 @@ -3403,6 +3403,15 @@ Hämtningsstorlek: %3 Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + Misslyckades med att öppna minnesloggfil + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Hämtningsstorlek: %3 Stoppa - - Failed to open memory log file - Misslyckades med att öppna minnesloggfil - - - - + + Select access log file Välj åtkomstloggfil - + Memory access logs (*.mal) Minnesåtkomstloggar (*.mal) @@ -6238,7 +6242,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Skanna e-Reader-punktkoder... - + Convert e-Reader card image to raw... Konvertera e-Reader-kortavbilder till raw... @@ -6709,82 +6713,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may Logga minneså&tkomster... - + Record debug video log... Spela in felsökningsvideologg... - + Stop debug video log Stoppa felsökningsvideologg - + Exit fullscreen Avsluta helskärm - + GameShark Button (held) GameShark-knapp (håll) - + Autofire Autofire - + Autofire A Autofire A - + Autofire B Autofire B - + Autofire L Autofire L - + Autofire R Autofire R - + Autofire Start Autofire Start - + Autofire Select Autofire Select - + Autofire Up Autofire upp - + Autofire Right Autofire höger - + Autofire Down Autofire ner - + Autofire Left Autofire vänster - + Clear Töm diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 0155d9c06..77294e94d 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -381,48 +381,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3397,6 +3397,15 @@ Download size: %3 + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3445,18 +3454,13 @@ Download size: %3 - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6228,7 +6232,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Convert e-Reader card image to raw... @@ -6699,82 +6703,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index aaafaf988..6db0c47a6 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -387,48 +387,48 @@ Yeni sürüm: %2 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? Oyun sıfırlansım mı? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 Kayıt dosyası açılamadı: %1 - + Failed to open game file: %1 Oyun dosyası açılamadı: %1 - + Can't yank pack in unexpected platform! Beklenmedik bir platformda kartı çıkaramazsın! - + Failed to open snapshot file for reading: %1 Anlık görüntü dosyası okuma için açılamadı: %1 - + Failed to open snapshot file for writing: %1 Anlık görüntü dosyası yazma için açılamadı: %1 @@ -3403,6 +3403,15 @@ Yeni sürüm: %2 + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Yeni sürüm: %2 Durdur - - Failed to open memory log file - - - - - + + Select access log file - + Memory access logs (*.mal) @@ -6220,7 +6224,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Convert e-Reader card image to raw... e-Okuyucu kart resimlerini rawa dönüştür... @@ -6707,82 +6711,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may &I/O kayıtlarını görüntüle - + Record debug video log... Hata ayıklama video günlüğünü kaydet... - + Stop debug video log Hata ayıklama video günlüğünü durdur - + Exit fullscreen Tam ekrandan çık - + GameShark Button (held) GameShark Butonu (basılı tutun) - + Autofire Otomatik basma - + Autofire A Otomatik basma A - + Autofire B Otomatik basma B - + Autofire L Otomatik basma L - + Autofire R Otomatik basma R - + Autofire Start Otomatik basma Start - + Autofire Select Otomatik basma Select - + Autofire Up Otomatik basma Up - + Autofire Right Otomatik basma Right - + Autofire Down Otomatik basma Down - + Autofire Left Otomatik basma Sol - + Clear Temizle diff --git a/src/platform/qt/ts/mgba-uk.ts b/src/platform/qt/ts/mgba-uk.ts index fd52542ef..32098e99d 100644 --- a/src/platform/qt/ts/mgba-uk.ts +++ b/src/platform/qt/ts/mgba-uk.ts @@ -1,6 +1,29 @@ - + + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -86,22 +109,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -162,17 +185,17 @@ Download size: %3 QGBA::AudioDevice - + Can't set format of context-less audio device - + Audio device is missing its core - + Writing data to read-only audio device @@ -180,7 +203,7 @@ Download size: %3 QGBA::AudioProcessorQt - + Can't start an audio processor without input @@ -256,28 +279,28 @@ Download size: %3 - + BattleChip data missing - + BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? - - + + Select deck file - + Incompatible deck - + The selected deck is not compatible with this Chip Gate @@ -338,19 +361,19 @@ Download size: %3 - - + + Autodetect (recommended) - - + + Select cheats file - + Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. @@ -358,48 +381,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 - - + + Rewinding not currently enabled - + Reset the game? - + Most games will require a reset to load the new save. Do you want to reset now? - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -407,17 +430,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 - + Could not load game. Are you sure it's in the correct format? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -443,11 +466,19 @@ Download size: %3 QGBA::DebuggerConsoleController - + Could not open CLI history for writing + + QGBA::DisplayGL + + + Failed to create an OpenGL 3 context, trying old-style... + + + QGBA::DolphinConnector @@ -496,6 +527,200 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + + + Image files (*.png *.jpg *.bmp) + + + QGBA::FrameView @@ -534,52 +759,52 @@ Download size: %3 - + Export frame - + Portable Network Graphics (*.png) - + None - + Background - + Window - + Objwin - + Sprite - + Backdrop - + Frame - + %1 %2 @@ -587,7 +812,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence @@ -595,22 +820,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh - + Set all @@ -744,148 +969,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2763,26 +3008,11 @@ Download size: %3 QGBA::KeyEditor - - + + --- - - - Super (L) - - - - - Super (R) - - - - - Menu - - QGBA::LibraryTree @@ -2904,7 +3134,7 @@ Download size: %3 - + Slot %1 @@ -3130,43 +3360,111 @@ Download size: %3 - + None - + Both - + Horizontal - + Vertical - - - + + + N/A - + Export map - + Portable Network Graphics (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + + + + + QGBA::MemoryAccessLogView + + + Memory access logging + + + + + Log file + + + + + Browse + + + + + Log additional information (uses 3× space) + + + + + Load existing file if present + + + + + Regions + + + + + Export ROM snapshot + + + + + Start + + + + + Stop + + + + + + Select access log file + + + + + Memory access logs (*.mal) + + + QGBA::MemoryDump @@ -3413,22 +3711,22 @@ Download size: %3 - + (%0/%1×) - + (⅟%0×) - + (%0×) - + %1 byte%2 @@ -3519,6 +3817,34 @@ Download size: %3 + + QGBA::MultiplayerController + + + Trying to detach a multiplayer player that's not attached + + + + + Clearing invalid save ID + + + + + Clearing invalid preferred ID + + + + + Trying to get player ID for a multiplayer player that's not attached + + + + + Trying to get save ID for a multiplayer player that's not attached + + + QGBA::ObjView @@ -3911,35 +4237,35 @@ Download size: %3 - + #%0 - + 0x%0 + + - - 0x%0 (%1) - + Export palette - + Windows PAL (*.pal);;Adobe Color Table (*.act) - + Failed to open output palette file: %1 @@ -4013,20 +4339,21 @@ Download size: %3 QGBA::ROMInfo - - - - + + + + + (unknown) - + bytes - + (no database present) @@ -4036,27 +4363,57 @@ Download size: %3 - + + File information + + + + Game name: - + + MD5 + + + + + Save file: + + + + + ROM header + + + + Internal name: - + Game ID: - + + Maker Code: + + + + + Revision: + + + + File size: - + CRC32: @@ -4112,62 +4469,62 @@ Download size: %3 QGBA::SaveConverter - + Save games and save states (%1) - + Select save game or save state - + Save games (%1) - + Select save game - + Conversion failed - + Failed to convert the save game. This is probably a bug. - + No file selected - + Could not open file - + No valid formats found - + Please select a valid input file - + No valid conversions found - + Cannot convert save games between platforms @@ -4193,92 +4550,97 @@ Download size: %3 - + %1 %2 save game - + little endian - + big endian - + SRAM - + %1 flash - + %1 EEPROM - - %1 SRAM + RTC - - - - - %1 SRAM + + + RTC - packed MBC2 + %1 SRAM + RTC - unpacked MBC2 + %1 SRAM - MBC6 flash + packed MBC2 + unpacked MBC2 + + + + + MBC6 flash + + + + MBC6 combined SRAM + flash - + MBC6 SRAM - + TAMA5 - + %1 (%2) - + %1 save state with embedded %2 save game - + %1 SharkPort %2 save game - + %1 GameShark Advance SP %2 save game @@ -4286,7 +4648,7 @@ Download size: %3 QGBA::ScriptingTextBuffer - + Untitled buffer @@ -4314,32 +4676,37 @@ Download size: %3 - + Load script... - + + &Load most recent + + + + &Reset - + 0 - + Select script to load - + Lua scripts (*.lua) - + All files (*.*) @@ -4432,105 +4799,128 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) - - + + OpenGL - + OpenGL (force version 1.x) - + None - + None (Still Image) - + Keyboard - + Controllers - + Shortcuts - - + + Shaders are not supported when the display driver is not OpenGL. + +If it is set to OpenGL and you still see this, your graphics card or drivers may be too old. + + + + + + + Shaders - + Select BIOS - + Select directory - + + Select image + + + + + Image file (*.png *.jpg *.jpeg) + + + + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago + + - + %n day(s) ago + + @@ -4725,7 +5115,7 @@ Download size: %3 - + frames @@ -4813,77 +5203,77 @@ Download size: %3 - + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only - + SGB color palette if available - + GBC color palette if available - + SGB (preferred) or GBC color palette if available - + Game Boy Camera - + Driver: - + Source: @@ -4978,58 +5368,68 @@ Download size: %3 - + + Custom border: + + + + Fast forward speed: - - + + Unbounded - + Fast forward (held) speed: - + Autofire interval: - + Enable rewind - + Rewind history: - + + Rewind speed: + + + + Idle loops: - + Run all - + Remove known - + Detect and remove - + Preload entire ROM into memory @@ -5050,42 +5450,42 @@ Download size: %3 - + Models - + GB only: - + SGB compatible: - + GBC only: - + GBC compatible: - + SGB and GBC compatible: - + Game Boy palette - + Preset: @@ -5102,154 +5502,150 @@ Download size: %3 - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL enhancements - + High-resolution scale: - + (240×160) - - XQ GBA audio (experimental) - - - - + GB BIOS file: - - - - + + + + - - - - + + + + + Browse - + Use BIOS file if found - + Skip BIOS intro - + GBA BIOS file: - + GBC BIOS file: - + SGB BIOS file: - + Save games - - - - - + + + + + Same directory as the ROM - + Save states - + Screenshots - + Patches - + Cheats - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders @@ -5257,32 +5653,48 @@ Download size: %3 QGBA::ShaderSelector - + No shader active - + + Load shader - + + mGBA Shaders + + + + + Error loading shader + + + + + The shader "%1" could not be loaded successfully. + + + + No shader loaded - + by %1 - + Preprocessing - + Pass %1 @@ -5325,17 +5737,17 @@ Download size: %3 QGBA::ShortcutModel - + Action - + Keyboard - + Gamepad @@ -5455,17 +5867,17 @@ Download size: %3 QGBA::VideoView - + Failed to open output video file: %1 - + Native (%0x%1) - + Select output file @@ -5506,13 +5918,11 @@ Download size: %3 - WebM - MP4 @@ -5551,82 +5961,6 @@ Download size: %3 Format - - - MKV - - - - - AVI - - - - - HEVC - - - - - HEVC (NVENC) - - - - - VP8 - - - - - VP9 - - - - - FFV1 - - - - - - None - - - - - FLAC - - - - - WavPack - - - - - Opus - - - - - Vorbis - - - - - MP3 - - - - - AAC - - - - - Uncompressed - - Bitrate (kbps) @@ -5637,16 +5971,6 @@ Download size: %3 ABR - - - H.264 - - - - - H.264 (NVENC) - - VBR @@ -5676,784 +6000,789 @@ Download size: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - - - - - Game Boy ROMs (%1) - - - - - All ROMs (%1) - - - - - %1 Video Logs (*.mvl) - - - - + Archives (%1) - - - + + + Select ROM - + Select folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash - + The game has crashed with the following error: %1 - + Couldn't Start - + Could not start game. - + Unimplemented BIOS call - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - + Restart needed - + Some changes will not take effect until the emulator is restarted. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... - + Load ROM in archive... - + Add folder to library... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Import GameShark Save... - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + New multiplayer window - + Connect to Dolphin... - + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + + Increase fast forward speed + + + + + Decrease fast forward speed + + + + Rewind (held) - + Re&wind - + Step backwards - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + + &Lock frame size + + + + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + + Create forwarder... + + + + Settings... - + Open debugger console... - + Start &GDB server... - + Scripting... - + Game state views - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + + Log memory &accesses... + + + + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear @@ -6461,55 +6790,70 @@ Download size: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? + + + Super (L) + + + + + Super (R) + + + + + Menu + + QShortcut - + Shift - + Control - + Alt - + Meta diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index 801bacb8f..0518b256b 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -387,48 +387,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 重置 r%1-%2 %3 - - + + Rewinding not currently enabled 当前未开启倒带 - + Reset the game? 要重置游戏吗? - + Most games will require a reset to load the new save. Do you want to reset now? 大多数游戏需要重置才能加载新的存档。您要立即重启吗? - + Failed to open save file: %1 打开存档失败: %1 - + Failed to open game file: %1 打开游戏文件失败: %1 - + Can't yank pack in unexpected platform! 无法在意外平台上抽出卡带! - + Failed to open snapshot file for reading: %1 读取快照文件失败: %1 - + Failed to open snapshot file for writing: %1 写入快照文件失败: %1 @@ -3403,6 +3403,15 @@ Download size: %3 便携式网络图形 (*.png) + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + 打开内存日志文件失败 + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Download size: %3 停止 - - Failed to open memory log file - 打开内存日志文件失败 - - - - + + Select access log file 选择访问日志文件 - + Memory access logs (*.mal) 内存访问日志(*.mal) @@ -6236,7 +6240,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may 扫描 e-Reader 点码... - + Convert e-Reader card image to raw... 将 e-Reader 卡片图像转换为原始数据... @@ -6707,82 +6711,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may 记录内存访问(&a)... - + Record debug video log... 记录调试视频日志... - + Stop debug video log 停止记录调试视频日志 - + Exit fullscreen 退出全屏 - + GameShark Button (held) GameShark 键 (长按) - + Autofire 连发 - + Autofire A 连发 A - + Autofire B 连发 B - + Autofire L 连发 L - + Autofire R 连发 R - + Autofire Start 连发 Start - + Autofire Select 连发 Select - + Autofire Up 连发 上 - + Autofire Right 连发 右 - + Autofire Down 连发 下 - + Autofire Left 连发 左 - + Clear 清除 diff --git a/src/platform/qt/ts/mgba-zh_Hant.ts b/src/platform/qt/ts/mgba-zh_Hant.ts index 5b5c96e52..e764abb92 100644 --- a/src/platform/qt/ts/mgba-zh_Hant.ts +++ b/src/platform/qt/ts/mgba-zh_Hant.ts @@ -387,48 +387,48 @@ Download size: %3 QGBA::CoreController - + Reset r%1-%2 %3 重置 r%1-%2 %3 - - + + Rewinding not currently enabled 目前未開啟倒帶 - + Reset the game? 要重置遊戲嗎? - + Most games will require a reset to load the new save. Do you want to reset now? 大多數遊戲需要重置才能載入新的檔案。您要立即重啟嗎? - + Failed to open save file: %1 存檔開啟失敗: %1 - + Failed to open game file: %1 遊戲開啟失敗: %1 - + Can't yank pack in unexpected platform! 無法在預料外的平台拔除卡帶! - + Failed to open snapshot file for reading: %1 讀取快照失敗: %1 - + Failed to open snapshot file for writing: %1 寫入快照失敗: %1 @@ -3403,6 +3403,15 @@ Download size: %3 複製 + + QGBA::MemoryAccessLogController + + + + Failed to open memory log file + 打開記憶體日誌檔案失敗 + + QGBA::MemoryAccessLogView @@ -3451,18 +3460,13 @@ Download size: %3 停止 - - Failed to open memory log file - 打開記憶體日誌檔案失敗 - - - - + + Select access log file 選擇訪問日誌文件 - + Memory access logs (*.mal) 記憶體存取日誌(*.mal) @@ -4450,7 +4454,7 @@ Download size: %3 Save - + 儲存 @@ -6246,7 +6250,7 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may 掃描 e-Reader 點碼... - + Convert e-Reader card image to raw... 轉換 e-Reader 卡片圖檔為原始資料... @@ -6707,82 +6711,82 @@ If it is set to OpenGL and you still see this, your graphics card or drivers may - + Record debug video log... 錄製除錯影片記錄檔。 - + Stop debug video log 停止除錯影片記錄檔 - + Exit fullscreen 離開全螢幕 - + GameShark Button (held) Gameshark 按鈕 (長按) - + Autofire 自動連射 - + Autofire A 自動連射 A - + Autofire B 自動連射 B - + Autofire L 自動連射 L - + Autofire R 自動連射 R - + Autofire Start 自動連射 Start - + Autofire Select 自動連射 Select - + Autofire Up 自動連射 上 - + Autofire Right 自動連射 右 - + Autofire Down 自動連射 下 - + Autofire Left 自動連射 左 - + Clear 清除 diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 5246f959b..2399dc599 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -115,11 +115,4 @@ if(UNIX) install(FILES ${PROJECT_SOURCE_DIR}/doc/mgba.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-sdl) endif() -if(DISTBUILD AND CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") - if(NOT APPLE) - add_custom_command(TARGET ${BINARY_NAME}-sdl POST_BUILD COMMAND "${OBJCOPY}" --only-keep-debug "$" "$.debug") - add_custom_command(TARGET ${BINARY_NAME}-sdl POST_BUILD COMMAND "${STRIP}" "$") - add_custom_command(TARGET ${BINARY_NAME}-sdl POST_BUILD COMMAND "${OBJCOPY}" --add-gnu-debuglink "$.debug" "$") - install(FILES "$.debug" DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-sdl-dbg) - endif() -endif() +debug_strip(${BINARY_NAME}-sdl) diff --git a/src/platform/test/CMakeLists.txt b/src/platform/test/CMakeLists.txt index 3172c6c88..ce21f8ceb 100644 --- a/src/platform/test/CMakeLists.txt +++ b/src/platform/test/CMakeLists.txt @@ -46,10 +46,3 @@ if(BUILD_CINEMA) add_test(cinema ${BINARY_NAME}-cinema -v) install(TARGETS ${BINARY_NAME}-cinema DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-test) endif() - -if(BUILD_ROM_TEST) - add_executable(${BINARY_NAME}-rom-test ${CMAKE_CURRENT_SOURCE_DIR}/rom-test-main.c) - target_link_libraries(${BINARY_NAME}-rom-test ${BINARY_NAME}) - target_compile_definitions(${BINARY_NAME}-rom-test PRIVATE "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") - install(TARGETS ${BINARY_NAME}-rom-test DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-test) -endif() diff --git a/src/script/console.c b/src/script/console.c index d908534f6..c6324452c 100644 --- a/src/script/console.c +++ b/src/script/console.c @@ -82,7 +82,7 @@ static struct mScriptConsole* _ensureConsole(struct mScriptContext* context) { void mScriptContextAttachLogger(struct mScriptContext* context, struct mLogger* logger) { struct mScriptConsole* console = _ensureConsole(context); - console->logger = logger; + console->logger = logger ? logger : mLogGetContext(); } void mScriptContextDetachLogger(struct mScriptContext* context) { diff --git a/src/script/context.c b/src/script/context.c index 0d770dfde..fbed31862 100644 --- a/src/script/context.c +++ b/src/script/context.c @@ -421,7 +421,10 @@ bool mScriptContextLoadVF(struct mScriptContext* context, const char* name, stru if (!info.context) { return false; } - return info.context->load(info.context, name, vf); + if (!info.context->load(info.context, name, vf)) { + return false; + } + return info.context->run(info.context); } #ifdef ENABLE_VFS diff --git a/src/script/engines/lua.c b/src/script/engines/lua.c index f4f4026e9..26099b1f0 100644 --- a/src/script/engines/lua.c +++ b/src/script/engines/lua.c @@ -1573,7 +1573,19 @@ static int _luaRequireShim(lua_State* lua) { static int _luaPrintShim(lua_State* lua) { int n = lua_gettop(lua); - lua_getglobal(lua, "console"); + if (lua_getglobal(lua, "console") == LUA_TNIL) { + // There is no console installed, so output to stdout + lua_pop(lua, 1); + for (int i = 1; i <= n; i++) { + const char* str = luaL_tolstring(lua, i, NULL); + if (i > 1) { + printf("\t"); + } + printf("%s", str); + } + printf("\n"); + return 0; + } lua_insert(lua, 1); // The first upvalue is either "log" or "warn" diff --git a/src/script/stdlib.c b/src/script/stdlib.c index 6e81cfd86..8fc1b1404 100644 --- a/src/script/stdlib.c +++ b/src/script/stdlib.c @@ -130,6 +130,7 @@ void mScriptContextAttachStdlib(struct mScriptContext* context) { }); mScriptContextExportConstants(context, "CHECKSUM", (struct mScriptKVPair[]) { mSCRIPT_CONSTANT_PAIR(mCHECKSUM, CRC32), + mSCRIPT_CONSTANT_PAIR(mCHECKSUM, MD5), mSCRIPT_KV_SENTINEL }); #ifdef M_CORE_GBA diff --git a/src/tools/updater-main.c b/src/tools/updater-main.c index a27a07a08..b536e3208 100644 --- a/src/tools/updater-main.c +++ b/src/tools/updater-main.c @@ -133,14 +133,11 @@ bool extractArchive(struct VDir* archive, const char* root, bool prefix) { errno = 0; vfOut = VFileOpen(path, O_WRONLY | O_CREAT | O_TRUNC); if (!vfOut) { - if (errno == EACCES) { -#ifdef _WIN32 - Sleep(1000); -#else - sleep(1); -#endif - vfOut = VFileOpen(path, O_WRONLY | O_CREAT | O_TRUNC); - } else if (errno == EISDIR) { + int error = errno; + struct stat st; + if (error == EISDIR || (stat(path, &st) >= 0 && S_ISDIR(st.st_mode))) { + // Windows maps STATUS_FILE_IS_A_DIRECTORY to ERROR_ACCESS_DENIED, + // which then gets mapped to EACCESS, because everything is awful fprintf(logfile, "rm -r %s\n", path); if (!rmdirRecursive(VDirOpen(path))) { return false; @@ -151,6 +148,13 @@ bool extractArchive(struct VDir* archive, const char* root, bool prefix) { RemoveDirectoryW(wpath); #else rmdir(path); +#endif + vfOut = VFileOpen(path, O_WRONLY | O_CREAT | O_TRUNC); + } else if (error == EACCES || error == ETXTBSY) { +#ifdef _WIN32 + Sleep(1000); +#else + sleep(1); #endif vfOut = VFileOpen(path, O_WRONLY | O_CREAT | O_TRUNC); } diff --git a/src/util/gui/file-select.c b/src/util/gui/file-select.c index 0cdfba35d..f13668c3f 100644 --- a/src/util/gui/file-select.c +++ b/src/util/gui/file-select.c @@ -163,7 +163,16 @@ bool GUISelectFile(struct GUIParams* params, char* outPath, size_t outLen, bool .subtitle = params->currentPath, }; GUIMenuItemListInit(&menu.items, 0); - _refreshDirectory(params, params->currentPath, &menu.items, filterName, filterContents, preselect); + while (true) { + if (_refreshDirectory(params, params->currentPath, &menu.items, filterName, filterContents, preselect)) { + break; + } + if (strncmp(params->currentPath, params->basePath, PATH_MAX) == 0 || !params->currentPath[0]) { + mLOG(GUI_MENU, ERROR, "Failed to load base directory"); + return false; + } + _upDirectory(params->currentPath); + } menu.index = params->fileIndex; while (true) { diff --git a/src/util/gui/menu.c b/src/util/gui/menu.c index f0c624f17..3aeff4533 100644 --- a/src/util/gui/menu.c +++ b/src/util/gui/menu.c @@ -17,6 +17,8 @@ DEFINE_VECTOR(GUIMenuItemList, struct GUIMenuItem); DEFINE_VECTOR(GUIMenuSavedList, struct GUIMenuSavedState); +mLOG_DEFINE_CATEGORY(GUI_MENU, "GUI Menu", "gui.menu"); + void _itemNext(struct GUIMenuItem* item, bool wrap) { if (wrap || item->state < item->nStates - 1) { unsigned oldState = item->state; @@ -117,12 +119,6 @@ static enum GUIMenuExitReason GUIMenuPollInput(struct GUIParams* params, struct state->cursor = GUIPollCursor(params, &state->cx, &state->cy); // Check for new direction presses - if (newInput & (1 << GUI_INPUT_UP) && menu->index > 0) { - --menu->index; - } - if (newInput & (1 << GUI_INPUT_DOWN) && menu->index < GUIMenuItemListSize(&menu->items) - 1) { - ++menu->index; - } if (newInput & (1 << GUI_INPUT_LEFT)) { struct GUIMenuItem* item = GUIMenuItemListGetPointer(&menu->items, menu->index); if (item->validStates && !item->readonly) { @@ -143,6 +139,20 @@ static enum GUIMenuExitReason GUIMenuPollInput(struct GUIParams* params, struct menu->index = GUIMenuItemListSize(&menu->items) - 1; } } + if (newInput & (1 << GUI_INPUT_UP)) { + if (menu->index > 0) { + --menu->index; + } else { + menu->index = GUIMenuItemListSize(&menu->items) - 1; + } + } + if (newInput & (1 << GUI_INPUT_DOWN)) { + if (menu->index < GUIMenuItemListSize(&menu->items) - 1) { + ++menu->index; + } else { + menu->index = 0; + } + } // Handle cursor movement if (state->cursor != GUI_CURSOR_NOT_PRESENT) {