From 4d648c4f7c61fba5c9ff8b1ad4555e0a7f76e27e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 00:57:46 -0800 Subject: [PATCH 01/60] Windows: MSVC fixes --- src/gb/core.c | 2 +- src/gba/core.c | 2 +- src/platform/sdl/CMakeLists.txt | 3 --- 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/gb/core.c b/src/gb/core.c index 7a1191bb5..033f94aa6 100644 --- a/src/gb/core.c +++ b/src/gb/core.c @@ -453,7 +453,7 @@ static void _GBCoreUnloadROM(struct mCore* core) { mCheatDeviceDestroy(gbcore->cheatDevice); gbcore->cheatDevice = NULL; } - return GBUnloadROM(core->board); + GBUnloadROM(core->board); } static void _GBCoreChecksum(const struct mCore* core, void* data, enum mCoreChecksumType type) { diff --git a/src/gba/core.c b/src/gba/core.c index 328f3d128..8515fa9c1 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -535,7 +535,7 @@ static void _GBACoreUnloadROM(struct mCore* core) { mCheatDeviceDestroy(gbacore->cheatDevice); gbacore->cheatDevice = NULL; } - return GBAUnloadROM(core->board); + GBAUnloadROM(core->board); } static void _GBACoreChecksum(const struct mCore* core, void* data, enum mCoreChecksumType type) { diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 107761d8c..5340dc482 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -117,9 +117,6 @@ if(NOT WIN32) else() set_target_properties(${BINARY_NAME}-sdl PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") endif() -if (WIN32 AND MSVC) - set_target_properties(${BINARY_NAME}-sdl PROPERTIES LINK_FLAGS "/SUBSYSTEM:CONSOLE") -endif() install(TARGETS ${BINARY_NAME}-sdl DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT ${BINARY_NAME}-sdl) if(UNIX) install(FILES ${CMAKE_SOURCE_DIR}/doc/mgba.6 DESTINATION ${MANDIR}/man6 COMPONENT ${BINARY_NAME}-sdl) From 6c84f43c22eb010e6b7fcec1f670c5dcaf4b71f9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 04:02:37 -0800 Subject: [PATCH 02/60] GB: Copy logo from ROM if not running the BIOS intro (fixes #2378) --- CHANGES | 1 + src/gb/gb.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/CHANGES b/CHANGES index c6a63a7c5..bcffc0b31 100644 --- a/CHANGES +++ b/CHANGES @@ -16,6 +16,7 @@ Features: - New unlicensed GB mappers: NT (newer type) Emulation fixes: - ARM7: Fix unsigned multiply timing + - GB: Copy logo from ROM if not running the BIOS intro (fixes mgba.io/i/2378) - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) - GB Serialize: Fix loading MBC1 states that affect bank 0 (fixes mgba.io/i/2402) - GB Video: Draw SGB border pieces that overlap GB graphics (fixes mgba.io/i/1339) diff --git a/src/gb/gb.c b/src/gb/gb.c index 186231bd6..9fabe57cc 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -587,6 +587,53 @@ void GBSkipBIOS(struct GB* gb) { break; } + unsigned i; + for (i = 0; i < sizeof(cart->logo); ++i) { + uint8_t byte = GBLoad8(cpu, 0x104 + i); + + uint8_t output0 = 0; + uint8_t output1 = 0; + + output0 |= (byte & 0x80) >> 0; + output0 |= (byte & 0x40) >> 1; + output0 |= (byte & 0x20) >> 2; + output0 |= (byte & 0x10) >> 3; + output0 |= output0 >> 1; + + output1 |= (byte & 0x08) << 3; + output1 |= (byte & 0x04) << 2; + output1 |= (byte & 0x02) << 1; + output1 |= (byte & 0x01) << 0; + output1 |= output1 << 1; + + if (gb->model < GB_MODEL_CGB) { + GBPatch8(cpu, 0x8010 + i * 8, output0, NULL, 0); + GBPatch8(cpu, 0x8012 + i * 8, output0, NULL, 0); + GBPatch8(cpu, 0x8014 + i * 8, output1, NULL, 0); + GBPatch8(cpu, 0x8016 + i * 8, output1, NULL, 0); + } else { + GBPatch8(cpu, 0x8380 + i * 2, output0, NULL, 0); + GBPatch8(cpu, 0x8381 + i * 2, output1, NULL, 0); + } + } + if (gb->model < GB_MODEL_CGB) { + for (i = 0; i < 12; ++i) { + GBPatch8(cpu, 0x9904 + i, i + 1, NULL, 0); + GBPatch8(cpu, 0x9924 + i, i + 13, NULL, 0); + } + GBPatch8(cpu, 0x9910, 0x19, NULL, 0); + for (i = 0; i < sizeof(_registeredTrademark); ++i) { + GBPatch8(cpu, 0x8191 + i * 2, _registeredTrademark[i], NULL, 0); + } + } else { + for (i = 0; i < 7; ++i) { + GBPatch8(cpu, 0x99A7 + i, i + 0x38, NULL, 0); + } + for (i = 0; i < sizeof(_registeredTrademark); ++i) { + GBPatch8(cpu, 0x83E1 + i * 2, _registeredTrademark[i], NULL, 0); + } + } + cpu->sp = 0xFFFE; cpu->pc = 0x100; From a9e6c0a659c142e5d02ea37ed9de08379fc8271f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 04:28:43 -0800 Subject: [PATCH 03/60] SDL: Use FindSDL2 by default --- src/platform/sdl/CMakeLists.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 5340dc482..935ed74a3 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -6,7 +6,7 @@ if (SDL_VERSION EQUAL "2") if (NOT SDL2_FOUND) find_package(SDL2) endif() - + if (SDL2_FOUND) set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIRS}) set(SDL_LIBRARY ${SDL2_LIBRARIES}) @@ -15,7 +15,11 @@ if (SDL_VERSION EQUAL "2") set(SDL_FOUND ON PARENT_SCOPE) if (NOT SDL2MAIN_LIBRARY) - set(SDL2MAIN_LIBRARY "") + if(TARGET SDL2::SDL2main) + set(SDL2MAIN_LIBRARY SDL2::SDL2main) + else() + set(SDL2MAIN_LIBRARY "") + endif() endif() set(SDLMAIN_LIBRARY ${SDL2MAIN_LIBRARY}) From 2052e2cfe494eafca6d496c7e11ef434a09f1d9e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 14:08:35 -0800 Subject: [PATCH 04/60] GB: Fix build --- src/gb/gb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/gb/gb.c b/src/gb/gb.c index 9fabe57cc..9d53bb99b 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -23,7 +23,8 @@ const uint32_t SGB_SM83_FREQUENCY = 0x418B1E; const uint32_t GB_COMPONENT_MAGIC = 0x400000; -static const uint8_t _knownHeader[4] = { 0xCE, 0xED, 0x66, 0x66}; +static const uint8_t _knownHeader[4] = {0xCE, 0xED, 0x66, 0x66}; +static const uint8_t _registeredTrademark[] = {0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C}; #define DMG0_BIOS_CHECKSUM 0xC2F5CC97 #define DMG_BIOS_CHECKSUM 0x59C8598E From 8c802991bba6c8d20e3292f5915d7f21a7917e7c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 14:27:23 -0800 Subject: [PATCH 05/60] CInema: Fix new mooneye-gb failures --- .../acceptance/timer/rapid_toggle/config.ini | 1 + .../timer/rapid_toggle/xbaseline_0000.png | Bin 411 -> 581 bytes .../mbc1/bits_mode/baseline_0000.png | Bin 411 -> 528 bytes .../emulator-only/mbc1/bits_mode/config.ini | 2 ++ 4 files changed, 3 insertions(+) create mode 100644 cinema/gb/mooneye-gb/emulator-only/mbc1/bits_mode/config.ini diff --git a/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/config.ini b/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/config.ini index 7ddee425b..430524ed5 100644 --- a/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/config.ini +++ b/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/config.ini @@ -1,2 +1,3 @@ [testinfo] +skip=120 fail=1 diff --git a/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/xbaseline_0000.png b/cinema/gb/mooneye-gb/acceptance/timer/rapid_toggle/xbaseline_0000.png index bbe7e5937a4a0bdc08a3f6336d8a678ac75ae6ca..1cf57556bd05d9cd21718161e94e4a2ad0c23794 100644 GIT binary patch literal 581 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|OI}r;B4q#hkY{Zss*PFgOHe z{P`chj6W<%ppY~7>9aZF%BKv9V%d&o&SKlO?_V|3AHBxMEPcWjeh(}_3~S!Q27Qme zE;~B)<-(+q+jQ?@7OUX!Cq`xBB_rG5Pj)?z1ibe0KHcd)r^E ztyYfDuYdO9`?H<9-XA-mFZ*TjpBmSG@$UBX>(f8#)!qKw{HFBC-edF6pWpb3ulT{s zN8cn@KfM3>(#@YMjy<0#zwVtuz3cj0|8)N_&%gGgWB!A+2c(~U-W1Vf8?%1z$K?GH zkN0dp5f!U-ukZhvl)kG!5-vXtUDu54Zny_V8Hixn$H?clQncY+aSteYc)I$ztaD0e F0sxb34pjgE literal 411 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|R4{r;B4q#hkYn895mg1P(ZC zt$%Lb%JEq5U_y18SnTt1hI~nx^ny7D3)zm3GRO&pJFMSKS!8D~ezp}9=$@{AF6*2U FngEd%oml_? diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/bits_mode/baseline_0000.png b/cinema/gb/mooneye-gb/emulator-only/mbc1/bits_mode/baseline_0000.png index bbe7e5937a4a0bdc08a3f6336d8a678ac75ae6ca..f9e5e47b50a4d548ddbc988a8e76364d30f505cf 100644 GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|VoAPZ!6KiaBquU(7mWz~FE( z<;Va1cWgxt&B%VfEU&=!xnok3TT$lH;@jICuivi!&oIyXfkoqEmOfz%KM+GNxySPP z*F*Dd<=5Z6-dB81|M;InsWNlk%!+)xcb*0|R4{r;B4q#hkYn895mg1P(ZC zt$%Lb%JEq5U_y18SnTt1hI~nx^ny7D3)zm3GRO&pJFMSKS!8D~ezp}9=$@{AF6*2U FngEd%oml_? diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/bits_mode/config.ini b/cinema/gb/mooneye-gb/emulator-only/mbc1/bits_mode/config.ini new file mode 100644 index 000000000..6906d9fc3 --- /dev/null +++ b/cinema/gb/mooneye-gb/emulator-only/mbc1/bits_mode/config.ini @@ -0,0 +1,2 @@ +[testinfo] +skip=180 From 9b8a31a7a5aefb63390ad22fa47784dbe915a984 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 18:29:18 -0800 Subject: [PATCH 06/60] SDL: Fix static Windows build --- src/platform/sdl/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 935ed74a3..91ac72590 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -114,7 +114,7 @@ if(ENABLE_SCRIPTING) endif() add_executable(${BINARY_NAME}-sdl WIN32 ${PLATFORM_SRC} ${MAIN_SRC}) -set_target_properties(${BINARY_NAME}-sdl PROPERTIES COMPILE_DEFINITIONS "${FEATURE_DEFINES};${FUNCTION_DEFINES}") +set_target_properties(${BINARY_NAME}-sdl PROPERTIES COMPILE_DEFINITIONS "${FEATURE_DEFINES};${FUNCTION_DEFINES};${OS_DEFINES}") target_link_libraries(${BINARY_NAME}-sdl ${BINARY_NAME} ${PLATFORM_LIBRARY} ${OPENGL_LIBRARY} ${OPENGLES2_LIBRARY}) if(NOT WIN32) set_target_properties(${BINARY_NAME}-sdl PROPERTIES OUTPUT_NAME ${BINARY_NAME}) From a5976e6c342f879bbb2786b6c84b002c3f35abf9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 22:19:19 -0800 Subject: [PATCH 07/60] GB MBC: Sachen MMC1 support --- CHANGES | 2 +- include/mgba/gb/interface.h | 2 + include/mgba/internal/gb/memory.h | 15 ++++++ include/mgba/internal/gb/serialize.h | 10 ++++ src/gb/gb.c | 25 ++++++++-- src/gb/mbc.c | 71 ++++++++++++++++++++++++++++ src/gb/memory.c | 23 +++++++++ src/platform/qt/GameBoy.cpp | 3 ++ 8 files changed, 145 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index bcffc0b31..34e8e94b1 100644 --- a/CHANGES +++ b/CHANGES @@ -13,7 +13,7 @@ Features: - Additional scaling shaders - Support for GameShark Advance SP (.gsv) save file importing - Support for multiple saves per game using .sa2, .sa3, etc. - - New unlicensed GB mappers: NT (newer type) + - New unlicensed GB mappers: NT (newer type), Sachen (MMC1) Emulation fixes: - ARM7: Fix unsigned multiply timing - GB: Copy logo from ROM if not running the BIOS intro (fixes mgba.io/i/2378) diff --git a/include/mgba/gb/interface.h b/include/mgba/gb/interface.h index 997312c3a..6b7e1adac 100644 --- a/include/mgba/gb/interface.h +++ b/include/mgba/gb/interface.h @@ -44,6 +44,8 @@ enum GBMemoryBankControllerType { GB_UNL_NT_NEW = 0x212, GB_UNL_BBD = 0x220, // Also used as a mask for MBCs that need special read behavior GB_UNL_HITEK = 0x221, + GB_UNL_SACHEN_MMC1 = 0x230, + GB_UNL_SACHEN_MMC2 = 0x231, }; enum GBVideoLayer { diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h index ce3e9079c..bb4029bf2 100644 --- a/include/mgba/internal/gb/memory.h +++ b/include/mgba/internal/gb/memory.h @@ -137,6 +137,12 @@ enum GBHuC3Command { GBHUC3_CMD_TONE = 0xE, }; +enum GBSachenLockMode { + GB_SACHEN_LOCKED_DMG = 0, + GB_SACHEN_LOCKED_CGB, + GB_SACHEN_UNLOCKED +}; + struct GBMBC1State { int mode; int multicartStride; @@ -196,6 +202,14 @@ struct GBBBDState { int bankSwapMode; }; +struct GBSachenState { + enum GBSachenLockMode locked; + int transition; + uint8_t mask; + uint8_t unmaskedBank; + uint8_t baseBank; +}; + union GBMBCState { struct GBMBC1State mbc1; struct GBMBC6State mbc6; @@ -207,6 +221,7 @@ union GBMBCState { struct GBNTNewState ntNew; struct GBPKJDState pkjd; struct GBBBDState bbd; + struct GBSachenState sachen; }; struct mRotationSource; diff --git a/include/mgba/internal/gb/serialize.h b/include/mgba/internal/gb/serialize.h index 274172cbe..6973d4e57 100644 --- a/include/mgba/internal/gb/serialize.h +++ b/include/mgba/internal/gb/serialize.h @@ -262,6 +262,10 @@ DECL_BITFIELD(GBSerializedMBC7Flags, uint8_t); DECL_BITS(GBSerializedMBC7Flags, Command, 0, 2); DECL_BIT(GBSerializedMBC7Flags, Writable, 2); +DECL_BITFIELD(GBSerializedSachenFlags, uint8_t); +DECL_BITS(GBSerializedSachenFlags, Transition, 0, 6); +DECL_BITS(GBSerializedSachenFlags, Locked, 6, 2); + DECL_BITFIELD(GBSerializedMemoryFlags, uint16_t); DECL_BIT(GBSerializedMemoryFlags, SramAccess, 0); DECL_BIT(GBSerializedMemoryFlags, RtcAccess, 1); @@ -404,6 +408,12 @@ struct GBSerializedState { uint8_t dataSwapMode; uint8_t bankSwapMode; } bbd; + struct { + GBSerializedSachenFlags flags; + uint8_t mask; + uint8_t unmaskedBank; + uint8_t baseBank; + } sachen; struct { uint8_t reserved[16]; } padding; diff --git a/src/gb/gb.c b/src/gb/gb.c index 9d53bb99b..6f8aa97ff 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -24,6 +24,7 @@ const uint32_t SGB_SM83_FREQUENCY = 0x418B1E; const uint32_t GB_COMPONENT_MAGIC = 0x400000; static const uint8_t _knownHeader[4] = {0xCE, 0xED, 0x66, 0x66}; +static const uint8_t _knownHeaderSachen[4] = {0x7C, 0xE7, 0xC0, 0x00}; static const uint8_t _registeredTrademark[] = {0x3C, 0x42, 0xB9, 0xA5, 0xB9, 0xA5, 0x42, 0x3C}; #define DMG0_BIOS_CHECKSUM 0xC2F5CC97 @@ -906,16 +907,30 @@ bool GBIsROM(struct VFile* vf) { if (!vf) { return false; } - vf->seek(vf, 0x104, SEEK_SET); - uint8_t header[4]; + vf->seek(vf, 0x100, SEEK_SET); + uint8_t header[0x100]; if (vf->read(vf, &header, sizeof(header)) < (ssize_t) sizeof(header)) { return false; } - if (memcmp(header, _knownHeader, sizeof(header))) { - return false; + if (memcmp(&header[4], _knownHeader, sizeof(_knownHeader)) == 0) { + return true; } - return true; + if (memcmp(&header[4], _knownHeaderSachen, sizeof(_knownHeaderSachen)) == 0) { + // Sachen logo + return true; + } + if (header[0x04] == _knownHeader[0] && header[0x44] == _knownHeader[1] && + header[0x14] == _knownHeader[2] && header[0x54] == _knownHeader[3]) { + // Sachen MMC1 scrambled header + return true; + } + if (header[0x04] == _knownHeaderSachen[0] && header[0x44] == _knownHeaderSachen[1] && + header[0x14] == _knownHeaderSachen[2] && header[0x54] == _knownHeaderSachen[3]) { + // Sachen MMC2 scrambled header + return true; + } + return false; } void GBGetGameTitle(const struct GB* gb, char* out) { diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 21932a456..f844540d2 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -41,6 +41,7 @@ static void _GBPKJD(struct GB* gb, uint16_t address, uint8_t value); static void _GBNTNew(struct GB* gb, uint16_t address, uint8_t value); static void _GBBBD(struct GB* gb, uint16_t address, uint8_t value); static void _GBHitek(struct GB* gb, uint16_t address, uint8_t value); +static void _GBSachen(struct GB* gb, uint16_t address, uint8_t value); static uint8_t _GBMBC2Read(struct GBMemory*, uint16_t address); static uint8_t _GBMBC6Read(struct GBMemory*, uint16_t address); @@ -52,6 +53,7 @@ static uint8_t _GBHuC3Read(struct GBMemory*, uint16_t address); static uint8_t _GBPKJDRead(struct GBMemory*, uint16_t address); static uint8_t _GBBBDRead(struct GBMemory*, uint16_t address); static uint8_t _GBHitekRead(struct GBMemory*, uint16_t address); +static uint8_t _GBSachenMMC1Read(struct GBMemory*, uint16_t address); static uint8_t _GBPocketCamRead(struct GBMemory*, uint16_t address); static void _GBPocketCamCapture(struct GBMemory*); @@ -198,6 +200,10 @@ static enum GBMemoryBankControllerType _detectUnlMBC(const uint8_t* mem, size_t } } + if (mem[0x104] == 0xCE && mem[0x144] == 0xED && mem[0x114] == 0x66) { + return GB_UNL_SACHEN_MMC1; + } + return GB_MBC_AUTODETECT; } @@ -424,6 +430,10 @@ void GBMBCInit(struct GB* gb) { gb->memory.mbcState.bbd.dataSwapMode = 7; gb->memory.mbcState.bbd.bankSwapMode = 7; break; + case GB_UNL_SACHEN_MMC1: + gb->memory.mbcWrite = _GBSachen; + gb->memory.mbcRead = _GBSachenMMC1Read; + break; } gb->memory.currentBank = 1; @@ -1724,6 +1734,67 @@ uint8_t _GBHitekRead(struct GBMemory* memory, uint16_t address) { } } +void _GBSachen(struct GB* gb, uint16_t address, uint8_t value) { + struct GBSachenState* state = &gb->memory.mbcState.sachen; + uint8_t bank = value; + switch (address >> 13) { + case 0: + if ((state->unmaskedBank & 0x30) == 0x30) { + state->baseBank = bank; + GBMBCSwitchBank0(gb, state->baseBank & state->mask); + } + break; + case 1: + if (!bank) { + bank = 1; + } + state->unmaskedBank = bank; + bank = (bank & ~state->mask) | (state->baseBank & state->mask); + GBMBCSwitchBank(gb, bank); + break; + case 2: + if ((state->unmaskedBank & 0x30) == 0x30) { + state->mask = value; + bank = (state->unmaskedBank & ~state->mask) | (state->baseBank & state->mask); + GBMBCSwitchBank(gb, bank); + GBMBCSwitchBank0(gb, state->baseBank & state->mask); + } + break; + } +} + +static uint16_t _unscrambleSachen(uint16_t address) { + uint16_t unscrambled = address & 0xFFAC; + unscrambled |= (address & 0x40) >> 6; + unscrambled |= (address & 0x10) >> 3; + unscrambled |= (address & 0x02) << 3; + unscrambled |= (address & 0x01) << 6; + return unscrambled; +} + +uint8_t _GBSachenMMC1Read(struct GBMemory* memory, uint16_t address) { + struct GBSachenState* state = &memory->mbcState.sachen; + if (state->locked != GB_SACHEN_UNLOCKED) { + ++state->transition; + if (state->transition == 0x31) { + state->locked = GB_SACHEN_UNLOCKED; + } + address |= 0x80; + } + + if ((address & 0xFF00) == 0x0100) { + address = _unscrambleSachen(address); + } + + if (address < GB_BASE_CART_BANK1) { + return memory->romBase[address]; + } else if (address < GB_BASE_VRAM) { + return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)]; + } else { + return 0xFF; + } +} + static void _appendSaveSuffix(struct GB* gb, const void* buffer, size_t size) { struct VFile* vf = gb->sramVf; if ((size_t) vf->size(vf) < gb->sramSize + size) { diff --git a/src/gb/memory.c b/src/gb/memory.c index f80fef77b..10b09eed1 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -73,6 +73,10 @@ static void GBSetActiveRegion(struct SM83Core* cpu, uint16_t address) { case GB_REGION_CART_BANK0 + 1: case GB_REGION_CART_BANK0 + 2: case GB_REGION_CART_BANK0 + 3: + if ((gb->memory.mbcType & GB_UNL_SACHEN_MMC1) == GB_UNL_SACHEN_MMC1) { + cpu->memory.cpuLoad8 = GBLoad8; + break; + } cpu->memory.cpuLoad8 = GBCartLoad8; cpu->memory.activeRegion = memory->romBase; cpu->memory.activeRegionEnd = GB_BASE_CART_BANK1; @@ -245,6 +249,8 @@ uint8_t GBLoad8(struct SM83Core* cpu, uint16_t address) { case GB_REGION_CART_BANK0 + 3: if (address >= memory->romSize) { memory->cartBus = 0xFF; + } else if ((memory->mbcType & GB_UNL_SACHEN_MMC1) == GB_UNL_SACHEN_MMC1) { + memory->cartBus = memory->mbcRead(memory, address); } else { memory->cartBus = memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)]; } @@ -766,6 +772,14 @@ void GBMemorySerialize(const struct GB* gb, struct GBSerializedState* state) { state->memory.bbd.dataSwapMode = memory->mbcState.bbd.dataSwapMode; state->memory.bbd.bankSwapMode = memory->mbcState.bbd.bankSwapMode; break; + case GB_UNL_SACHEN_MMC1: + case GB_UNL_SACHEN_MMC2: + state->memory.sachen.flags = GBSerializedSachenFlagsSetTransition(0, memory->mbcState.sachen.transition); + state->memory.sachen.flags = GBSerializedSachenFlagsSetLocked(state->memory.sachen.flags, memory->mbcState.sachen.locked); + state->memory.sachen.mask = memory->mbcState.sachen.mask; + state->memory.sachen.unmaskedBank = memory->mbcState.sachen.unmaskedBank; + state->memory.sachen.baseBank = memory->mbcState.sachen.baseBank; + break; default: break; } @@ -872,6 +886,15 @@ void GBMemoryDeserialize(struct GB* gb, const struct GBSerializedState* state) { memory->mbcState.bbd.dataSwapMode = state->memory.bbd.dataSwapMode & 0x7; memory->mbcState.bbd.bankSwapMode = state->memory.bbd.bankSwapMode & 0x7; break; + case GB_UNL_SACHEN_MMC1: + case GB_UNL_SACHEN_MMC2: + memory->mbcState.sachen.transition = GBSerializedSachenFlagsGetTransition(state->memory.sachen.flags); + memory->mbcState.sachen.locked = GBSerializedSachenFlagsGetLocked(state->memory.sachen.flags); + memory->mbcState.sachen.mask = state->memory.sachen.mask; + memory->mbcState.sachen.unmaskedBank = state->memory.sachen.unmaskedBank; + memory->mbcState.sachen.baseBank = state->memory.sachen.baseBank; + GBMBCSwitchBank0(gb, memory->mbcState.sachen.baseBank & memory->mbcState.sachen.mask); + break; default: break; } diff --git a/src/platform/qt/GameBoy.cpp b/src/platform/qt/GameBoy.cpp index c27218afc..181461188 100644 --- a/src/platform/qt/GameBoy.cpp +++ b/src/platform/qt/GameBoy.cpp @@ -38,6 +38,7 @@ static const QList s_mbcList{ GB_UNL_NT_NEW, GB_UNL_BBD, GB_UNL_HITEK, + GB_UNL_SACHEN_MMC1, }; static QMap s_gbModelNames; @@ -92,6 +93,8 @@ QString GameBoy::mbcName(GBMemoryBankControllerType mbc) { s_mbcNames[GB_UNL_PKJD] = tr("Pokémon Jade/Diamond"); s_mbcNames[GB_UNL_BBD] = tr("BBD"); s_mbcNames[GB_UNL_HITEK] = tr("Hitek"); + s_mbcNames[GB_UNL_SACHEN_MMC1] = tr("Sachen (MMC1)"); + s_mbcNames[GB_UNL_SACHEN_MMC2] = tr("Sachen (MMC2)"); } return s_mbcNames[mbc]; From 73f18f80496670844a449bd9582acd014c296deb Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 23:21:17 -0800 Subject: [PATCH 08/60] AppVeyor: Bump Qt --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 8cf7c6ce2..100d3a633 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -14,7 +14,7 @@ install: - vcpkg --no-dry-run upgrade - rd /Q /S C:\Tools\vcpkg\buildtrees before_build: -- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.12\msvc2017_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake +- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake build: parallel: true project: mGBA.sln From 0676769b6897408fa009c8a6cb29f1824fd4f6e7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Feb 2022 22:19:46 -0800 Subject: [PATCH 09/60] GB MBC: Sachen MMC2 support --- CHANGES | 2 +- include/mgba/internal/gb/memory.h | 5 +++ src/gb/gb.c | 6 ++- src/gb/mbc.c | 62 ++++++++++++++++++++++++++++++- src/gb/memory.c | 20 ++++++++-- 5 files changed, 87 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index 34e8e94b1..3806127ed 100644 --- a/CHANGES +++ b/CHANGES @@ -13,7 +13,7 @@ Features: - Additional scaling shaders - Support for GameShark Advance SP (.gsv) save file importing - Support for multiple saves per game using .sa2, .sa3, etc. - - New unlicensed GB mappers: NT (newer type), Sachen (MMC1) + - New unlicensed GB mappers: NT (newer type), Sachen (MMC1, MMC2) Emulation fixes: - ARM7: Fix unsigned multiply timing - GB: Copy logo from ROM if not running the BIOS intro (fixes mgba.io/i/2378) diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h index bb4029bf2..43ece98d2 100644 --- a/include/mgba/internal/gb/memory.h +++ b/include/mgba/internal/gb/memory.h @@ -248,6 +248,11 @@ struct GBMemory { uint8_t* wramBank; int wramCurrentBank; + bool mbcReadBank0; + bool mbcReadBank1; + bool mbcReadHigh; + bool mbcWriteHigh; + bool sramAccess; bool directSramAccess; uint8_t* sram; diff --git a/src/gb/gb.c b/src/gb/gb.c index 6f8aa97ff..6130964b8 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -636,6 +636,10 @@ void GBSkipBIOS(struct GB* gb) { } } + if (gb->memory.mbcType == GB_UNL_SACHEN_MMC2) { + gb->memory.mbcState.sachen.locked = GB_SACHEN_UNLOCKED; + } + cpu->sp = 0xFFFE; cpu->pc = 0x100; @@ -660,7 +664,7 @@ void GBMapBIOS(struct GB* gb) { if (gb->memory.rom) { memcpy(&gb->memory.romBase[size], &gb->memory.rom[size], GB_SIZE_CART_BANK0 - size); if (size > 0x100) { - memcpy(&gb->memory.romBase[0x100], &gb->memory.rom[0x100], sizeof(struct GBCartridge)); + memcpy(&gb->memory.romBase[0x100], &gb->memory.rom[0x100], 0x100); } } } diff --git a/src/gb/mbc.c b/src/gb/mbc.c index f844540d2..ffc4054e6 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -54,6 +54,7 @@ static uint8_t _GBPKJDRead(struct GBMemory*, uint16_t address); static uint8_t _GBBBDRead(struct GBMemory*, uint16_t address); static uint8_t _GBHitekRead(struct GBMemory*, uint16_t address); static uint8_t _GBSachenMMC1Read(struct GBMemory*, uint16_t address); +static uint8_t _GBSachenMMC2Read(struct GBMemory*, uint16_t address); static uint8_t _GBPocketCamRead(struct GBMemory*, uint16_t address); static void _GBPocketCamCapture(struct GBMemory*); @@ -204,6 +205,10 @@ static enum GBMemoryBankControllerType _detectUnlMBC(const uint8_t* mem, size_t return GB_UNL_SACHEN_MMC1; } + if (mem[0x184] == 0xCE && mem[0x1C4] == 0xED && mem[0x194] == 0x66) { + return GB_UNL_SACHEN_MMC2; + } + return GB_MBC_AUTODETECT; } @@ -423,16 +428,31 @@ void GBMBCInit(struct GB* gb) { case GB_UNL_BBD: gb->memory.mbcWrite = _GBBBD; gb->memory.mbcRead = _GBBBDRead; + gb->memory.mbcReadBank1 = true; break; case GB_UNL_HITEK: gb->memory.mbcWrite = _GBHitek; gb->memory.mbcRead = _GBHitekRead; gb->memory.mbcState.bbd.dataSwapMode = 7; gb->memory.mbcState.bbd.bankSwapMode = 7; + gb->memory.mbcReadBank1 = true; break; case GB_UNL_SACHEN_MMC1: gb->memory.mbcWrite = _GBSachen; gb->memory.mbcRead = _GBSachenMMC1Read; + gb->memory.mbcReadBank0 = true; + gb->memory.mbcReadBank1 = true; + break; + case GB_UNL_SACHEN_MMC2: + gb->memory.mbcWrite = _GBSachen; + gb->memory.mbcRead = _GBSachenMMC2Read; + gb->memory.mbcReadBank0 = true; + gb->memory.mbcReadBank1 = true; + gb->memory.mbcReadHigh = true; + gb->memory.mbcWriteHigh = true; + if (gb->sramSize) { + gb->memory.sramAccess = true; + } break; } @@ -1760,6 +1780,12 @@ void _GBSachen(struct GB* gb, uint16_t address, uint8_t value) { GBMBCSwitchBank0(gb, state->baseBank & state->mask); } break; + case 6: + if (gb->memory.mbcType == GB_UNL_SACHEN_MMC2 && state->locked == GB_SACHEN_LOCKED_DMG) { + state->locked = GB_SACHEN_LOCKED_CGB; + state->transition = 0; + } + break; } } @@ -1774,12 +1800,13 @@ static uint16_t _unscrambleSachen(uint16_t address) { uint8_t _GBSachenMMC1Read(struct GBMemory* memory, uint16_t address) { struct GBSachenState* state = &memory->mbcState.sachen; - if (state->locked != GB_SACHEN_UNLOCKED) { + if (state->locked != GB_SACHEN_UNLOCKED && (address & 0xFF00) == 0x100) { ++state->transition; if (state->transition == 0x31) { state->locked = GB_SACHEN_UNLOCKED; + } else { + address |= 0x80; } - address |= 0x80; } if ((address & 0xFF00) == 0x0100) { @@ -1795,6 +1822,37 @@ uint8_t _GBSachenMMC1Read(struct GBMemory* memory, uint16_t address) { } } +uint8_t _GBSachenMMC2Read(struct GBMemory* memory, uint16_t address) { + struct GBSachenState* state = &memory->mbcState.sachen; + if (address >= 0xC000 && state->locked == GB_SACHEN_LOCKED_DMG) { + state->transition = 0; + state->locked = GB_SACHEN_LOCKED_CGB; + } + + if (state->locked != GB_SACHEN_UNLOCKED && (address & 0x8700) == 0x0100) { + ++state->transition; + if (state->transition == 0x31) { + ++state->locked; + state->transition = 0; + } + } + + if ((address & 0xFF00) == 0x0100) { + if (state->locked == GB_SACHEN_LOCKED_CGB) { + address |= 0x80; + } + address = _unscrambleSachen(address); + } + + if (address < GB_BASE_CART_BANK1) { + return memory->romBase[address]; + } else if (address < GB_BASE_VRAM) { + return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)]; + } else { + return 0xFF; + } +} + static void _appendSaveSuffix(struct GB* gb, const void* buffer, size_t size) { struct VFile* vf = gb->sramVf; if ((size_t) vf->size(vf) < gb->sramSize + size) { diff --git a/src/gb/memory.c b/src/gb/memory.c index 10b09eed1..ec9a81ac8 100644 --- a/src/gb/memory.c +++ b/src/gb/memory.c @@ -73,7 +73,7 @@ static void GBSetActiveRegion(struct SM83Core* cpu, uint16_t address) { case GB_REGION_CART_BANK0 + 1: case GB_REGION_CART_BANK0 + 2: case GB_REGION_CART_BANK0 + 3: - if ((gb->memory.mbcType & GB_UNL_SACHEN_MMC1) == GB_UNL_SACHEN_MMC1) { + if (gb->memory.mbcReadBank0) { cpu->memory.cpuLoad8 = GBLoad8; break; } @@ -94,7 +94,7 @@ static void GBSetActiveRegion(struct SM83Core* cpu, uint16_t address) { case GB_REGION_CART_BANK1 + 1: case GB_REGION_CART_BANK1 + 2: case GB_REGION_CART_BANK1 + 3: - if ((gb->memory.mbcType & GB_UNL_BBD) == GB_UNL_BBD) { + if (gb->memory.mbcReadBank1) { cpu->memory.cpuLoad8 = GBLoad8; break; } @@ -249,7 +249,7 @@ uint8_t GBLoad8(struct SM83Core* cpu, uint16_t address) { case GB_REGION_CART_BANK0 + 3: if (address >= memory->romSize) { memory->cartBus = 0xFF; - } else if ((memory->mbcType & GB_UNL_SACHEN_MMC1) == GB_UNL_SACHEN_MMC1) { + } else if (gb->memory.mbcReadBank0) { memory->cartBus = memory->mbcRead(memory, address); } else { memory->cartBus = memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)]; @@ -268,7 +268,7 @@ uint8_t GBLoad8(struct SM83Core* cpu, uint16_t address) { case GB_REGION_CART_BANK1 + 1: if (address >= memory->romSize) { memory->cartBus = 0xFF; - } else if ((memory->mbcType & GB_UNL_BBD) == GB_UNL_BBD) { + } else if (gb->memory.mbcReadBank1) { memory->cartBus = memory->mbcRead(memory, address); } else { memory->cartBus = memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)]; @@ -298,8 +298,14 @@ uint8_t GBLoad8(struct SM83Core* cpu, uint16_t address) { return memory->cartBus; case GB_REGION_WORKING_RAM_BANK0: case GB_REGION_WORKING_RAM_BANK0 + 2: + if (gb->memory.mbcReadHigh) { + memory->mbcRead(memory, address); + } return memory->wram[address & (GB_SIZE_WORKING_RAM_BANK0 - 1)]; case GB_REGION_WORKING_RAM_BANK1: + if (gb->memory.mbcReadHigh) { + memory->mbcRead(memory, address); + } return memory->wramBank[address & (GB_SIZE_WORKING_RAM_BANK0 - 1)]; default: if (address < GB_BASE_OAM) { @@ -373,9 +379,15 @@ void GBStore8(struct SM83Core* cpu, uint16_t address, int8_t value) { return; case GB_REGION_WORKING_RAM_BANK0: case GB_REGION_WORKING_RAM_BANK0 + 2: + if (memory->mbcWriteHigh) { + memory->mbcWrite(gb, address, value); + } memory->wram[address & (GB_SIZE_WORKING_RAM_BANK0 - 1)] = value; return; case GB_REGION_WORKING_RAM_BANK1: + if (memory->mbcWriteHigh) { + memory->mbcWrite(gb, address, value); + } memory->wramBank[address & (GB_SIZE_WORKING_RAM_BANK0 - 1)] = value; return; default: From 4f844bcdc3af8e1236dccf2f1bec03b5473ca480 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 8 Feb 2022 23:41:58 -0800 Subject: [PATCH 10/60] GB: Fix BIOS skipping VRAM and palette for GBC --- src/gb/gb.c | 26 +++++++------------------- src/gb/video.c | 5 +++++ 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/gb/gb.c b/src/gb/gb.c index 6130964b8..a49b641af 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -608,15 +608,13 @@ void GBSkipBIOS(struct GB* gb) { output1 |= (byte & 0x01) << 0; output1 |= output1 << 1; - if (gb->model < GB_MODEL_CGB) { - GBPatch8(cpu, 0x8010 + i * 8, output0, NULL, 0); - GBPatch8(cpu, 0x8012 + i * 8, output0, NULL, 0); - GBPatch8(cpu, 0x8014 + i * 8, output1, NULL, 0); - GBPatch8(cpu, 0x8016 + i * 8, output1, NULL, 0); - } else { - GBPatch8(cpu, 0x8380 + i * 2, output0, NULL, 0); - GBPatch8(cpu, 0x8381 + i * 2, output1, NULL, 0); - } + GBPatch8(cpu, 0x8010 + i * 8, output0, NULL, 0); + GBPatch8(cpu, 0x8012 + i * 8, output0, NULL, 0); + GBPatch8(cpu, 0x8014 + i * 8, output1, NULL, 0); + GBPatch8(cpu, 0x8016 + i * 8, output1, NULL, 0); + } + for (i = 0; i < sizeof(_registeredTrademark); ++i) { + GBPatch8(cpu, 0x8190 + i * 2, _registeredTrademark[i], NULL, 0); } if (gb->model < GB_MODEL_CGB) { for (i = 0; i < 12; ++i) { @@ -624,16 +622,6 @@ void GBSkipBIOS(struct GB* gb) { GBPatch8(cpu, 0x9924 + i, i + 13, NULL, 0); } GBPatch8(cpu, 0x9910, 0x19, NULL, 0); - for (i = 0; i < sizeof(_registeredTrademark); ++i) { - GBPatch8(cpu, 0x8191 + i * 2, _registeredTrademark[i], NULL, 0); - } - } else { - for (i = 0; i < 7; ++i) { - GBPatch8(cpu, 0x99A7 + i, i + 0x38, NULL, 0); - } - for (i = 0; i < sizeof(_registeredTrademark); ++i) { - GBPatch8(cpu, 0x83E1 + i * 2, _registeredTrademark[i], NULL, 0); - } } if (gb->memory.mbcType == GB_UNL_SACHEN_MMC2) { diff --git a/src/gb/video.c b/src/gb/video.c index e4059a3e1..3991b0d7e 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -521,6 +521,11 @@ void GBVideoSkipBIOS(struct GBVideo* video) { int32_t next; if (video->p->model & GB_MODEL_CGB) { + int i; + for (i = 0; i < 0x40; ++i) { + video->palette[i] = 0x7FFF; + video->renderer->writePalette(video->renderer, i, video->palette[i]); + } video->ly = GB_VIDEO_VERTICAL_PIXELS; video->p->memory.io[GB_REG_LY] = video->ly; video->stat = GBRegisterSTATClearLYC(video->stat); From 5159d389a38f805c3a4332f53c973cd0cddcacb3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 9 Feb 2022 03:06:57 -0800 Subject: [PATCH 11/60] CInema: Fix writing 4-up where result and expected strides differ --- src/platform/test/cinema-main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/test/cinema-main.c b/src/platform/test/cinema-main.c index 88fcf2a66..28bb07693 100644 --- a/src/platform/test/cinema-main.c +++ b/src/platform/test/cinema-main.c @@ -883,7 +883,7 @@ static void _write4UpDiff(const struct CInemaImage* expected, const struct CInem size_t base = y * out.stride; size_t inbase = y * expected->stride; memcpy(&outdata[base], &((uint32_t*) expected->data)[inbase], expected->width * 4); - memcpy(&outdata[base + expected->width], &((uint32_t*) result->data)[inbase], expected->width * 4); + memcpy(&outdata[base + expected->width], &((uint32_t*) result->data)[y * result->stride], expected->width * 4); memcpy(&outdata[base + expected->height * out.stride], &diff[inbase * 4], expected->width * 4); for (x = 0; x < expected->width; ++x) { size_t pix = (expected->stride * y + x) * 4; From 6f697744d14d3b950b537fe4591db76a08ef50cb Mon Sep 17 00:00:00 2001 From: aldelaro5 Date: Thu, 30 Dec 2021 16:54:24 -0500 Subject: [PATCH 12/60] GDB Stub: allow to override GDB's handling logic of write watchpoint Also allow to break on nonmodifying writes. --- include/mgba/internal/debugger/gdb-stub.h | 10 +++++++- src/debugger/debugger.c | 2 +- src/debugger/gdb-stub.c | 22 ++++++++++------- src/platform/qt/GDBController.cpp | 6 ++++- src/platform/qt/GDBController.h | 2 ++ src/platform/qt/GDBWindow.cpp | 30 +++++++++++++++++++++++ src/platform/qt/GDBWindow.h | 4 +++ 7 files changed, 64 insertions(+), 12 deletions(-) diff --git a/include/mgba/internal/debugger/gdb-stub.h b/include/mgba/internal/debugger/gdb-stub.h index a617bc558..b76b52452 100644 --- a/include/mgba/internal/debugger/gdb-stub.h +++ b/include/mgba/internal/debugger/gdb-stub.h @@ -24,6 +24,12 @@ enum GDBStubAckState { GDB_ACK_OFF }; +enum GDBWatchpointsBehvaior { + GDB_WATCHPOINT_STANDARD_LOGIC = 0, + GDB_WATCHPOINT_OVERRIDE_LOGIC, + GDB_WATCHPOINT_OVERRIDE_LOGIC_ANY_WRITE, +}; + struct GDBStub { struct mDebugger d; @@ -40,10 +46,12 @@ struct GDBStub { bool supportsSwbreak; bool supportsHwbreak; + + enum GDBWatchpointsBehvaior watchpointsBehavior; }; void GDBStubCreate(struct GDBStub*); -bool GDBStubListen(struct GDBStub*, int port, const struct Address* bindAddress); +bool GDBStubListen(struct GDBStub*, int port, const struct Address* bindAddress, enum GDBWatchpointsBehvaior watchpointsBehavior); void GDBStubHangup(struct GDBStub*); void GDBStubShutdown(struct GDBStub*); diff --git a/src/debugger/debugger.c b/src/debugger/debugger.c index bdf7b1cab..1c6ecd7ef 100644 --- a/src/debugger/debugger.c +++ b/src/debugger/debugger.c @@ -53,7 +53,7 @@ struct mDebugger* mDebuggerCreate(enum mDebuggerType type, struct mCore* core) { case DEBUGGER_GDB: #ifdef USE_GDB_STUB GDBStubCreate(&debugger->gdb); - GDBStubListen(&debugger->gdb, 2345, 0); + GDBStubListen(&debugger->gdb, 2345, 0, GDB_WATCHPOINT_STANDARD_LOGIC); break; #endif case DEBUGGER_NONE: diff --git a/src/debugger/gdb-stub.c b/src/debugger/gdb-stub.c index 7069c7f75..5526aa0b2 100644 --- a/src/debugger/gdb-stub.c +++ b/src/debugger/gdb-stub.c @@ -79,15 +79,18 @@ static void _gdbStubEntered(struct mDebugger* debugger, enum mDebuggerEntryReaso case DEBUGGER_ENTER_WATCHPOINT: if (info) { const char* type = 0; + + if (stub->watchpointsBehavior != GDB_WATCHPOINT_STANDARD_LOGIC && info->type.wp.watchType & WATCHPOINT_WRITE) { + // We send S05 instead of T05watch because it bypasses GDB's internal logic to check if + // the value changed and to bypass a step into by GDB. This allows to control the change + // logic even when using savestates which we already handle in the core debugger logic + snprintf(stub->outgoing, GDB_STUB_MAX_LINE - 4, "S%02x", SIGTRAP); + _sendMessage(stub); + return; + } + switch (info->type.wp.watchType) { case WATCHPOINT_WRITE: - if (info->type.wp.newValue == info->type.wp.oldValue) { - if (stub->d.state == DEBUGGER_PAUSED) { - stub->d.state = DEBUGGER_RUNNING; - } - return; - } - // Fall through case WATCHPOINT_WRITE_CHANGE: type = "watch"; break; @@ -575,7 +578,7 @@ static void _setBreakpoint(struct GDBStub* stub, const char* message) { stub->d.platform->setBreakpoint(stub->d.platform, &breakpoint); break; case '2': - watchpoint.type = WATCHPOINT_WRITE_CHANGE; + watchpoint.type = stub->watchpointsBehavior == GDB_WATCHPOINT_OVERRIDE_LOGIC_ANY_WRITE ? WATCHPOINT_WRITE : WATCHPOINT_WRITE_CHANGE; stub->d.platform->setWatchpoint(stub->d.platform, &watchpoint); break; case '3': @@ -763,7 +766,7 @@ void GDBStubCreate(struct GDBStub* stub) { stub->shouldBlock = false; } -bool GDBStubListen(struct GDBStub* stub, int port, const struct Address* bindAddress) { +bool GDBStubListen(struct GDBStub* stub, int port, const struct Address* bindAddress, enum GDBWatchpointsBehvaior watchpointsBehavior) { if (!SOCKET_FAILED(stub->socket)) { GDBStubShutdown(stub); } @@ -780,6 +783,7 @@ bool GDBStubListen(struct GDBStub* stub, int port, const struct Address* bindAdd goto cleanup; } + stub->watchpointsBehavior = watchpointsBehavior; memset(stub->memoryMapXml, 0, GDB_STUB_MAX_LINE); return true; diff --git a/src/platform/qt/GDBController.cpp b/src/platform/qt/GDBController.cpp index 86ae0dc45..5fd2a1768 100644 --- a/src/platform/qt/GDBController.cpp +++ b/src/platform/qt/GDBController.cpp @@ -32,8 +32,12 @@ void GDBController::setBindAddress(const Address& address) { m_bindAddress = address; } +void GDBController::setWatchpointsBehavior(int watchpointsBehaviorId) { + m_watchpointsBehavior = static_cast(watchpointsBehaviorId); +} + void GDBController::listen() { - if (GDBStubListen(&m_gdbStub, m_port, &m_bindAddress)) { + if (GDBStubListen(&m_gdbStub, m_port, &m_bindAddress, m_watchpointsBehavior)) { if (!isAttached()) { attach(); } diff --git a/src/platform/qt/GDBController.h b/src/platform/qt/GDBController.h index 03619fe87..d83f00028 100644 --- a/src/platform/qt/GDBController.h +++ b/src/platform/qt/GDBController.h @@ -28,6 +28,7 @@ public: public slots: void setPort(ushort port); void setBindAddress(const Address&); + void setWatchpointsBehavior(int watchpointsBehaviorId); void listen(); signals: @@ -41,6 +42,7 @@ private: ushort m_port = 2345; Address m_bindAddress; + enum GDBWatchpointsBehvaior m_watchpointsBehavior = GDB_WATCHPOINT_STANDARD_LOGIC; }; } diff --git a/src/platform/qt/GDBWindow.cpp b/src/platform/qt/GDBWindow.cpp index b719c324d..8f1c44fe8 100644 --- a/src/platform/qt/GDBWindow.cpp +++ b/src/platform/qt/GDBWindow.cpp @@ -5,6 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "GDBWindow.h" +#include #include #include #include @@ -12,6 +13,7 @@ #include #include #include +#include #include #include "GDBController.h" @@ -47,6 +49,28 @@ GDBWindow::GDBWindow(GDBController* controller, QWidget* parent) connect(m_bindAddressEdit, &QLineEdit::textChanged, this, &GDBWindow::bindAddressChanged); settingsGrid->addWidget(m_bindAddressEdit, 1, 1, Qt::AlignLeft); + QGroupBox* watchpointsSettings = new QGroupBox(tr("Write watchpoints behavior")); + mainSegment->addWidget(watchpointsSettings); + + QVBoxLayout* watchpointsSettingsLayout = new QVBoxLayout; + watchpointsSettings->setLayout(watchpointsSettingsLayout); + + QButtonGroup* watchpointsButtonGroup = new QButtonGroup(watchpointsSettings); + connect(watchpointsButtonGroup, &QButtonGroup::idClicked, controller, &GDBController::setWatchpointsBehavior); + + m_watchpointsStandardRadio = new QRadioButton(tr("Standard GDB"), watchpointsSettings); + m_watchpointsStandardRadio->setChecked(true); + watchpointsButtonGroup->addButton(m_watchpointsStandardRadio, GDB_WATCHPOINT_STANDARD_LOGIC); + watchpointsSettingsLayout->addWidget(m_watchpointsStandardRadio); + + m_watchpointsOverrideLogicRadio = new QRadioButton(tr("Internal change detection"), watchpointsSettings); + watchpointsButtonGroup->addButton(m_watchpointsOverrideLogicRadio, GDB_WATCHPOINT_OVERRIDE_LOGIC); + watchpointsSettingsLayout->addWidget(m_watchpointsOverrideLogicRadio); + + m_watchpointsOverrideLogicAnyWriteRadio = new QRadioButton(tr("Break on all writes"), watchpointsSettings); + watchpointsButtonGroup->addButton(m_watchpointsOverrideLogicAnyWriteRadio, GDB_WATCHPOINT_OVERRIDE_LOGIC_ANY_WRITE); + watchpointsSettingsLayout->addWidget(m_watchpointsOverrideLogicAnyWriteRadio); + QHBoxLayout* buttons = new QHBoxLayout; m_startStopButton = new QPushButton; @@ -92,6 +116,9 @@ void GDBWindow::bindAddressChanged(const QString& bindAddressString) { void GDBWindow::started() { m_portEdit->setEnabled(false); m_bindAddressEdit->setEnabled(false); + m_watchpointsStandardRadio->setEnabled(false); + m_watchpointsOverrideLogicRadio->setEnabled(false); + m_watchpointsOverrideLogicAnyWriteRadio->setEnabled(false); m_startStopButton->setText(tr("Stop")); m_breakButton->setEnabled(true); disconnect(m_startStopButton, &QAbstractButton::clicked, m_gdbController, &GDBController::listen); @@ -102,6 +129,9 @@ void GDBWindow::started() { void GDBWindow::stopped() { m_portEdit->setEnabled(true); m_bindAddressEdit->setEnabled(true); + m_watchpointsStandardRadio->setEnabled(true); + m_watchpointsOverrideLogicRadio->setEnabled(true); + m_watchpointsOverrideLogicAnyWriteRadio->setEnabled(true); m_startStopButton->setText(tr("Start")); m_breakButton->setEnabled(false); disconnect(m_startStopButton, &QAbstractButton::clicked, m_gdbController, &DebuggerController::detach); diff --git a/src/platform/qt/GDBWindow.h b/src/platform/qt/GDBWindow.h index f185a7df7..929520d96 100644 --- a/src/platform/qt/GDBWindow.h +++ b/src/platform/qt/GDBWindow.h @@ -9,6 +9,7 @@ class QLineEdit; class QPushButton; +class QRadioButton; namespace QGBA { @@ -34,6 +35,9 @@ private: QLineEdit* m_portEdit; QLineEdit* m_bindAddressEdit; + QRadioButton* m_watchpointsStandardRadio; + QRadioButton* m_watchpointsOverrideLogicRadio; + QRadioButton* m_watchpointsOverrideLogicAnyWriteRadio; QPushButton* m_startStopButton; QPushButton* m_breakButton; }; From fcd26647617d786dd18933a1f0530cbe99b35495 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 14:23:56 -0800 Subject: [PATCH 13/60] GB: MBC cleanup --- src/gb/gb.c | 1 - src/gb/mbc.c | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gb/gb.c b/src/gb/gb.c index a49b641af..0da504c61 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -117,7 +117,6 @@ bool GBLoadROM(struct GB* gb, struct VFile* vf) { gb->yankedRomSize = 0; gb->memory.romSize = gb->pristineRomSize; gb->romCrc32 = doCrc32(gb->memory.rom, gb->memory.romSize); - memset(&gb->memory.mbcState, 0, sizeof(gb->memory.mbcState)); GBMBCReset(gb); if (gb->cpu) { diff --git a/src/gb/mbc.c b/src/gb/mbc.c index ffc4054e6..20ab20322 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -339,6 +339,10 @@ void GBMBCInit(struct GB* gb) { } gb->memory.mbcRead = NULL; gb->memory.directSramAccess = true; + gb->memory.mbcReadBank0 = false; + gb->memory.mbcReadBank1 = false; + gb->memory.mbcReadHigh = false; + gb->memory.mbcWriteHigh = false; gb->memory.cartBusDecay = 4; switch (gb->memory.mbcType) { case GB_MBC_NONE: From 8ac1ece17a3e1f6cc914642b98a102a7fffd71f3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 14:25:21 -0800 Subject: [PATCH 14/60] GB: Support for GBX ROMs --- CHANGES | 1 + include/mgba/internal/gb/gb.h | 15 + include/mgba/internal/gb/mbc.h | 2 + src/gb/CMakeLists.txt | 1 + src/gb/gb.c | 85 ++++- src/gb/mbc.c | 92 ++++-- src/gb/test/gbx.c | 557 +++++++++++++++++++++++++++++++++ 7 files changed, 734 insertions(+), 19 deletions(-) create mode 100644 src/gb/test/gbx.c diff --git a/CHANGES b/CHANGES index 3806127ed..dc8ad9aa0 100644 --- a/CHANGES +++ b/CHANGES @@ -13,6 +13,7 @@ Features: - Additional scaling shaders - Support for GameShark Advance SP (.gsv) save file importing - Support for multiple saves per game using .sa2, .sa3, etc. + - Support for GBX format Game Boy ROMs - New unlicensed GB mappers: NT (newer type), Sachen (MMC1, MMC2) Emulation fixes: - ARM7: Fix unsigned multiply timing diff --git a/include/mgba/internal/gb/gb.h b/include/mgba/internal/gb/gb.h index a0196c162..5359176ac 100644 --- a/include/mgba/internal/gb/gb.h +++ b/include/mgba/internal/gb/gb.h @@ -72,6 +72,19 @@ enum GBSGBCommand { SGB_OBJ_TRN }; +struct GBXMetadata { + enum GBMemoryBankControllerType mbc; + bool battery; + bool rumble; + bool timer; + uint32_t romSize; + uint32_t ramSize; + union { + uint8_t u8[32]; + uint32_t u32[8]; + } mapperVars; +}; + struct SM83Core; struct mCoreSync; struct mAVStream; @@ -85,6 +98,7 @@ struct GB { struct GBAudio audio; struct GBSIO sio; enum GBModel model; + struct GBXMetadata gbx; struct mCoreSync* sync; struct mTiming timing; @@ -165,6 +179,7 @@ bool GBLoadSave(struct GB* gb, struct VFile* vf); void GBUnloadROM(struct GB* gb); void GBSynthesizeROM(struct VFile* vf); void GBYankROM(struct GB* gb); +bool GBLoadGBX(struct GBXMetadata* metadata, struct VFile* vf); void GBLoadBIOS(struct GB* gb, struct VFile* vf); diff --git a/include/mgba/internal/gb/mbc.h b/include/mgba/internal/gb/mbc.h index a63de3b84..a59132ba4 100644 --- a/include/mgba/internal/gb/mbc.h +++ b/include/mgba/internal/gb/mbc.h @@ -24,6 +24,8 @@ void GBMBCSwitchHalfBank(struct GB* gb, int half, int bank); void GBMBCSwitchSramBank(struct GB* gb, int bank); void GBMBCSwitchSramHalfBank(struct GB* gb, int half, int bank); +enum GBMemoryBankControllerType GBMBCFromGBX(const void* fourcc); + enum GBCam { GBCAM_WIDTH = 128, GBCAM_HEIGHT = 112 diff --git a/src/gb/CMakeLists.txt b/src/gb/CMakeLists.txt index 0dc642803..74e7800de 100644 --- a/src/gb/CMakeLists.txt +++ b/src/gb/CMakeLists.txt @@ -30,6 +30,7 @@ set(DEBUGGER_FILES set(TEST_FILES test/core.c + test/gbx.c test/mbc.c test/memory.c test/rtc.c) diff --git a/src/gb/gb.c b/src/gb/gb.c index 0da504c61..ee6699839 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -84,6 +84,8 @@ static void GBInit(void* cpu, struct mCPUComponent* component) { gb->pristineRomSize = 0; gb->yankedRomSize = 0; + memset(&gb->gbx, 0, sizeof(gb->gbx)); + mCoreCallbacksListInit(&gb->coreCallbacks, 0); gb->stream = NULL; @@ -101,13 +103,79 @@ static void GBDeinit(struct mCPUComponent* component) { mTimingDeinit(&gb->timing); } +bool GBLoadGBX(struct GBXMetadata* metadata, struct VFile* vf) { + uint8_t footer[16]; + if (vf->seek(vf, -sizeof(footer), SEEK_END) < 0) { + return false; + } + if (vf->read(vf, footer, sizeof(footer)) < (ssize_t) sizeof(footer)) { + return false; + } + int32_t gbxSize = 0; + uint32_t vers; + LOAD_32BE(gbxSize, 0, footer); + LOAD_32BE(vers, 4, footer); + if (memcmp(&footer[12], "GBX!", 4) != 0 || gbxSize != 0x40 || vers != 1) { + return false; + } + if (vf->seek(vf, -gbxSize, SEEK_END) < 0) { + return false; + } + if (vf->read(vf, footer, sizeof(footer)) != (ssize_t) sizeof(footer)) { + return false; + } + memset(metadata, 0, sizeof(*metadata)); + metadata->mbc = GBMBCFromGBX(footer); + + if (footer[4] == 1) { + metadata->battery = true; + } + if (footer[5] == 1) { + metadata->rumble = true; + if (metadata->mbc == GB_MBC5) { + metadata->mbc = GB_MBC5_RUMBLE; + } + } + if (footer[6] == 1) { + metadata->timer = true; + if (metadata->mbc == GB_MBC3) { + metadata->mbc = GB_MBC3_RTC; + } + } + LOAD_32BE(metadata->romSize, 8, footer); + LOAD_32BE(metadata->ramSize, 12, footer); + vf->read(vf, &metadata->mapperVars, 0x20); + + // There's no dedicated mapper type for MBC1M so let's stash some data here + if (memcmp(footer, "MBC1", 4) == 0) { + metadata->mapperVars.u8[0] = 5; + } else if (memcmp(footer, "MB1M", 4) == 0) { + metadata->mapperVars.u8[0] = 4; + } + return true; +} + bool GBLoadROM(struct GB* gb, struct VFile* vf) { if (!vf) { return false; } GBUnloadROM(gb); + + if (!GBLoadGBX(&gb->gbx, vf)) { + // GBX handles the pristine size itself, but other formats don't + gb->pristineRomSize = vf->size(vf); + } else { + uint32_t fileSize = vf->size(vf); + if (gb->gbx.romSize <= fileSize - 0x40) { + gb->pristineRomSize = gb->gbx.romSize; + } else { + // TODO: Should we make a temporary buffer? + mLOG(GB, WARN, "GBX file size %d is larger than real file size %d", gb->gbx.romSize, fileSize - 0x40); + gb->pristineRomSize = fileSize - 0x40; + } + } + gb->romVf = vf; - gb->pristineRomSize = vf->size(vf); vf->seek(vf, 0, SEEK_SET); gb->isPristine = true; gb->memory.rom = vf->map(vf, gb->pristineRomSize, MAP_READ); @@ -921,6 +989,21 @@ bool GBIsROM(struct VFile* vf) { // Sachen MMC2 scrambled header return true; } + + uint8_t footer[16]; + vf->seek(vf, -sizeof(footer), SEEK_END); + if (vf->read(vf, footer, sizeof(footer)) < (ssize_t) sizeof(footer)) { + return false; + } + uint32_t size; + uint32_t vers; + LOAD_32BE(size, 0, footer); + LOAD_32BE(vers, 4, footer); + if (memcmp(&footer[12], "GBX!", 4) == 0 && size == 0x40 && vers == 1) { + // GBX file + return true; + } + return false; } diff --git a/src/gb/mbc.c b/src/gb/mbc.c index 20ab20322..43f6c7a90 100644 --- a/src/gb/mbc.c +++ b/src/gb/mbc.c @@ -131,6 +131,55 @@ void GBMBCSwitchHalfBank(struct GB* gb, int half, int bank) { } } +static struct { + const char* fourcc; + enum GBMemoryBankControllerType mbc; +} _gbxToMbc[] = { + {"ROM", GB_MBC_NONE}, + {"MBC1", GB_MBC1}, + {"MBC2", GB_MBC2}, + {"MBC3", GB_MBC3}, + {"MBC5", GB_MBC5}, + {"MBC6", GB_MBC6}, + {"MBC7", GB_MBC7}, + {"MB1M", GB_MBC1}, + {"MMM1", GB_MMM01}, + {"CAMR", GB_POCKETCAM}, + {"HUC1", GB_HuC1}, + {"HUC3", GB_HuC3}, + {"TAM5", GB_TAMA5}, + {"M161", GB_MBC_AUTODETECT}, // TODO + {"BBD", GB_UNL_BBD}, + {"HITK", GB_UNL_HITEK}, + {"SNTX", GB_MBC_AUTODETECT}, // TODO + {"NTO1", GB_MBC_AUTODETECT}, // TODO + {"NTO2", GB_MBC_AUTODETECT}, // TODO + {"NTN", GB_UNL_NT_NEW}, + {"LICH", GB_MBC_AUTODETECT}, // TODO + {"LBMC", GB_MBC_AUTODETECT}, // TODO + {"LIBA", GB_MBC_AUTODETECT}, // TODO + {"PKJD", GB_UNL_PKJD}, + {"WISD", GB_UNL_WISDOM_TREE}, + {"SAM1", GB_UNL_SACHEN_MMC1}, + {"SAM2", GB_UNL_SACHEN_MMC2}, + {"ROCK", GB_MBC_AUTODETECT}, // TODO + {"NGHK", GB_MBC_AUTODETECT}, // TODO + {"GB81", GB_MBC_AUTODETECT}, // TODO + {"TPP1", GB_MBC_AUTODETECT}, // TODO + + {NULL, GB_MBC_AUTODETECT}, +}; + +enum GBMemoryBankControllerType GBMBCFromGBX(const void* fourcc) { + size_t i; + for (i = 0; _gbxToMbc[i].fourcc; ++i) { + if (memcmp(fourcc, _gbxToMbc[i].fourcc, 4) == 0) { + break; + } + } + return _gbxToMbc[i].mbc; +} + static bool _isMulticart(const uint8_t* mem) { bool success; struct VFile* vf; @@ -249,23 +298,28 @@ void GBMBCInit(struct GB* gb) { cart = cartFooter; } } - switch (cart->ramSize) { - case 0: - gb->sramSize = 0; - break; - default: - case 2: - gb->sramSize = 0x2000; - break; - case 3: - gb->sramSize = 0x8000; - break; - case 4: - gb->sramSize = 0x20000; - break; - case 5: - gb->sramSize = 0x10000; - break; + if (gb->gbx.romSize) { + gb->sramSize = gb->gbx.ramSize; + gb->memory.mbcType = gb->gbx.mbc; + } else { + switch (cart->ramSize) { + case 0: + gb->sramSize = 0; + break; + default: + case 2: + gb->sramSize = 0x2000; + break; + case 3: + gb->sramSize = 0x8000; + break; + case 4: + gb->sramSize = 0x20000; + break; + case 5: + gb->sramSize = 0x10000; + break; + } } if (gb->memory.mbcType == GB_MBC_AUTODETECT) { gb->memory.mbcType = _detectUnlMBC(gb->memory.rom, gb->memory.romSize); @@ -350,7 +404,9 @@ void GBMBCInit(struct GB* gb) { break; case GB_MBC1: gb->memory.mbcWrite = _GBMBC1; - if (gb->memory.romSize >= GB_SIZE_CART_BANK0 * 0x31 && _isMulticart(gb->memory.rom)) { + if (gb->gbx.mapperVars.u8[0]) { + gb->memory.mbcState.mbc1.multicartStride = gb->gbx.mapperVars.u8[0]; + } else if (gb->memory.romSize >= GB_SIZE_CART_BANK0 * 0x31 && _isMulticart(gb->memory.rom)) { gb->memory.mbcState.mbc1.multicartStride = 4; } else { gb->memory.mbcState.mbc1.multicartStride = 5; diff --git a/src/gb/test/gbx.c b/src/gb/test/gbx.c new file mode 100644 index 000000000..b15502e37 --- /dev/null +++ b/src/gb/test/gbx.c @@ -0,0 +1,557 @@ +/* Copyright (c) 2013-2021 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 "util/test/suite.h" + +#include +#include +#include +#include +#include + +#define GBX_FOOTER_SIZE 0x40 + +struct GBXParams { + uint32_t major; + uint32_t minor; + char fourcc[4]; + bool battery; + bool rumble; + bool timer; + uint32_t romSize; + uint32_t ramSize; + union { + uint8_t u8[32]; + uint32_t u32[8]; + } mapperVars; +}; + +static struct VFile* makeGBX(const struct GBXParams* params, unsigned padding) { + struct VFile* vf = VFileMemChunk(NULL, padding + GBX_FOOTER_SIZE); + uint8_t bool2flag[2] = {0, 1}; + vf->seek(vf, -GBX_FOOTER_SIZE, SEEK_END); + vf->write(vf, params->fourcc, 4); + vf->write(vf, &bool2flag[(int) params->battery], 1); + vf->write(vf, &bool2flag[(int) params->rumble], 1); + vf->write(vf, &bool2flag[(int) params->timer], 1); + vf->write(vf, &bool2flag[0], 1); // Reserved + + uint32_t beint; + STORE_32BE(params->romSize, 0, &beint); + vf->write(vf, &beint, 4); + STORE_32BE(params->ramSize, 0, &beint); + vf->write(vf, &beint, 4); + vf->write(vf, ¶ms->mapperVars, 0x20); + + STORE_32BE(0x40, 0, &beint); // Footer size + vf->write(vf, &beint, 4); + + STORE_32BE(params->major, 0, &beint); + vf->write(vf, &beint, 4); + + STORE_32BE(params->minor, 0, &beint); + vf->write(vf, &beint, 4); + + vf->write(vf, "GBX!", 4); // Magic + return vf; +} + +M_TEST_SUITE_SETUP(GBGBX) { + struct mCore* core = GBCoreCreate(); + core->init(core); + mCoreInitConfig(core, NULL); + *state = core; + return 0; +} + +M_TEST_SUITE_TEARDOWN(GBGBX) { + if (!*state) { + return 0; + } + struct mCore* core = *state; + mCoreConfigDeinit(&core->config); + core->deinit(core); + return 0; +} + +M_TEST_DEFINE(failTooSmall) { + struct mCore* core = *state; + struct GB* gb = core->board; + char truncGbx[0x3F] = { + [0x32] = 0x40, + [0x36] = 0x1, + [0x3B] = 'G', + [0x3C] = 'B', + [0x3D] = 'X', + [0x3E] = '!', + }; + struct VFile* vf = VFileFromConstMemory(truncGbx, sizeof(truncGbx)); + bool loaded = core->loadROM(core, vf); + assert_false(loaded && gb->pristineRomSize == 0); +} + +M_TEST_DEFINE(failNoMagic) { + struct mCore* core = *state; + struct GB* gb = core->board; + char gbx[0x40] = { + [0x0] = 'R', + [0x1] = 'O', + [0x2] = 'M', + [0x33] = 0x40, + [0x37] = 0x1, + [0x3C] = 'G', + [0x3D] = 'B', + [0x3E] = 'X', + }; + struct VFile* vf = VFileFromConstMemory(gbx, sizeof(gbx)); + bool loaded = core->loadROM(core, vf); + assert_false(loaded && gb->pristineRomSize == 0); +} + +M_TEST_DEFINE(invalidVersionLow) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 0, + .fourcc = "ROM", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_false(loaded && gb->pristineRomSize == 0x8000); +} + +M_TEST_DEFINE(invalidVersionHigh) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 2, + .fourcc = "ROM", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_false(loaded && gb->pristineRomSize == 0x8000); +} + +M_TEST_DEFINE(mbcInvalidNone) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "INVL", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC_NONE); +} + +M_TEST_DEFINE(mbcInvalidFallback) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "INVL", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + vf->seek(vf, 0x147, SEEK_SET); + char one = 1; + vf->write(vf, &one, 1); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC1); +} + +M_TEST_DEFINE(mbcRom) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "ROM", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC_NONE); +} + +M_TEST_DEFINE(mbc1) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC1", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC1); + assert_int_equal(gb->memory.mbcState.mbc1.multicartStride, 5); +} + +M_TEST_DEFINE(mbc2) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC2", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC2); +} + +M_TEST_DEFINE(mbc3) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC3", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC3); +} + +M_TEST_DEFINE(mbc3Rtc) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC3", + .timer = true, + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC3_RTC); +} + +M_TEST_DEFINE(mbc5) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC5", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC5); +} + +M_TEST_DEFINE(mbc5Rumble) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC5", + .romSize = 0x8000, + .rumble = true + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC5_RUMBLE); +} + +M_TEST_DEFINE(mbc6) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC6", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC6); +} + +M_TEST_DEFINE(mbc7) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC7", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC7); +} + +M_TEST_DEFINE(mbc1m) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MB1M", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MBC1); + assert_int_equal(gb->memory.mbcState.mbc1.multicartStride, 4); +} + +M_TEST_DEFINE(mmm01) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MMM1", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_MMM01); +} + +M_TEST_DEFINE(pocketCam) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "CAMR", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_POCKETCAM); +} + +M_TEST_DEFINE(huc1) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "HUC1", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_HuC1); +} + +M_TEST_DEFINE(huc3) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "HUC3", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_HuC3); +} + +M_TEST_DEFINE(tama5) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "TAM5", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_TAMA5); +} + +M_TEST_DEFINE(bbd) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "BBD", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_UNL_BBD); +} + +M_TEST_DEFINE(hitek) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "HITK", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_UNL_HITEK); +} + +M_TEST_DEFINE(ntNew) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "NTN", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_UNL_NT_NEW); +} + +M_TEST_DEFINE(pkjd) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "PKJD", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_UNL_PKJD); +} + +M_TEST_DEFINE(wisdomTree) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "WISD", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_UNL_WISDOM_TREE); +} + +M_TEST_DEFINE(sachenMmc1) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "SAM1", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_UNL_SACHEN_MMC1); +} + +M_TEST_DEFINE(sachenMmc2) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "SAM2", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_int_equal(gb->memory.mbcType, GB_UNL_SACHEN_MMC2); +} + +M_TEST_DEFINE(resetMbc1m) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MB1M", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + core->reset(core); + assert_int_equal(gb->memory.mbcType, GB_MBC1); + assert_int_equal(gb->memory.mbcState.mbc1.multicartStride, 4); +} + +M_TEST_DEFINE(fakeRomSize) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC1", + .romSize = 0x8000 + }; + struct VFile* vf = makeGBX(¶ms, 0x10000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); +} + +M_TEST_DEFINE(fakeRamSize) { + struct mCore* core = *state; + struct GB* gb = core->board; + struct GBXParams params = { + .major = 1, + .fourcc = "MBC1", + .romSize = 0x8000, + .ramSize = 0x4000 + }; + struct VFile* vf = makeGBX(¶ms, 0x8000); + bool loaded = core->loadROM(core, vf); + assert_true(loaded && gb->pristineRomSize == 0x8000); + assert_true(gb->sramSize == 0x4000); +} + +M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(GBGBX, + cmocka_unit_test(failTooSmall), + cmocka_unit_test(failNoMagic), + cmocka_unit_test(invalidVersionLow), + cmocka_unit_test(invalidVersionHigh), + cmocka_unit_test(mbcInvalidNone), + cmocka_unit_test(mbcInvalidFallback), + cmocka_unit_test(mbcRom), + cmocka_unit_test(mbc1), + cmocka_unit_test(mbc2), + cmocka_unit_test(mbc3), + cmocka_unit_test(mbc3Rtc), + cmocka_unit_test(mbc5), + cmocka_unit_test(mbc5Rumble), + cmocka_unit_test(mbc6), + cmocka_unit_test(mbc7), + cmocka_unit_test(mbc1m), + cmocka_unit_test(mmm01), + cmocka_unit_test(pocketCam), + cmocka_unit_test(huc1), + cmocka_unit_test(huc3), + cmocka_unit_test(tama5), + cmocka_unit_test(bbd), + cmocka_unit_test(hitek), + cmocka_unit_test(ntNew), + cmocka_unit_test(pkjd), + cmocka_unit_test(wisdomTree), + cmocka_unit_test(sachenMmc1), + cmocka_unit_test(sachenMmc2), + cmocka_unit_test(resetMbc1m), + cmocka_unit_test(fakeRomSize), + cmocka_unit_test(fakeRamSize)) From 006beb0704621c42a14721b173acfc2d2040d6b2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 14:28:35 -0800 Subject: [PATCH 15/60] SDL: Actually use FindSDL2 by default --- src/platform/sdl/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt index 91ac72590..047f26333 100644 --- a/src/platform/sdl/CMakeLists.txt +++ b/src/platform/sdl/CMakeLists.txt @@ -1,10 +1,10 @@ set(SDL_VERSION "2" CACHE STRING "Version of SDL to use (1.2 or 2)") if (SDL_VERSION EQUAL "2") - include(FindPkgConfig) - pkg_search_module(SDL2 sdl2) + find_package(SDL2) if (NOT SDL2_FOUND) - find_package(SDL2) + include(FindPkgConfig) + pkg_search_module(SDL2 sdl2) endif() if (SDL2_FOUND) From 33792b20f8697dc9666f586c3280448d8d7565a8 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 14:43:48 -0800 Subject: [PATCH 16/60] Qt: Fix build --- src/platform/qt/GDBWindow.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/platform/qt/GDBWindow.cpp b/src/platform/qt/GDBWindow.cpp index 8f1c44fe8..3f1f86efb 100644 --- a/src/platform/qt/GDBWindow.cpp +++ b/src/platform/qt/GDBWindow.cpp @@ -56,7 +56,9 @@ GDBWindow::GDBWindow(GDBController* controller, QWidget* parent) watchpointsSettings->setLayout(watchpointsSettingsLayout); QButtonGroup* watchpointsButtonGroup = new QButtonGroup(watchpointsSettings); - connect(watchpointsButtonGroup, &QButtonGroup::idClicked, controller, &GDBController::setWatchpointsBehavior); + connect(watchpointsButtonGroup, qOverload(&QButtonGroup::buttonClicked), controller, [watchpointsButtonGroup, controller](QAbstractButton* button) { + controller->setWatchpointsBehavior(watchpointsButtonGroup->id(button)); + }); m_watchpointsStandardRadio = new QRadioButton(tr("Standard GDB"), watchpointsSettings); m_watchpointsStandardRadio->setChecked(true); From 72de9bd370fd6f72092b6def61ddff99d7e4b603 Mon Sep 17 00:00:00 2001 From: T Date: Sun, 16 Jan 2022 20:02:05 +0000 Subject: [PATCH 17/60] Qt: Update translation (Italian) Translation: mGBA/Qt Translate-URL: https://hosted.weblate.org/projects/mgba/mgba-qt/it/ --- src/platform/qt/ts/mgba-it.ts | 105 ++++++++++++++++++---------------- 1 file changed, 55 insertions(+), 50 deletions(-) diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index f850871df..cf4b87913 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -41,7 +41,7 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. An update is available - + È disponibile un aggiornamento @@ -140,7 +140,7 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. Chip ID - Chip ID + ID chip @@ -163,7 +163,7 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. Add New Code - + Aggiungi nuovo codice @@ -173,12 +173,12 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. Add Lines - + Aggiungi linee Code type - + Tipo codice @@ -1003,17 +1003,17 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. EEPROM 8kB - + EEPROM 8kB EEPROM 512 bytes - + EEPROM 512 byte SRAM 64kB (bootlegs only) - + SRAM 64kB (solo bootleg) @@ -1199,41 +1199,46 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. An update to %1 is available. - + È disponibile un aggiornamento a %1. + Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + +Vuoi scaricarlo e installarlo adesso? Dovrai riavviare l'emulatore quando il download sarà completato. Auto-update is not available on this platform. If you wish to update you will need to do it manually. - + +L'aggiornamento automatico non è disponibile su questa piattaforma. Se vuoi aggiornare dovrai farlo manualmente. Current version: %1 New version: %2 Download size: %3 - + Versione attuale: %1 +Nuova versione: %2 +Dimensione del download: %3 Downloading update... - + Scaricamento aggiornamento in corso... Downloading failed. Please update manually. - + Download fallito. Si prega di aggiornare manualmente. Downloading done. Press OK to restart %1 and install the update. - + Download terminato. Premi OK per riavviare %1 e installare l'aggiornamento. @@ -1241,22 +1246,22 @@ Download size: %3 Stable - + Stabile Development - + Sviluppo Unknown - Sconosciuto + Sconosciuto (None) - + (Nessuno) @@ -1293,7 +1298,7 @@ Download size: %3 Autodetect (recommended) - + Rilevamento automatico (consigliato) @@ -1345,7 +1350,7 @@ Download size: %3 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). - + Impossibile aprire il file di salvataggio; i salvataggi in gioco non possono essere aggiornati. Assicurati che la directory di salvataggio sia scrivibile senza privilegi aggiuntivi (ad esempio UAC su Windows). @@ -3924,7 +3929,7 @@ Download size: %3 None - Nessuno + Nessuno @@ -3970,32 +3975,32 @@ Download size: %3 Never - + Mai Just now - + Solo adesso Less than an hour ago - + Meno di un ora fa %n hour(s) ago - - - + + %n ora fa + %n ore fa %n day(s) ago - - - + + %n giorno fa + %n giorni fa @@ -4375,7 +4380,7 @@ Download size: %3 GameShark saves (*.gsv *.sps *.xps) - + Salvataggi GameShark (*.gsv *.sps *.xps) @@ -5082,12 +5087,12 @@ Download size: %3 %1 SharkPort %2 save game - + %1 SharkPort %2 salvataggio gioco %1 GameShark Advance SP %2 save game - + %1 GameShark Advance SP %2 salvataggio gioco @@ -5185,7 +5190,7 @@ Download size: %3 Update - + Aggiornamento @@ -5315,22 +5320,22 @@ Download size: %3 Audio in multiplayer: - + Audio nel multiplayer: All windows - + Tutte le finestre Player 1 window only - + Solo finestra giocatore 1 Currently active player window - + Finestra giocatore attualmente attiva @@ -5387,57 +5392,57 @@ Download size: %3 Pause - + Pausa When inactive: - + Quando inattiva: When minimized: - + Quando rimpicciolita: Current channel: - + Canale attuale: Current version: - + Versione attuale: Update channel: - + Canale aggiornamento: Available version: - + Versione disponibile: (Unknown) - + (Sconosciuto) Last checked: - + Vista l'ultima volta: Automatically check on start - + Verifica automaticamente all'avvio Check now - + Verifica adesso From cb8bdb4c480b498f791ab42da0e7ddf26f492ba9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 15:55:14 -0800 Subject: [PATCH 18/60] Windows: Fix MSVC paths --- src/platform/qt/updater.qrc.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/qt/updater.qrc.in b/src/platform/qt/updater.qrc.in index c0ff021d9..edf2cd38e 100644 --- a/src/platform/qt/updater.qrc.in +++ b/src/platform/qt/updater.qrc.in @@ -1,5 +1,5 @@ - ${CMAKE_CURRENT_BINARY_DIR}/../updater-stub${CMAKE_EXECUTABLE_SUFFIX} + ${PROJECT_BINARY_DIR}/updater-stub${CMAKE_EXECUTABLE_SUFFIX} From 8ba146c0c48ecf1449181bdd4fb3e0c3694affc1 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 16:16:10 -0800 Subject: [PATCH 19/60] AppVeyor: Only build release libs --- .appveyor.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 100d3a633..e8312b7b0 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -10,11 +10,11 @@ install: - git -C C:\Tools\vcpkg clean -dfq docs ports scripts toolsrc triplets versions - git -C C:\Tools\vcpkg pull --force --quiet - C:\Tools\vcpkg\bootstrap-vcpkg -- vcpkg --triplet x64-windows --recurse install ffmpeg libepoxy libpng libzip sdl2 sqlite3 +- vcpkg --triplet x64-windows-release --recurse install ffmpeg libepoxy libpng libzip sdl2 sqlite3 - vcpkg --no-dry-run upgrade - rd /Q /S C:\Tools\vcpkg\buildtrees before_build: -- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake +- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release build: parallel: true project: mGBA.sln From 4f94849728227e028564cbd72ef4605edbb56707 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 18:26:08 -0800 Subject: [PATCH 20/60] GBA: Automatically skip BIOS if ROM has invalid logo --- CHANGES | 1 + src/gba/core.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index dc8ad9aa0..7a7285bd5 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,7 @@ Other fixes: Misc: - Core: Suspend runloop when a core crashes - GB Video: Add default SGB border + - GBA: Automatically skip BIOS if ROM has invalid logo - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) - Qt: Rearrange menus some - Qt: Clean up cheats dialog diff --git a/src/gba/core.c b/src/gba/core.c index 8515fa9c1..633572249 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -25,6 +25,7 @@ #include #include #include +#include #ifdef USE_ELF #include #endif @@ -129,6 +130,7 @@ static const struct mCoreMemoryBlock _GBAMemoryBlocksEEPROM[] = { struct mVideoLogContext; #define CPU_COMPONENT_AUDIO_MIXER CPU_COMPONENT_MISC_1 +#define LOGO_CRC32 0xD0BEB55E struct GBACore { struct mCore d; @@ -658,7 +660,16 @@ static void _GBACoreReset(struct mCore* core) { #endif ARMReset(core->cpu); - if ((core->opts.skipBios && (gba->romVf || gba->memory.rom)) || (gba->romVf && GBAIsMB(gba->romVf))) { + bool forceSkip = gba->romVf && GBAIsMB(gba->romVf); + if (!(forceSkip || core->opts.skipBios) && (gba->romVf || gba->memory.rom) && gba->pristineRomSize >= 0xA0 && gba->biosVf) { + uint32_t crc = doCrc32(&gba->memory.rom[1], 0x9C); + if (crc != LOGO_CRC32) { + mLOG(STATUS, WARN, "Invalid logo, skipping BIOS"); + forceSkip = true; + } + } + + if (forceSkip || (core->opts.skipBios && (gba->romVf || gba->memory.rom))) { GBASkipBIOS(core->board); } } From 43817e7287d5cdc677e8a5c114a06de847936893 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 18:26:25 -0800 Subject: [PATCH 21/60] Python: CMake cleanup --- src/platform/python/CMakeLists.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/platform/python/CMakeLists.txt b/src/platform/python/CMakeLists.txt index 7004519ae..dc4037ef5 100644 --- a/src/platform/python/CMakeLists.txt +++ b/src/platform/python/CMakeLists.txt @@ -17,7 +17,7 @@ endforeach() file(GLOB PYTHON_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h) add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lib.c - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py + COMMAND BINDIR=${PROJECT_BINARY_DIR} CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/_builder.py COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/lib.c DEPENDS ${PYTHON_HEADERS} DEPENDS ${BINARY_NAME} @@ -31,7 +31,7 @@ set_target_properties(${BINARY_NAME}-pylib PROPERTIES INCLUDE_DIRECTORIES "${CMA set_target_properties(${BINARY_NAME}-pylib PROPERTIES COMPILE_DEFINITIONS "${OS_DEFINES};${FEATURE_DEFINES};${FUNCTION_DEFINES}") add_custom_target(${BINARY_NAME}-py ALL - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. LIBDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py build -b ${CMAKE_CURRENT_BINARY_DIR} + COMMAND BINDIR=${PROJECT_BINARY_DIR} LIBDIR=${PROJECT_BINARY_DIR} CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py build -b ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${BINARY_NAME} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/setup.py @@ -40,17 +40,17 @@ add_custom_target(${BINARY_NAME}-py ALL DEPENDS ${BINARY_NAME}-pylib) add_custom_target(${BINARY_NAME}-py-install - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. LIBDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py install -b ${CMAKE_CURRENT_BINARY_DIR} + COMMAND BINDIR=${PROJECT_BINARY_DIR} LIBDIR=${PROJECT_BINARY_DIR} CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py install -b ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${BINARY_NAME}-py) add_custom_target(${BINARY_NAME}-py-develop - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. LIBDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py develop -b ${CMAKE_CURRENT_BINARY_DIR} + COMMAND BINDIR=${PROJECT_BINARY_DIR} LIBDIR=${PROJECT_BINARY_DIR} CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py develop -b ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${BINARY_NAME}-py) add_custom_target(${BINARY_NAME}-py-bdist - COMMAND BINDIR=${CMAKE_CURRENT_BINARY_DIR}/.. LIBDIR=${CMAKE_CURRENT_BINARY_DIR}/.. CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py bdist_wheel -b ${CMAKE_CURRENT_BINARY_DIR} + COMMAND BINDIR=${PROJECT_BINARY_DIR} LIBDIR=${PROJECT_BINARY_DIR} CPPFLAGS="${INCLUDE_FLAGS}" ${PYTHON_EXECUTABLE} setup.py bdist_wheel -b ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${BINARY_NAME}-py) @@ -68,5 +68,5 @@ foreach(TEST IN LISTS TESTS) add_test(NAME python-${TEST_NAME} COMMAND ${PYTHON_EXECUTABLE} setup.py build -b ${CMAKE_CURRENT_BINARY_DIR} pytest --extras --addopts ${TEST} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - set_tests_properties(python-${TEST_NAME} PROPERTIES ENVIRONMENT "${PATH}=${CMAKE_CURRENT_BINARY_DIR}/..;BINDIR=${CMAKE_CURRENT_BINARY_DIR}/..;LIBDIR=${CMAKE_CURRENT_BINARY_DIR}/..;CPPFLAGS=${INCLUDE_FLAGS_STR}") + set_tests_properties(python-${TEST_NAME} PROPERTIES ENVIRONMENT "${PATH}=${PROJECT_BINARY_DIR};BINDIR=${PROJECT_BINARY_DIR};LIBDIR=${PROJECT_BINARY_DIR};CPPFLAGS=${INCLUDE_FLAGS_STR}") endforeach() From 982eeeb68915bd2d85d9c6e416b88ab666c35d45 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 21:13:55 -0800 Subject: [PATCH 22/60] AppVeyor: vcpkg is terrible --- .appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index e8312b7b0..1d1cb083b 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -4,8 +4,6 @@ platform: - x64 configuration: - Release -cache: -- C:\Tools\vcpkg install: - git -C C:\Tools\vcpkg clean -dfq docs ports scripts toolsrc triplets versions - git -C C:\Tools\vcpkg pull --force --quiet From 285d915df88e092160b1b0129f6fba323e1de5d7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 21:15:08 -0800 Subject: [PATCH 23/60] Qt: Update translations --- src/platform/qt/ts/mgba-de.ts | 632 +++++++------- src/platform/qt/ts/mgba-en.ts | 684 ++++++++-------- src/platform/qt/ts/mgba-es.ts | 632 +++++++------- src/platform/qt/ts/mgba-fi.ts | 684 ++++++++-------- src/platform/qt/ts/mgba-fr.ts | 632 +++++++------- src/platform/qt/ts/mgba-hu.ts | 684 ++++++++-------- src/platform/qt/ts/mgba-it.ts | 632 +++++++------- src/platform/qt/ts/mgba-ja.ts | 632 +++++++------- src/platform/qt/ts/mgba-ko.ts | 1176 ++++++++++++++------------- src/platform/qt/ts/mgba-ms.ts | 676 ++++++++------- src/platform/qt/ts/mgba-nb_NO.ts | 684 ++++++++-------- src/platform/qt/ts/mgba-nl.ts | 684 ++++++++-------- src/platform/qt/ts/mgba-pl.ts | 736 +++++++++-------- src/platform/qt/ts/mgba-ru.ts | 676 ++++++++------- src/platform/qt/ts/mgba-template.ts | 684 ++++++++-------- src/platform/qt/ts/mgba-tr.ts | 632 +++++++------- src/platform/qt/ts/mgba-zh_CN.ts | 632 +++++++------- 17 files changed, 6321 insertions(+), 5471 deletions(-) diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index 544d11693..e7def3599 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -1185,14 +1185,6 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.Kopieren - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1307,27 +1299,42 @@ Download-Größe: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 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 @@ -1437,42 +1444,62 @@ Download-Größe: %3 QGBA::GDBWindow - + Server settings Server-Einstellungen - + Local port Lokaler Port - + Bind address Bind-Adresse - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Unterbrechen - + Stop Stopp - + Start Start - + Crash Absturz - + Could not start GDB server Konnte GDB-Server nicht starten @@ -3680,6 +3707,14 @@ Download-Größe: %3 %1 byte%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3822,12 +3857,12 @@ Download-Größe: %3 QGBA::ReportView - + Bug report archive Fehlerbericht speichern - + ZIP archive (*.zip) ZIP-Archiv (*.zip) @@ -3965,27 +4000,27 @@ Download-Größe: %3 Verzeichnis auswählen - + (%1×%2) (%1×%2) - + Never Nie - + Just now Gerade eben - + Less than an hour ago Vor weniger als einer Stunde - + %n hour(s) ago Vor %n Stunde(n) @@ -3993,7 +4028,7 @@ Download-Größe: %3 - + %n day(s) ago Vor %n Tag(en) @@ -4092,105 +4127,105 @@ Download-Größe: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance-ROMs (%1) - + Game Boy ROMs (%1) Game Boy-ROMs (%1) - + All ROMs (%1) Alle ROMs (%1) - + %1 Video Logs (*.mvl) %1 Video-Logs (*.mvl) - + Archives (%1) Archive (%1) - - - + + + Select ROM ROM auswählen - - + + Select save Speicherdatei wählen - + Select patch Patch wählen - + Patches (*.ips *.ups *.bps) Korrekturen (*.ips *.ups *.bps) - + Select e-Reader card images Bilder der Lesegerät-Karte auswählen - + Image file (*.png *.jpg *.jpeg) Bilddatei (*.png *.jpg *.jpeg) - + Conversion finished Konvertierung abgeschlossen - + %1 of %2 e-Reader cards converted successfully. %1 von %2 Lesegerät-Karten erfolgreich konvertiert. - + Select image Bild auswählen - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Bild-Datei (*.png *.gif *.jpg *.jpeg);;Alle Dateien (*) - + GameShark saves (*.sps *.xps) GameShark-Speicherdaten (*.sps *.xps) - + Select video log Video-Log auswählen - + Video logs (*.mvl) Video-Logs (*.mvl) - + Crash Absturz - + The game has crashed with the following error: %1 @@ -4199,654 +4234,659 @@ Download-Größe: %3 %1 - + Unimplemented BIOS call Nicht implementierter BIOS-Aufruf - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Dieses Spiel verwendet einen BIOS-Aufruf, der nicht implementiert ist. Bitte verwenden Sie für die beste Spielerfahrung das offizielle BIOS. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Es konnte kein geeignetes Ausgabegerät erstellt werden, stattdessen wird Software-Rendering als Rückfalloption genutzt. Spiele laufen möglicherweise langsamer, besonders innerhalb großer Fenster. - + Really make portable? Portablen Modus wirklich aktivieren? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Diese Einstellung wird den Emulator so konfigurieren, dass er seine Konfiguration aus dem gleichen Verzeichnis wie die Programmdatei lädt. Möchten Sie fortfahren? - + Restart needed Neustart benötigt - + Some changes will not take effect until the emulator is restarted. Einige Änderungen werden erst übernommen, wenn der Emulator neu gestartet wurde. - + - Player %1 of %2 - Spieler %1 von %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 Bilder/Sekunde) - %4 - + &File &Datei - + Load &ROM... &ROM laden... - + Load ROM in archive... ROM aus Archiv laden... - + + Save games + Spielstände + + + + Automatically determine + + + + + Use player %0 save game + + + + Load &patch... &Patch laden... - + Boot BIOS BIOS booten - + Replace ROM... ROM ersetzen... - + Convert e-Reader card image to raw... Lesegerät-Kartenbild in Rohdaten umwandeln … - + ROM &info... ROM-&Informationen... - + Recent Zuletzt verwendet - + Make portable Portablen Modus aktivieren - + &Load state Savestate (aktueller Zustand) &laden - + Load state file... Savestate-Datei laden... - + &Save state Savestate (aktueller Zustand) &speichern - + Save state file... Savestate-Datei speichern... - + Quick load Schnell laden - + Quick save Schnell speichern - + Load recent Lade zuletzt gespeicherten Savestate - + Save recent Speichere aktuellen Zustand - + Undo load state Laden des Savestate rückgängig machen - + Undo save state Speichern des Savestate rückgängig machen - - + + State &%1 Savestate &%1 - + Load camera image... Lade Kamerabild... - + Convert save game... Spielstand konvertieren... - + New multiplayer window Neues Multiplayer-Fenster - + Connect to Dolphin... Mit Dolphin verbinden... - + Report bug... Fehler melden... - + E&xit &Beenden - + &Emulation &Emulation - + &Reset Zu&rücksetzen - + Sh&utdown Schli&eßen - + Yank game pak Spielmodul herausziehen - + &Pause &Pause - + &Next frame &Nächstes Bild - + Fast forward (held) Schneller Vorlauf (gehalten) - + &Fast forward Schneller &Vorlauf - + Fast forward speed Vorlauf-Geschwindigkeit - + Unbounded Unbegrenzt - + %0x %0x - + Rewind (held) Zurückspulen (gehalten) - + Re&wind Zur&ückspulen - + Step backwards Schrittweiser Rücklauf - - Sync to &video - Mit &Video synchronisieren - - - - Sync to &audio - Mit &Audio synchronisieren - - - + Solar sensor Sonnen-Sensor - + Increase solar level Sonnen-Level erhöhen - + Decrease solar level Sonnen-Level verringern - + Brightest solar level Hellster Sonnen-Level - + Darkest solar level Dunkelster Sonnen-Level - + Brightness %1 Helligkeit %1 - + BattleChip Gate... BattleChip Gate... - + Audio/&Video Audio/&Video - + Frame size Bildgröße - + Toggle fullscreen Vollbildmodus umschalten - + Lock aspect ratio Seitenverhältnis korrigieren - + Force integer scaling Pixelgenaue Skalierung (Integer scaling) - + Interframe blending Interframe-Überblendung - + Frame&skip Frame&skip - + Mute Stummschalten - + FPS target Bildwiederholrate - + Take &screenshot &Screenshot erstellen - + F12 F12 - + Clear Leeren - + Game Boy Printer... Game Boy Printer... - + Video layers Video-Ebenen - + Audio channels Audio-Kanäle - + Adjust layer placement... Lage der Bildebenen anpassen... - + &Tools &Werkzeuge - + View &logs... &Logs ansehen... - + Game &overrides... Spiel-&Überschreibungen... - + &Cheats... &Cheats... - + Open debugger console... Debugger-Konsole öffnen... - + Start &GDB server... &GDB-Server starten... - + Settings... Einstellungen... - + Select folder Ordner auswählen - + Save games (%1) Spielstände (%1) - + Select save game Spielstand auswählen - + mGBA save state files (%1) mGBA-Savestates (%1) - + Select save state Savestate auswählen - + Select e-Reader dotcode e-Reader-Code auswählen - + e-Reader card (*.raw *.bin *.bmp) e-Reader-Karte (*.raw *.bin *.bmp) - + GameShark saves (*.gsv *.sps *.xps) - + Couldn't Start Konnte nicht gestartet werden - + Could not start game. Spiel konnte nicht gestartet werden. - + Add folder to library... Ordner zur Bibliothek hinzufügen... - + Load alternate save game... Alternativen Spielstand laden... - + Load temporary save game... Temporären Spielstand laden... - + Scan e-Reader dotcodes... e-Reader-Code einlesen... - + Import GameShark Save... GameShare-Speicherstand importieren... - + Export GameShark Save... GameShark-Speicherstand exportieren... - + About... Über... - + %1× %1x - + Bilinear filtering Bilineare Filterung - + Native (59.7275) Nativ (59.7275) - + Record A/V... Audio/Video aufzeichnen... - + Record GIF/WebP/APNG... GIF/WebP/APNG aufzeichnen... - + Game Pak sensors... Spielmodul-Sensoren... - + View &palette... &Palette betrachten... - + View &sprites... &Sprites betrachten... - + View &tiles... &Tiles betrachten... - + View &map... &Map betrachten... - + &Frame inspector... &Bildbetrachter... - + View memory... Speicher betrachten... - + Search memory... Speicher durchsuchen... - + View &I/O registers... &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 @@ -5304,8 +5344,8 @@ Download-Größe: %3 - - + + Mute Stummschalten @@ -5351,7 +5391,7 @@ Download-Größe: %3 - + frames Bild(er) @@ -5391,93 +5431,93 @@ Download-Größe: %3 Erzwinge pixelgenaue Skalierung - - + + Pause Pausiert - + When inactive: Wenn inaktiv: - + When minimized: Wenn minimiert: - + Current channel: Aktueller Channel: - + Current version: Aktuelle Version: - + Update channel: Update-Channel: - + Available version: Verfügbare Version: - + (Unknown) (unbekannt) - + Last checked: Zuletzt geprüft: - + Automatically check on start Beim Start automatisch auf Aktualisierungen prüfen - + Check now Jetzt überprüfen - + Default color palette only Nur Standard-Farbpalette - + SGB color palette if available SGB-Farbpalette, sofern verfügbar - + GBC color palette if available GBC-Farbpalette, sofern verfügbar - + SGB (preferred) or GBC color palette if available SGB (bevorzugt) oder GBC-Farbpalette, sofern verfügbar - + Game Boy Camera Game Boy Camera - + Driver: Treiber: - + Source: Quelle: @@ -5507,188 +5547,198 @@ Download-Größe: %3 Baumansicht - + Dynamically update window title Fenster-Titel dynamisch aktualisieren - + Show FPS in title bar Bildwiederholrate in der Titelleiste anzeigen - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Save state extra data: Zusätzliche Savestate-Daten: - - + + Save game Spielstand - + Load state extra data: Zusätzliche Savestate-Daten laden: - + Models Modelle - + GB only: Nur GB: - + SGB compatible: SGB-kompatibel: - + GBC only: Nur GBC: - + GBC compatible: GBC-kompatibel: - + SGB and GBC compatible: SGB- und GBC-kompatibel: - + Game Boy palette Game Boy-Palette - + Preset: Voreinstellungen: - + Enable Game Boy Player features by default Game Boy Player-Features standardmäßig aktivieren - + Automatically save cheats Cheats automatisch speichern - + Automatically load cheats Cheats automatisch laden - + Automatically save state Zustand (Savestate) automatisch speichern - + Automatically load state Zustand (Savestate) automatisch laden - + Enable Discord Rich Presence Discord-Integration aktivieren - + Show OSD messages Bildschirmmeldungen anzeigen - + Show filename instead of ROM name in title bar Dateinamen statt ROM-Namen in der Titelleiste anzeigen - + Fast forward (held) speed: Vorlauf-Geschwindigkeit (halten): - + Enable VBA bug compatibility in ROM hacks VBA-Bug-Kompatibilität in ROM-Hacks aktivieren - + Video renderer: Video-Renderer: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements OpenGL-Verbesserungen - + High-resolution scale: Hochauflösende Skalierung: - + XQ GBA audio (experimental) XQ GBA-Audio (experimentell) - + Cheats Cheats - + Log to file In Datei protokollieren - + Log to console Auf die Konsole protokollieren - + Select Log File Protokoll-Datei auswählen - + Default BG colors: Standard-Hintergrundfarben: - + Default sprite colors 1: Standard-Sprite-Farben 1: - + Default sprite colors 2: Standard-Sprite-Farben 2: - + Super Game Boy borders Super Game Boy-Rahmen @@ -5708,41 +5758,41 @@ Download-Größe: %3 Cache leeren - + Fast forward speed: Vorlauf-Geschwindigkeit: - + Preload entire ROM into memory ROM-Datei vollständig in Arbeitsspeicher vorladen - - - - - - - - - + + + + + + + + + Browse Durchsuchen - + Use BIOS file if found BIOS-Datei verwenden, wenn vorhanden - + Skip BIOS intro BIOS-Intro überspringen - - + + Unbounded unbegrenzt @@ -5757,17 +5807,17 @@ Download-Größe: %3 BIOS - + Run all Alle ausführen - + Remove known Bekannte entfernen - + Detect and remove Erkennen und entfernen @@ -5777,19 +5827,19 @@ Download-Größe: %3 Gegensätzliche Eingaberichtungen erlauben - - + + Screenshot Screenshot - - + + Cheat codes Cheat-Codes - + Enable rewind Rücklauf aktivieren @@ -5799,71 +5849,71 @@ Download-Größe: %3 Bilineare Filterung - + Rewind history: Rücklauf-Verlauf: - + Idle loops: Leerlaufprozesse: - + Autofire interval: Autofeuer-Intervall: - + (240×160) (240×160) - + GB BIOS file: Datei mit GB-BIOS: - + GBA BIOS file: Datei mit GBA-BIOS: - + GBC BIOS file: Datei mit GBC-BIOS: - + SGB BIOS file: Datei mit SGB-BIOS: - + Save games Spielstände - - - - - + + + + + Same directory as the ROM Verzeichnis der ROM-Datei - + Save states Savestates - + Screenshots Bildschirmfotos - + Patches Korrekturen diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index e39ca8bfd..c77e6108e 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -1184,14 +1184,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - - QGBA::AboutScreen - - - 2021 - - - QGBA::ApplicationUpdatePrompt @@ -1304,27 +1296,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1434,42 +1441,62 @@ Download size: %3 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 @@ -3677,6 +3704,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3819,12 +3854,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -3962,27 +3997,27 @@ Download size: %3 - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3990,7 +4025,7 @@ Download size: %3 - + %n day(s) ago @@ -4089,759 +4124,764 @@ 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) - + + Save games + + + + Import GameShark Save... - + Export GameShark Save... - - New multiplayer window + + Automatically determine - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset + + Use player %0 save game - Sh&utdown - - - - - Yank game pak + New multiplayer window - &Pause + Connect to Dolphin... - - &Next frame + + 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 @@ -5304,8 +5344,8 @@ Download size: %3 - - + + Mute @@ -5351,7 +5391,7 @@ Download size: %3 - + frames @@ -5396,93 +5436,93 @@ Download size: %3 - - + + 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: @@ -5537,328 +5577,338 @@ Download size: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + 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 - - + + Cheat codes - + 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) - + 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 diff --git a/src/platform/qt/ts/mgba-es.ts b/src/platform/qt/ts/mgba-es.ts index 4616b8d46..c4a9c7233 100644 --- a/src/platform/qt/ts/mgba-es.ts +++ b/src/platform/qt/ts/mgba-es.ts @@ -1185,14 +1185,6 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Ampliación - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 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 remover 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 @@ -1435,42 +1442,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings Configuración del servidor - + Local port Puerto local - + Bind address Dirección de enlace - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Entrar a depuración - + Stop Detener - + Start Iniciar - + Crash Cierre inesperado - + Could not start GDB server No se pudo iniciar el servidor GDB @@ -3678,6 +3705,14 @@ Download size: %3 %1 byte%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3855,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Archivo del reporte de bugs - + ZIP archive (*.zip) Archivo ZIP (*.zip) @@ -3963,27 +3998,27 @@ Download size: %3 Elegir carpeta - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3991,7 +4026,7 @@ Download size: %3 - + %n day(s) ago @@ -4090,100 +4125,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROMs de Game Boy Advance (%1) - + Game Boy ROMs (%1) ROMs de Game Boy (%1) - + All ROMs (%1) Todas las ROMs (%1) - + %1 Video Logs (*.mvl) Video-registros de %1 (*.mvl) - + Archives (%1) Contenedores (%1) - - - + + + Select ROM Seleccionar ROM - + Select folder Seleccionar carpeta - - + + Select save Seleccionar guardado - + Select patch Seleccionar parche - + Patches (*.ips *.ups *.bps) Parches (*.ips *.ups *.bps) - + Select e-Reader dotcode Seleccionar dotcode del e-Reader - + e-Reader card (*.raw *.bin *.bmp) Tarjeta e-Reader (*.raw *.bin *.bmp) - + Select image Seleccionar imagen - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Archivo de imagen (*.png *.gif *.jpg *.jpeg);;Todos los archivos (*) - + GameShark saves (*.sps *.xps) Guardados de GameShark (*.sps *.xps) - + Select video log Seleccionar video-registro - + Video logs (*.mvl) Video-registros (*.mvl) - + Crash Cierre inesperado - + The game has crashed with the following error: %1 @@ -4192,659 +4227,664 @@ Download size: %3 %1 - + Unimplemented BIOS call Llamada a BIOS no implementada - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Este juego utiliza una llamada al BIOS que no se ha implementado. Utiliza el BIOS oficial para obtener la mejor experiencia. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. No se pudo crear un dispositivo de pantalla apropiado, recurriendo a software. Los juegos pueden funcionar lentamente, especialmente con ventanas grandes. - + Really make portable? ¿Hacer "portable"? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Esto hará que el emulador cargue su configuración desde el mismo directorio que el ejecutable. ¿Quieres continuar? - + Restart needed Reinicio necesario - + Some changes will not take effect until the emulator is restarted. Algunos cambios no surtirán efecto hasta que se reinicie el emulador. - + - Player %1 of %2 - Jugador %1 de %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Archivo - + Load &ROM... Cargar &ROM... - + Load ROM in archive... Cargar ROM desde contenedor... - + Add folder to library... Agregar carpeta a la biblioteca... - + + Save games + Datos de guardado + + + + Automatically determine + + + + + Use player %0 save game + + + + Load &patch... Cargar &parche... - + Boot BIOS Arrancar BIOS - + Replace ROM... Reemplazar ROM... - + ROM &info... &Información de la ROM... - + Recent Recientes - + Make portable Hacer "portable" - + &Load state Ca&rgar estado - + Report bug... Reportar bug... - + About... Acerca de... - + Game Pak sensors... Sensores del cartucho... - + Clear Limpiar - + Load state file... Cargar archivo de estado... - + Save games (%1) Juegos guardados (%1) - + Select save game Elegir juego guardado - + mGBA save state files (%1) Archivos estados guardados mGBA (%1) - + Select save state Elegir estado guardado - + Select e-Reader card images Elegir imágenes de tarjeta e-Reader - + Image file (*.png *.jpg *.jpeg) Archivo de imagen (*.png *.jpg *.jpeg) - + Conversion finished Conversión terminada - + %1 of %2 e-Reader cards converted successfully. %1 de %2 tarjetas e-Reader convertidas con éxito. - + Load alternate save game... Elegir juego guardado alterno... - + Load temporary save game... Elegir juego guardado temporal... - + Convert e-Reader card image to raw... Convertir imagen de tarjeta e-Reader a raw... - + &Save state Guardar e&stado - + Save state file... Guardar archivo de estado... - + Quick load Cargado rápido - + Quick save Guardado rápido - + Load recent Cargar reciente - + Save recent Guardar reciente - + Undo load state Deshacer cargar estado - + Undo save state Deshacer guardar estado - - + + State &%1 Estado &%1 - + Load camera image... Cargar imagen para la cámara... - + Convert save game... Convertir juego guardado... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window Nueva ventana multijugador - + Connect to Dolphin... Conectar a Dolphin... - + E&xit Salir (&X) - + &Emulation &Emulación - + &Reset &Reinicializar - + Sh&utdown Apagar (&U) - + Yank game pak Tirar del cartucho - + &Pause &Pausar - + &Next frame Cuadro siguie&nte - + Fast forward (held) Avance rápido (mantener) - + &Fast forward &Avance rápido - + Fast forward speed Velocidad de avance rápido - + Unbounded Sin límite - + %0x %0x - + Rewind (held) Rebobinar (mantener) - + Re&wind Re&bobinar - + Step backwards Paso hacia atrás - - Sync to &video - Sincronizar a &video - - - - Sync to &audio - Sincronizar a au&dio - - - + Solar sensor Sensor solar - + Increase solar level Subir nivel - + Decrease solar level Bajar nivel - + Brightest solar level Más claro - + Darkest solar level Más oscuro - + Brightness %1 Brillo %1 - + Audio/&Video Audio/&video - + Frame size Tamaño del cuadro - + Toggle fullscreen Pantalla completa - + Lock aspect ratio Bloquear proporción de aspecto - + Force integer scaling Forzar escala a enteros - + Bilinear filtering Filtro bilineal - + Frame&skip &Salto de cuadros - + Mute Silenciar - + FPS target Objetivo de FPS - + Native (59.7275) Nativo (59,7275) - + Take &screenshot Tomar pan&tallazo - + F12 F12 - + Game Boy Printer... Game Boy Printer... - + BattleChip Gate... BattleChip Gate... - + %1× %1× - + Interframe blending Mezcla entre cuadros - + Record A/V... Grabar A/V... - + Video layers Capas de video - + Audio channels Canales de audio - + Adjust layer placement... Ajustar ubicación de capas... - + &Tools Herramien&tas - + View &logs... Ver re&gistros... - + Game &overrides... Ajustes específic&os por juego... - + Couldn't Start No se pudo iniciar - + Could not start game. No se pudo iniciar el juego. - + Scan e-Reader dotcodes... Escanear dotcodes del e-Reader... - + Import GameShark Save... Importar desde GameShark... - + Export GameShark Save... Exportar a GameShark... - + Record GIF/WebP/APNG... Grabar GIF/WebP/APNG... - + &Cheats... Tru&cos... - + Settings... Ajustes... - + Open debugger console... Abrir consola de depuración... - + Start &GDB server... Iniciar servidor &GDB... - + View &palette... Ver &paleta... - + View &sprites... Ver &sprites... - + View &tiles... Ver m&osaicos... - + View &map... Ver &mapa... - + &Frame inspector... Inspec&tor de cuadros... - + View memory... Ver memoria... - + Search memory... Buscar memoria... - + View &I/O registers... Ver registros &I/O... - + Record debug video log... Grabar registro de depuración de video... - + Stop debug video log Detener registro de depuración de video - + 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 @@ -5307,8 +5347,8 @@ Download size: %3 - - + + Mute Silenciar @@ -5354,7 +5394,7 @@ Download size: %3 - + frames cuadros @@ -5394,93 +5434,103 @@ Download size: %3 Filtro bilineal - - + + Pause - + When inactive: - + When minimized: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only Sólo paleta de colores predeterminada - + SGB color palette if available Paleta de color SGB si está disponible - + GBC color palette if available Paleta de color GBC si está disponible - + SGB (preferred) or GBC color palette if available Paleta de colores SGB (preferida) o GBC si está disponible - + Game Boy Camera Cámara Game Boy - + Driver: Controlador: - + Source: Fuente: @@ -5495,68 +5545,68 @@ Download size: %3 Mezcla entre cuadros - + Dynamically update window title Actualizar titulo de ventana dinámicamente - + Show OSD messages Mostrar mensajes en el OSD - + Save state extra data: Guardar datos adicionales de estado: - - + + Save game Guardar partida - + Load state extra data: Cargar datos adicionales de estado: - + Enable VBA bug compatibility in ROM hacks Activar modo de compatibilidad VBA en ROM hacks - + Preset: Ajustes: - + Show filename instead of ROM name in title bar Enseñar el nombre de archivo en lugar del nombre de ROM en el titulo de la ventana - + Fast forward (held) speed: Avance rápido (mantenido): - + (240×160) (240×160) - + Log to file Guardar a archivo - + Log to console Guardar a consola - + Select Log File Seleccionar @@ -5606,262 +5656,262 @@ Download size: %3 Suspender protector de pantalla - + Show FPS in title bar Mostrar FPS en la barra de título - + Automatically save cheats Guardar trucos automáticamente - + Automatically load cheats Cargar trucos automáticamente - + Automatically save state Guardar estado automáticamente - + Automatically load state Cargar estado automáticamente - + Enable Discord Rich Presence Hablitar Rich Presence en Discord - + Fast forward speed: Avance rápido: - - + + Unbounded Sin límite - + Enable rewind Habilitar el rebobinar - + Rewind history: Hist. de rebobinado: - + Idle loops: Bucles inactivos: - + Run all Ejecutarlos todos - + Remove known Eliminar los conocidos - + Detect and remove Detectar y eliminar - - + + Screenshot Pantallazo - - + + Cheat codes Trucos - + Preload entire ROM into memory Cargar ROM completa a la memoria - + Autofire interval: Intervalo de turbo: - + Enable Game Boy Player features by default Habilitar funcionalidad de Game Boy Player por defecto - + Video renderer: Renderizador de video: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements Mejoras para OpenGL - + High-resolution scale: Escala de alta resolución: - + XQ GBA audio (experimental) Mejorar audio GBA (experimental) - + GB BIOS file: Archivo BIOS GB: - - - - - - - - - + + + + + + + + + Browse Examinar - + Use BIOS file if found Usar archivo BIOS si fue encontrado - + Skip BIOS intro Saltar animación de entrada del BIOS - + GBA BIOS file: Archivo BIOS GBA: - + GBC BIOS file: Archivo BIOS GBC: - + SGB BIOS file: Archivo BIOS SGB: - + Save games Datos de guardado - - - - - + + + + + Same directory as the ROM Al mismo directorio que la ROM - + Save states Estados de guardado - + Screenshots Pantallazos - + Patches Parches - + Cheats Trucos - + Models Modelos - + GB only: Sólo GB: - + SGB compatible: Compatible con SGB: - + GBC only: Sólo GBC: - + GBC compatible: Compatible con GBC: - + SGB and GBC compatible: Compatible con SGB y GBC: - + Game Boy palette Paleta de Game Boy - + Default BG colors: Colores de fondo por defecto: - + Super Game Boy borders Bordes de Super Game Boy - + Default sprite colors 1: Colores de sprite 1 por defecto: - + Default sprite colors 2: Colores de sprite 2 por defecto: diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index 6cf67e56e..a9ff527ef 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -1185,14 +1185,6 @@ Game Boy Advance on Nintendo Co., Ltd rekisteröimä tuotemerkki. - - QGBA::AboutScreen - - - 2021 - - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1435,42 +1442,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings - + Local port - + Bind address - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Rikkoa - + Stop - + Start - + Crash - + Could not start GDB server @@ -3678,6 +3705,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3855,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -3963,27 +3998,27 @@ Download size: %3 - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3991,7 +4026,7 @@ Download size: %3 - + %n day(s) ago @@ -4090,759 +4125,764 @@ 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 - + 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... - + + Save games + + + + Export GameShark Save... - - New multiplayer window + + Automatically determine - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset + + Use player %0 save game - Sh&utdown - - - - - Yank game pak + New multiplayer window - &Pause + Connect to Dolphin... - - &Next frame + + 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 @@ -5305,8 +5345,8 @@ Download size: %3 - - + + Mute @@ -5352,7 +5392,7 @@ Download size: %3 - + frames @@ -5397,93 +5437,93 @@ Download size: %3 - - + + 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: @@ -5538,328 +5578,338 @@ Download size: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + 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 - - + + Cheat codes - + 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) - + 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 diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index 937966a0c..842d90105 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -1186,14 +1186,6 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.Agrandissement - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1306,27 +1298,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 É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 @@ -1436,42 +1443,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings Paramètres du serveur - + Local port Port local - + Bind address Lier l'adresse - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Interrompre - + Stop Arrêter - + Start Démarrer - + Crash Plantage - + Could not start GDB server Impossible de démarrer le serveur GDB @@ -3697,6 +3724,14 @@ Download size: %3 %1 octet%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3839,12 +3874,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Archive de signalement d'erreur - + ZIP archive (*.zip) Archive ZIP (*.zip) @@ -3982,27 +4017,27 @@ Download size: %3 - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -4010,7 +4045,7 @@ Download size: %3 - + %n day(s) ago @@ -4109,120 +4144,120 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROMs de Game Boy Advance (%1) - + Game Boy ROMs (%1) ROMs de Game Boy (%1) - + All ROMs (%1) Toutes les ROM (%1) - + %1 Video Logs (*.mvl) %1 Journaux vidéo (*.mvl) - + Archives (%1) Archives (%1) - - - + + + Select ROM Choisir une ROM - + Select folder Choisir un dossier - - + + Select save Choisir une sauvegarde - + Select patch Sélectionner un correctif - + Patches (*.ips *.ups *.bps) Correctifs/Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Sélectionnez le numéro de point du e-Reader - + e-Reader card (*.raw *.bin *.bmp) e-Reader carte (*.raw *.bin *.bmp) - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Select image Choisir une image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Image (*.png *.gif *.jpg *.jpeg);;Tous les fichiers (*) - + GameShark saves (*.sps *.xps) Sauvegardes GameShark (*.sps *.xps) - + Select video log Sélectionner un journal vidéo - + Video logs (*.mvl) Journaux vidéo (*.mvl) - + Crash Plantage - + The game has crashed with the following error: %1 @@ -4231,639 +4266,644 @@ Download size: %3 %1 - + Unimplemented BIOS call Requête au BIOS non supporté - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Ce jeu utilise un appel BIOS qui n'est pas implémenté. Veuillez utiliser le BIOS officiel pour une meilleure expérience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Échec de la création d'un périphérique d'affichage approprié, retour à l'affichage du logiciel. Les jeux peuvent fonctionner lentement, en particulier avec des fenêtres plus grandes. - + Really make portable? Vraiment rendre portable ? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Cela amènera l'émulateur à charger sa configuration depuis le même répertoire que l'exécutable. Souhaitez vous continuer ? - + Restart needed Un redémarrage est nécessaire - + Some changes will not take effect until the emulator is restarted. Certains changements ne prendront effet qu'après le redémarrage de l'émulateur. - + - Player %1 of %2 - Joueur %1 of %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Fichier - + Load &ROM... Charger une &ROM… - + Load ROM in archive... Charger la ROM d'une archive… - + Add folder to library... Ajouter un dossier à la bibliothèque… - + Load &patch... Charger un c&orrectif… - + Boot BIOS Démarrer le BIOS - + Replace ROM... Remplacer la ROM… - + Convert e-Reader card image to raw... - + ROM &info... &Infos sur la ROM… - + Recent Récent - + Make portable Rendre portable - + &Load state &Charger un état - + &Save state &Sauvegarder un état - + Quick load Chargement rapide - + Quick save Sauvegarde rapide - + Load recent Charger un fichier récent - + Save recent Sauvegarder un fichier récent - + Undo load state Annuler le chargement de l'état - + Undo save state Annuler la sauvegarde de l'état - - + + State &%1 État &%1 - + Load camera image... Charger une image de la caméra… - + Convert save game... - + New multiplayer window Nouvelle fenêtre multijoueur - + Connect to Dolphin... - + Report bug... Signalement de l'erreur… - + E&xit &Quitter - + &Emulation &Émulation - + &Reset &Réinitialiser - + Sh&utdown Extin&ction - + Yank game pak Yank game pak - + &Pause &Pause - + &Next frame &Image suivante - + Fast forward (held) Avance rapide (maintenir) - + &Fast forward A&vance rapide - + Fast forward speed Vitesse de l'avance rapide - + Unbounded Sans limites - + %0x %0x - + Rewind (held) Rembobiner (maintenir) - + Re&wind Rem&bobiner - + Step backwards Retour en arrière - - Sync to &video - Synchro &vidéo - - - - Sync to &audio - Synchro &audio - - - + Solar sensor Capteur solaire - + Increase solar level Augmenter le niveau solaire - + Decrease solar level Diminuer le niveau solaire - + Brightest solar level Tester le niveau solaire - + Darkest solar level Assombrir le niveau solaire - + Brightness %1 Luminosité %1 - + Audio/&Video Audio/&Vidéo - + Frame size Taille de l'image - + Toggle fullscreen Basculer en plein écran - + Lock aspect ratio Bloquer les proportions - + Force integer scaling Forcer la mise à l'échelle par des nombres entiers - + Bilinear filtering Filtrage bilinèaire - + Frame&skip &Saut d'image - + Mute Muet - + FPS target FPS ciblé - + Take &screenshot Prendre une ca&pture d'écran - + F12 F12 - + Game Boy Printer... Imprimante GameBoy… - + Video layers Couches vidéo - + Audio channels Canaux audio - + Adjust layer placement... Ajuster la disposition… - + &Tools Ou&tils - + View &logs... Voir les &journaux… - + Game &overrides... - + Couldn't Start N'a pas pu démarrer - + Save games (%1) - + Select save game - + mGBA save state files (%1) - + Select save state - + GameShark saves (*.gsv *.sps *.xps) - + Could not start game. Impossible de démarrer le jeu. - + Load alternate save game... - + Load temporary save game... - + Scan e-Reader dotcodes... Scanner les dotcodes e-Reader... - + Load state file... Charger le fichier d'état... - + Save state file... Enregistrer le fichier d'état... - + Import GameShark Save... Importer la sauvegarde de GameShark... - + + Save games + Sauvegarder les jeux + + + Export GameShark Save... Exporter la sauvegarde de GameShark... - + + Automatically determine + + + + + Use player %0 save game + + + + About... À propos de… - + BattleChip Gate... - + %1× %1× - + Interframe blending Mélange d'images - + Native (59.7275) Natif (59.7275) - + Record A/V... Enregistrer A/V... - + Record GIF/WebP/APNG... Enregistrer GIF/WebP/APNG... - + Game Pak sensors... Capteurs de la Game Pak... - + &Cheats... &Cheats… - + Settings... Paramètres… - + Open debugger console... Ouvrir la console de débug… - + Start &GDB server... Démarrer le serveur &GDB… - + View &palette... Voir la &palette… - + View &sprites... Voir les &sprites… - + View &tiles... Voir les &tiles… - + View &map... Voir la &map… - + &Frame inspector... Inspecteur de &frame... - + View memory... Voir la mémoire… - + Search memory... Recherche dans la mémoire… - + View &I/O registers... 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 @@ -5327,8 +5367,8 @@ Download size: %3 - - + + Mute Muet @@ -5374,7 +5414,7 @@ Download size: %3 - + frames images @@ -5414,174 +5454,184 @@ Download size: %3 Filtrage bilinéaire - - + + Pause - + Dynamically update window title - + When inactive: - + When minimized: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + 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: - + 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: - + Enable Game Boy Player features by default - + Log to file Journalisation vers le fichier - + Log to console Journalisation vers la console - + Select Log File Sélectionner le fichier de journalisation @@ -5631,22 +5681,22 @@ Download size: %3 Suspendre l'économiseur d'écran - + Show FPS in title bar Afficher le nombre de FPS dans la barre de titre - + Automatically save cheats Sauvegarder automatiquement les cheats - + Automatically load cheats Charger automatiquement les cheats - + Automatically save state Sauvegarder automatiquement l'état @@ -5661,227 +5711,227 @@ Download size: %3 Mélange d'images - + Enable Discord Rich Presence Activer l'intégration avec Discord - + Automatically load state Charger automatiquement l'état - + Show OSD messages Afficher les messages OSD - + Show filename instead of ROM name in title bar Afficher le nom du fichier au lieu du nom de la ROM dans la barre de titre - + Fast forward speed: Vitesse d'avance rapide : - - + + Unbounded Sans limites - + Fast forward (held) speed: Vitesse d'avance rapide (maintenue) : - + Enable rewind Permettre le rembobinage - + Rewind history: Historique du rembobinage : - + Idle loops: Boucles d'inactivité : - + Run all Tout lancer - + Remove known Supprimer les éléments connus - + Detect and remove Détecter et supprimer - - + + Screenshot Capture d'écran - - + + Cheat codes Codes de triches - + Preload entire ROM into memory Précharger toute la ROM en mémoire - + Autofire interval: Intervalle de tir automatique : - + Enable VBA bug compatibility in ROM hacks - + Video renderer: Rendu vidéo : - + Software Logiciel(s) - + OpenGL OpenGL - + OpenGL enhancements Améliorations OpenGL - + High-resolution scale: Échelle haute résolution : - + (240×160) (240×160) - + XQ GBA audio (experimental) XQ GBA audio (expérimental) - + GB BIOS file: GB BIOS : - - - - - - - - - + + + + + + + + + Browse Parcourir - + Use BIOS file if found Utiliser le fichier BIOS si trouvé - + Skip BIOS intro Passer l'intro du BIOS - + GBA BIOS file: GBA BIOS : - + GBC BIOS file: GBC BIOS : - + SGB BIOS file: SGB BIOS : - + Save games Sauvegarder les jeux - - - - - + + + + + Same directory as the ROM Même répertoire que la ROM - + Save states Sauvegarder les états - + Screenshots Captures d'écran - + Patches Correctifs - + Cheats Cheats - + Default BG colors: Couleurs par défaut de l'arrière plan : - + Super Game Boy borders Bordures Super Game Boy - + Default sprite colors 1: Couleurs par défaut de la sprite nº 1 : - + Default sprite colors 2: Couleurs par défaut de la sprite n°2 : diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index c26ac92bd..8aa914c7a 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -1185,14 +1185,6 @@ A Game Boy Advance a Nintendo Co., Ltd. bejegyzett védjegye Másolás - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1435,42 +1442,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings Szerverbeállítások - + Local port Helyi port - + Bind address Cím hozzárendelése - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Törés - + Stop Leállítás - + Start Indítás - + Crash - + Could not start GDB server A GDB szerver elindítása nem sikerült @@ -3678,6 +3705,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3855,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -3963,34 +3998,34 @@ Download size: %3 - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4088,759 +4123,764 @@ 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) - + + Save games + + + + Import GameShark Save... - + Export GameShark Save... - - New multiplayer window + + Automatically determine - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset + + Use player %0 save game - Sh&utdown - - - - - Yank game pak + New multiplayer window - &Pause + Connect to Dolphin... - - &Next frame + + 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 %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× %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 Napló törlése @@ -5303,8 +5343,8 @@ Download size: %3 - - + + Mute @@ -5350,7 +5390,7 @@ Download size: %3 - + frames @@ -5395,37 +5435,47 @@ Download size: %3 - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + 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: @@ -5480,384 +5530,384 @@ Download size: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence Discord Rich Presence engedélyezése - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show FPS in title bar - - + + Pause - + When inactive: - + When minimized: - + Current channel: - + Current version: - + 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: - + 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 - - + + Cheat codes - + 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) - + 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 Csalások - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index cf4b87913..b503e3c6a 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -1185,14 +1185,6 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. Ingrandimento - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1310,27 +1302,42 @@ Dimensione del download: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 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 @@ -1440,42 +1447,62 @@ Dimensione del download: %3 QGBA::GDBWindow - + Server settings Impostazioni Server - + Local port Porta locale - + Bind address Collega indirizzo - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Interruzione - + Stop Ferma - + Start Avvia - + Crash Errore - + Could not start GDB server Impossibile avviare il server GDB @@ -3683,6 +3710,14 @@ Dimensione del download: %3 %1 byte%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3825,12 +3860,12 @@ Dimensione del download: %3 QGBA::ReportView - + Bug report archive Archivio delle segnalazioni di bug - + ZIP archive (*.zip) Archivio ZIP (*.zip) @@ -3968,27 +4003,27 @@ Dimensione del download: %3 Seleziona directory - + (%1×%2) (%1×%2) - + Never Mai - + Just now Solo adesso - + Less than an hour ago Meno di un ora fa - + %n hour(s) ago %n ora fa @@ -3996,7 +4031,7 @@ Dimensione del download: %3 - + %n day(s) ago %n giorno fa @@ -4095,115 +4130,115 @@ Dimensione del download: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROM per Game Boy Advance (%1) - + Game Boy ROMs (%1) ROM per Game Boy (%1) - + All ROMs (%1) Tutte le ROM (%1) - + %1 Video Logs (*.mvl) %1 log Video (*.mvl) - + Archives (%1) Archivi (%1) - - - + + + Select ROM Seleziona ROM - - + + Select save Seleziona salvataggio - + Select patch Seleziona patch - + Patches (*.ips *.ups *.bps) Patch (*.ips *.ups *.bps) - + Select e-Reader dotcode Selezione e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) e-Reader card (*.raw *.bin *.bmp) - + Select e-Reader card images Seleziona immagini carte e-Reader - + Image file (*.png *.jpg *.jpeg) File immagine (*.png *.jpg *.jpeg) - + Conversion finished Conversione terminata - + %1 of %2 e-Reader cards converted successfully. %1 di %2 carte e-Reader convertite con successo. - + Select image Seleziona immagine - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) File immagine (*.png *.gif *.jpg *.jpeg);;Tutti i file (*) - + GameShark saves (*.sps *.xps) Salvataggi GameShark (*.sps *.xps) - + Select video log Seleziona log video - + Video logs (*.mvl) Log video (*.mvl) - + Crash Errore fatale - + The game has crashed with the following error: %1 @@ -4212,644 +4247,649 @@ Dimensione del download: %3 %1 - + Unimplemented BIOS call BIOS non implementato - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Questo gioco utilizza una chiamata BIOS non implementata. Utilizza il BIOS ufficiale per una migliore esperienza. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Impossibile creare un dispositivo di visualizzazione appropriato, tornando alla visualizzazione software. I giochi possono funzionare lentamente, specialmente con finestre più grandi. - + Really make portable? Vuoi davvero rendere portatile l'applicazione? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? In questo modo l'emulatore carica la propria configurazione dalla stessa cartella dell'eseguibile. Vuoi continuare? - + Restart needed È necessario riavviare - + Some changes will not take effect until the emulator is restarted. Alcune modifiche non avranno effetto finché l'emulatore non verrà riavviato. - + - Player %1 of %2 - Giocatore %1 di %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File File - + Load &ROM... Carica ROM... - + Load ROM in archive... Carica la ROM in archivio... - + Load &patch... Carica patch... - + Boot BIOS Avvia BIOS - + Replace ROM... Sostituisci la ROM... - + Scan e-Reader dotcodes... Scansiona e-Reader dotcode... - + Convert e-Reader card image to raw... Converti immagini carte e-Reader in raw... - + ROM &info... Informazioni ROM... - + Recent Recenti - + Make portable Rendi portatile - + &Load state Carica stato - + &Save state Salva stato - + Quick load Caricamento rapido - + Quick save Salvataggio rapido - + Load recent Carica recente - + Save recent Salva recente - + Undo load state Annulla il caricamento dello stato - + Undo save state Annulla salvataggio stato - - + + State &%1 Stato %1 - + Load camera image... Carica immagine fotocamera... - + Convert save game... Converti salvataggi... - + GameShark saves (*.gsv *.sps *.xps) Salvataggi GameShark (*.gsv *.sps *.xps) - + New multiplayer window Nuova finestra multigiocatore - + Connect to Dolphin... Connessione a Dolphin... - + Report bug... Segnala bug... - + E&xit Esci (&X) - + &Emulation Emulazione - + &Reset Reset - + Sh&utdown Spegni (&U) - + Yank game pak Yank game pak - + &Pause Pausa - + &Next frame Salta il prossimo frame (&N) - + Fast forward (held) Avanzamento rapido (tieni premuto) - + &Fast forward Avanzamento rapido (&F) - + Fast forward speed Velocità di avanzamento rapido - + Unbounded Illimitata - + %0x %0x - + Rewind (held) Riavvolgimento (tieni premuto) - + Re&wind Riavvolgimento (&W) - + Step backwards Torna indietro - - Sync to &video - Sincronizza con il video - - - - Sync to &audio - Sincronizza con l'audio - - - + Solar sensor Sensore solare - + Increase solar level Incrementa il livello solare - + Decrease solar level Riduci il livello solare - + Brightest solar level Livello solare massimo - + Darkest solar level Livello solare minimo - + Brightness %1 Luminosità %1 - + Audio/&Video Audio/Video - + Frame size Dimensione frame - + Toggle fullscreen Abilita schermo Intero - + Lock aspect ratio Blocca rapporti aspetto - + Frame&skip Salto frame - + Mute Muto - + FPS target FPS finali - + Take &screenshot Acquisisci schermata - + F12 F12 - + Record GIF/WebP/APNG... Registra GIF / WebP / APNG ... - + Video layers Layers video - + Audio channels Canali audio - + &Tools Strumenti - + View &logs... Visualizza registri (&log)... - + Game &overrides... Valore specifico per il gioco... - + &Cheats... Trucchi... - + Open debugger console... Apri console debugger... - + Start &GDB server... Avvia server GDB... - + Settings... Impostazioni... - + Select folder Seleziona cartella - + Couldn't Start Non è stato possibile avviare - + Could not start game. Non è stato possibile avviare il gioco. - + Add folder to library... Aggiungi cartella alla libreria... - + Load state file... Carica stato di salvataggio... - + Save state file... Salva stato di salvataggio... - + Import GameShark Save... Importa Salvataggio GameShark... - + Export GameShark Save... Esporta Salvataggio GameShark... - + About... Informazioni… - + Force integer scaling Forza ridimensionamento a interi - + Bilinear filtering Filtro bilineare - + Game Boy Printer... Stampante Game Boy... - + Save games (%1) Salvataggi (%1) - + Select save game Seleziona salvataggio - + mGBA save state files (%1) file di stati di salvataggio mGBA (%1) - + Select save state Seleziona stato di salvataggio - + + Save games + Salva le partite + + + Load alternate save game... Carica stato di salvataggio alternativo... - + Load temporary save game... Carica salvataggio temporaneo... - + + Automatically determine + + + + + Use player %0 save game + + + + BattleChip Gate... BattleChip Gate... - + %1× %1x - + Interframe blending Miscelazione dei frame - + Native (59.7275) Nativo (59.7) - + Record A/V... Registra A/V... - + Adjust layer placement... Regola posizionamento layer... - + Game Pak sensors... Sensori Game Pak... - + View &palette... Mostra palette... - + View &sprites... Mostra sprites... - + View &tiles... Mostra tiles... - + View &map... Mostra mappa... - + &Frame inspector... &Frame inspector... - + View memory... Mostra memoria... - + Search memory... Ricerca memoria... - + View &I/O registers... Mostra registri I/O... - + Record debug video log... Registra video log di debug... - + Stop debug video log Ferma video log 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 @@ -5307,8 +5347,8 @@ Dimensione del download: %3 - - + + Mute Muto @@ -5354,7 +5394,7 @@ Dimensione del download: %3 - + frames frame @@ -5389,128 +5429,138 @@ Dimensione del download: %3 Blocca rapporti aspetto - - + + Pause Pausa - + When inactive: Quando inattiva: - + When minimized: Quando rimpicciolita: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Current channel: Canale attuale: - + Current version: Versione attuale: - + Update channel: Canale aggiornamento: - + Available version: Versione disponibile: - + (Unknown) (Sconosciuto) - + Last checked: Vista l'ultima volta: - + Automatically check on start Verifica automaticamente all'avvio - + Check now Verifica adesso - + Models Modelli - + GB only: Solo GB: - + SGB compatible: Compatibile SGB: - + GBC only: Solo GBC: - + GBC compatible: Compatibile BGC: - + SGB and GBC compatible: Compatibile SGB e GBC: - + Game Boy palette Tavolozza Game Boy - + Default color palette only Solo tavolozza colori predefinita - + SGB color palette if available Tavolozza colori SGB se disponibile - + GBC color palette if available Tavolozza colori GBC se disponibile - + SGB (preferred) or GBC color palette if available Tavolozza colori SGB (preferita) o GBC se disponibile - + Game Boy Camera Videocamera Game Boy - + Driver: Driver: - + Source: Sorgente: @@ -5525,133 +5575,133 @@ Dimensione del download: %3 Miscelazione dei frame - + Dynamically update window title Aggiorna dinamicamente il titolo della finestra - + Enable Discord Rich Presence Abilita Discord Rich Presence - + Save state extra data: Dati extra stato di salvataggio: - - + + Save game Salvataggio - + Load state extra data: Carica dati extra stato di salvataggio: - + Enable VBA bug compatibility in ROM hacks Abilita compatibilità con i bug di VBA nelle hack delle ROM - + Preset: Profilo: - + Show OSD messages Mostra messaggi OSD - + Show filename instead of ROM name in title bar Mostra nome file anziché nome ROM nella barra del titolo - + Fast forward (held) speed: Velocità di crociera: - + Enable Game Boy Player features by default Abilita funzionalità Game Boy Player per impostazione predefinita - + Video renderer: Rend. video: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements Miglioramenti OpenGL - + High-resolution scale: Rapporto alta risoluzione: - + (240×160) (240×160) - + XQ GBA audio (experimental) audio XQ GBA (sperimentale) - + Cheats Trucchi - + Log to file Registro log in file - + Log to console Registro log in console - + Select Log File Seleziona file log - + Default BG colors: Colori predefiniti sfondo: - + Super Game Boy borders Bordi Super Game Boy - + Default sprite colors 1: Colori predefiniti sprite 1: - + Default sprite colors 2: Colori predefiniti sprite 2: @@ -5671,36 +5721,36 @@ Dimensione del download: %3 Svuota la cache - + Fast forward speed: Velocità di avanzamento rapido: - - - - - - - - - + + + + + + + + + Browse Sfoglia - + Use BIOS file if found Usa il file del BIOS se è presente - + Skip BIOS intro Salta intro del BIOS - - + + Unbounded Illimitato @@ -5715,17 +5765,17 @@ Dimensione del download: %3 BIOS - + Run all esegui tutto - + Remove known rimuovi conosciuti - + Detect and remove rileva e rimuovi @@ -5735,19 +5785,19 @@ Dimensione del download: %3 Consenti direzioni opposte - - + + Screenshot Schermata - - + + Cheat codes Trucchi - + Enable rewind Abilita riavvolgimento @@ -5777,96 +5827,96 @@ Dimensione del download: %3 vista ad albero - + Show FPS in title bar Mostra gli FPS nella barra del titolo - + Automatically save cheats Salva i trucchi automaticamente - + Automatically load cheats Carica i trucchi automaticamente - + Automatically save state Salva stato automaticamente - + Automatically load state Carica stato automaticamente - + Rewind history: Cronologia riavvolgimento: - + Idle loops: Cicli inattivi: - + Preload entire ROM into memory Precarica ROM in memoria - + Autofire interval: Intervallo Autofire: - + GB BIOS file: File BIOS del GB: - + GBA BIOS file: File BIOS del GBA: - + GBC BIOS file: File BIOS del GBC: - + SGB BIOS file: File BIOS del SGB: - + Save games Salva le partite - - - - - + + + + + Same directory as the ROM Stessa cartella della ROM - + Save states Salvataggio Stati - + Screenshots Schermate - + Patches Patch diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index 04c3ff979..ec30389cf 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -1185,14 +1185,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 倍率 - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1435,42 +1442,62 @@ Download size: %3 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 GDBサーバを起動できませんでした @@ -3678,6 +3705,14 @@ Download size: %3 %1 byte%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3855,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive バグレポートアーカイブ - + ZIP archive (*.zip) ZIPアーカイブ (*.zip) @@ -3963,34 +3998,34 @@ Download size: %3 - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4088,100 +4123,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ゲームボーイアドバンスファイル (%1) - + Game Boy ROMs (%1) ゲームボーイファイル (%1) - + All ROMs (%1) すべてのファイル (%1) - + %1 Video Logs (*.mvl) %1ビデオログ (*.mvl) - + Archives (%1) アーカイブファイル (%1) - - - + + + Select ROM ROMを開く - + Select folder フォルダを開く - - + + Select save セーブを開く - + Select patch パッチを開く - + Patches (*.ips *.ups *.bps) パッチファイル (*.ips *.ups *.bps) - + Select e-Reader dotcode カードeを開く - + e-Reader card (*.raw *.bin *.bmp) カードe (*.raw *.bin *.bmp) - + Select image 画像を開く - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 画像ファイル (*.png *.gif *.jpg *.jpeg);;すべてのファイル (*) - + GameShark saves (*.sps *.xps) GameSharkセーブファイル (*.sps *.xps) - + Select video log ビデオログを開く - + Video logs (*.mvl) ビデオログ (*.mvl) - + Crash クラッシュ - + The game has crashed with the following error: %1 @@ -4190,659 +4225,664 @@ Download size: %3 %1 - + Couldn't Start 起動失敗 - + Could not start game. ゲームを起動できませんでした。 - + Unimplemented BIOS call 未実装のBIOS呼び出し - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. このゲームは実装されていないBIOS呼び出しを使用します。最高のエクスペリエンスを得るには公式のBIOSを使用してください。 - + 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 of %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &ファイル (&F) - + Load &ROM... ROMをロード... - + Load ROM in archive... アーカイブにROMをロード... - + Add folder to library... ライブラリーにフォルダを追加... - + Load &patch... パッチをロード... (&P) - + Boot BIOS BIOSを起動 - + Replace ROM... ROMを交換... - + Scan e-Reader dotcodes... カードeをスキャン... - + ROM &info... ROM情報... (&I) - + Recent 最近開いたROM - + Make portable ポータブル化 - + &Load state ステートをロード (&L) - + Report bug... バグ報告 - + About... バージョン情報... - + Record GIF/WebP/APNG... GIF/WebP/APNGを記録 - + Game Pak sensors... カートリッジセンサー... - + Clear 消去 - + Load state file... ステートファイルをロード... - + 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... - + Convert e-Reader card image to raw... - + &Save state ステートをセーブ (&S) - + Save state file... ステートファイルをセーブ... - + Quick load クイックロード - + Quick save クイックセーブ - + Load recent 最近使ったクイックロットからロード - + Save recent 最近使ったクイックロットにセーブ - + Undo load state クイックロードを元に戻す - + Undo save state クイックセーブを元に戻す - - + + State &%1 クイックスロット &%1 - + Load camera image... カメラ画像をロード... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... GameSharkスナップショットを読み込む - + Export GameShark Save... GameSharkスナップショットを書き出す - + New multiplayer window 新しいウィンドウ(マルチプレイ) - + Connect to Dolphin... - + E&xit 終了 (&X) - + &Emulation エミュレーション (&E) - + &Reset リセット (&R) - + Sh&utdown 閉じる (&U) - + Yank game pak ゲームパックをヤンク - + &Pause 一時停止 (&P) - + &Next frame 次のフレーム (&N) - + Fast forward (held) 早送り(押し) - + &Fast forward 早送り (&F) - + Fast forward speed 早送り速度 - + Unbounded 制限なし - + %0x %0x - + Rewind (held) 巻戻し(押し) - + Re&wind 巻戻し (&R) - + Step backwards 1フレーム巻き戻す - - Sync to &video - ビデオ同期 (&V) - - - - Sync to &audio - オーディオ同期 (&A) - - - + Solar sensor 太陽センサー - + Increase solar level 明るさを上げる - + Decrease solar level 明るさを下げる - + Brightest solar level 明るさ最高 - + Darkest solar level 明るさ最低 - + Brightness %1 明るさ %1 - + Audio/&Video オーディオ/ビデオ (&V) - + Frame size 画面サイズ - + Toggle fullscreen 全画面表示 - + Lock aspect ratio 縦横比を固定 - + Force integer scaling 整数スケーリングを強制 - + Bilinear filtering バイリニアフィルタリング - + Frame&skip フレームスキップ (&S) - + Mute ミュート - + FPS target FPS - + Native (59.7275) ネイティブ(59.7275) - + Take &screenshot スクリーンショット (&S) - + F12 F12 - + Game Boy Printer... ポケットプリンタ... - + + Save games + セーブデータ + + + + Automatically determine + + + + + Use player %0 save game + + + + BattleChip Gate... チップゲート... - + %1× %1× - + Interframe blending フレーム間混合 - + Record A/V... ビデオ録画... - + Video layers ビデオレイヤー - + Audio channels オーディオチャンネル - + Adjust layer placement... レイヤーの配置を調整... - + &Tools ツール (&T) - + View &logs... ログビューアー... (&L) - + Game &overrides... ゲーム別設定... (&O) - + &Cheats... チート... (&C) - + Settings... 設定... - + Open debugger console... デバッガコンソールを開く... - + Start &GDB server... GDBサーバを起動... (&G) - + View &palette... パレットビューアー... (&P) - + View &sprites... スプライトビューアー... (&S) - + View &tiles... タイルビューアー... (&T) - + View &map... マップビューアー... (&M) - + &Frame inspector... フレームインスペクタ... (&F) - + View memory... メモリビューアー... - + Search memory... メモリ検索... - + View &I/O registers... IOビューアー... (&I) - + 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 連打 左 @@ -5305,8 +5345,8 @@ Download size: %3 - - + + Mute ミュート @@ -5352,7 +5392,7 @@ Download size: %3 - + frames フレーム @@ -5392,93 +5432,103 @@ Download size: %3 バイリニアフィルタリング - - + + Pause - + When inactive: - + When minimized: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + 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: @@ -5493,98 +5543,98 @@ Download size: %3 フレーム間混合 - + Dynamically update window title ウィンドウタイトルを動的に更新 - + Show OSD messages OSDメッセージを表示 - + Fast forward (held) speed: 早送り(押し)速度: - + 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: - + Enable Game Boy Player features by default ゲームボーイプレーヤーの機能をデフォルトで有効化 - + (240×160) (240×160) - + Log to file ファイル出力 - + Log to console コンソール出力 - + Select Log File ログファイルを選択 @@ -5634,232 +5684,232 @@ Download size: %3 スクリーンセーバーを停止 - + Show FPS in title bar タイトルバーにFPSを表示 - + Automatically save cheats チートの自動セーブ - + Automatically load cheats チートの自動ロード - + Automatically save state ステートの自動セーブ - + Automatically load state ステートの自動ロード - + Enable Discord Rich Presence DiscordのRich Presenceを有効 - + Show filename instead of ROM name in title bar タイトルバーにゲーム名の代わりにファイル名を表示 - + Fast forward speed: 早送り速度: - - + + Unbounded 制限なし - + Enable rewind 巻戻し有効 - + Rewind history: 巻戻し履歴: - + Idle loops: アイドルループ: - + Run all すべて実行 - + Remove known 既知を削除 - + Detect and remove 検出して削除 - - + + Screenshot スクリーンショット - - + + Cheat codes チートコード - + Preload entire ROM into memory ROM全体をメモリにプリロード - + Autofire interval: 連射間隔: - + Enable VBA bug compatibility in ROM hacks - + Video renderer: ビデオレンダラー: - + Software ソフト - + OpenGL OpenGL - + OpenGL enhancements OpenGL機能強化 - + High-resolution scale: 高解像度スケール: - + XQ GBA audio (experimental) XQ GBA オーディオ機能(実験的) - + GB BIOS file: ゲームボーイBIOS: - - - - - - - - - + + + + + + + + + Browse 参照 - + Use BIOS file if found 存在する場合にBIOSファイルを使用 - + Skip BIOS intro BIOSイントロをスキップ - + GBA BIOS file: ゲームボーイアドバンスBIOS: - + GBC BIOS file: ゲームボーイカラーBIOS: - + SGB BIOS file: スーパーゲームボーイBIOS: - + Save games セーブデータ - - - - - + + + + + Same directory as the ROM ROMファイルと同じディレクトリ - + Save states セーブステート - + Screenshots スクリーンショット - + Patches パッチ - + Cheats チート - + Default BG colors: デフォルト背景色: - + Super Game Boy borders スーパーゲームボーイのボーダー - + Default sprite colors 1: デフォルトスプライト1: - + Default sprite colors 2: デフォルトスプライト2: diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index b004997a1..2968cc217 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -1185,14 +1185,6 @@ Game Boy Advance는 Nintendo Co., Ltd.의 등록 상표입니다. - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1435,42 +1442,62 @@ Download size: %3 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 GDB 서버를 시작할 수 없습니다. @@ -3678,6 +3705,14 @@ Download size: %3 %1 바이트%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3855,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -3963,34 +3998,34 @@ Download size: %3 - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4088,115 +4123,115 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) 게임 보이 어드밴스 롬 (%1) - + Game Boy ROMs (%1) 게임 보이 (%1) - + All ROMs (%1) 모든 롬 (%1) - + %1 Video Logs (*.mvl) %1 비디오 로그 (*.mvl) - + Archives (%1) 아카이브 (%1) - - - + + + Select ROM 롬 선택 - - + + Select save 저장 파일 선택 - + Select patch 패치 선택 - + Patches (*.ips *.ups *.bps) 패치 (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Select image 이미지 선택 - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 이미지 파일 (*.png *.gif *.jpg *.jpeg);;모든 파일 (*) - + GameShark saves (*.sps *.xps) 게임샤크 저장 파일 (*.sps *.xps) - + Select video log 비디오 로그 선택 - + Video logs (*.mvl) 비디오 로그 (*.mvl) - + Crash 치명적인 오류 - + The game has crashed with the following error: %1 @@ -4205,644 +4240,649 @@ Download size: %3 %1 - + 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 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &파일 - + Load &ROM... 로드 &롬... - + Load ROM in archive... 롬을 아카이브에 로드... - - Load &patch... - 로드 &패치... + + Save games + 게임 저장 - - Boot BIOS - BIOS 부팅 - - - - Replace ROM... - 롬 교체... - - - - Scan e-Reader dotcodes... + + Automatically determine - - - Convert e-Reader card image to raw... - - - - - ROM &info... - 롬 &정보... - - - - Recent - 최근 실행 - - - - Make portable - 휴대용 만들기 - - - - &Load state - &로드 파일 상태 - - - - &Save state - &저장 파일 상태 - - - - Quick load - 빠른 로드 - - - - Quick save - 빠른 저장 - - - - Load recent - 최근 실행 로드 - - - - Save recent - 최근 실행 저장 - - - - Undo load state - 로드 파일 상태 복원 - - - - Undo save state - 저장 파일 상태 복원 - - - - - State &%1 - 상태 &%1 - - - - Load camera image... - 카메라 이미지 로드... - - - - Convert save game... - - - - - GameShark saves (*.gsv *.sps *.xps) - - - - - New multiplayer window - 새로운 멀티 플레이어 창 - - - - Connect to Dolphin... - - - - - E&xit - 종&료 - - - - &Emulation - &에뮬레이션 - - - - &Reset - &재설정 - - - - Sh&utdown - 종&료 - - - - Yank game pak - 양키 게임 팩 - - - - &Pause - &정지 - - - - &Next frame - &다음 프레임 - - - - Fast forward (held) - 빨리 감기 (누름) - - - - &Fast forward - &빨리 감기 - - - - Fast forward speed - 빨리 감기 속도 - - - - Unbounded - 무제한 - - - - %0x - %0x - - - - Rewind (held) - 되김기 (누름) - - - - Re&wind - 리&와인드 - - - - Step backwards - 돌아가기 - - - - Sync to &video - 비디오 &동기화 - - - - Sync to &audio - 오디오 &동기화 - - - - Brightest solar level - 가장 밝은 태양 수준 - - - - Darkest solar level - 가장 어두운 태양 수준 - - - - Brightness %1 - 밝기 %1 - - - - Audio/&Video - 오디오/&비디오 - - - - Frame size - 프레임 크기 - - - - Toggle fullscreen - 전체화면 전환 - - - - Lock aspect ratio - 화면비 잠금 - - - - Frame&skip - 프레임&건너뛰기 - - - - Mute - 무음 - - - - FPS target - FPS 대상 - - - - Take &screenshot - 스크린샷 &찍기 - - - - F12 - F12 - - - - Video layers - 비디오 레이어 - - - - Audio channels - 오디오 채널 - - - - &Tools - &도구 - - - - View &logs... - 로그 &보기... - - - - Game &overrides... - 게임 &오버라이드... - - - - &Cheats... - &치트.. - - - - Open debugger console... - 디버거 콘솔 열기... - - - - Start &GDB server... - GDB 서버 &시작... - - - - Settings... - 설정... - - - - Select folder - 폴더 선택 - - - - Couldn't Start - - - - - Could not start game. - - - - - Add folder to library... - 라이브러리에 폴더 추가... - - Load state file... + Use player %0 save game - Save state file... + Load &patch... + 로드 &패치... + + + + Boot BIOS + BIOS 부팅 + + + + Replace ROM... + 롬 교체... + + + + Scan e-Reader dotcodes... - - Import GameShark Save... + + Convert e-Reader card image to raw... + + + ROM &info... + 롬 &정보... + + + + Recent + 최근 실행 + + + + Make portable + 휴대용 만들기 + + + + &Load state + &로드 파일 상태 + + + + &Save state + &저장 파일 상태 + + + + Quick load + 빠른 로드 + + + + Quick save + 빠른 저장 + + + + Load recent + 최근 실행 로드 + - Export GameShark Save... + Save recent + 최근 실행 저장 + + + + Undo load state + 로드 파일 상태 복원 + + + + Undo save state + 저장 파일 상태 복원 + + + + + State &%1 + 상태 &%1 + + + + Load camera image... + 카메라 이미지 로드... + + + + Convert save game... - - Report bug... + + GameShark saves (*.gsv *.sps *.xps) - - About... + + New multiplayer window + 새로운 멀티 플레이어 창 + + + + Connect to Dolphin... - - Solar sensor - + + E&xit + 종&료 + + + + &Emulation + &에뮬레이션 + + + + &Reset + &재설정 + + + + Sh&utdown + 종&료 + + + + Yank game pak + 양키 게임 팩 + + + + &Pause + &정지 + + + + &Next frame + &다음 프레임 + + + + Fast forward (held) + 빨리 감기 (누름) + + + + &Fast forward + &빨리 감기 + + + + Fast forward speed + 빨리 감기 속도 + + + + Unbounded + 무제한 + + + + %0x + %0x + + + + Rewind (held) + 되김기 (누름) + + + + Re&wind + 리&와인드 - Increase solar level - + Step backwards + 돌아가기 - - Decrease solar level - + + Brightest solar level + 가장 밝은 태양 수준 - - Force integer scaling - 정수 스케일링 강제 수행 - - - - Bilinear filtering - 이중선형 필터링 + + Darkest solar level + 가장 어두운 태양 수준 - Game Boy Printer... - 게임 보이 프린터... + Brightness %1 + 밝기 %1 - - Save games (%1) + + Audio/&Video + 오디오/&비디오 + + + + Frame size + 프레임 크기 + + + + Toggle fullscreen + 전체화면 전환 + + + + Lock aspect ratio + 화면비 잠금 + + + + Frame&skip + 프레임&건너뛰기 + + + + Mute + 무음 + + + + FPS target + FPS 대상 + + + + Take &screenshot + 스크린샷 &찍기 + + + + F12 + F12 + + + + Video layers + 비디오 레이어 + + + + Audio channels + 오디오 채널 + + + + &Tools + &도구 + + + + View &logs... + 로그 &보기... + + + + Game &overrides... + 게임 &오버라이드... + + + + &Cheats... + &치트.. + + + + Open debugger console... + 디버거 콘솔 열기... + + + + Start &GDB server... + GDB 서버 &시작... + + + + Settings... + 설정... + + + + Select folder + 폴더 선택 + + + + Couldn't Start - - Select save game - - - - - mGBA save state files (%1) - - - - - - Select save state - - - - - Load alternate save game... + + Could not start game. + Add folder to library... + 라이브러리에 폴더 추가... + + + + Load state file... + + + + + Save state file... + + + + + Import GameShark Save... + + + + + Export GameShark Save... + + + + + Report bug... + + + + + About... + + + + + Solar sensor + + + + + Increase solar level + + + + + Decrease solar level + + + + + Force integer scaling + 정수 스케일링 강제 수행 + + + + Bilinear filtering + 이중선형 필터링 + + + + Game Boy Printer... + 게임 보이 프린터... + + + + Save games (%1) + + + + + Select save game + + + + + mGBA save state files (%1) + + + + + + Select save state + + + + + Load alternate save game... + + + + Load temporary save game... - + BattleChip Gate... - + %1× %1x {1×?} - + Interframe blending - + Native (59.7275) Nativo (59.7) {59.7275)?} - + Record A/V... - + Record GIF/WebP/APNG... - + Adjust layer placement... 레이어 배치 조정... - + Game Pak sensors... - + View &palette... 팔레트 &보기... - + View &sprites... 스프라이트 &보기... - + View &tiles... 타일 &보기... - + View &map... 지도 &보기... - + &Frame inspector... - + View memory... 메모리 보기... - + Search memory... 메모리 검색... - + View &I/O registers... I/O 레지스터 &보기... - + 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 연사 왼쪽 @@ -5300,8 +5340,8 @@ Download size: %3 - - + + Mute 무음 @@ -5347,7 +5387,7 @@ Download size: %3 - + frames 프레임 @@ -5382,93 +5422,93 @@ Download size: %3 화면비 잠금 - - + + 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: @@ -5483,168 +5523,178 @@ Download size: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Enable Discord Rich Presence - + Fast forward (held) speed: - + 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: - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL 오픈GL - + OpenGL enhancements - + High-resolution scale: - + (240×160) - + XQ GBA audio (experimental) - + Cheats 치트 - + Default BG colors: 기본 배경 색상: - + Super Game Boy borders 슈퍼 게임 보이 테두리 - + Default sprite colors 1: 기본 스프라이트 색상 1: - + Log to file - + Log to console - + Select Log File - + Default sprite colors 2: 기본 스프라이트 색상 2: @@ -5664,36 +5714,36 @@ Download size: %3 캐시 지우기 - + Fast forward speed: 빨리 감기 속도: - - - - - - - - - + + + + + + + + + Browse 브라우저 - + Use BIOS file if found 발견되면 바이오스 파일 사용 - + Skip BIOS intro 바이오스 소개 건너 뛰기 - - + + Unbounded 무제한 @@ -5708,17 +5758,17 @@ Download size: %3 바이오스 - + Run all 모두 실행 - + Remove known 알려진 것 제거 - + Detect and remove 감지 및 제거 @@ -5728,19 +5778,19 @@ Download size: %3 반대 방향 입력 허용 - - + + Screenshot 스크린샷 - - + + Cheat codes 치트 코드 - + Enable rewind Abilita riavvolgimento @@ -5770,96 +5820,96 @@ Download size: %3 트리 보기 - + Show FPS in title bar 제목 표시 줄에 FPS 표시 - + Automatically save cheats 자동 치트 저장 - + Automatically load cheats 자동 치트 로드 - + Automatically save state 자동 상태 저장 - + Automatically load state 자동 상태 로드 - + Rewind history: 되감기 기록: - + Idle loops: Idle loops: - + Preload entire ROM into memory 전체 롬을 메모리에 미리 로드하십시오. - + Autofire interval: Intervallo Autofire: - + GB BIOS file: GB 바이오스 파일: - + GBA BIOS file: GBA 바이오스 파일: - + GBC BIOS file: GBC 바이오스 파일: - + SGB BIOS file: SGB 바이오스 파일: - + Save games 게임 저장 - - - - - + + + + + Same directory as the ROM 롬과 같은 디렉토리 - + Save states 저장 파일 상태 - + Screenshots 스크린샷 - + Patches 패치 diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index 5f32ccf98..70af448b3 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -1184,14 +1184,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Salin - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1304,27 +1296,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1434,42 +1441,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings Tetapan pelayan - + Local port Port lokal - + Bind address Alamat terikat - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break - + Stop Henti - + Start Mula - + Crash Nahas - + Could not start GDB server Tidak dapat memulakan pelayan GDB @@ -3677,6 +3704,14 @@ Download size: %3 %1 bait%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3819,12 +3854,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Arkib laporan pepijat - + ZIP archive (*.zip) Arkib ZIP (*.zip) @@ -3962,34 +3997,34 @@ Download size: %3 Pilih direktori - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4087,100 +4122,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROM Game Boy Advance (%1) - + Game Boy ROMs (%1) ROM Game Boy (%1) - + All ROMs (%1) Semua ROM (%1) - + %1 Video Logs (*.mvl) %1 Log Video (*.mvl) - + Archives (%1) Arkib (%1) - - - + + + Select ROM Pilih ROM - + Select folder Pilih folder - - + + Select save - + Select patch - + Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image Pilih gambar - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Fail gambar (*.png *.gif *.jpg *.jpeg);;Semua fail (*) - + GameShark saves (*.sps *.xps) Simpanan GameShark (*.sps *.xps) - + Select video log Pilih log video - + Video logs (*.mvl) Log video (*.mvl) - + Crash Nahas - + The game has crashed with the following error: %1 @@ -4189,659 +4224,664 @@ Download size: %3 %1 - + Couldn't Start Tidak dapat memula - + Could not start game. Permainan tidak dapat bermula. - + Unimplemented BIOS call Panggilan BIOS yg belum dilaksanakan - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Permainan ini menggunakan panggilan BIOS yang belum dilaksanakan. Sila pakai BIOS rasmi untuk pengalaman yang lebih baik. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Gagal mencipta peranti paparan yang sesuai, berbalik ke paparan perisian. Permainan mungkin menjadi lembap, terutamanya dengan tetingkap besar. - + Really make portable? Betulkah mahu buat jadi mudah alih? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Ini akan menetapkan pelagak untuk muat konfigurasi dari direktori yang sama dengan fail bolehlakunya. Teruskan? - + Restart needed Mula semula diperlukan - + Some changes will not take effect until the emulator is restarted. Beberapa perubahan tidak akan dilaksanakan sehingga pelagak dimula semula. - + - Player %1 of %2 - Pemain %1 dari %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &File - + Load &ROM... Muat %ROM... - + Load ROM in archive... Muat ROM daripada arkib... - + Add folder to library... Tambah folder ke perpustakaan... - + Save games (%1) Simpanan permainan (%1) - + Select save game Pilih simpanan permainan - + mGBA save state files (%1) mGBA fail keadaan tersimpan (%1) - + Select save state Pilih keadaan tersimpan - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) Fail gambar (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Load alternate save game... Muat simpanan permainan alternatif... - + Load temporary save game... Muat simpanan permainan sementara... - + Load &patch... - + Boot BIOS But BIOS - + Replace ROM... Ganti ROM... - + Scan e-Reader dotcodes... - + Convert e-Reader card image to raw... - + ROM &info... &Perihal ROM... - + Recent Terkini - + Make portable Buat jadi mudah alih - + &Load state &Muat keadaan - + Load state file... Muat fail keadaan... - + &Save state &Simpan keadaan - + Save state file... Simpan fail keadaan... - + Quick load - + Quick save - + Load recent Muat terkini - + Save recent Simpan terkini - + Undo load state Buat asal keadaan termuat - + Undo save state Buat asal keadaan tersimpan - - + + State &%1 Keadaan &%1 - + Load camera image... Muat gambar kamera... - + Convert save game... Tukar simpanan permainan... - + GameShark saves (*.gsv *.sps *.xps) - + + Save games + Simpanan permainan + + + Import GameShark Save... Import Simpanan GameShark... - + Export GameShark Save... Eksport Simpanan GameShark... - - New multiplayer window - Tetingkap multipemain baru + + Automatically determine + - - Connect to Dolphin... - Sambung ke Dolphin... - - - - Report bug... - Laporkan pepijat... - - - - About... - Perihal... - - - - E&xit - &Keluar - - - - &Emulation - Pe&lagak - - - - &Reset + + Use player %0 save game + New multiplayer window + Tetingkap multipemain baru + + + + Connect to Dolphin... + Sambung ke Dolphin... + + + + Report bug... + Laporkan pepijat... + + + + About... + Perihal... + + + + E&xit + &Keluar + + + + &Emulation + Pe&lagak + + + + &Reset + + + + Sh&utdown &Matikan - + Yank game pak Alih keluar Game Pak - + &Pause &Jeda - + &Next frame Bingkai se&terusnya - + Fast forward (held) Mundar laju (pegang) - + &Fast forward Mundar &laju - + Fast forward speed Kelajuan mundar laju - + Unbounded Tidak terbatas - + %0x %0x - + Rewind (held) Putar balik (pegang) - + Re&wind Ma&ndir - + Step backwards Langkah belakang - - Sync to &video - Segerak ke &video - - - - Sync to &audio - Segerak ke &audio - - - + Solar sensor Pengesan suria - + Increase solar level Meningkatkan aras suria - + Decrease solar level Mengurangkan aras suria - + Brightest solar level Aras suria paling terang - + Darkest solar level Aras suria paling gelap - + Brightness %1 Kecerahan %1 - + Game Boy Printer... Pencetak Game Boy... - + BattleChip Gate... BattleChip Gate... - + Audio/&Video Audio/&Video - + Frame size Saiz bingkai - + %1× %1× - + Toggle fullscreen Togol skrinpenuh - + Lock aspect ratio Kekalkan nisbah aspek - + Force integer scaling Paksa skala integer - + Interframe blending Persebatian antarabingkai - + Bilinear filtering Penapisan bilinear - + Frame&skip Langkauan &bingkai - + Mute Senyap - + FPS target Sasaran FPS - + Native (59.7275) Asal (59.7275) - + Take &screenshot Ambil &cekupan skrin - + F12 F12 - + Record A/V... Rakam A/V... - + Record GIF/WebP/APNG... Rakam GIF/WebP/APNG... - + Video layers Lapisan video - + Audio channels Saluran audio - + Adjust layer placement... Melaras peletakan lapisan... - + &Tools &Alat - + View &logs... Lihat &log... - + Game &overrides... - + Game Pak sensors... Pengesan Game Pak... - + &Cheats... &Tipu... - + Settings... Tetapan... - + Open debugger console... Buka konsol penyahpepijat... - + Start &GDB server... Mula pelayan &GDB... - + View &palette... Pelihat &palet... - + View &sprites... - + View &tiles... Pelihat &jubin... - + View &map... Pelihat pe&ta... - + &Frame inspector... Periksa &bingkai... - + View memory... Lihat ingatan... - + Search memory... Cari ingatan... - + View &I/O registers... Lihat daftar &I/O... - + 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 @@ -5304,8 +5344,8 @@ Download size: %3 - - + + Mute Senyap @@ -5351,7 +5391,7 @@ Download size: %3 - + frames bingkai @@ -5396,93 +5436,93 @@ Download size: %3 Penapisan bilinear - - + + 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 Palet warna piawai sahaja - + SGB color palette if available Palet warna SGB jika ada - + GBC color palette if available Palet warna GBC jika ada - + SGB (preferred) or GBC color palette if available SGB (pilihan utama) atau palet warna GBC jika ada - + Game Boy Camera Game Boy Camera - + Driver: Pemacu: - + Source: Sumber: @@ -5537,328 +5577,338 @@ Download size: %3 Gantung screensaver - + Dynamically update window title Kemaskini tajuk tetingkap secara dinamik - + Show filename instead of ROM name in title bar Tunjuk nama ROM dan bukan nama fail dalam bar tajuk - + Show OSD messages Tunjuk mesej OSD - + Enable Discord Rich Presence Dayakan Discord Rich Presence - + Automatically save state Simpan keadaan secara automatik - + Automatically load state Muat keadaan secara automatik - + Automatically save cheats Simpan tipuan secara automatik - + Automatically load cheats Muat tipuan secara automatik - + Show FPS in title bar Tunjuk FPS dalam bar tajuk - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Fast forward speed: Kelajuan mundar laju: - - + + Unbounded Tidak terbatas - + Fast forward (held) speed: Kelajuan mundar laju (pegang): - + Autofire interval: - + Enable rewind Dayakan putar balik - + Rewind history: Sejarah putar balik: - + Idle loops: - + Run all Jalan semua - + Remove known Buang yg diketahui - + Detect and remove Kesan dan buang - + Preload entire ROM into memory Pra-muat selurus ROM ke dalam ingatan - + Save state extra data: Data ekstra keadaan tersimpan: - - + + Save game Simpanan permainan - + Load state extra data: Data ekstra keadaan muat: - + Models Model - + GB only: GB sahaja: - + SGB compatible: SGB serasi: - + GBC only: GBC sahaja: - + GBC compatible: GBC serasi: - + SGB and GBC compatible: SGB dan GBC serasi: - + Game Boy palette Palet Game Boy - + Preset: Praset: - - + + Screenshot Cekupan skrin - - + + Cheat codes Kod tipu - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software Perisian - + OpenGL OpenGL - + OpenGL enhancements - + High-resolution scale: - + (240×160) (240×160) - + XQ GBA audio (experimental) - + GB BIOS file: Fail BIOS GB: - - - - - - - - - + + + + + + + + + Browse Pilih fail - + Use BIOS file if found Guna fail BIOS jika ada - + Skip BIOS intro Langkau pendahuluan BIOS - + GBA BIOS file: Fail BIOS GBA: - + GBC BIOS file: Fail BIOS GBC: - + SGB BIOS file: Fail BIOS SGB: - + Save games Simpanan permainan - - - - - + + + + + Same directory as the ROM Direktori sama dengan ROM - + Save states Keadaan tersimpan - + Screenshots Cekupan skrin - + Patches - + Cheats Tipuan - + Log to file Log dalam fail - + Log to console Log dalam konsol - + Select Log File Pilih fail log - + Default BG colors: Warna LB piawai: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index c8272fb1f..34e3acd07 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -1185,14 +1185,6 @@ Game Boy Advance er et registrert varemerke tilhørende Nintendo Co., Ltd.Kopier - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 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 @@ -1435,42 +1442,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings Tjenerinnstillinger - + Local port Lokal port - + Bind address - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break - + Stop Stopp - + Start Start - + Crash Krasj - + Could not start GDB server Kunne ikke starte GDB-tjener @@ -3678,6 +3705,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3855,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) ZIP-arkiv (*.zip) @@ -3963,27 +3998,27 @@ Download size: %3 Velg mappe - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3991,7 +4026,7 @@ Download size: %3 - + %n day(s) ago @@ -4090,759 +4125,764 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) - + Game Boy ROMs (%1) - + All ROMs (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) Arkiv (%1) - - - + + + Select ROM Velg ROM - + Select folder Velg mappe - - + + Select save - + Select patch Velg feilfiks - + Patches (*.ips *.ups *.bps) Feilfikser (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image Velg bilde - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Bildefil (*.png *.gif *.jpg *.jpeg);;All filer (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash Krasj - + 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) - + + Save games + + + + Import GameShark Save... - + Export GameShark Save... - - New multiplayer window + + Automatically determine - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset + + Use player %0 save game - Sh&utdown - - - - - Yank game pak + New multiplayer window - &Pause + Connect to Dolphin... - - &Next frame + + 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 Tøm @@ -5305,8 +5345,8 @@ Download size: %3 - - + + Mute @@ -5352,7 +5392,7 @@ Download size: %3 - + frames @@ -5397,93 +5437,93 @@ Download size: %3 - - + + 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: @@ -5538,328 +5578,338 @@ Download size: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + 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 - - + + Cheat codes - + Enable Game Boy Player features by default - + Enable VBA bug compatibility in ROM hacks - + Video renderer: - + Software - + OpenGL OpenGL - + 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 Juks - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index 15b425687..eebb7a954 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -1184,14 +1184,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Vergroting - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1304,27 +1296,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1434,42 +1441,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings - + Local port - + Bind address - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break - + Stop Stop - + Start Start - + Crash - + Could not start GDB server @@ -3677,6 +3704,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3819,12 +3854,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -3962,27 +3997,27 @@ Download size: %3 - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3990,7 +4025,7 @@ Download size: %3 - + %n day(s) ago @@ -4089,759 +4124,764 @@ 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) - + + Save games + + + + Import GameShark Save... - + Export GameShark Save... - - New multiplayer window + + Automatically determine - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset + + Use player %0 save game - Sh&utdown - - - - - Yank game pak + New multiplayer window - &Pause + Connect to Dolphin... - - &Next frame + + 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 @@ -5304,8 +5344,8 @@ Download size: %3 - - + + Mute @@ -5351,7 +5391,7 @@ Download size: %3 - + frames @@ -5396,128 +5436,138 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + 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: @@ -5572,293 +5622,293 @@ Download size: %3 - + Dynamically update window title - + Show FPS in title bar - + Save state extra data: - - + + Save game - + Load state extra data: - + Enable VBA bug compatibility in ROM hacks - + Preset: - + Enable Discord Rich Presence - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show OSD messages - + Show filename instead of ROM name 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 - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Video renderer: - + Software - + OpenGL - + 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: diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index e4300e0fa..d519f4c9c 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -1185,14 +1185,6 @@ Game Boy Advance jest zarejestrowanym znakiem towarowym Nintendo Co., Ltd.Kopiuj - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1307,27 +1299,42 @@ Rozmiar pobierania: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 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 @@ -1437,42 +1444,62 @@ Rozmiar pobierania: %3 QGBA::GDBWindow - + Server settings Ustawienia serwera - + Local port Port lokalny - + Bind address Adres powiązania - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Przerwij - + Stop Stop - + Start Start - + Crash Crash - + Could not start GDB server Nie można uruchomić serwera GDB @@ -2773,7 +2800,7 @@ Rozmiar pobierania: %3 Start - + Start @@ -3178,7 +3205,7 @@ Rozmiar pobierania: %3 Mode - + Tryb @@ -3307,7 +3334,7 @@ Rozmiar pobierania: %3 Unknown - + Nieznana @@ -3503,7 +3530,7 @@ Rozmiar pobierania: %3 Priority - + Priorytet @@ -3526,7 +3553,7 @@ Rozmiar pobierania: %3 Offset - + Offset @@ -3546,7 +3573,7 @@ Rozmiar pobierania: %3 None - + Nic @@ -3578,7 +3605,7 @@ Rozmiar pobierania: %3 Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) @@ -3591,7 +3618,7 @@ Rozmiar pobierania: %3 Failed to open output file: %1 - + Nie udało się otworzyć pliku wyjściowego: %1 @@ -3619,12 +3646,12 @@ Rozmiar pobierania: %3 All - + Wszystkie Load TBL - + Załaduj TBL @@ -3634,7 +3661,7 @@ Rozmiar pobierania: %3 Failed to open output file: %1 - + Nie udało się otworzyć pliku wyjściowego: %1 @@ -3680,6 +3707,14 @@ Rozmiar pobierania: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3708,7 +3743,7 @@ Rozmiar pobierania: %3 Normal - + Normalna @@ -3739,7 +3774,7 @@ Rozmiar pobierania: %3 Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) @@ -3822,12 +3857,12 @@ Rozmiar pobierania: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -3926,7 +3961,7 @@ Rozmiar pobierania: %3 None - + Nic @@ -3965,27 +4000,27 @@ Rozmiar pobierania: %3 - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3994,7 +4029,7 @@ Rozmiar pobierania: %3 - + %n day(s) ago @@ -4065,7 +4100,7 @@ Rozmiar pobierania: %3 Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) @@ -4088,765 +4123,770 @@ Rozmiar pobierania: %3 Select output file - + Wybierz plik wyjściowy 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 - + 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) - + + Save games + + + + Import GameShark Save... - + Export GameShark Save... - - New multiplayer window + + Automatically determine - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset + + Use player %0 save game - Sh&utdown - - - - - Yank game pak + New multiplayer window - &Pause + Connect to Dolphin... - - &Next frame + + 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 %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× %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 Wyczyść @@ -5019,7 +5059,7 @@ Rozmiar pobierania: %3 SRAM - + SRAM @@ -5102,7 +5142,7 @@ Rozmiar pobierania: %3 Realtime clock - + Zegar czasu rzeczywistego @@ -5132,7 +5172,7 @@ Rozmiar pobierania: %3 Light sensor - + Czujnik światła @@ -5159,7 +5199,7 @@ Rozmiar pobierania: %3 Gyroscope - + Żyroskop @@ -5217,7 +5257,7 @@ Rozmiar pobierania: %3 Game Boy - + Game Boy @@ -5309,8 +5349,8 @@ Rozmiar pobierania: %3 - - + + Mute @@ -5356,7 +5396,7 @@ Rozmiar pobierania: %3 - + frames @@ -5401,93 +5441,93 @@ Rozmiar pobierania: %3 - - + + 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: @@ -5542,328 +5582,338 @@ Rozmiar pobierania: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + Show OSD messages - + Enable Discord Rich Presence - + Włącz 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 - - + + Cheat codes - + 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) - + 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 - + Kody (cheaty) - + Log to file - + Log to console - + Select Log File - + Default BG colors: - + Default sprite colors 1: - + Default sprite colors 2: - + Super Game Boy borders @@ -5987,7 +6037,7 @@ Rozmiar pobierania: %3 Start - + Start @@ -6100,7 +6150,7 @@ Rozmiar pobierania: %3 None - + Nic diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 6856fd1a9..251ee9cb2 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -1185,14 +1185,6 @@ Game Boy Advance - зарегистрированная торговая мар Увеличение - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1307,27 +1299,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1437,42 +1444,62 @@ Download size: %3 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 Не удалось запустить GDB-сервер @@ -3680,6 +3707,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3822,12 +3857,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Архив отчётов об ошибках - + ZIP archive (*.zip) ZIP архив (*.zip) @@ -3965,27 +4000,27 @@ Download size: %3 Выбор папки - + (%1×%2) - + Never Никогда - + Just now Только сейчас - + Less than an hour ago Менее часа назад - + %n hour(s) ago %n час назад @@ -3994,7 +4029,7 @@ Download size: %3 - + %n day(s) ago %n день назад @@ -4094,100 +4129,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Игры Game Boy Advance (%1) - + Game Boy ROMs (%1) Игры Game Boy (%1) - + All ROMs (%1) Все игры (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) Архивы (%1) - - - + + + Select ROM Выбор игры - + Select folder Выбор папки - - + + Select save Выбор сохранения - + Select patch Выбор патча - + Patches (*.ips *.ups *.bps) Патчи (*.ips *.ups *.bps) - + Select e-Reader dotcode Выбор карточки e-Reader - + e-Reader card (*.raw *.bin *.bmp) Карточка e-Reader (*.raw *.bin *.bmp) - + Select image Выбор изображения - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Файл изображения (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) Сохранения GameShark (*.sps *.xps) - + Select video log Выбор видеолога - + Video logs (*.mvl) Видеологи (*.mvl) - + Crash Сбой - + The game has crashed with the following error: %1 @@ -4196,659 +4231,664 @@ Download size: %3 %1 - + Couldn't Start Запуск не удался - + Could not start game. Не удалось запустить игру. - + Unimplemented BIOS call Неизвестный вызов BIOS - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Игра использует нереализованный вызов BIOS. Пожалуйста, воспользуйтесь официальным BIOS для лучшей совместимости. - + 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) Игровые сохранения (%1) - + Select save game Выбор игрового сохранения - + mGBA save state files (%1) Файл сохранения состояния mGBA (%1) - + Select save state Выбор сохранения состояния - + Select e-Reader card images Выбор изображения карточки e-Reader - + Image file (*.png *.jpg *.jpeg) Файл изображения (*.png *.jpg *.jpeg) - + Conversion finished Конвертация завершена - + %1 of %2 e-Reader cards converted successfully. %1 из %2 карточек e-Reader успешно сконвертировано. - + Load alternate save game... Загрузить альтернативное сохранение... - + Load temporary save game... Загрузить временное сохранение... - + Load &patch... Загрузить &патч... - + Boot BIOS Загрузиться в BIOS - + Replace ROM... Заменить ROM... - + Scan e-Reader dotcodes... Сканировать dot-коды e-Reader... - + Convert e-Reader card image to raw... Конвертировать карту e-Reader в 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 Слот &%1 - + Load camera image... Загрузить изображение с камеры... - + Convert save game... Конвертировать игровое сохранение... - + GameShark saves (*.gsv *.sps *.xps) - + + Save games + + + + Import GameShark Save... Импорт сохранения GameShark... - + Export GameShark Save... Экспорт сохранения GameShark... - - New multiplayer window - Новое окно мультиплеера + + Automatically determine + - - Connect to Dolphin... - Соединение с Dolphin... - - - - Report bug... - Сообщить об ошибке... - - - - About... - О программе... - - - - E&xit - &Выход - - - - &Emulation - &Эмуляция - - - - &Reset + + Use player %0 save game + New multiplayer window + Новое окно мультиплеера + + + + Connect to Dolphin... + Соединение с 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 %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× %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 Очистить @@ -5311,8 +5351,8 @@ Download size: %3 - - + + Mute @@ -5358,7 +5398,7 @@ Download size: %3 - + frames @@ -5403,128 +5443,138 @@ Download size: %3 - - + + Pause - + When inactive: - + When minimized: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + 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: @@ -5579,293 +5629,293 @@ Download size: %3 - + Dynamically update window title - + Show FPS in title bar - + Save state extra data: - - + + Save game - + Load state extra data: - + Enable VBA bug compatibility in ROM hacks - + Preset: - + Enable Discord Rich Presence Вкл. расширенный статус в Discord - + Automatically save state - + Automatically load state - + Automatically save cheats - + Automatically load cheats - + Show OSD messages - + Show filename instead of ROM name 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 - - + + Screenshot - - + + Cheat codes - + Enable Game Boy Player features by default - + Video renderer: - + Software - + OpenGL - + 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: - + Super Game Boy borders - + Default sprite colors 1: - + Default sprite colors 2: diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index ccdf160bd..dbf5e54f0 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -1184,14 +1184,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - - QGBA::AboutScreen - - - 2021 - - - QGBA::ApplicationUpdatePrompt @@ -1304,27 +1296,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1434,42 +1441,62 @@ Download size: %3 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 @@ -3677,6 +3704,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3819,12 +3854,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -3962,34 +3997,34 @@ Download size: %3 - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4087,759 +4122,764 @@ 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) - + + Save games + + + + Import GameShark Save... - + Export GameShark Save... - - New multiplayer window + + Automatically determine - - Connect to Dolphin... - - - - - Report bug... - - - - - About... - - - - - E&xit - - - - - &Emulation - - - - - &Reset + + Use player %0 save game - Sh&utdown - - - - - Yank game pak + New multiplayer window - &Pause + Connect to Dolphin... - - &Next frame + + 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 @@ -5302,8 +5342,8 @@ Download size: %3 - - + + Mute @@ -5349,7 +5389,7 @@ Download size: %3 - + frames @@ -5394,93 +5434,93 @@ Download size: %3 - - + + 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: @@ -5535,328 +5575,338 @@ Download size: %3 - + Dynamically update window title - + Show filename instead of ROM name in title bar - + 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 - - + + Cheat codes - + 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) - + 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 diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index a92fb9dcd..b339512b1 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -1185,14 +1185,6 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.Büyütme - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 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 @@ -1435,42 +1442,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings Sunucu ayarları - + Local port Yerel port - + Bind address Adresi bağla - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break İptal - + Stop Durdur - + Start Başlat - + Crash Hata - + Could not start GDB server GDB sunucusu başlatılamadı @@ -3678,6 +3705,14 @@ Download size: %3 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3855,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Hata rapor arşivi - + ZIP archive (*.zip) ZIP arşivi (*.zip) @@ -3963,34 +3998,34 @@ Download size: %3 Yolu seç - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4088,120 +4123,120 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance ROMları (%1) - + Game Boy ROMs (%1) Game Boy ROMları (%1) - + All ROMs (%1) Bütün ROMlar (%1) - + %1 Video Logs (*.mvl) - + Archives (%1) Arşivler (%1) - - - + + + Select ROM ROM seç - + Select folder Klasör seç - - + + Select save Kayıt seç - + Select patch Yama seç - + Patches (*.ips *.ups *.bps) Yamalar (*.ips *.ups *.bps) - + Select e-Reader dotcode e-Okuyucu nokta kodunu seç - + e-Reader card (*.raw *.bin *.bmp) e-Okuyucu kart (*.raw *.bin *.bmp) - + Select e-Reader card images e-Okuyucu kartından görüntüleri seç - + Image file (*.png *.jpg *.jpeg) Görüntü dosyası (*.png *.jpg *.jpeg) - + Conversion finished Dönüştürme tamamlandı - + %1 of %2 e-Reader cards converted successfully. %1 / %2 e-Okuyucu kartları dönüştürme tamamlandı. - + Select image Resim seç - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Resim dosyası (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) GameShark kayıtları (*.sps *.xps) - + Select video log Video günlüğü seç - + Video logs (*.mvl) Video günlükleri (*.mvl) - + Crash Çökme - + The game has crashed with the following error: %1 @@ -4210,639 +4245,644 @@ Download size: %3 %1 - + Unimplemented BIOS call Uygulanmamış BIOS girişi - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Oyun BIOS dosyasına ihtiyacı var. Lütfen en iyi deneyim için resmi BIOS'u kullanın. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Uygun görüntü cihazı oluşturma başarısız, yazılım ekranına dönülüyor. Oyunlar özellikle daha büyük ekranlarda yavaş çalışabilir. - + Really make portable? Taşınabilir yapılsın mı? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Emülatörün yapılandırmasını yürütülebilir dosya ile aynı dizinden yüklemesini sağlar. Devam etmek istiyor musun? - + Restart needed Yeniden başlatma gerekli - + Some changes will not take effect until the emulator is restarted. Bazı değişiklikler emülatör yeniden başlatılıncaya kadar etkili olmaz. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... &ROM yükle... - + Load ROM in archive... ROM'u arşivden yükle ... - + Add folder to library... Kütüphaneye klasör ekle ... - + + Save games + Oyunları kaydet + + + + Automatically determine + + + + + Use player %0 save game + + + + Load &patch... &Patch yükle... - + Boot BIOS BIOS boot et - + Replace ROM... ROM değişti... - + Convert e-Reader card image to raw... e-Okuyucu kart resimlerini rawa dönüştür... - + ROM &info... ROM &info... - + Recent Son kullanılanlar - + Make portable Portatif yap - + &Load state &Kaydedilmiş konum yükle - + Load state file... Kaydedilmiş konum dosyası yükle... - + &Save state &Konumu kaydet - + Save state file... Konum dosyasını kaydet... - + Quick load Hızlı Yükle - + Quick save Hızlı kaydet - + Load recent En son yükle - + Save recent Hızlı kaydet - + Undo load state Kaydedilen konum yüklemeyi geri al - + Undo save state Konum kaydetmeyi geri al - - + + State &%1 Konum &%1 - + Load camera image... Kamera resmini yükle ... - + Convert save game... Kayıtlı oyun dömnüştürülüyor... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window Yeni çokoyunculu ekranı - + Connect to Dolphin... Dolphin'e Bağlan... - + Report bug... Hata rapor et... - + About... Hakkında... - + E&xit Çıkış - + &Emulation Emülasyon - + &Reset &Reset - + Sh&utdown Kapat - + Yank game pak - + &Pause &Durdur - + &Next frame &Sonraki kare - + Fast forward (held) İleriye sar(basılı tutun) - + &Fast forward &İleriye sar - + Fast forward speed İleriye sarma hızı - + Unbounded - + %0x - + Rewind (held) Geri sar (basılı tutun) - + Re&wind Geri sar - + Step backwards Geriye doğru adım - - Sync to &video - &Videoya eşitle - - - - Sync to &audio - &Sese eşitle - - - + Solar sensor - + Increase solar level Solar seviyesini arttır - + Decrease solar level Solar seviyesini düşür - + Brightest solar level En parlak solar seviyesi - + Darkest solar level En karanlık solar seviyesi - + Brightness %1 Parlaklık:%1 - + Game Boy Printer... Game Boy yazıcısı... - + BattleChip Gate... - + Audio/&Video Ses/&Video - + Frame size Çerçeve boyutu - + Toggle fullscreen Tamekranı aç/kapa - + Lock aspect ratio En boy oranını kilitle - + Force integer scaling Tamsayılı ölçeklendirmeyi zorla - + Bilinear filtering Bilinear filtreleme - + Frame&skip Kare atlama - + Mute Sessiz - + FPS target FPS hedefi - + Native (59.7275) - + Take &screenshot Ekran görüntüsü al - + F12 - + Video layers - + Audio channels Ses kanalları - + Adjust layer placement... Katman yerleşimini ayarlayın... - + &Tools &Araçlar - + View &logs... Kayıtları görüntüle... - + Game &overrides... & Oyunun üzerine yazılanlar... - + Couldn't Start Başlatılamadı - + Save games (%1) Kayıtlı oyunlar (%1) - + Select save game Kayıtlı oyun seç - + mGBA save state files (%1) mGBA kayıt durum dosyası (%1) - + Select save state Kayıt durumu seç - + Could not start game. Oyun başlatılamadı. - + Load alternate save game... Alternatif kayıtlı oyun yükle... - + Load temporary save game... Geçici kayıtlı oyunu yükle... - + Scan e-Reader dotcodes... e-Okuyucu noktakodları tara... - + Import GameShark Save... GameShark kaydını içeri aktar... - + Export GameShark Save... GameShark kaydını dışarı aktar... - + %1× %1× - + Interframe blending Kareler-arası Karıştırma - + Record A/V... A/V Kayıt... - + Record GIF/WebP/APNG... GIF/WebP/APNG Kayıt... - + Game Pak sensors... Oyun Kartuş sensörleri... - + &Cheats... &Hileler... - + Settings... Ayarlar... - + Open debugger console... Hata ayıklayıcı konsolunu aç ... - + Start &GDB server... &GDB sunucusunu başlat... - + View &palette... &Renk Paletini gör... - + View &sprites... &Spriteları gör... - + View &tiles... &Desenleri gör... - + View &map... &Haritayı gör - + &Frame inspector... &Kare denetçisi... - + View memory... Hafıza gör... - + Search memory... Hafızada ara... - + View &I/O registers... &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 @@ -5305,8 +5345,8 @@ Download size: %3 - - + + Mute Sessiz @@ -5352,7 +5392,7 @@ Download size: %3 - + frames Kare @@ -5397,128 +5437,138 @@ Download size: %3 Bilinear filtreleme - - + + Pause - + When inactive: - + When minimized: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Models Modeller - + GB only: Sadece GB: - + SGB compatible: SGB uyumlu: - + GBC only: Sadece GBC: - + GBC compatible: Uyumlu GBC: - + SGB and GBC compatible: Uyumlu SGB ve GBC: - + Game Boy palette Game Boy paleti - + Default color palette only Sadece varsayılan renk paleti - + SGB color palette if available Mevcutsa SGB renk paketi - + GBC color palette if available Mevcutsa GBC renk paketi - + SGB (preferred) or GBC color palette if available Mevcutsa SGB (tercih edilen) ya da GBC renk paketi - + Game Boy Camera Game Boy Kamera - + Driver: Sürücü: - + Source: Kaynak: @@ -5573,293 +5623,293 @@ Download size: %3 Ekran koruyucuyu askıya alın - + Dynamically update window title Pencere boyutuna göre dinamik olarak güncelle - + Show FPS in title bar FPS'i başlık çubuğunda göster - + Save state extra data: Durum ekstra veriyi kaydet: - - + + Save game Oyunu kaydet - + Load state extra data: Durum ekstra veriyi yükle: - + Enable VBA bug compatibility in ROM hacks ROM hacklerinde VBA hata uyumluluğunu etkinleştir - + Preset: Ön ayar: - + Automatically save cheats Otomatik hile kaydedici - + Automatically load cheats Otomatik hile yükleyici - + Automatically save state Otomatik konum kaydedici - + Automatically load state Otomatik konum yükleyici - + Enable Discord Rich Presence Discord etkinliğini etkinleştir - + Show OSD messages OSD mesajlarını göster - + Show filename instead of ROM name in title bar Başlık çubuğunda ROM adı yerine dosya adını göster - + Fast forward speed: Hızlı sarma hızı: - - + + Unbounded Sınırsız - + Fast forward (held) speed: İleri sarma (tutulan) hızı: - + Autofire interval: Otomatik ateşleme aralığı: - + Enable rewind Geri sarmayı etkinleştir - + Rewind history: Geri alma tarihi: - + Idle loops: - + Run all Hepsini çalıştır - + Remove known Bilinenleri kaldır - + Detect and remove Algıla ve kaldır - + Preload entire ROM into memory Tüm ROM'u belleğe önceden yükle - - + + Screenshot Ekran görüntüsü - - + + Cheat codes Hile kodları - + Enable Game Boy Player features by default Game Boy Player özelliklerini varsayılan olarak etkinleştir - + Video renderer: Video oluşturucu: - + Software Yazılım - + OpenGL OpenGL - + OpenGL enhancements OpenGL geliştirmeleri - + High-resolution scale: Yüksek kalite ölçeği: - + (240×160) (240×160) - + XQ GBA audio (experimental) XQ GBA ses (deneysel) - + GB BIOS file: GB BIOS dosyası: - - - - - - - - - + + + + + + + + + Browse Gözat - + Use BIOS file if found Varsa BIOS dosyasını kullan - + Skip BIOS intro BIOS girişini atla - + GBA BIOS file: GBA BIOS dosyası: - + GBC BIOS file: GBC BIOS dosyası: - + SGB BIOS file: SGB BIOS dosyası: - + Save games Oyunları kaydet - - - - - + + + + + Same directory as the ROM ROM ile aynı dizin - + Save states Konum kaydedici - + Screenshots Ekran Görüntüleri - + Patches Yamalar - + Cheats Hileler - + Log to file Dosyaya günlüğünü gir - + Log to console Konsola günlüğünü gir - + Select Log File Günlük Dosyasını Seç - + Default BG colors: - + Super Game Boy borders Super Game Boy sınırları - + Default sprite colors 1: Varsayılan sprite renkleri 1: - + Default sprite colors 2: Varsayılan sprite renkleri 2: diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index 85c31c78c..65092f8b7 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -1185,14 +1185,6 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 复制 - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1307,27 +1299,42 @@ Download size: %3 QGBA::CoreController - + + Reset r%1-%2 %3 + + + + + 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 @@ -1437,42 +1444,62 @@ Download size: %3 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 无法打开 GDB 服务器 @@ -3680,6 +3707,14 @@ Download size: %3 %1 字节%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3822,12 +3857,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive 错误报告存档 - + ZIP archive (*.zip) ZIP 存档 (*.zip) @@ -3965,34 +4000,34 @@ Download size: %3 选择目录 - + (%1×%2) (%1×%2) - + Never 从不 - + Just now 刚刚 - + Less than an hour ago 不到一小时前 - + %n hour(s) ago %n 小时前 - + %n day(s) ago %n 天前 @@ -4090,100 +4125,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance ROM (%1) - + Game Boy ROMs (%1) Game Boy ROM (%1) - + All ROMs (%1) 所有 ROM (%1) - + %1 Video Logs (*.mvl) %1 视频日志 (*.mvl) - + Archives (%1) 压缩文件 (%1) - - - + + + Select ROM 选择 ROM - + Select folder 选择文件夹 - - + + Select save 选择存档 - + Select patch 选择补丁 - + Patches (*.ips *.ups *.bps) 补丁 (*.ips *.ups *.bps) - + Select e-Reader dotcode 选择 e-Reader 点码 - + e-Reader card (*.raw *.bin *.bmp) e-Reader 卡 (*.raw *.bin *.bmp) - + Select image 选择图片 - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 图像文件 (*.png *.gif *.jpg *.jpeg);;所有文件 (*) - + GameShark saves (*.sps *.xps) GameShark 存档 (*.sps *.xps) - + Select video log 选择视频日志 - + Video logs (*.mvl) 视频日志文件 (*.mvl) - + Crash 崩溃 - + The game has crashed with the following error: %1 @@ -4192,659 +4227,664 @@ Download size: %3 %1 - + Couldn't Start 无法启动 - + Could not start game. 无法启动游戏。 - + Unimplemented BIOS call 未实现的 BIOS 调用 - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. 此游戏使用尚未实现的 BIOS 调用。请使用官方 BIOS 以获得最佳体验。 - + 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 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2(%3 fps)- %4 - + &File 文件(&F) - + Load &ROM... 载入 ROM(&R)... - + Load ROM in archive... 从压缩文件中载入 ROM... - + Add folder to library... 将文件夹添加到库中... - + Save games (%1) 保存游戏(%1) - + Select save game 选择保存游戏 - + mGBA save state files (%1) mGBA 即时存档文件(%1) - + Select save state 选择即时存档 - + Select e-Reader card images 选择 e-Reader 卡片图像 - + Image file (*.png *.jpg *.jpeg) 图像文件(*.png *.jpg *.jpeg) - + Conversion finished 转换完成 - + %1 of %2 e-Reader cards converted successfully. 成功转换了 %1 张(共 %2 张)e-Reader 卡片。 - + Load alternate save game... 加载备用保存游戏... - + Load temporary save game... 加载临时保存游戏... - + Load &patch... 载入补丁(&P)... - + Boot BIOS 引导 BIOS - + Replace ROM... 替换 ROM... - + Scan e-Reader dotcodes... 扫描 e-Reader 点码... - + Convert e-Reader card image to raw... 将 e-Reader 卡片图像转换为原始数据... - + ROM &info... ROM 信息(&I)... - + Recent 最近打开 - + Make portable 程序便携化 - + &Load state 载入即时存档(&L) - + Load state file... 载入即时存档文件... - + &Save state 保存即时存档(&S) - + Save state file... 保存即时存档文件... - + Quick load 快速读档 - + Quick save 快速存档 - + Load recent 载入最近存档 - + Save recent 保存最近存档 - + Undo load state 撤消读档 - + Undo save state 撤消存档 - - + + State &%1 即时存档 (&%1) - + Load camera image... 载入相机图片... - + Convert save game... 转换保存游戏... - + GameShark saves (*.gsv *.sps *.xps) - + + Save games + 游戏存档 + + + Import GameShark Save... 导入 GameShark 存档... - + Export GameShark Save... 导出 GameShark 存档... - + + Automatically determine + + + + + Use player %0 save game + + + + New multiplayer window 新建多人游戏窗口 - + Connect to Dolphin... 连接到 Dolphin... - + Report bug... 报告错误... - + About... 关于... - + E&xit 退出(&X) - + &Emulation 模拟(&E) - + &Reset 重置(&R) - + Sh&utdown 关机(&U) - + Yank game pak 快速抽出游戏卡带 - + &Pause 暂停(&P) - + &Next frame 下一帧(&N) - + Fast forward (held) 快进 (长按) - + &Fast forward 快进(&F) - + Fast forward speed 快进速度 - + Unbounded 不限制 - + %0x %0x - + Rewind (held) 倒带 (长按) - + Re&wind 倒带(&W) - + Step backwards 步退 - - Sync to &video - 视频同步(&V) - - - - Sync to &audio - 音频同步(&A) - - - + Solar sensor 太阳光传感器 - + Increase solar level 增加太阳光等级 - + Decrease solar level 降低太阳光等级 - + Brightest solar level 太阳光等级为最亮 - + Darkest solar level 太阳光等级为最暗 - + Brightness %1 亮度 %1 - + Game Boy Printer... Game Boy 打印机... - + BattleChip Gate... BattleChip Gate... - + Audio/&Video 音频/视频(&V) - + Frame size 画面大小 - + %1× %1× - + Toggle fullscreen 切换全屏 - + Lock aspect ratio 锁定纵横比 - + Force integer scaling 强制整数缩放 - + Interframe blending 帧间混合 - + Bilinear filtering 双线性过滤 - + Frame&skip 跳帧(&S) - + Mute 静音 - + FPS target 目标 FPS - + Native (59.7275) 原生 (59.7275) - + Take &screenshot 截图(&S) - + F12 F12 - + Record A/V... 录制音频/视频... - + Record GIF/WebP/APNG... 录制 GIF/WebP/APNG... - + Video layers 视频图层 - + Audio channels 音频声道 - + Adjust layer placement... 调整图层布局... - + &Tools 工具(&T) - + View &logs... 查看日志(&L)... - + Game &overrides... 覆写游戏(&O)... - + Game Pak sensors... 游戏卡带传感器... - + &Cheats... 作弊码(&C)... - + Settings... 设置... - + Open debugger console... 打开调试器控制台... - + Start &GDB server... 打开 GDB 服务器(&G)... - + View &palette... 查看调色板(&P)... - + View &sprites... 查看精灵图(&S)... - + View &tiles... 查看图块(&T)... - + View &map... 查看映射(&M)... - + &Frame inspector... 框架检查器(&F)... - + View memory... 查看内存... - + Search memory... 搜索内存... - + View &I/O registers... 查看 I/O 寄存器(&I)... - + 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 清除 @@ -5307,8 +5347,8 @@ Download size: %3 - - + + Mute 静音 @@ -5354,7 +5394,7 @@ Download size: %3 - + frames @@ -5399,93 +5439,93 @@ Download size: %3 双线性过滤 - - + + 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 可用时使用 SGB 调色板 - + GBC color palette if available 可用时使用 GBC 调色板 - + SGB (preferred) or GBC color palette if available 可用时使用 SGB(首选)或 GBC 调色板 - + Game Boy Camera Game Boy Camera - + Driver: 驱动: - + Source: 来源: @@ -5540,328 +5580,338 @@ Download size: %3 停用屏幕保护程序 - + Dynamically update window title 动态更新窗口标题 - + Show filename instead of ROM name in title bar 标题栏显示文件名而不显示 ROM 名称 - + Show OSD messages 显示 OSD 信息 - + Enable Discord Rich Presence 启用 Discord Rich Presence - + Automatically save state 自动存档 - + Automatically load state 自动读档 - + Automatically save cheats 自动保存作弊码 - + Automatically load cheats 自动载入作弊码 - + Show FPS in title bar 在标题栏显示 FPS - + + 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 将整个 ROM 预载到内存中 - + Save state extra data: 保存存档附加数据: - - + + Save game 保存游戏 - + Load state extra data: 载入存档附加数据: - + Models 型号 - + GB only: 仅 GB: - + SGB compatible: 兼容 SGB: - + GBC only: 仅 GBC: - + GBC compatible: 兼容 GBC: - + SGB and GBC compatible: 兼容 SGB 和 GBC: - + Game Boy palette Game Boy 调色板 - + Preset: 预设: - - + + Screenshot 截图 - - + + Cheat codes 作弊码 - + Enable Game Boy Player features by default 默认启用 Game Boy Player 功能 - + Enable VBA bug compatibility in ROM hacks 启用用于改版的 VBA 漏洞兼容模式 - + Video renderer: 视频渲染器: - + Software 软件 - + OpenGL OpenGL - + OpenGL enhancements OpenGL 增强 - + High-resolution scale: 高分辨率比例: - + (240×160) (240×160) - + XQ GBA audio (experimental) XQ GBA 音频 (实验性) - + GB BIOS file: GB BIOS 文件: - - - - - - - - - + + + + + + + + + Browse 浏览 - + Use BIOS file if found 当可用时使用 BIOS 文件 - + Skip BIOS intro 跳过 BIOS 启动画面 - + GBA BIOS file: GBA BIOS 文件: - + GBC BIOS file: GBC BIOS 文件: - + SGB BIOS file: SGB BIOS 文件: - + Save games 游戏存档 - - - - - + + + + + Same directory as the ROM 与 ROM 所在目录相同 - + Save states 即时存档 - + Screenshots 截图 - + Patches 补丁 - + Cheats 作弊码 - + Log to file 记录日志到文件 - + Log to console 记录日志到控制台 - + Select Log File 选择日志文件 - + Default BG colors: 默认背景色: - + Default sprite colors 1: 默认精灵图颜色 1: - + Default sprite colors 2: 默认精灵图颜色 2: - + Super Game Boy borders Super Game Boy 边框 From 13dee91ecc7bc07c1d57ba0b9827961309a16c17 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Feb 2022 22:20:09 -0800 Subject: [PATCH 24/60] AppVeyor: I'm so tired --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 1d1cb083b..1159ecf7d 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -12,7 +12,7 @@ install: - vcpkg --no-dry-run upgrade - rd /Q /S C:\Tools\vcpkg\buildtrees before_build: -- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release +- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release --config Release build: parallel: true project: mGBA.sln From 6b48b5335624cf985ea7879b568c4619a3f81052 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 11 Feb 2022 19:44:57 -0800 Subject: [PATCH 25/60] AppVeyor: So very, very tired --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 1159ecf7d..e2ad17491 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -12,7 +12,7 @@ install: - vcpkg --no-dry-run upgrade - rd /Q /S C:\Tools\vcpkg\buildtrees before_build: -- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release --config Release +- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release -DBUILD_UPDATER=OFF build: parallel: true project: mGBA.sln From 9cfa7120b186b125406a850d373d86e5be40a7bd Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 11 Feb 2022 20:30:38 -0800 Subject: [PATCH 26/60] Updater: Fix updating mGBA from a path with spaces on Windows --- src/feature/updater-main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/feature/updater-main.c b/src/feature/updater-main.c index 154702637..4c7277203 100644 --- a/src/feature/updater-main.c +++ b/src/feature/updater-main.c @@ -213,10 +213,14 @@ int main(int argc, char* argv[]) { } mCoreConfigDeinit(&config); if (ok == 0) { - const char* argv[] = { bin, NULL }; #ifdef _WIN32 + char qbin[PATH_MAX + 2] = {0}; + // Windows is a bad operating system + snprintf(qbin, sizeof(qbin), "\"%s\"", bin); + const char* argv[] = { qbin, NULL }; _execv(bin, argv); #elif defined(_POSIX_C_SOURCE) || defined(__APPLE__) + const char* argv[] = { bin, NULL }; execv(bin, argv); #endif } From e15911891c2670f08433a9aa9ab45248e51abed4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 14 Feb 2022 20:31:03 -0800 Subject: [PATCH 27/60] 3DS: Ensure writes update file modification time (fixes #2444) --- CHANGES | 1 + src/platform/3ds/3ds-vfs.c | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 7a7285bd5..b22181c15 100644 --- a/CHANGES +++ b/CHANGES @@ -33,6 +33,7 @@ Emulation fixes: - GBA Video: Fix Hblank timing (fixes mgba.io/i/2131, mgba.io/i/2310) - GBA Video: Fix rare crash in modes 3-5 Other fixes: + - 3DS: Ensure writes update file modification time (fixes mgba.io/i/2444) - Core: Don't attempt to restore rewind diffs past start of rewind - FFmpeg: Fix crash when encoding audio with some containers - FFmpeg: Fix GIF recording (fixes mgba.io/i/2393) diff --git a/src/platform/3ds/3ds-vfs.c b/src/platform/3ds/3ds-vfs.c index 587ac5944..5b6a8c9eb 100644 --- a/src/platform/3ds/3ds-vfs.c +++ b/src/platform/3ds/3ds-vfs.c @@ -126,7 +126,7 @@ ssize_t _vf3dRead(struct VFile* vf, void* buffer, size_t size) { ssize_t _vf3dWrite(struct VFile* vf, const void* buffer, size_t size) { struct VFile3DS* vf3d = (struct VFile3DS*) vf; u32 sizeWritten; - Result res = FSFILE_Write(vf3d->handle, &sizeWritten, vf3d->offset, buffer, size, FS_WRITE_FLUSH); + Result res = FSFILE_Write(vf3d->handle, &sizeWritten, vf3d->offset, buffer, size, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME); if (res) { return -1; } @@ -148,7 +148,7 @@ static void* _vf3dMap(struct VFile* vf, size_t size, int flags) { static void _vf3dUnmap(struct VFile* vf, void* memory, size_t size) { struct VFile3DS* vf3d = (struct VFile3DS*) vf; u32 sizeWritten; - FSFILE_Write(vf3d->handle, &sizeWritten, 0, memory, size, FS_WRITE_FLUSH); + FSFILE_Write(vf3d->handle, &sizeWritten, 0, memory, size, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME); mappedMemoryFree(memory, size); } @@ -168,7 +168,7 @@ static bool _vf3dSync(struct VFile* vf, void* buffer, size_t size) { struct VFile3DS* vf3d = (struct VFile3DS*) vf; if (buffer) { u32 sizeWritten; - Result res = FSFILE_Write(vf3d->handle, &sizeWritten, 0, buffer, size, FS_WRITE_FLUSH); + Result res = FSFILE_Write(vf3d->handle, &sizeWritten, 0, buffer, size, FS_WRITE_FLUSH | FS_WRITE_UPDATE_TIME); return R_SUCCEEDED(res); } FSFILE_Flush(vf3d->handle); From 8289222c18f238de9c5dd2784ed1cec8ebdc9f14 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 14 Feb 2022 20:41:44 -0800 Subject: [PATCH 28/60] 3DS: Update ifdef macros --- include/mgba-util/common.h | 2 +- include/mgba-util/socket.h | 14 +++++++------- include/mgba-util/threading.h | 4 ++-- include/mgba-util/vfs.h | 2 +- src/core/config.c | 6 +++--- src/feature/gui/gui-runner.c | 4 ++-- src/gb/audio.c | 2 +- src/gba/audio.c | 2 +- src/platform/3ds/CMakeToolchain.txt | 2 +- src/platform/test/perf-main.c | 6 +++--- src/util/gui/file-select.c | 2 +- src/util/gui/menu.c | 4 ++-- src/util/vfs.c | 2 +- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/include/mgba-util/common.h b/include/mgba-util/common.h index e908c40ea..d370d67a5 100644 --- a/include/mgba-util/common.h +++ b/include/mgba-util/common.h @@ -116,7 +116,7 @@ typedef intptr_t ssize_t; #define ATOMIC_LOAD_PTR(DST, SRC) ATOMIC_LOAD(DST, SRC) #endif -#if defined(_3DS) || defined(GEKKO) || defined(PSP2) +#if defined(__3DS__) || defined(GEKKO) || defined(PSP2) // newlib doesn't support %z properly by default #define PRIz "" #elif defined(_MSC_VER) diff --git a/include/mgba-util/socket.h b/include/mgba-util/socket.h index 377d53a2e..bcafd28d1 100644 --- a/include/mgba-util/socket.h +++ b/include/mgba-util/socket.h @@ -52,7 +52,7 @@ struct Address { }; }; -#ifdef _3DS +#ifdef __3DS__ #include <3ds.h> #include @@ -73,7 +73,7 @@ static inline void SocketSubsystemInit() { #ifdef _WIN32 WSADATA data; WSAStartup(MAKEWORD(2, 2), &data); -#elif defined(_3DS) +#elif defined(__3DS__) if (!SOCUBuffer) { SOCUBuffer = memalign(SOCU_ALIGN, SOCU_BUFFERSIZE); socInit(SOCUBuffer, SOCU_BUFFERSIZE); @@ -92,7 +92,7 @@ static inline void SocketSubsystemInit() { static inline void SocketSubsystemDeinit() { #ifdef _WIN32 WSACleanup(); -#elif defined(_3DS) +#elif defined(__3DS__) socExit(); free(SOCUBuffer); SOCUBuffer = NULL; @@ -168,7 +168,7 @@ static inline Socket SocketOpenTCP(int port, const struct Address* bindAddress) memset(&bindInfo, 0, sizeof(bindInfo)); bindInfo.sin_family = AF_INET; bindInfo.sin_port = htons(port); -#ifndef _3DS +#ifndef __3DS__ bindInfo.sin_addr.s_addr = INADDR_ANY; #else bindInfo.sin_addr.s_addr = gethostid(); @@ -189,7 +189,7 @@ static inline Socket SocketOpenTCP(int port, const struct Address* bindAddress) #else err = bind(sock, (const struct sockaddr*) &bindInfo, sizeof(bindInfo)); #endif -#if !defined(_3DS) && !defined(GEKKO) +#if !defined(__3DS__) && !defined(GEKKO) } else { struct sockaddr_in6 bindInfo; memset(&bindInfo, 0, sizeof(bindInfo)); @@ -238,7 +238,7 @@ static inline Socket SocketConnectTCP(int port, const struct Address* destinatio #else err = connect(sock, (const struct sockaddr*) &bindInfo, sizeof(bindInfo)); #endif -#if !defined(_3DS) && !defined(GEKKO) +#if !defined(__3DS__) && !defined(GEKKO) } else { struct sockaddr_in6 bindInfo; memset(&bindInfo, 0, sizeof(bindInfo)); @@ -291,7 +291,7 @@ static inline Socket SocketAccept(Socket socket, struct Address* address) { #else return accept(socket, (struct sockaddr*) &addrInfo, &len); #endif -#if !defined(_3DS) && !defined(GEKKO) +#if !defined(__3DS__) && !defined(GEKKO) } else { struct sockaddr_in6 addrInfo; memset(&addrInfo, 0, sizeof(addrInfo)); diff --git a/include/mgba-util/threading.h b/include/mgba-util/threading.h index 1a7fcceab..eefff031f 100644 --- a/include/mgba-util/threading.h +++ b/include/mgba-util/threading.h @@ -23,7 +23,7 @@ CXX_GUARD_START #include #elif defined(PSP2) #include -#elif defined(_3DS) +#elif defined(__3DS__) #include #elif defined(__SWITCH__) #include @@ -32,7 +32,7 @@ CXX_GUARD_START #endif #endif #ifdef DISABLE_THREADING -#ifdef _3DS +#ifdef __3DS__ // ctrulib already has a type called Thread #include <3ds/thread.h> #elif defined(__SWITCH__) diff --git a/include/mgba-util/vfs.h b/include/mgba-util/vfs.h index c9faded6e..334f84419 100644 --- a/include/mgba-util/vfs.h +++ b/include/mgba-util/vfs.h @@ -87,7 +87,7 @@ struct VDir* VDirOpenZip(const char* path, int flags); struct VDir* VDirOpen7z(const char* path, int flags); #endif -#if defined(__wii__) || defined(_3DS) || defined(PSP2) +#if defined(__wii__) || defined(__3DS__) || defined(PSP2) struct VDir* VDeviceList(void); #endif diff --git a/src/core/config.c b/src/core/config.c index 5d23f0d8d..4308b50ba 100644 --- a/src/core/config.c +++ b/src/core/config.c @@ -29,7 +29,7 @@ #include #endif -#ifdef _3DS +#ifdef __3DS__ #include #endif @@ -253,7 +253,7 @@ void mCoreConfigDirectory(char* out, size_t outLength) { #elif defined(GEKKO) || defined(__SWITCH__) snprintf(out, outLength, "/%s", projectName); mkdir(out, 0777); -#elif defined(_3DS) +#elif defined(__3DS__) snprintf(out, outLength, "/%s", projectName); FSUSER_CreateDirectory(sdmcArchive, fsMakePath(PATH_ASCII, out), 0); #elif defined(__HAIKU__) @@ -290,7 +290,7 @@ void mCoreConfigPortablePath(char* out, size_t outLength) { } WideCharToMultiByte(CP_UTF8, 0, wpath, -1, out, outLength, 0, 0); StringCchCatA(out, outLength, PATH_SEP "portable.ini"); -#elif defined(PSP2) || defined(GEKKO) || defined(__SWITCH__) || defined(_3DS) +#elif defined(PSP2) || defined(GEKKO) || defined(__SWITCH__) || defined(__3DS__) out[0] = '\0'; #else getcwd(out, outLength); diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c index dc203e158..a79b01042 100644 --- a/src/feature/gui/gui-runner.c +++ b/src/feature/gui/gui-runner.c @@ -667,13 +667,13 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { int frames = 0; GUIPollInput(&runner->params, 0, &keys); while (keys && frames < 30) { -#ifdef _3DS +#ifdef __3DS__ if (!frames) { #endif runner->params.drawStart(); runner->drawFrame(runner, true); runner->params.drawEnd(); -#ifdef _3DS +#ifdef __3DS__ } else { // XXX: Why does this fix #1294? usleep(15000); diff --git a/src/gb/audio.c b/src/gb/audio.c index 6824072bf..9c06de737 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -12,7 +12,7 @@ #include #include -#ifdef _3DS +#ifdef __3DS__ #define blip_add_delta blip_add_delta_fast #endif diff --git a/src/gba/audio.c b/src/gba/audio.c index a8e2324b9..fc264349f 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -16,7 +16,7 @@ #define MP2K_LOCK_MAX 8 -#ifdef _3DS +#ifdef __3DS__ #define blip_add_delta blip_add_delta_fast #endif diff --git a/src/platform/3ds/CMakeToolchain.txt b/src/platform/3ds/CMakeToolchain.txt index ea0fb7e70..eb9d76db2 100644 --- a/src/platform/3ds/CMakeToolchain.txt +++ b/src/platform/3ds/CMakeToolchain.txt @@ -15,7 +15,7 @@ set(CMAKE_SYSTEM_PROCESSOR arm CACHE INTERNAL "processor") set(CMAKE_LIBRARY_ARCHITECTURE arm-none-eabi CACHE INTERNAL "abi") set(3DS ON) -add_definitions(-D_3DS -DARM11) +add_definitions(-D__3DS__) create_devkit(ARM) diff --git a/src/platform/test/perf-main.c b/src/platform/test/perf-main.c index 2e1736390..23cb1d4a8 100644 --- a/src/platform/test/perf-main.c +++ b/src/platform/test/perf-main.c @@ -16,7 +16,7 @@ #include #include -#ifdef _3DS +#ifdef __3DS__ #include <3ds.h> #endif #ifdef __SWITCH__ @@ -81,7 +81,7 @@ static Socket _socket = INVALID_SOCKET; static Socket _server = INVALID_SOCKET; int main(int argc, char** argv) { -#ifdef _3DS +#ifdef __3DS__ UNUSED(_mPerfShutdown); gfxInitDefault(); osSetSpeedupEnable(true); @@ -173,7 +173,7 @@ int main(int argc, char** argv) { cleanup: freeArguments(&args); -#ifdef _3DS +#ifdef __3DS__ gfxExit(); acExit(); #elif defined(__SWITCH__) diff --git a/src/util/gui/file-select.c b/src/util/gui/file-select.c index 8c6b86ca8..0cdfba35d 100644 --- a/src/util/gui/file-select.c +++ b/src/util/gui/file-select.c @@ -14,7 +14,7 @@ #define ITERATION_SIZE 5 #define SCANNING_THRESHOLD_1 50 -#ifdef _3DS +#ifdef __3DS__ // 3DS is slooooow at opening files #define SCANNING_THRESHOLD_2 10 #else diff --git a/src/util/gui/menu.c b/src/util/gui/menu.c index e70323d37..584f2d0d5 100644 --- a/src/util/gui/menu.c +++ b/src/util/gui/menu.c @@ -8,7 +8,7 @@ #include #include -#ifdef _3DS +#ifdef __3DS__ #include <3ds.h> #elif defined(__SWITCH__) #include @@ -62,7 +62,7 @@ enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* men GUIMenuStateInit(&state); GUIInvalidateKeys(params); while (true) { -#ifdef _3DS +#ifdef __3DS__ if (!aptMainLoop()) { return GUI_MENU_EXIT_CANCEL; } diff --git a/src/util/vfs.c b/src/util/vfs.c index 736a88ec9..28d366c53 100644 --- a/src/util/vfs.c +++ b/src/util/vfs.c @@ -10,7 +10,7 @@ #ifdef PSP2 #include #endif -#ifdef _3DS +#ifdef __3DS__ #include #endif From cea11fadc44e96b12d907c8559a0d77c9f48a5f0 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 16 Feb 2022 21:11:30 -0800 Subject: [PATCH 29/60] GBA BIOS: Fix warnings --- src/gba/bios.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gba/bios.c b/src/gba/bios.c index 585c99dc3..6dec13d86 100644 --- a/src/gba/bios.c +++ b/src/gba/bios.c @@ -307,7 +307,7 @@ static void _Div(struct GBA* gba, int32_t num, int32_t denom) { } static int16_t _ArcTan(int32_t i, int32_t* r1, int32_t* r3, uint32_t* cycles) { - int currentCycles = 37; + uint32_t currentCycles = 37; currentCycles += _mulWait(i * i); int32_t a = -((i * i) >> 14); currentCycles += _mulWait(0xA9 * a); @@ -645,7 +645,7 @@ static void _unLz77(struct GBA* gba, int width) { struct ARMCore* cpu = gba->cpu; uint32_t source = cpu->gprs[0]; uint32_t dest = cpu->gprs[1]; - int32_t cycles = 20; + int cycles = 20; int remaining = (cpu->memory.load32(cpu, source, &cycles) & 0xFFFFFF00) >> 8; // We assume the signature byte (0x10) is correct int blockheader = 0; // Some compilers warn if this isn't set, even though it's trivially provably always set From 4312ce14ff9262a3aa73c90a4f26de443b28b3a5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 16 Feb 2022 22:57:25 -0800 Subject: [PATCH 30/60] Util: Failed file mapping should return NULL on POSIX --- CHANGES | 1 + src/util/vfs/vfs-fd.c | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index b22181c15..846ab2a3c 100644 --- a/CHANGES +++ b/CHANGES @@ -39,6 +39,7 @@ Other fixes: - FFmpeg: Fix GIF recording (fixes mgba.io/i/2393) - GB: Fix temporary saves - GB, GBA: Save writeback-pending masked saves on unload (fixes mgba.io/i/2396) + - VFS: Failed file mapping should return NULL on POSIX Misc: - Core: Suspend runloop when a core crashes - GB Video: Add default SGB border diff --git a/src/util/vfs/vfs-fd.c b/src/util/vfs/vfs-fd.c index b67d701fa..01a08e7c7 100644 --- a/src/util/vfs/vfs-fd.c +++ b/src/util/vfs/vfs-fd.c @@ -132,7 +132,11 @@ static void* _vfdMap(struct VFile* vf, size_t size, int flags) { if (flags & MAP_WRITE) { mmapFlags = MAP_SHARED; } - return mmap(0, size, PROT_READ | PROT_WRITE, mmapFlags, vfd->fd, 0); + void* mapped = mmap(0, size, PROT_READ | PROT_WRITE, mmapFlags, vfd->fd, 0); + if (mapped == MAP_FAILED) { + return NULL; + } + return mapped; } static void _vfdUnmap(struct VFile* vf, void* memory, size_t size) { From 5d6349338a23883275e61f328f74272004db94af Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 16 Feb 2022 23:06:10 -0800 Subject: [PATCH 31/60] Qt: Add status message for rewinding being disabled --- src/platform/qt/CoreController.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index ac1613036..94043d680 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -500,6 +500,9 @@ void CoreController::showResetInfo(bool enable) { void CoreController::setRewinding(bool rewind) { if (!m_threadContext.core->opts.rewindEnable) { + if (rewind) { + emit statusPosted(tr("Rewinding not currently enabled")); + } return; } if (rewind && m_multiplayer && m_multiplayer->attached() > 1) { @@ -514,17 +517,22 @@ void CoreController::setRewinding(bool rewind) { } void CoreController::rewind(int states) { - { - Interrupter interrupter(this); - if (!states) { - states = INT_MAX; - } - for (int i = 0; i < states; ++i) { - if (!mCoreRewindRestore(&m_threadContext.impl->rewind, m_threadContext.core)) { - break; - } + if (!states) { + return; + } + if (!m_threadContext.core->opts.rewindEnable) { + emit statusPosted(tr("Rewinding not currently enabled")); + } + Interrupter interrupter(this); + if (!states) { + states = INT_MAX; + } + for (int i = 0; i < states; ++i) { + if (!mCoreRewindRestore(&m_threadContext.impl->rewind, m_threadContext.core)) { + break; } } + interrupter.resume(); emit frameAvailable(); emit rewound(); } From d0f959099958c594fabcc887a55da375e7ef3644 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 16 Feb 2022 23:13:34 -0800 Subject: [PATCH 32/60] Qt: Tweak OSD sizing --- src/platform/qt/MessagePainter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform/qt/MessagePainter.cpp b/src/platform/qt/MessagePainter.cpp index cf72051ff..401d7cf4b 100644 --- a/src/platform/qt/MessagePainter.cpp +++ b/src/platform/qt/MessagePainter.cpp @@ -30,11 +30,11 @@ MessagePainter::MessagePainter(QObject* parent) void MessagePainter::resize(const QSize& size, qreal scaleFactor) { double drawW = size.width(); double drawH = size.height(); - double area = pow(drawW * drawW * drawW * drawH * drawH, 0.2); + double area = pow(drawW * drawW * drawW * drawH * drawH, 0.185); m_scaleFactor = scaleFactor; m_world.reset(); - m_world.scale(area / 220., area / 220.); - m_local = QPoint(area / 100., drawH - m_messageFont.pixelSize() * m_world.m22() * 1.3); + m_world.scale(area / 170., area / 170.); + m_local = QPoint(area / 80., drawH - m_messageFont.pixelSize() * m_world.m22() * 1.3); QFontMetrics metrics(m_frameFont); m_framePoint = QPoint(drawW / m_world.m11() - metrics.height() * 0.1, metrics.height() * 0.75); From 39553ee9dddb8ad4004e0b16b25cf61b8bbe9fee Mon Sep 17 00:00:00 2001 From: Liu Wenyuan <15816141883@163.com> Date: Fri, 11 Feb 2022 07:03:21 +0000 Subject: [PATCH 33/60] Qt: Update translation (Chinese (Simplified)) Translation: mGBA/Qt Translate-URL: https://hosted.weblate.org/projects/mgba/mgba-qt/zh_Hans/ --- src/platform/qt/ts/mgba-zh_CN.ts | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index 65092f8b7..7ef2f9c47 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -1191,19 +1191,22 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 An update to %1 is available. - + %1 有更新可用。 + 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. - + +自动更新在此平台上不可用。如果您希望更新,则需要手动进行。 @@ -1354,7 +1357,7 @@ Download size: %3 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). - + 无法打开存档;游戏内存档无法更新。请确保保存目录是可写的,且没有额外权限(例如 Windows 上的 UAC)。 @@ -4471,7 +4474,7 @@ Download size: %3 GameShark saves (*.gsv *.sps *.xps) - + GameShark 存档 (*.gsv *.sps *.xps) @@ -5122,12 +5125,12 @@ Download size: %3 %1 SharkPort %2 save game - + %1 SharkPort %2 存档 %1 GameShark Advance SP %2 save game - + %1 GameShark Advance SP %2 存档 From a1945cb57a9015f08770e9d572265df25c27bba4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 16 Feb 2022 23:15:32 -0800 Subject: [PATCH 34/60] Qt: Update translations --- src/platform/qt/ts/mgba-de.ts | 20 +- src/platform/qt/ts/mgba-en.ts | 20 +- src/platform/qt/ts/mgba-es.ts | 20 +- src/platform/qt/ts/mgba-fi.ts | 20 +- src/platform/qt/ts/mgba-fr.ts | 20 +- src/platform/qt/ts/mgba-hu.ts | 20 +- src/platform/qt/ts/mgba-it.ts | 20 +- src/platform/qt/ts/mgba-ja.ts | 20 +- src/platform/qt/ts/mgba-ko.ts | 20 +- src/platform/qt/ts/mgba-ms.ts | 20 +- src/platform/qt/ts/mgba-nb_NO.ts | 20 +- src/platform/qt/ts/mgba-nl.ts | 20 +- src/platform/qt/ts/mgba-pl.ts | 20 +- src/platform/qt/ts/mgba-pt_BR.ts | 638 +++++++++++++++------------- src/platform/qt/ts/mgba-ru.ts | 20 +- src/platform/qt/ts/mgba-template.ts | 20 +- src/platform/qt/ts/mgba-tr.ts | 20 +- 17 files changed, 555 insertions(+), 403 deletions(-) diff --git a/src/platform/qt/ts/mgba-de.ts b/src/platform/qt/ts/mgba-de.ts index e7def3599..f91c2b3f4 100644 --- a/src/platform/qt/ts/mgba-de.ts +++ b/src/platform/qt/ts/mgba-de.ts @@ -1304,37 +1304,43 @@ Download-Größe: %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 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 diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index c77e6108e..c915fcd49 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -1301,37 +1301,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-es.ts b/src/platform/qt/ts/mgba-es.ts index c4a9c7233..0d4a76b53 100644 --- a/src/platform/qt/ts/mgba-es.ts +++ b/src/platform/qt/ts/mgba-es.ts @@ -1302,37 +1302,43 @@ Download size: %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 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 remover 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 diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index a9ff527ef..2569ca550 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -1302,37 +1302,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index 842d90105..de7d4c51f 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -1303,37 +1303,43 @@ Download size: %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 É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 diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index 8aa914c7a..dc6fc29a1 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -1302,37 +1302,43 @@ Download size: %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 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 diff --git a/src/platform/qt/ts/mgba-it.ts b/src/platform/qt/ts/mgba-it.ts index b503e3c6a..ac88eaace 100644 --- a/src/platform/qt/ts/mgba-it.ts +++ b/src/platform/qt/ts/mgba-it.ts @@ -1307,37 +1307,43 @@ Dimensione del download: %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 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 diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index ec30389cf..538c30e25 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -1302,37 +1302,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index 2968cc217..d4adeec72 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -1302,37 +1302,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index 70af448b3..8e10775dd 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -1301,37 +1301,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index 34e3acd07..350cd304e 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -1302,37 +1302,43 @@ Download size: %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 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 diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index eebb7a954..a82bc4707 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -1301,37 +1301,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index d519f4c9c..912e0c2fa 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -1304,37 +1304,43 @@ Rozmiar pobierania: %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 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 diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index 3e1df1a9c..ba2d1311e 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -1185,14 +1185,6 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Ampliação - - QGBA::AboutScreen - - - 2021 - 2021 - - QGBA::ApplicationUpdatePrompt @@ -1305,27 +1297,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 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 @@ -1435,42 +1448,62 @@ Download size: %3 QGBA::GDBWindow - + Server settings Configurações do servidor - + Local port Porta local - + Bind address Vincular endereço - + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + Break Pausar - + Stop Parar - + Start Iniciar - + Crash Crash - + Could not start GDB server Não pôde iniciar o servidor do GDB @@ -3678,6 +3711,14 @@ Download size: %3 %1 byte%2 + + QGBA::MessagePainter + + + Frame %1 + + + QGBA::ObjView @@ -3820,12 +3861,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Arquivo compactado do relatório dos bugs - + ZIP archive (*.zip) Arquivo compactado ZIP (*.zip) @@ -3963,27 +4004,27 @@ Download size: %3 Selecione o diretório - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -3991,7 +4032,7 @@ Download size: %3 - + %n day(s) ago @@ -4090,100 +4131,100 @@ Download size: %3 QGBA::Window - + Game Boy Advance ROMs (%1) ROMs do Game Boy Advance (%1) - + Game Boy ROMs (%1) ROMs do Game Boy (%1) - + All ROMs (%1) Todas as ROMs (%1) - + %1 Video Logs (*.mvl) %1 Registros do Vídeo (*.mvl) - + Archives (%1) Arquivos Compactados (%1) - - - + + + Select ROM Selecionar ROM - + Select folder Selecionar pasta - - + + Select save Selecionar save - + Select patch Selecionar patch - + Patches (*.ips *.ups *.bps) Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Selecionar dotcode do e-Reader - + e-Reader card (*.raw *.bin *.bmp) Cartão do e-Reader (*.raw *.bin *.bmp) - + Select image Selecionar imagem - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Arquivo de imagem (*.png *.gif *.jpg *.jpeg);;Todos os arquivos (*) - + GameShark saves (*.sps *.xps) Saves do GameShark (*.sps *.xps) - + Select video log Selecionar registro do vídeo - + Video logs (*.mvl) Registros do vídeo (*.mvl) - + Crash Crash - + The game has crashed with the following error: %1 @@ -4192,659 +4233,664 @@ Download size: %3 %1 - + Unimplemented BIOS call Chamada da BIOS não implementada - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Este jogo usa uma chamada de BIOS que não está implementada. Por favor use a BIOS oficial pra uma melhor experiência. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Falhou em criar um dispositivo de exibição apropriado, voltando a exibição por software. Os jogos podem executar lentamente, especialmente com janelas maiores. - + Really make portable? Realmente tornar portátil? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Isto fará o emulador carregar sua configuração do mesmo diretório que o executável. Você quer continuar? - + Restart needed Reiniciar é necessário - + Some changes will not take effect until the emulator is restarted. Algumas mudanças não terão efeito até que o emulador seja reiniciado. - + - Player %1 of %2 - Jogador %1 de %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Arquivo - + Load &ROM... Carregar &ROM... - + Load ROM in archive... Carregar ROM no arquivo compactado... - + Add folder to library... Adicionar a pasta a biblioteca... - + + Save games + Saves dos jogos + + + + Automatically determine + + + + + Use player %0 save game + + + + Load &patch... Carregar &patch... - + Boot BIOS Dar Boot na BIOS - + Replace ROM... Substituir ROM... - + ROM &info... Informações da &ROM... - + Recent Recentes - + Make portable Tornar portátil - + &Load state &Carregar state - + Report bug... Reportar bug... - + About... Sobre... - + Game Pak sensors... Sensores do Game Pak... - + Clear Limpar - + Load state file... Carregar arquivo do state... - + Save games (%1) Saves dos jogos (%1) - + Select save game Selecione save do jogo - + mGBA save state files (%1) Arquivos do save state do mGBA (%1) - + Select save state Selecione save state - + Select e-Reader card images Selecionar imagens do cartão do e-Reader - + Image file (*.png *.jpg *.jpeg) Arquivo da imagem (*.png *.jpg *.jpeg) - + Conversion finished Conversão concluída - + %1 of %2 e-Reader cards converted successfully. %1 de %2 cartões do e-Reader convertidos com sucesso. - + Load alternate save game... Carregar save alternativo do jogo... - + Load temporary save game... Carregar save temporário do jogo... - + Convert e-Reader card image to raw... Converter imagem do cartão do e-Reader pro natural... - + &Save state &Salvar o state - + Save state file... Arquivo do save state... - + Quick load Carregamento rápido - + Quick save Salvamento rápido - + Load recent Carregar recentes - + Save recent Salvar recentes - + Undo load state Desfazer o carregamento do state - + Undo save state Desfazer o salvamento do state - - + + State &%1 State &%1 - + Load camera image... Carregar imagem da câmera... - + Convert save game... Converter save do jogo... - + GameShark saves (*.gsv *.sps *.xps) - + New multiplayer window Nova janela multi-jogador - + Connect to Dolphin... Conectar ao Dolphin... - + E&xit S&air - + &Emulation &Emulação - + &Reset &Resetar - + Sh&utdown De&sligar - + Yank game pak Arrancar game pak - + &Pause &Pausar - + &Next frame &Próximo frame - + Fast forward (held) Avanço rápido (segurado) - + &Fast forward &Avanço rápido - + Fast forward speed Velocidade do avanço rápido - + Unbounded Ilimitado - + %0x %0x - + Rewind (held) Retroceder (segurado) - + Re&wind Re&troceder - + Step backwards Voltar um passo - - Sync to &video - Sincronizar no &vídeo - - - - Sync to &audio - Sincronizar no &áudio - - - + Solar sensor Sensor solar - + Increase solar level Aumentar nível solar - + Decrease solar level Diminuir nível solar - + Brightest solar level Nível solar mais brilhante - + Darkest solar level Nível solar mais escuro - + Brightness %1 Brilho %1 - + Audio/&Video Áudio/&Vídeo - + Frame size Tamanho do frame - + Toggle fullscreen Alternar tela cheia - + Lock aspect ratio Trancar proporção do aspecto - + Force integer scaling Forçar dimensionamento da integral - + Bilinear filtering Filtragem bilinear - + Frame&skip Frame&skip - + Mute Mudo - + FPS target FPS alvo - + Native (59.7275) Nativo (59,7275) - + Take &screenshot Tirar &screenshot - + F12 F12 - + Game Boy Printer... Impressora do Game Boy... - + BattleChip Gate... Portal do BattleChip... - + %1× %1× - + Interframe blending Mistura do interframe - + Record A/V... Gravar A/V... - + Video layers Camadas do vídeo - + Audio channels Canais de áudio - + Adjust layer placement... Ajustar posicionamento da camada... - + &Tools &Ferramentas - + View &logs... Visualizar &registros... - + Game &overrides... Substituições &do jogo... - + Couldn't Start Não Pôde Iniciar - + Could not start game. Não pôde iniciar o jogo. - + Scan e-Reader dotcodes... Escanear dotcodes do e-Reader... - + Import GameShark Save... Importar Save do GameShark... - + Export GameShark Save... Exportar Save do GameShark... - + Record GIF/WebP/APNG... Gravar GIF/WebP/APNG... - + &Cheats... &Trapaças... - + Settings... Configurações... - + Open debugger console... Abrir console do debugger... - + Start &GDB server... Iniciar servidor do &GDB... - + View &palette... Visualizar &paleta... - + View &sprites... Visualizar &imagens móveis... - + View &tiles... Visualizar &ladrilhos... - + View &map... Visualizar &mapa... - + &Frame inspector... Inspetor dos &frames... - + View memory... Visualizar memória... - + Search memory... Procurar memória... - + View &I/O registers... Visualizar registros de &E/S... - + Record debug video log... Gravar registro do vídeo de debug... - + Stop debug video log Parar log do vídeo de debug - + Exit fullscreen Sair da tela cheia - + 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 Pra Cima - + Autofire Right Auto-disparar Direita - + Autofire Down Auto-disparar Pra Baixo - + Autofire Left Auto-disparar Esquerda @@ -5307,8 +5353,8 @@ Download size: %3 - - + + Mute Mudo @@ -5354,7 +5400,7 @@ Download size: %3 - + frames frames @@ -5394,93 +5440,103 @@ Download size: %3 Filtragem bilinear - - + + Pause - + When inactive: - + When minimized: - + + Show frame count in OSD + + + + + Show emulation info on reset + + + + Current channel: - + Current version: - + Update channel: - + Available version: - + (Unknown) - + Last checked: - + Automatically check on start - + Check now - + Default color palette only Só a cor padrão da paleta - + SGB color palette if available Paleta das cores SGB se disponível - + GBC color palette if available Paleta das cores do GBC se disponível - + SGB (preferred) or GBC color palette if available SGB (preferido) ou paleta das cores do GBC se disponível - + Game Boy Camera Câmera do Game Boy - + Driver: Driver: - + Source: Fonte: @@ -5495,68 +5551,68 @@ Download size: %3 Mistura do interframe - + Dynamically update window title Atualizar título da janela dinamicamente - + Show OSD messages Mostrarr mensagens do OSD - + Save state extra data: Dados extras do save state: - - + + Save game Save do jogo - + Load state extra data: Carregar dados extras do state: - + Enable VBA bug compatibility in ROM hacks Ativar compatibilidade dos bugs do VBA nos hacks das ROMs - + Preset: Pré-definições: - + Show filename instead of ROM name in title bar Mostrar nome do arquivo em vez do nome da ROM na barra de título - + Fast forward (held) speed: Velocidade do avanço rápido (segurado): - + (240×160) (240×160) - + Log to file Registrar no arquivo - + Log to console Registrar no console - + Select Log File Selecionar Arquivo de Registro @@ -5606,262 +5662,262 @@ Download size: %3 Suspender proteção de tela - + Show FPS in title bar Mostrar FPS na barra de título - + Automatically save cheats Salvar trapaças automaticamente - + Automatically load cheats Carregar trapaças automaticamente - + Automatically save state Salvar o state automaticamente - + Automatically load state Carregar o state automaticamente - + Enable Discord Rich Presence Ativar Discord Rich Presence - + Fast forward speed: Velocidade de avanço rápido: - - + + Unbounded Ilimitado - + Enable rewind Ativar retrocesso - + Rewind history: Histórico do retrocesso: - + Idle loops: Loops inativos: - + Run all Executar todos - + Remove known Remover conhecidos - + Detect and remove Detectar e remover - - + + Screenshot Screenshot - - + + Cheat codes Códigos de trapaça - + Preload entire ROM into memory Pré-carregar a ROM inteira na memória - + Autofire interval: Intervalo do Auto-Disparo: - + Enable Game Boy Player features by default Ativar funções do Game Boy Player por padrão - + Video renderer: Renderizador do vídeo: - + Software Software - + OpenGL OpenGL - + OpenGL enhancements Melhorias do OpenGL - + High-resolution scale: Escala de alta-resolução: - + XQ GBA audio (experimental) Áudio do XQ GBA (experimental) - + GB BIOS file: Arquivo do GB BIOS: - - - - - - - - - + + + + + + + + + Browse Navegar - + Use BIOS file if found Usar o arquivo da BIOS se encontrado - + Skip BIOS intro Ignorar introdução da BIOS - + GBA BIOS file: Arquivo da BIOS do GBA: - + GBC BIOS file: Arquivo da BIOS do GBC: - + SGB BIOS file: Arquivo da BIOS do SGB: - + Save games Saves dos jogos - - - - - + + + + + Same directory as the ROM O mesmo diretório que a ROM - + Save states Save states - + Screenshots Screenshots - + Patches Patches - + Cheats Trapaças - + Models Modelos - + GB only: Só GB: - + SGB compatible: Compatível com SGB: - + GBC only: Só no GBC: - + GBC compatible: Compatível com GBC: - + SGB and GBC compatible: Compatível com SGB e GBC: - + Game Boy palette Paleta do Game Boy - + Default BG colors: Cores padrão do BG: - + Super Game Boy borders Bordas do Super Game Boy - + Default sprite colors 1: Cores padrão de sprite 1: - + Default sprite colors 2: Cores padrão de sprite 2: diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 251ee9cb2..6c5c46346 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -1304,37 +1304,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index dbf5e54f0..6ca3b64f0 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -1301,37 +1301,43 @@ Download size: %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 diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index b339512b1..b60164d54 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -1302,37 +1302,43 @@ Download size: %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 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 From cf06497456cf576d8c68de67cf039a07160e0e49 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 18 Feb 2022 20:31:05 -0800 Subject: [PATCH 35/60] GBA DMA: Enhanced logging (closes #2454) --- CHANGES | 1 + include/mgba/internal/gba/dma.h | 4 ++++ src/gba/dma.c | 20 ++++++++++++++------ 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 846ab2a3c..a76c5c7af 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,7 @@ Misc: - Core: Suspend runloop when a core crashes - GB Video: Add default SGB border - GBA: Automatically skip BIOS if ROM has invalid logo + - GBA DMA: Enhanced logging (closes mgba.io/i/2454) - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) - Qt: Rearrange menus some - Qt: Clean up cheats dialog diff --git a/include/mgba/internal/gba/dma.h b/include/mgba/internal/gba/dma.h index 6f880c971..192b3995a 100644 --- a/include/mgba/internal/gba/dma.h +++ b/include/mgba/internal/gba/dma.h @@ -10,6 +10,8 @@ CXX_GUARD_START +#include + enum GBADMAControl { GBA_DMA_INCREMENT = 0, GBA_DMA_DECREMENT = 1, @@ -34,6 +36,8 @@ DECL_BITS(GBADMARegister, Timing, 12, 2); DECL_BIT(GBADMARegister, DoIRQ, 14); DECL_BIT(GBADMARegister, Enable, 15); +mLOG_DECLARE_CATEGORY(GBA_DMA); + struct GBADMA { GBADMARegister reg; diff --git a/src/gba/dma.c b/src/gba/dma.c index 5807e506f..759140da6 100644 --- a/src/gba/dma.c +++ b/src/gba/dma.c @@ -8,6 +8,8 @@ #include #include +mLOG_DEFINE_CATEGORY(GBA_DMA, "GBA DMA", "gba.dma"); + static void _dmaEvent(struct mTiming* timing, void* context, uint32_t cyclesLate); static void GBADMAService(struct GBA* gba, int number, struct GBADMA* info); @@ -43,10 +45,10 @@ static bool _isValidDMADAD(int dma, uint32_t address) { uint32_t GBADMAWriteSAD(struct GBA* gba, int dma, uint32_t address) { struct GBAMemory* memory = &gba->memory; - address &= 0x0FFFFFFE; if (_isValidDMASAD(dma, address)) { - memory->dma[dma].source = address; + memory->dma[dma].source = address & 0x0FFFFFFE; } else { + mLOG(GBA_DMA, GAME_ERROR, "Invalid DMA source address: 0x%08X", address); memory->dma[dma].source = 0; } return memory->dma[dma].source; @@ -57,6 +59,8 @@ uint32_t GBADMAWriteDAD(struct GBA* gba, int dma, uint32_t address) { address &= 0x0FFFFFFE; if (_isValidDMADAD(dma, address)) { memory->dma[dma].dest = address; + } else { + mLOG(GBA_DMA, GAME_ERROR, "Invalid DMA destination address: 0x%08X", address); } return memory->dma[dma].dest; } @@ -78,7 +82,7 @@ uint16_t GBADMAWriteCNT_HI(struct GBA* gba, int dma, uint16_t control) { currentDma->reg = control; if (GBADMARegisterIsDRQ(currentDma->reg)) { - mLOG(GBA_MEM, STUB, "DRQ not implemented"); + mLOG(GBA_DMA, STUB, "DRQ not implemented"); } if (!wasEnabled && GBADMARegisterIsEnable(currentDma->reg)) { @@ -87,11 +91,15 @@ uint16_t GBADMAWriteCNT_HI(struct GBA* gba, int dma, uint16_t control) { uint32_t width = 2 << GBADMARegisterGetWidth(currentDma->reg); if (currentDma->nextSource & (width - 1)) { - mLOG(GBA_MEM, GAME_ERROR, "Misaligned DMA source address: 0x%08X", currentDma->nextSource); + mLOG(GBA_DMA, GAME_ERROR, "Misaligned DMA source address: 0x%08X", currentDma->nextSource); } if (currentDma->nextDest & (width - 1)) { - mLOG(GBA_MEM, GAME_ERROR, "Misaligned DMA destination address: 0x%08X", currentDma->nextDest); + mLOG(GBA_DMA, GAME_ERROR, "Misaligned DMA destination address: 0x%08X", currentDma->nextDest); } + mLOG(GBA_DMA, INFO, "Starting DMA %i 0x%08X -> 0x%08X (%04X:%04X)", dma, + currentDma->nextSource, currentDma->nextDest, + currentDma->reg, currentDma->count & 0xFFFF); + currentDma->nextSource &= -width; currentDma->nextDest &= -width; @@ -114,7 +122,7 @@ void GBADMASchedule(struct GBA* gba, int number, struct GBADMA* info) { case GBA_DMA_TIMING_CUSTOM: switch (number) { case 0: - mLOG(GBA_MEM, WARN, "Discarding invalid DMA0 scheduling"); + mLOG(GBA_DMA, WARN, "Discarding invalid DMA0 scheduling"); return; case 1: case 2: From 751ab434f401b1686282d145072a2d7d332b5cae Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 18 Feb 2022 21:26:45 -0800 Subject: [PATCH 36/60] Qt: Add tile range selection to tile viewer, modernize layout (closes #2455) --- CHANGES | 1 + src/platform/qt/TileView.cpp | 92 +++++++---- src/platform/qt/TileView.ui | 286 ++++++++++++++++++++++------------- 3 files changed, 241 insertions(+), 138 deletions(-) diff --git a/CHANGES b/CHANGES index a76c5c7af..8e995f274 100644 --- a/CHANGES +++ b/CHANGES @@ -55,6 +55,7 @@ Misc: - Qt: Add optional emulation-related information on reset (closes mgba.io/i/1780) - Qt: Add QOpenGLWidget cross-thread codepath for macOS (fixes mgba.io/i/1754) - Qt: Enable -b for Boot BIOS menu option (fixes mgba.io/i/2074) + - Qt: Add tile range selection to tile viewer (closes mgba.io/i/2455) - Windows: Attach to console if present 0.9.3: (2021-12-17) diff --git a/src/platform/qt/TileView.cpp b/src/platform/qt/TileView.cpp index 1c16b79c6..3e8e58155 100644 --- a/src/platform/qt/TileView.cpp +++ b/src/platform/qt/TileView.cpp @@ -29,6 +29,9 @@ TileView::TileView(std::shared_ptr controller, QWidget* parent) connect(m_ui.tiles, &TilePainter::needsRedraw, this, [this]() { updateTiles(true); }); + connect(m_ui.tilesSelector, qOverload(&QButtonGroup::buttonClicked), this, [this]() { + updateTiles(true); + }); connect(m_ui.paletteId, static_cast(&QSpinBox::valueChanged), this, &TileView::updatePalette); switch (m_controller->platform()) { @@ -39,6 +42,9 @@ TileView::TileView(std::shared_ptr controller, QWidget* parent) #endif #ifdef M_CORE_GB case mPLATFORM_GB: + m_ui.tilesBg->setEnabled(false); + m_ui.tilesObj->setEnabled(false); + m_ui.tilesBoth->setEnabled(false); m_ui.palette256->setEnabled(false); m_ui.tile->setBoundary(1024, 0, 0); break; @@ -107,43 +113,69 @@ TileView::TileView(std::shared_ptr controller, QWidget* parent) #ifdef M_CORE_GBA void TileView::updateTilesGBA(bool force) { if (m_ui.palette256->isChecked()) { - m_ui.tiles->setTileCount(1536); - mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 1); - for (int i = 0; i < 1024; ++i) { - const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, 0); - if (data) { - m_ui.tiles->setTile(i, data); - } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, 0)); + if (m_ui.tilesBg->isChecked()) { + m_ui.tiles->setTileCount(1024); + } else if (m_ui.tilesObj->isChecked()) { + m_ui.tiles->setTileCount(512); + } else { + m_ui.tiles->setTileCount(1536); + } + mTileCache* cache; + int objOffset = 1024; + if (!m_ui.tilesObj->isChecked()) { + objOffset = 0; + cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 1); + for (int i = 0; i < 1024; ++i) { + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, 0); + if (data) { + m_ui.tiles->setTile(i, data); + } else if (force) { + m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, 0)); + } } } - cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 3); - for (int i = 1024; i < 1536; ++i) { - const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 1024, 0); - if (data) { - m_ui.tiles->setTile(i, data); - } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 1024, 0)); + if (!m_ui.tilesBg->isChecked()) { + cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 3); + for (int i = 1024; i < 1536; ++i) { + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 1024, 0); + if (data) { + m_ui.tiles->setTile(i - objOffset, data); + } else if (force) { + m_ui.tiles->setTile(i - objOffset, mTileCacheGetTile(cache, i - 1024, 0)); + } } } } else { - mTileCache* cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0); - m_ui.tiles->setTileCount(3072); - for (int i = 0; i < 2048; ++i) { - const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, m_paletteId); - if (data) { - m_ui.tiles->setTile(i, data); - } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId)); + if (m_ui.tilesBg->isChecked()) { + m_ui.tiles->setTileCount(2048); + } else if (m_ui.tilesObj->isChecked()) { + m_ui.tiles->setTileCount(1024); + } else { + m_ui.tiles->setTileCount(3072); + } + mTileCache* cache; + int objOffset = 2048; + if (!m_ui.tilesObj->isChecked()) { + objOffset = 0; + cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 0); + for (int i = 0; i < 2048; ++i) { + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i, m_paletteId); + if (data) { + m_ui.tiles->setTile(i, data); + } else if (force) { + m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i, m_paletteId)); + } } } - cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 2); - for (int i = 2048; i < 3072; ++i) { - const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 2048, m_paletteId); - if (data) { - m_ui.tiles->setTile(i, data); - } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(cache, i - 2048, m_paletteId)); + if (!m_ui.tilesBg->isChecked()) { + cache = mTileCacheSetGetPointer(&m_cacheSet->tiles, 2); + for (int i = 2048; i < 3072; ++i) { + const color_t* data = mTileCacheGetTileIfDirty(cache, &m_tileStatus[16 * i], i - 2048, m_paletteId); + if (data) { + m_ui.tiles->setTile(i - objOffset, data); + } else if (force) { + m_ui.tiles->setTile(i - objOffset, mTileCacheGetTile(cache, i - 2048, m_paletteId)); + } } } } diff --git a/src/platform/qt/TileView.ui b/src/platform/qt/TileView.ui index 41b2eeb32..01eb168cf 100644 --- a/src/platform/qt/TileView.ui +++ b/src/platform/qt/TileView.ui @@ -6,119 +6,188 @@ 0 0 - 748 - 823 + 680 + 450 Tiles - - - - - Export Selected - - - - - - - Export All - - - + - + + + + + + + + + 15 + + + + + + + Palette + + + + + + + 256 colors + + + + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + × + + + 1 + + + 8 + + + + + + + Magnification + + + + + + + false + + + 1 + + + 64 + + + 32 + + + + + + + Tiles per row + + + + + + + Fit to window + + + true + + + + + + + + + + + + + Displayed tiles + + + + + + Only BG tiles + + + tilesSelector + + + + + + + Only OBJ tiles + + + tilesSelector + + + + + + + Both + + + true + + + tilesSelector + + + + + + + + - - - 15 - - - - - + - 256 colors + Copy Selected - - - - 0 - 0 - + + + Export Selected - - × - - - 1 - - - 8 + + + + + + Copy All - + - Magnification - - - - - - - false - - - 1 - - - 64 - - - 32 - - - - - - - Tiles per row - - - - - - - Fit to window - - - true + Export All - - - - Qt::Vertical - - - - 0 - 0 - - - - - + @@ -137,7 +206,7 @@ 0 0 - 480 + 441 768 @@ -183,23 +252,6 @@ - - - - - - - Copy Selected - - - - - - - Copy All - - - @@ -219,6 +271,21 @@ + + paletteId + palette256 + magnification + tilesPerRow + tileFit + tilesBg + tilesObj + tilesBoth + copyOne + copyAll + exportOne + exportAll + scrollArea + @@ -270,4 +337,7 @@ + + + From ad00b2f883a1df391aa02f09a45ddb3cb90591c3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 18 Feb 2022 22:09:14 -0800 Subject: [PATCH 37/60] Core: Fix the runloop resuming after a game has crashed (fixes #2451) --- CHANGES | 1 + include/mgba/core/thread.h | 7 ++++--- src/core/thread.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 8e995f274..7624b8312 100644 --- a/CHANGES +++ b/CHANGES @@ -35,6 +35,7 @@ Emulation fixes: Other fixes: - 3DS: Ensure writes update file modification time (fixes mgba.io/i/2444) - Core: Don't attempt to restore rewind diffs past start of rewind + - Core: Fix the runloop resuming after a game has crashed (fixes mgba.io/i/2451) - FFmpeg: Fix crash when encoding audio with some containers - FFmpeg: Fix GIF recording (fixes mgba.io/i/2393) - GB: Fix temporary saves diff --git a/include/mgba/core/thread.h b/include/mgba/core/thread.h index 9f790cfe5..62605aa7f 100644 --- a/include/mgba/core/thread.h +++ b/include/mgba/core/thread.h @@ -54,14 +54,15 @@ enum mCoreThreadState { mTHREAD_INTERRUPTED, mTHREAD_PAUSED, - mTHREAD_MIN_WAITING = mTHREAD_INTERRUPTED, mTHREAD_CRASHED, - mTHREAD_MAX_WAITING = mTHREAD_PAUSED, mTHREAD_INTERRUPTING, mTHREAD_EXITING, - mTHREAD_SHUTDOWN + mTHREAD_SHUTDOWN, + + mTHREAD_MIN_WAITING = mTHREAD_INTERRUPTED, + mTHREAD_MAX_WAITING = mTHREAD_CRASHED }; enum mCoreThreadRequest { diff --git a/src/core/thread.c b/src/core/thread.c index de8a74987..1a9378a77 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -468,7 +468,7 @@ bool mCoreThreadIsActive(struct mCoreThread* threadContext) { if (!threadContext->impl) { return false; } - return threadContext->impl->state >= mTHREAD_RUNNING && threadContext->impl->state < mTHREAD_EXITING; + return threadContext->impl->state >= mTHREAD_RUNNING && threadContext->impl->state < mTHREAD_EXITING && threadContext->impl->state != mTHREAD_CRASHED; } void mCoreThreadInterrupt(struct mCoreThread* threadContext) { From 66f445cd0ac8b885b06e7eabf32e1c5615aa0273 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 18 Feb 2022 22:14:16 -0800 Subject: [PATCH 38/60] GBA: Fix expected entry point for multiboot ELFs (fixes #2450) --- CHANGES | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES b/CHANGES index 7624b8312..c035d71d0 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,7 @@ Emulation fixes: - GB Serialize: Fix loading MBC1 states that affect bank 0 (fixes mgba.io/i/2402) - GB Video: Draw SGB border pieces that overlap GB graphics (fixes mgba.io/i/1339) - GBA: Improve timing when not booting from BIOS + - GBA: Fix expected entry point for multiboot ELFs (fixes mgba.io/i/2450) - GBA BIOS: Work around IRQ handling hiccup in Mario & Luigi (fixes mgba.io/i/1059) - GBA BIOS: Initial HLE timing estimation of UnLz77 functions (fixes mgba.io/i/2141) - GBA DMA: Fix DMA source direction bits being cleared (fixes mgba.io/i/2410) From a966511e1e1128ee7716886bb13097b9fda7f527 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 18 Feb 2022 22:15:31 -0800 Subject: [PATCH 39/60] GBA: Fix expected entry point for multiboot ELFs (fixes #2450) --- src/gba/gba.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gba/gba.c b/src/gba/gba.c index 86b597dc2..2fd1fbe7a 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -582,7 +582,7 @@ bool GBAIsROM(struct VFile* vf) { uint32_t entry = ELFEntry(elf); bool isGBA = true; isGBA = isGBA && ELFMachine(elf) == EM_ARM; - isGBA = isGBA && (entry == BASE_CART0 || entry == BASE_WORKING_RAM); + isGBA = isGBA && (entry == BASE_CART0 || entry == BASE_WORKING_RAM + 0xC0); ELFClose(elf); return isGBA; } @@ -641,7 +641,7 @@ bool GBAIsMB(struct VFile* vf) { #ifdef USE_ELF struct ELF* elf = ELFOpen(vf); if (elf) { - bool isMB = ELFEntry(elf) == BASE_WORKING_RAM; + bool isMB = ELFEntry(elf) == BASE_WORKING_RAM + 0xC0; ELFClose(elf); return isMB; } From 4ae540b387d08d115a155b18b6ad855f2c5cda82 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 03:49:59 -0800 Subject: [PATCH 40/60] Debugger: Save and restore CLI history --- CHANGES | 1 + src/feature/editline/cli-el-backend.c | 37 ++++++++++++++++++ src/platform/qt/DebuggerConsole.cpp | 12 +++--- src/platform/qt/DebuggerConsole.h | 1 - src/platform/qt/DebuggerConsoleController.cpp | 38 ++++++++++++++++++- src/platform/qt/DebuggerConsoleController.h | 4 ++ 6 files changed, 86 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index c035d71d0..fdabf6914 100644 --- a/CHANGES +++ b/CHANGES @@ -44,6 +44,7 @@ Other fixes: - VFS: Failed file mapping should return NULL on POSIX Misc: - Core: Suspend runloop when a core crashes + - Debugger: Save and restore CLI history - GB Video: Add default SGB border - GBA: Automatically skip BIOS if ROM has invalid logo - GBA DMA: Enhanced logging (closes mgba.io/i/2454) diff --git a/src/feature/editline/cli-el-backend.c b/src/feature/editline/cli-el-backend.c index 530019b03..2ae6d7612 100644 --- a/src/feature/editline/cli-el-backend.c +++ b/src/feature/editline/cli-el-backend.c @@ -5,7 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "cli-el-backend.h" +#include #include +#include #include @@ -60,12 +62,47 @@ void _CLIDebuggerEditLineInit(struct CLIDebuggerBackend* be) { HistEvent ev; history(elbe->histate, &ev, H_SETSIZE, 200); el_set(elbe->elstate, EL_HIST, history, elbe->histate); + + char path[PATH_MAX + 1]; + mCoreConfigDirectory(path, PATH_MAX); + if (path[0]) { + strncat(path, PATH_SEP, PATH_MAX); + strncat(path, "cli_history.log", PATH_MAX); + struct VFile* vf = VFileOpen(path, O_RDONLY); + if (vf) { + char line[512]; + while (vf->readline(vf, line, sizeof(line)) > 0) { + history(elbe->histate, &ev, H_ENTER, line); + } + vf->close(vf); + } + } + _activeDebugger = be->p; signal(SIGINT, _breakIntoDefault); } void _CLIDebuggerEditLineDeinit(struct CLIDebuggerBackend* be) { struct CLIDebuggerEditLineBackend* elbe = (struct CLIDebuggerEditLineBackend*) be; + char path[PATH_MAX + 1]; + mCoreConfigDirectory(path, PATH_MAX); + if (path[0]) { + strncat(path, PATH_SEP, PATH_MAX); + strncat(path, "cli_history.log", PATH_MAX); + struct VFile* vf = VFileOpen(path, O_WRONLY | O_CREAT | O_TRUNC); + if (vf) { + HistEvent ev = {0}; + if (history(elbe->histate, &ev, H_FIRST) >= 0) { + do { + if (!ev.str || ev.str[0] == '\n') { + continue; + } + vf->write(vf, ev.str, strlen(ev.str)); + } while (history(elbe->histate, &ev, H_NEXT) >= 0); + } + vf->close(vf); + } + } history_end(elbe->histate); el_end(elbe->elstate); free(elbe); diff --git a/src/platform/qt/DebuggerConsole.cpp b/src/platform/qt/DebuggerConsole.cpp index 2d4261afb..0a4beb909 100644 --- a/src/platform/qt/DebuggerConsole.cpp +++ b/src/platform/qt/DebuggerConsole.cpp @@ -26,6 +26,8 @@ DebuggerConsole::DebuggerConsole(DebuggerConsoleController* controller, QWidget* connect(controller, &DebuggerConsoleController::log, this, &DebuggerConsole::log); connect(m_ui.breakpoint, &QAbstractButton::clicked, controller, &DebuggerController::attach); connect(m_ui.breakpoint, &QAbstractButton::clicked, controller, &DebuggerController::breakInto); + + controller->historyLoad(); } void DebuggerConsole::log(const QString& line) { @@ -41,7 +43,6 @@ void DebuggerConsole::postLine() { if (line.isEmpty()) { m_consoleController->enterLine(QString("\n")); } else { - m_history.append(line); m_historyOffset = 0; log(QString("> %1\n").arg(line)); m_consoleController->enterLine(line); @@ -52,7 +53,8 @@ bool DebuggerConsole::eventFilter(QObject*, QEvent* event) { if (event->type() != QEvent::KeyPress) { return false; } - if (m_history.isEmpty()) { + QStringList history = m_consoleController->history(); + if (history.isEmpty()) { return false; } QKeyEvent* keyEvent = static_cast(event); @@ -64,7 +66,7 @@ bool DebuggerConsole::eventFilter(QObject*, QEvent* event) { --m_historyOffset; break; case Qt::Key_Up: - if (m_historyOffset >= m_history.size()) { + if (m_historyOffset >= history.size()) { return false; } ++m_historyOffset; @@ -73,7 +75,7 @@ bool DebuggerConsole::eventFilter(QObject*, QEvent* event) { m_historyOffset = 0; break; case Qt::Key_Home: - m_historyOffset = m_history.size(); + m_historyOffset = history.size(); break; default: return false; @@ -81,7 +83,7 @@ bool DebuggerConsole::eventFilter(QObject*, QEvent* event) { if (m_historyOffset == 0) { m_ui.prompt->clear(); } else { - m_ui.prompt->setText(m_history[m_history.size() - m_historyOffset]); + m_ui.prompt->setText(history[history.size() - m_historyOffset]); } return true; } diff --git a/src/platform/qt/DebuggerConsole.h b/src/platform/qt/DebuggerConsole.h index 5fe523c24..d13ef4a13 100644 --- a/src/platform/qt/DebuggerConsole.h +++ b/src/platform/qt/DebuggerConsole.h @@ -26,7 +26,6 @@ protected: private: Ui::DebuggerConsole m_ui; - QStringList m_history; int m_historyOffset; DebuggerConsoleController* m_consoleController; diff --git a/src/platform/qt/DebuggerConsoleController.cpp b/src/platform/qt/DebuggerConsoleController.cpp index b77609a5a..24ef25dba 100644 --- a/src/platform/qt/DebuggerConsoleController.cpp +++ b/src/platform/qt/DebuggerConsoleController.cpp @@ -5,7 +5,9 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "DebuggerConsoleController.h" +#include "ConfigController.h" #include "CoreController.h" +#include "LogController.h" #include #include @@ -50,12 +52,12 @@ void DebuggerConsoleController::detach() { } } DebuggerController::detach(); + historySave(); } void DebuggerConsoleController::attachInternal() { CoreController::Interrupter interrupter(m_gameController); QMutexLocker lock(&m_mutex); - m_history.clear(); mCore* core = m_gameController->thread()->core; CLIDebuggerAttachBackend(&m_cliDebugger, &m_backend.d); CLIDebuggerAttachSystem(&m_cliDebugger, core->cliDebuggerSystem(core)); @@ -129,3 +131,37 @@ void DebuggerConsoleController::historyAppend(struct CLIDebuggerBackend* be, con QMutexLocker lock(&self->m_mutex); self->m_history.append(QString::fromUtf8(line)); } + +void DebuggerConsoleController::historyLoad() { + QFile log(ConfigController::configDir() + "/cli_history.log"); + QStringList history; + if (!log.open(QIODevice::ReadOnly | QIODevice::Text)) { + return; + } + while (true) { + QByteArray line = log.readLine(); + if (line.isEmpty()) { + break; + } + if (line.endsWith("\r\n")) { + line.chop(2); + } else if (line.endsWith("\n")) { + line.chop(1); + } + history.append(QString::fromUtf8(line)); + } + QMutexLocker lock(&m_mutex); + m_history = history; +} + +void DebuggerConsoleController::historySave() { + QFile log(ConfigController::configDir() + "/cli_history.log"); + if (!log.open(QIODevice::WriteOnly | QIODevice::Text)) { + LOG(QT, WARN) << tr("Could not open CLI history for writing"); + return; + } + for (const QString& line : m_history) { + log.write(line.toUtf8()); + log.write("\n"); + } +} diff --git a/src/platform/qt/DebuggerConsoleController.h b/src/platform/qt/DebuggerConsoleController.h index 5989b7441..051d78666 100644 --- a/src/platform/qt/DebuggerConsoleController.h +++ b/src/platform/qt/DebuggerConsoleController.h @@ -23,6 +23,8 @@ Q_OBJECT public: DebuggerConsoleController(QObject* parent = nullptr); + QStringList history() const { return m_history; } + signals: void log(const QString&); void lineAppend(const QString&); @@ -30,6 +32,8 @@ signals: public slots: void enterLine(const QString&); virtual void detach() override; + void historyLoad(); + void historySave(); protected: virtual void attachInternal() override; From f72e55c3f6dc965266c4a4da2233f83ca1092af8 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 03:50:44 -0800 Subject: [PATCH 41/60] GB I/O: Remove pointless GBVideoProcessDots calls --- src/gb/io.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/gb/io.c b/src/gb/io.c index 61a1b7c93..deed1153f 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -506,9 +506,6 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { gb->memory.io[GB_REG_BCPD] = gb->video.palette[gb->video.bcpIndex >> 1] >> (8 * (gb->video.bcpIndex & 1)); break; case GB_REG_BCPD: - if (gb->video.mode != 3) { - GBVideoProcessDots(&gb->video, 0); - } GBVideoWritePalette(&gb->video, address, value); return; case GB_REG_OCPS: @@ -517,9 +514,6 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) { gb->memory.io[GB_REG_OCPD] = gb->video.palette[8 * 4 + (gb->video.ocpIndex >> 1)] >> (8 * (gb->video.ocpIndex & 1)); break; case GB_REG_OCPD: - if (gb->video.mode != 3) { - GBVideoProcessDots(&gb->video, 0); - } GBVideoWritePalette(&gb->video, address, value); return; case GB_REG_SVBK: From 5f3cb2f72fd38b68f64f9d8700e61febd23128b6 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 04:26:16 -0800 Subject: [PATCH 42/60] Vita: Add bilinear filtering option (closes #344) --- CHANGES | 1 + src/platform/psp2/main.c | 11 +++++++++ src/platform/psp2/psp2-context.c | 38 ++++++++++++++++++-------------- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index fdabf6914..eb5f81cb4 100644 --- a/CHANGES +++ b/CHANGES @@ -60,6 +60,7 @@ Misc: - Qt: Enable -b for Boot BIOS menu option (fixes mgba.io/i/2074) - Qt: Add tile range selection to tile viewer (closes mgba.io/i/2455) - Windows: Attach to console if present + - Vita: Add bilinear filtering option (closes mgba.io/i/344) 0.9.3: (2021-12-17) Emulation fixes: diff --git a/src/platform/psp2/main.c b/src/platform/psp2/main.c index 2be4dafee..7ad4db343 100644 --- a/src/platform/psp2/main.c +++ b/src/platform/psp2/main.c @@ -171,6 +171,17 @@ int main() { }, .nStates = 4 }, + { + .title = "Screen filtering", + .data = GUI_V_S("filtering"), + .submenu = 0, + .state = 0, + .validStates = (const char*[]) { + "None", + "Bilinear", + }, + .nStates = 2 + }, { .title = "Camera", .data = GUI_V_S("camera"), diff --git a/src/platform/psp2/psp2-context.c b/src/platform/psp2/psp2-context.c index 05e7a2593..82f0c6029 100644 --- a/src/platform/psp2/psp2-context.c +++ b/src/platform/psp2/psp2-context.c @@ -56,6 +56,7 @@ static vita2d_texture* screenshot; static Thread audioThread; static bool interframeBlending = false; static bool sgbCrop = false; +static bool blurry = false; static struct mSceRotationSource { struct mRotationSource d; @@ -368,10 +369,8 @@ void mPSP2Setup(struct mGUIRunner* runner) { if (mCoreConfigGetUIntValue(&runner->config, "camera", &mode)) { camera.cam = mode; } - int fakeBool; - if (mCoreConfigGetIntValue(&runner->config, "sgb.borderCrop", &fakeBool)) { - sgbCrop = fakeBool; - } + mCoreConfigGetBoolValue(&runner->config, "sgb.borderCrop", &sgbCrop); + mCoreConfigGetBoolValue(&runner->config, "filtering", &blurry); } void mPSP2LoadROM(struct mGUIRunner* runner) { @@ -400,10 +399,7 @@ void mPSP2LoadROM(struct mGUIRunner* runner) { break; } - int fakeBool; - if (mCoreConfigGetIntValue(&runner->config, "interframeBlending", &fakeBool)) { - interframeBlending = fakeBool; - } + mCoreConfigGetBoolValue(&runner->config, "interframeBlending", &interframeBlending); // Backcompat: Old versions of mGBA use an older binding system that has different mappings for L/R if (!sceKernelIsPSVitaTV()) { @@ -479,14 +475,9 @@ void mPSP2Unpaused(struct mGUIRunner* runner) { } } - int fakeBool; - if (mCoreConfigGetIntValue(&runner->config, "interframeBlending", &fakeBool)) { - interframeBlending = fakeBool; - } - - if (mCoreConfigGetIntValue(&runner->config, "sgb.borderCrop", &fakeBool)) { - sgbCrop = fakeBool; - } + mCoreConfigGetBoolValue(&runner->config, "interframeBlending", &interframeBlending); + mCoreConfigGetBoolValue(&runner->config, "sgb.borderCrop", &sgbCrop); + mCoreConfigGetBoolValue(&runner->config, "filtering", &blurry); } void mPSP2Teardown(struct mGUIRunner* runner) { @@ -577,6 +568,21 @@ void _drawTex(vita2d_texture* t, unsigned width, unsigned height, bool faded, bo scaley = 544.0f / height; break; } + vita2d_texture_set_filters(t, SCE_GXM_TEXTURE_FILTER_LINEAR, + blurry ? SCE_GXM_TEXTURE_FILTER_LINEAR : SCE_GXM_TEXTURE_FILTER_POINT); + if (blurry) { + // Needed to avoid bleed from off-screen portion of texture + unsigned i; + uint32_t* texpixels = vita2d_texture_get_datap(t); + if (width < 256) { + for (i = 0; i < height; ++i) { + texpixels[i * 256 + width] = texpixels[i * 256 + width - 1]; + } + } + if (height < vita2d_texture_get_height(t)) { + memcpy(&texpixels[height * 256], &texpixels[(height - 1) * 256], 1024); + } + } vita2d_draw_texture_tint_part_scale(t, (960.0f - w) / 2.0f, (544.0f - h) / 2.0f, 0, 0, width, height, From 7c8a06816bb09cc1c4f4950d78adef27a1daab44 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 19:45:13 -0800 Subject: [PATCH 43/60] GBA Video: Implement layer placement for OpenGL renderer (fixes #1962) --- CHANGES | 1 + include/mgba/internal/gba/renderers/gl.h | 6 +++++ src/gba/core.c | 14 ++++++++++ src/gba/renderers/gl.c | 34 +++++++++++++----------- 4 files changed, 39 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index eb5f81cb4..969e56742 100644 --- a/CHANGES +++ b/CHANGES @@ -48,6 +48,7 @@ Misc: - GB Video: Add default SGB border - GBA: Automatically skip BIOS if ROM has invalid logo - GBA DMA: Enhanced logging (closes mgba.io/i/2454) + - GBA Video: Implement layer placement for OpenGL renderer (fixes mgba.io/i/1962) - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) - Qt: Rearrange menus some - Qt: Clean up cheats dialog diff --git a/include/mgba/internal/gba/renderers/gl.h b/include/mgba/internal/gba/renderers/gl.h index 773d5dee0..1a972ada8 100644 --- a/include/mgba/internal/gba/renderers/gl.h +++ b/include/mgba/internal/gba/renderers/gl.h @@ -60,6 +60,8 @@ struct GBAVideoGLBackground { uint16_t y; int32_t refx; int32_t refy; + int32_t offsetX; + int32_t offsetY; struct GBAVideoGLAffine affine; @@ -142,6 +144,8 @@ struct GBAVideoGLRenderer { int oamMax; bool oamDirty; struct GBAVideoRendererSprite sprites[128]; + int16_t objOffsetX; + int16_t objOffsetY; GLuint fbo[GBA_GL_FBO_MAX]; GLuint layers[GBA_GL_TEX_MAX]; @@ -183,6 +187,8 @@ struct GBAVideoGLRenderer { struct GBAVideoWindowRegion h; struct GBAVideoWindowRegion v; GBAWindowControl control; + int16_t offsetX; + int16_t offsetY; } winN[2]; GLint winNHistory[2][GBA_VIDEO_VERTICAL_PIXELS * 4]; diff --git a/src/gba/core.c b/src/gba/core.c index 633572249..969145d30 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -1105,15 +1105,29 @@ static void _GBACoreAdjustVideoLayer(struct mCore* core, size_t id, int32_t x, i case GBA_LAYER_BG3: gbacore->renderer.bg[id].offsetX = x; gbacore->renderer.bg[id].offsetY = y; +#ifdef BUILD_GLES3 + gbacore->glRenderer.bg[id].offsetX = x; + gbacore->glRenderer.bg[id].offsetY = y; +#endif break; case GBA_LAYER_OBJ: gbacore->renderer.objOffsetX = x; gbacore->renderer.objOffsetY = y; gbacore->renderer.oamDirty = 1; +#ifdef BUILD_GLES3 + gbacore->glRenderer.objOffsetX = x; + gbacore->glRenderer.objOffsetY = y; + gbacore->glRenderer.oamDirty = 1; +#endif break; case GBA_LAYER_WIN0: + case GBA_LAYER_WIN1: gbacore->renderer.winN[id - GBA_LAYER_WIN0].offsetX = x; gbacore->renderer.winN[id - GBA_LAYER_WIN0].offsetY = y; +#ifdef BUILD_GLES3 + gbacore->glRenderer.winN[id - GBA_LAYER_WIN0].offsetX = x; + gbacore->glRenderer.winN[id - GBA_LAYER_WIN0].offsetY = y; +#endif break; default: return; diff --git a/src/gba/renderers/gl.c b/src/gba/renderers/gl.c index 4feddefbe..94e8514a6 100644 --- a/src/gba/renderers/gl.c +++ b/src/gba/renderers/gl.c @@ -1331,27 +1331,27 @@ void GBAVideoGLRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { } glRenderer->regsDirty = 0; - glRenderer->winNHistory[0][y * 4 + 0] = glRenderer->winN[0].h.start; - glRenderer->winNHistory[0][y * 4 + 1] = glRenderer->winN[0].h.end; - glRenderer->winNHistory[0][y * 4 + 2] = glRenderer->winN[0].v.start; - glRenderer->winNHistory[0][y * 4 + 3] = glRenderer->winN[0].v.end; - glRenderer->winNHistory[1][y * 4 + 0] = glRenderer->winN[1].h.start; - glRenderer->winNHistory[1][y * 4 + 1] = glRenderer->winN[1].h.end; - glRenderer->winNHistory[1][y * 4 + 2] = glRenderer->winN[1].v.start; - glRenderer->winNHistory[1][y * 4 + 3] = glRenderer->winN[1].v.end; + glRenderer->winNHistory[0][y * 4 + 0] = glRenderer->winN[0].h.start + glRenderer->winN[0].offsetX; + glRenderer->winNHistory[0][y * 4 + 1] = glRenderer->winN[0].h.end + glRenderer->winN[0].offsetX; + glRenderer->winNHistory[0][y * 4 + 2] = glRenderer->winN[0].v.start + glRenderer->winN[0].offsetY; + glRenderer->winNHistory[0][y * 4 + 3] = glRenderer->winN[0].v.end + glRenderer->winN[0].offsetY; + glRenderer->winNHistory[1][y * 4 + 0] = glRenderer->winN[1].h.start + glRenderer->winN[1].offsetX; + glRenderer->winNHistory[1][y * 4 + 1] = glRenderer->winN[1].h.end + glRenderer->winN[1].offsetX; + glRenderer->winNHistory[1][y * 4 + 2] = glRenderer->winN[1].v.start + glRenderer->winN[1].offsetY; + glRenderer->winNHistory[1][y * 4 + 3] = glRenderer->winN[1].v.end + glRenderer->winN[1].offsetY; - glRenderer->bg[0].scanlineOffset[y] = glRenderer->bg[0].x; - glRenderer->bg[0].scanlineOffset[y] |= glRenderer->bg[0].y << 12; - glRenderer->bg[1].scanlineOffset[y] = glRenderer->bg[1].x; - glRenderer->bg[1].scanlineOffset[y] |= glRenderer->bg[1].y << 12; - glRenderer->bg[2].scanlineOffset[y] = glRenderer->bg[2].x; - glRenderer->bg[2].scanlineOffset[y] |= glRenderer->bg[2].y << 12; + glRenderer->bg[0].scanlineOffset[y] = (glRenderer->bg[0].x - glRenderer->bg[0].offsetX) & 0x1FF; + glRenderer->bg[0].scanlineOffset[y] |= ((glRenderer->bg[0].y - glRenderer->bg[0].offsetY) & 0x1FF) << 12; + glRenderer->bg[1].scanlineOffset[y] = (glRenderer->bg[1].x - glRenderer->bg[1].offsetX) & 0x1FF; + glRenderer->bg[1].scanlineOffset[y] |= ((glRenderer->bg[1].y - glRenderer->bg[1].offsetY) & 0x1FF) << 12; + glRenderer->bg[2].scanlineOffset[y] = (glRenderer->bg[2].x - glRenderer->bg[2].offsetX) & 0x1FF; + glRenderer->bg[2].scanlineOffset[y] |= ((glRenderer->bg[2].y - glRenderer->bg[2].offsetY) & 0x1FF) << 12; glRenderer->bg[2].scanlineAffine[y * 4] = glRenderer->bg[2].affine.dx; glRenderer->bg[2].scanlineAffine[y * 4 + 1] = glRenderer->bg[2].affine.dy; glRenderer->bg[2].scanlineAffine[y * 4 + 2] = glRenderer->bg[2].affine.sx; glRenderer->bg[2].scanlineAffine[y * 4 + 3] = glRenderer->bg[2].affine.sy; - glRenderer->bg[3].scanlineOffset[y] = glRenderer->bg[3].x; - glRenderer->bg[3].scanlineOffset[y] |= glRenderer->bg[3].y << 12; + glRenderer->bg[3].scanlineOffset[y] = (glRenderer->bg[3].x - glRenderer->bg[3].offsetX) & 0x1FF; + glRenderer->bg[3].scanlineOffset[y] |= ((glRenderer->bg[3].y - glRenderer->bg[3].offsetY) & 0x1FF) << 12; glRenderer->bg[3].scanlineAffine[y * 4] = glRenderer->bg[3].affine.dx; glRenderer->bg[3].scanlineAffine[y * 4 + 1] = glRenderer->bg[3].affine.dy; glRenderer->bg[3].scanlineAffine[y * 4 + 2] = glRenderer->bg[3].affine.sx; @@ -1686,6 +1686,7 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB int height = GBAVideoObjSizes[GBAObjAttributesAGetShape(sprite->a) * 4 + GBAObjAttributesBGetSize(sprite->b)][1]; int32_t x = (uint32_t) GBAObjAttributesBGetX(sprite->b) << 23; x >>= 23; + x += renderer->objOffsetX; if (GBARegisterDISPCNTGetMode(renderer->dispcnt) >= 3 && GBAObjAttributesCGetTile(sprite->c) < 512) { return; @@ -1702,6 +1703,7 @@ void GBAVideoGLRendererDrawSprite(struct GBAVideoGLRenderer* renderer, struct GB totalHeight <<= 1; } + spriteY += renderer->objOffsetY; if (spriteY + totalHeight >= 256) { spriteY -= 256; } From 5b26099eacace4bf2a25e3d96aa779b9dc4f9ff1 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 20:37:22 -0800 Subject: [PATCH 44/60] Qt: Show warning if XQ audio is toggled while loaded (fixes #2295) --- CHANGES | 1 + src/platform/qt/SettingsView.cpp | 7 ++++++- src/platform/qt/SettingsView.h | 1 + src/platform/qt/Window.cpp | 25 ++++++++++++++++++++++++- src/platform/qt/Window.h | 2 ++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 969e56742..8e317b991 100644 --- a/CHANGES +++ b/CHANGES @@ -60,6 +60,7 @@ Misc: - Qt: Add QOpenGLWidget cross-thread codepath for macOS (fixes mgba.io/i/1754) - Qt: Enable -b for Boot BIOS menu option (fixes mgba.io/i/2074) - Qt: Add tile range selection to tile viewer (closes mgba.io/i/2455) + - Qt: Show warning if XQ audio is toggled while loaded (fixes mgba.io/i/2295) - Windows: Attach to console if present - Vita: Add bilinear filtering option (closes mgba.io/i/344) diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index 4af948d4b..65204df4b 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -483,7 +483,6 @@ void SettingsView::updateConfig() { saveSetting("logToStdout", m_ui.logToStdout); saveSetting("logFile", m_ui.logFile); saveSetting("useDiscordPresence", m_ui.useDiscordPresence); - saveSetting("gba.audioHle", m_ui.audioHle); saveSetting("dynamicTitle", m_ui.dynamicTitle); saveSetting("videoScale", m_ui.videoScale); saveSetting("gba.forceGbp", m_ui.forceGbp); @@ -577,6 +576,12 @@ void SettingsView::updateConfig() { emit languageChanged(); } + bool oldAudioHle = m_controller->getOption("gba.audioHle", "0") != "0"; + if (oldAudioHle != m_ui.audioHle->isChecked()) { + saveSetting("gba.audioHle", m_ui.audioHle); + emit audioHleChanged(); + } + if (m_ui.multiplayerAudioAll->isChecked()) { m_controller->setQtOption("multiplayerAudio", "all"); } else if (m_ui.multiplayerAudio1->isChecked()) { diff --git a/src/platform/qt/SettingsView.h b/src/platform/qt/SettingsView.h index d6ab1431b..1792c8f4b 100644 --- a/src/platform/qt/SettingsView.h +++ b/src/platform/qt/SettingsView.h @@ -62,6 +62,7 @@ signals: void pathsChanged(); void languageChanged(); void libraryCleared(); + void audioHleChanged(); public slots: void selectPage(Page); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 76bcacebc..523b518d7 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -156,6 +156,8 @@ Window::Window(CoreManager* manager, ConfigController* config, int playerId, QWi m_focusCheck.setInterval(200); m_mustRestart.setInterval(MUST_RESTART_TIMEOUT); m_mustRestart.setSingleShot(true); + m_mustReset.setInterval(MUST_RESTART_TIMEOUT); + m_mustReset.setSingleShot(true); m_shortcutController->setConfigController(m_config); m_shortcutController->setActionMapper(&m_actions); @@ -534,11 +536,20 @@ void Window::openSettingsWindow(SettingsView::Page page) { #endif connect(settingsWindow, &SettingsView::displayDriverChanged, this, &Window::reloadDisplayDriver); connect(settingsWindow, &SettingsView::audioDriverChanged, this, &Window::reloadAudioDriver); - connect(settingsWindow, &SettingsView::cameraDriverChanged, this, &Window::mustRestart); + connect(settingsWindow, &SettingsView::cameraDriverChanged, this, &Window::mustReset); connect(settingsWindow, &SettingsView::cameraChanged, &m_inputController, &InputController::setCamera); connect(settingsWindow, &SettingsView::videoRendererChanged, this, &Window::changeRenderer); connect(settingsWindow, &SettingsView::languageChanged, this, &Window::mustRestart); connect(settingsWindow, &SettingsView::pathsChanged, this, &Window::reloadConfig); + connect(settingsWindow, &SettingsView::audioHleChanged, this, [this]() { + if (!m_controller) { + return; + } + if (m_controller->platform() != mPLATFORM_GBA) { + return; + } + mustReset(); + }); #ifdef USE_SQLITE3 connect(settingsWindow, &SettingsView::libraryCleared, m_libraryView, &LibraryController::clear); #endif @@ -1082,6 +1093,18 @@ void Window::mustRestart() { dialog->show(); } +void Window::mustReset() { + if (m_mustReset.isActive() || !m_controller) { + return; + } + m_mustReset.start(); + QMessageBox* dialog = new QMessageBox(QMessageBox::Warning, tr("Reset needed"), + tr("Some changes will not take effect until the game is reset."), + QMessageBox::Ok, this, Qt::Sheet); + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->show(); +} + void Window::recordFrame() { m_frameList.append(m_frameTimer.nsecsElapsed()); m_frameTimer.restart(); diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 9fdf564ca..4a76a5d2e 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -142,6 +142,7 @@ private slots: void tryMakePortable(); void mustRestart(); + void mustReset(); void recordFrame(); void showFPS(); @@ -215,6 +216,7 @@ private: QElapsedTimer m_frameTimer; QTimer m_fpsTimer; QTimer m_mustRestart; + QTimer m_mustReset; QList m_mruFiles; ShortcutController* m_shortcutController; #if defined(BUILD_GL) || defined(BUILD_GLES2) From 91911fe092b888ab09be6e75aef2531fd01d0581 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 21:05:12 -0800 Subject: [PATCH 45/60] GBA: Refine multiboot detection (fixes #2192) --- CHANGES | 1 + src/gba/gba.c | 21 ++++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGES b/CHANGES index 8e317b991..a1bb2a0f3 100644 --- a/CHANGES +++ b/CHANGES @@ -47,6 +47,7 @@ Misc: - Debugger: Save and restore CLI history - GB Video: Add default SGB border - GBA: Automatically skip BIOS if ROM has invalid logo + - GBA: Refine multiboot detection (fixes mgba.io/i/2192) - GBA DMA: Enhanced logging (closes mgba.io/i/2454) - GBA Video: Implement layer placement for OpenGL renderer (fixes mgba.io/i/1962) - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) diff --git a/src/gba/gba.c b/src/gba/gba.c index 2fd1fbe7a..a3c6b66b2 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -672,6 +672,10 @@ bool GBAIsMB(struct VFile* vf) { } uint32_t pc = GBA_MB_MAGIC_OFFSET; + int wramAddrs = 0; + int wramLoads = 0; + int romAddrs = 0; + int romLoads = 0; int i; for (i = 0; i < 80; ++i) { if (vf->read(vf, &signature, sizeof(signature)) != sizeof(signature)) { @@ -679,6 +683,12 @@ bool GBAIsMB(struct VFile* vf) { } pc += 4; LOAD_32(opcode, 0, &signature); + if ((opcode & ~0x7FF) == BASE_WORKING_RAM) { + ++wramAddrs; + } + if ((opcode & ~0x7FF) == BASE_CART0) { + ++romAddrs; + } ARMDecodeARM(opcode, &info); if (info.mnemonic != ARM_MN_LDR) { continue; @@ -700,10 +710,19 @@ bool GBAIsMB(struct VFile* vf) { break; } if ((immediate & ~0x7FF) == BASE_WORKING_RAM) { - return true; + ++wramLoads; + } + if ((immediate & ~0x7FF) == BASE_CART0) { + ++romLoads; } } } + if (romLoads + romAddrs > 2) { + return false; + } + if (wramLoads + wramAddrs) { + return true; + } // Found a libgba-linked cart...these are a bit harder to detect. return false; } From 862bd15afc092653c24c53bfa9a36a5956c3d6d4 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 21:23:40 -0800 Subject: [PATCH 46/60] GBA: Widen multiboot search --- src/gba/gba.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/gba/gba.c b/src/gba/gba.c index a3c6b66b2..285b06615 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -677,16 +677,16 @@ bool GBAIsMB(struct VFile* vf) { int romAddrs = 0; int romLoads = 0; int i; - for (i = 0; i < 80; ++i) { + for (i = 0; i < 128; ++i) { if (vf->read(vf, &signature, sizeof(signature)) != sizeof(signature)) { break; } pc += 4; LOAD_32(opcode, 0, &signature); - if ((opcode & ~0x7FF) == BASE_WORKING_RAM) { + if ((opcode & ~0x1FFFF) == BASE_WORKING_RAM) { ++wramAddrs; } - if ((opcode & ~0x7FF) == BASE_CART0) { + if ((opcode & ~0x1FFFF) == BASE_CART0) { ++romAddrs; } ARMDecodeARM(opcode, &info); @@ -709,15 +709,15 @@ bool GBAIsMB(struct VFile* vf) { if (vf->seek(vf, pc, SEEK_SET) < 0) { break; } - if ((immediate & ~0x7FF) == BASE_WORKING_RAM) { + if ((immediate & ~0x1FFFF) == BASE_WORKING_RAM) { ++wramLoads; } - if ((immediate & ~0x7FF) == BASE_CART0) { + if ((immediate & ~0x1FFFF) == BASE_CART0) { ++romLoads; } } } - if (romLoads + romAddrs > 2) { + if (romLoads + romAddrs >= 2) { return false; } if (wramLoads + wramAddrs) { From 5f46364ef6e7cd7f8bfb7cc4266848b6508bb32f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 22:44:37 -0800 Subject: [PATCH 47/60] Windows: Attempt to fix building updater with MSVC --- src/platform/qt/CMakeLists.txt | 2 +- src/platform/qt/updater.qrc.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index fdbe4ab9c..9fcb99080 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -236,7 +236,7 @@ endif() qt5_add_resources(RESOURCES resources.qrc) if(BUILD_UPDATER) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/updater.qrc.in ${CMAKE_CURRENT_BINARY_DIR}/updater.qrc) + file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/updater.qrc INPUT ${CMAKE_CURRENT_SOURCE_DIR}/updater.qrc.in) qt5_add_resources(UPDATER_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/updater.qrc) list(APPEND RESOURCES ${UPDATER_RESOURCES}) endif() diff --git a/src/platform/qt/updater.qrc.in b/src/platform/qt/updater.qrc.in index edf2cd38e..d8f015ace 100644 --- a/src/platform/qt/updater.qrc.in +++ b/src/platform/qt/updater.qrc.in @@ -1,5 +1,5 @@ - ${PROJECT_BINARY_DIR}/updater-stub${CMAKE_EXECUTABLE_SUFFIX} + $ From 7b6dd5b1367e9fc3f65cdd9d7ef3d4b30e6f0eec Mon Sep 17 00:00:00 2001 From: S3aBreeze Date: Thu, 17 Feb 2022 13:06:01 +0000 Subject: [PATCH 48/60] Qt: Update translation (Russian) Translation: mGBA/Qt Translate-URL: https://hosted.weblate.org/projects/mgba/mgba-qt/ru/ --- src/platform/qt/ts/mgba-ru.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 6c5c46346..c25fc5cfe 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -6,7 +6,7 @@ About - О приложении + О программе From 7d71396968d5450266a7999b5848dceb0598c81f Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 20 Feb 2022 23:37:04 -0800 Subject: [PATCH 49/60] AppVeyor: Only build one config --- .appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index e2ad17491..1da9373ad 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -12,7 +12,7 @@ install: - vcpkg --no-dry-run upgrade - rd /Q /S C:\Tools\vcpkg\buildtrees before_build: -- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release -DBUILD_UPDATER=OFF +- cmake . -DCMAKE_PREFIX_PATH=C:\Qt\5.15\msvc2019_64 -DCMAKE_TOOLCHAIN_FILE=C:\Tools\vcpkg\scripts\buildsystems\vcpkg.cmake -DVCPKG_TARGET_TRIPLET=x64-windows-release -DCMAKE_CONFIGURATION_TYPES=Release build: parallel: true project: mGBA.sln From 64d8dd1b6967ba8cf610444a621b6fbaa434011c Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 22 Feb 2022 19:40:21 -0800 Subject: [PATCH 50/60] GBA Cheats: Implement "never" type codes (closes #915) --- CHANGES | 1 + include/mgba/core/cheats.h | 1 + src/core/cheats.c | 6 ++ src/gba/cheats/parv3.c | 10 +-- src/gba/test/cheats.c | 133 ++++++++++++++++++++++++++++++++++++- 5 files changed, 146 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index a1bb2a0f3..8fe94d5c3 100644 --- a/CHANGES +++ b/CHANGES @@ -48,6 +48,7 @@ Misc: - GB Video: Add default SGB border - GBA: Automatically skip BIOS if ROM has invalid logo - GBA: Refine multiboot detection (fixes mgba.io/i/2192) + - GBA Cheats: Implement "never" type codes (closes mgba.io/i/915) - GBA DMA: Enhanced logging (closes mgba.io/i/2454) - GBA Video: Implement layer placement for OpenGL renderer (fixes mgba.io/i/1962) - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) diff --git a/include/mgba/core/cheats.h b/include/mgba/core/cheats.h index 4d7bd909c..1da1aa859 100644 --- a/include/mgba/core/cheats.h +++ b/include/mgba/core/cheats.h @@ -31,6 +31,7 @@ enum mCheatType { CHEAT_IF_LAND, CHEAT_IF_NAND, CHEAT_IF_BUTTON, + CHEAT_NEVER, }; struct mCheat { diff --git a/src/core/cheats.c b/src/core/cheats.c index fad5943c0..688b32ebe 100644 --- a/src/core/cheats.c +++ b/src/core/cheats.c @@ -741,6 +741,12 @@ void mCheatRefresh(struct mCheatDevice* device, struct mCheatSet* cheats) { negativeConditionRemaining = cheat->negativeRepeat; operationsRemaining = 1; break; + case CHEAT_NEVER: + condition = false; + conditionRemaining = cheat->repeat; + negativeConditionRemaining = cheat->negativeRepeat; + operationsRemaining = 1; + break; } if (performAssignment) { diff --git a/src/gba/cheats/parv3.c b/src/gba/cheats/parv3.c index 1a82f084c..30cc5515b 100644 --- a/src/gba/cheats/parv3.c +++ b/src/gba/cheats/parv3.c @@ -72,12 +72,9 @@ static void _parElseBlock(struct GBACheatSet* cheats) { static bool _addPAR3Cond(struct GBACheatSet* cheats, uint32_t op1, uint32_t op2) { enum GBAActionReplay3Condition condition = op1 & PAR3_COND; int width = 1 << ((op1 & PAR3_WIDTH) >> PAR3_WIDTH_BASE); - if (width > 4) { - // TODO: Always false conditions - return false; - } if ((op1 & PAR3_ACTION) == PAR3_ACTION_DISABLE) { // TODO: Codes that disable + mLOG(CHEATS, STUB, "Disable-type PARv3 codes not yet supported"); return false; } @@ -136,6 +133,11 @@ static bool _addPAR3Cond(struct GBACheatSet* cheats, uint32_t op1, uint32_t op2) cheat->type = CHEAT_IF_AND; break; } + + if (width > 4) { + cheat->width = 0; + cheat->type = CHEAT_NEVER; + } return true; } diff --git a/src/gba/test/cheats.c b/src/gba/test/cheats.c index 527c3ccdc..5d76103fc 100644 --- a/src/gba/test/cheats.c +++ b/src/gba/test/cheats.c @@ -1051,6 +1051,133 @@ M_TEST_DEFINE(doPARv3IfButton) { mCheatSetDeinit(set); } +M_TEST_DEFINE(doPARv3Never1) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "0E300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + + mCheatSetDeinit(set); +} + +M_TEST_DEFINE(doPARv3Never2) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "4E300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x21); + + mCheatSetDeinit(set); +} + +M_TEST_DEFINE(doPARv3NeverX) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "8E300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + mCheatSetDeinit(set); +} + +M_TEST_DEFINE(doPARv3NeverXElse) { + struct mCore* core = *state; + struct mCheatDevice* device = core->cheatDevice(core); + assert_non_null(device); + struct mCheatSet* set = device->createSet(device, NULL); + assert_non_null(set); + GBACheatSetGameSharkVersion((struct GBACheatSet*) set, GBA_GS_PARV3_RAW); + assert_true(set->addLine(set, "00300001 00000011", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000021", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "8E300000 00000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300001 00000012", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 60000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300002 00000022", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00000000 40000000", GBA_CHEAT_PRO_ACTION_REPLAY)); + assert_true(set->addLine(set, "00300000 00000001", GBA_CHEAT_PRO_ACTION_REPLAY)); + + core->reset(core); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0); + + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + + core->reset(core); + core->rawWrite8(core, 0x03000000, -1, 0x1); + mCheatRefresh(device, set); + assert_int_equal(core->rawRead8(core, 0x03000000, -1), 0x1); + assert_int_equal(core->rawRead8(core, 0x03000001, -1), 0x11); + assert_int_equal(core->rawRead8(core, 0x03000002, -1), 0x22); + mCheatSetDeinit(set); +} + M_TEST_SUITE_DEFINE(GBACheats, cmocka_unit_test_setup_teardown(createSet, cheatsSetup, cheatsTeardown), cmocka_unit_test_setup_teardown(addRawPARv3, cheatsSetup, cheatsTeardown), @@ -1072,4 +1199,8 @@ M_TEST_SUITE_DEFINE(GBACheats, cmocka_unit_test_setup_teardown(doPARv3IfXContain1Else, cheatsSetup, cheatsTeardown), cmocka_unit_test_setup_teardown(doPARv3IfXElseContain1, cheatsSetup, cheatsTeardown), cmocka_unit_test_setup_teardown(doPARv3IfXContain1ElseContain1, cheatsSetup, cheatsTeardown), - cmocka_unit_test_setup_teardown(doPARv3IfButton, cheatsSetup, cheatsTeardown)) + cmocka_unit_test_setup_teardown(doPARv3IfButton, cheatsSetup, cheatsTeardown), + cmocka_unit_test_setup_teardown(doPARv3Never1, cheatsSetup, cheatsTeardown), + cmocka_unit_test_setup_teardown(doPARv3Never2, cheatsSetup, cheatsTeardown), + cmocka_unit_test_setup_teardown(doPARv3NeverX, cheatsSetup, cheatsTeardown), + cmocka_unit_test_setup_teardown(doPARv3NeverXElse, cheatsSetup, cheatsTeardown)) From c284506c1b7324215a624a7c560ad68436dab8a6 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 27 Feb 2022 21:17:06 -0800 Subject: [PATCH 51/60] mGUI: Fix FPS counter after closing menu --- CHANGES | 1 + src/feature/gui/gui-runner.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index 8fe94d5c3..15d7d3955 100644 --- a/CHANGES +++ b/CHANGES @@ -41,6 +41,7 @@ Other fixes: - FFmpeg: Fix GIF recording (fixes mgba.io/i/2393) - GB: Fix temporary saves - GB, GBA: Save writeback-pending masked saves on unload (fixes mgba.io/i/2396) + - mGUI: Fix FPS counter after closing menu - VFS: Failed file mapping should return NULL on POSIX Misc: - Core: Suspend runloop when a core crashes diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c index a79b01042..fe4aca500 100644 --- a/src/feature/gui/gui-runner.c +++ b/src/feature/gui/gui-runner.c @@ -25,8 +25,8 @@ mLOG_DECLARE_CATEGORY(GUI_RUNNER); mLOG_DEFINE_CATEGORY(GUI_RUNNER, "GUI Runner", "gui.runner"); #define AUTOSAVE_GRANULARITY 600 -#define FPS_GRANULARITY 120 -#define FPS_BUFFER_SIZE 3 +#define FPS_GRANULARITY 30 +#define FPS_BUFFER_SIZE 4 enum { RUNNER_CONTINUE = 1, @@ -491,10 +491,10 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { runner->gameLoaded(runner); } mLOG(GUI_RUNNER, INFO, "Game starting"); + runner->fps = 0; while (running) { CircleBufferClear(&runner->fpsBuffer); runner->totalDelta = 0; - runner->fps = 0; struct timeval tv; gettimeofday(&tv, 0); runner->lastFpsCheck = 1000000LL * tv.tv_sec + tv.tv_usec; @@ -593,7 +593,8 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { } runner->params.drawEnd(); - if (runner->core->frameCounter(runner->core) % FPS_GRANULARITY == 0) { + ++frame; + if (frame % FPS_GRANULARITY == 0) { if (drawFps) { struct timeval tv; gettimeofday(&tv, 0); @@ -618,7 +619,9 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { frame = 0; _tryAutosave(runner); } - ++frame; + if (frame == FPS_GRANULARITY * AUTOSAVE_GRANULARITY) { + frame = 0; + } } } if (!running) { From 467c620abca3ed13aa912ff1fcda58bb58e9a630 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 27 Feb 2022 21:17:56 -0800 Subject: [PATCH 52/60] mGUI: Autosave less frequently when fast-forwarding --- CHANGES | 1 + src/feature/gui/gui-runner.c | 11 +++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 15d7d3955..fbe0ed504 100644 --- a/CHANGES +++ b/CHANGES @@ -53,6 +53,7 @@ Misc: - GBA DMA: Enhanced logging (closes mgba.io/i/2454) - GBA Video: Implement layer placement for OpenGL renderer (fixes mgba.io/i/1962) - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) + - mGUI: Autosave less frequently when fast-forwarding - Qt: Rearrange menus some - Qt: Clean up cheats dialog - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c index fe4aca500..64488dcb8 100644 --- a/src/feature/gui/gui-runner.c +++ b/src/feature/gui/gui-runner.c @@ -536,11 +536,11 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { mCoreConfigSetUIntValue(&runner->config, "mute", mute); runner->core->reloadConfigOption(runner->core, "mute", &runner->config); } + if (guiKeys & (1 << mGUI_INPUT_FAST_FORWARD_TOGGLE)) { + fastForward = !fastForward; + } + bool fastForwarding = fastForward || (heldKeys & (1 << mGUI_INPUT_FAST_FORWARD_HELD)); if (runner->setFrameLimiter) { - if (guiKeys & (1 << mGUI_INPUT_FAST_FORWARD_TOGGLE)) { - fastForward = !fastForward; - } - bool fastForwarding = fastForward || (heldKeys & (1 << mGUI_INPUT_FAST_FORWARD_HELD)); if (fastForwarding) { if (fastForwardMute && !mute && !muteTogglePressed) { mCoreConfigSetUIntValue(&runner->core->config, "mute", fastForwardMute); @@ -615,8 +615,7 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { runner->fps = (CircleBufferSize(&runner->fpsBuffer) * FPS_GRANULARITY * 1000000.0f) / (runner->totalDelta * sizeof(uint32_t)); } } - if (frame == AUTOSAVE_GRANULARITY) { - frame = 0; + if (frame % (AUTOSAVE_GRANULARITY * (fastForwarding ? 2 : 1)) == 0) { _tryAutosave(runner); } if (frame == FPS_GRANULARITY * AUTOSAVE_GRANULARITY) { From db9d0434e75930793c2ce4914887aa3b55b22876 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 28 Feb 2022 22:59:47 -0800 Subject: [PATCH 53/60] Qt: Attempt to fix build on OpenGL ES platforms --- src/platform/qt/DisplayGL.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp index 2c4182abb..4bf008982 100644 --- a/src/platform/qt/DisplayGL.cpp +++ b/src/platform/qt/DisplayGL.cpp @@ -10,7 +10,13 @@ #include #include #include +#ifdef QT_OPENGL_ES_2 +#include +using QOpenGLFunctions_Baseline = QOpenGLFunctions_ES2; +#else #include +using QOpenGLFunctions_Baseline = QOpenGLFunctions_3_2_Core; +#endif #include #include #include @@ -77,7 +83,7 @@ void mGLWidget::initializeGL() { } void mGLWidget::finalizeVAO() { - QOpenGLFunctions_3_2_Core* fn = context()->versionFunctions(); + QOpenGLFunctions_Baseline* fn = context()->versionFunctions(); fn->glGetError(); // Clear the error m_vao.bind(); fn->glBindBuffer(GL_ARRAY_BUFFER, m_vbo); @@ -93,7 +99,7 @@ void mGLWidget::paintGL() { if (!m_vaoDone) { finalizeVAO(); } - QOpenGLFunctions_3_2_Core* fn = context()->versionFunctions(); + QOpenGLFunctions_Baseline* fn = context()->versionFunctions(); m_program.bind(); m_vao.bind(); fn->glBindTexture(GL_TEXTURE_2D, m_tex); @@ -455,7 +461,7 @@ void PainterGL::create() { painter->makeCurrent(); if (painter->m_widget && painter->supportsShaders()) { - QOpenGLFunctions_3_2_Core* fn = painter->m_gl->versionFunctions(); + QOpenGLFunctions_Baseline* fn = painter->m_gl->versionFunctions(); fn->glFinish(); mGLES2Context* gl2Backend = reinterpret_cast(painter->m_backend); painter->m_widget->setTex(painter->m_finalTex[painter->m_finalTexIdx]); From 245a20b442d577c90221fdbfd16ea573d0046523 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 28 Feb 2022 23:48:25 -0800 Subject: [PATCH 54/60] Qt: Fix clean build failing with Makefile generator --- src/platform/qt/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 9fcb99080..4d65c07d2 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -238,6 +238,7 @@ qt5_add_resources(RESOURCES resources.qrc) if(BUILD_UPDATER) file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/updater.qrc INPUT ${CMAKE_CURRENT_SOURCE_DIR}/updater.qrc.in) qt5_add_resources(UPDATER_RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/updater.qrc) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/updater.qrc PROPERTIES GENERATED ON) list(APPEND RESOURCES ${UPDATER_RESOURCES}) endif() if(APPLE) From eddd518a2cb6014478a33cb911d94a5de5b1e250 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Mar 2022 17:32:55 -0800 Subject: [PATCH 55/60] CInema: Integrate most blargg tests --- .../cgb_sound/01-registers/baseline_0000.png | Bin 0 -> 699 bytes cinema/gb/blargg/cgb_sound/01-registers/test.gb | Bin 0 -> 32768 bytes .../cgb_sound/02-len ctr/baseline_0000.png | Bin 0 -> 729 bytes .../gb/blargg/cgb_sound/02-len ctr/config.ini | 2 ++ cinema/gb/blargg/cgb_sound/02-len ctr/test.gb | Bin 0 -> 32768 bytes .../cgb_sound/03-trigger/baseline_0000.png | Bin 0 -> 751 bytes .../gb/blargg/cgb_sound/03-trigger/config.ini | 2 ++ cinema/gb/blargg/cgb_sound/03-trigger/test.gb | Bin 0 -> 32768 bytes .../blargg/cgb_sound/04-sweep/baseline_0000.png | Bin 0 -> 663 bytes cinema/gb/blargg/cgb_sound/04-sweep/test.gb | Bin 0 -> 32768 bytes .../05-sweep details/baseline_0000.png | Bin 0 -> 729 bytes .../blargg/cgb_sound/05-sweep details/test.gb | Bin 0 -> 32768 bytes .../06-overflow on trigger/baseline_0000.png | Bin 0 -> 1252 bytes .../cgb_sound/06-overflow on trigger/test.gb | Bin 0 -> 32768 bytes .../07-len sweep period sync/config.ini | 2 ++ .../cgb_sound/07-len sweep period sync/test.gb | Bin 0 -> 32768 bytes .../07-len sweep period sync/xbaseline_0000.png | Bin 0 -> 1260 bytes .../08-len ctr during power/config.ini | 2 ++ .../cgb_sound/08-len ctr during power/test.gb | Bin 0 -> 32768 bytes .../08-len ctr during power/xbaseline_0000.png | Bin 0 -> 968 bytes .../09-wave read while on/baseline_0000.png | Bin 0 -> 1412 bytes .../cgb_sound/09-wave read while on/test.gb | Bin 0 -> 32768 bytes .../10-wave trigger while on/baseline_0000.png | Bin 0 -> 1498 bytes .../cgb_sound/10-wave trigger while on/test.gb | Bin 0 -> 32768 bytes .../11-regs after power/baseline_0000.png | Bin 0 -> 737 bytes .../cgb_sound/11-regs after power/test.gb | Bin 0 -> 32768 bytes cinema/gb/blargg/cgb_sound/12-wave/config.ini | 2 ++ cinema/gb/blargg/cgb_sound/12-wave/test.gb | Bin 0 -> 32768 bytes .../blargg/cgb_sound/12-wave/xbaseline_0000.png | Bin 0 -> 785 bytes cinema/gb/blargg/config.ini | 3 +++ .../cpu_instrs/01-special/baseline_0000.png | Bin 0 -> 672 bytes cinema/gb/blargg/cpu_instrs/01-special/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/02-interrupts/baseline_0000.png | Bin 0 -> 700 bytes .../gb/blargg/cpu_instrs/02-interrupts/test.gb | Bin 0 -> 32768 bytes .../gb/blargg/cpu_instrs/03-op sp,hl/config.ini | 3 +++ cinema/gb/blargg/cpu_instrs/03-op sp,hl/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/03-op sp,hl/xbaseline_0000.png | Bin 0 -> 669 bytes .../cpu_instrs/04-op r,imm/baseline_0000.png | Bin 0 -> 675 bytes cinema/gb/blargg/cpu_instrs/04-op r,imm/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/05-op rp/baseline_0000.png | Bin 0 -> 634 bytes cinema/gb/blargg/cpu_instrs/05-op rp/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/06-ld r,r/baseline_0000.png | Bin 0 -> 628 bytes cinema/gb/blargg/cpu_instrs/06-ld r,r/test.gb | Bin 0 -> 32768 bytes .../07-jr,jp,call,ret,rst/baseline_0000.png | Bin 0 -> 745 bytes .../cpu_instrs/07-jr,jp,call,ret,rst/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/08-misc instrs/baseline_0000.png | Bin 0 -> 696 bytes .../gb/blargg/cpu_instrs/08-misc instrs/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/09-op r,r/baseline_0000.png | Bin 0 -> 636 bytes cinema/gb/blargg/cpu_instrs/09-op r,r/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/10-bit ops/baseline_0000.png | Bin 0 -> 664 bytes .../gb/blargg/cpu_instrs/10-bit ops/config.ini | 2 ++ cinema/gb/blargg/cpu_instrs/10-bit ops/test.gb | Bin 0 -> 32768 bytes .../cpu_instrs/11-op a,(hl)/baseline_0000.png | Bin 0 -> 685 bytes .../blargg/cpu_instrs/11-op a,(hl)/config.ini | 2 ++ .../gb/blargg/cpu_instrs/11-op a,(hl)/test.gb | Bin 0 -> 32768 bytes .../dmg_sound/01-registers/baseline_0000.png | Bin 0 -> 699 bytes cinema/gb/blargg/dmg_sound/01-registers/test.gb | Bin 0 -> 32768 bytes .../dmg_sound/02-len ctr/baseline_0000.png | Bin 0 -> 729 bytes .../gb/blargg/dmg_sound/02-len ctr/config.ini | 2 ++ cinema/gb/blargg/dmg_sound/02-len ctr/test.gb | Bin 0 -> 32768 bytes .../dmg_sound/03-trigger/baseline_0000.png | Bin 0 -> 751 bytes .../gb/blargg/dmg_sound/03-trigger/config.ini | 2 ++ cinema/gb/blargg/dmg_sound/03-trigger/test.gb | Bin 0 -> 32768 bytes .../blargg/dmg_sound/04-sweep/baseline_0000.png | Bin 0 -> 663 bytes cinema/gb/blargg/dmg_sound/04-sweep/test.gb | Bin 0 -> 32768 bytes .../05-sweep details/baseline_0000.png | Bin 0 -> 729 bytes .../blargg/dmg_sound/05-sweep details/test.gb | Bin 0 -> 32768 bytes .../06-overflow on trigger/baseline_0000.png | Bin 0 -> 1252 bytes .../dmg_sound/06-overflow on trigger/test.gb | Bin 0 -> 32768 bytes .../07-len sweep period sync/config.ini | 2 ++ .../dmg_sound/07-len sweep period sync/test.gb | Bin 0 -> 32768 bytes .../07-len sweep period sync/xbaseline_0000.png | Bin 0 -> 1260 bytes .../08-len ctr during power/config.ini | 2 ++ .../dmg_sound/08-len ctr during power/test.gb | Bin 0 -> 32768 bytes .../08-len ctr during power/xbaseline_0000.png | Bin 0 -> 975 bytes .../09-wave read while on/baseline_0000.png | Bin 0 -> 1440 bytes .../dmg_sound/09-wave read while on/test.gb | Bin 0 -> 32768 bytes .../10-wave trigger while on/config.ini | 2 ++ .../dmg_sound/10-wave trigger while on/test.gb | Bin 0 -> 32768 bytes .../10-wave trigger while on/xbaseline_0000.png | Bin 0 -> 1661 bytes .../11-regs after power/baseline_0000.png | Bin 0 -> 737 bytes .../dmg_sound/11-regs after power/test.gb | Bin 0 -> 32768 bytes .../12-wave write while on/baseline_0000.png | Bin 0 -> 1606 bytes .../dmg_sound/12-wave write while on/test.gb | Bin 0 -> 32768 bytes cinema/gb/blargg/instr_timing/baseline_0000.png | Bin 0 -> 527 bytes cinema/gb/blargg/instr_timing/test.gb | Bin 0 -> 32768 bytes 86 files changed, 30 insertions(+) create mode 100644 cinema/gb/blargg/cgb_sound/01-registers/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/01-registers/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/02-len ctr/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/02-len ctr/config.ini create mode 100644 cinema/gb/blargg/cgb_sound/02-len ctr/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/03-trigger/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/03-trigger/config.ini create mode 100644 cinema/gb/blargg/cgb_sound/03-trigger/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/04-sweep/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/04-sweep/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/05-sweep details/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/05-sweep details/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/06-overflow on trigger/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/06-overflow on trigger/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/07-len sweep period sync/config.ini create mode 100644 cinema/gb/blargg/cgb_sound/07-len sweep period sync/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/07-len sweep period sync/xbaseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/08-len ctr during power/config.ini create mode 100644 cinema/gb/blargg/cgb_sound/08-len ctr during power/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/08-len ctr during power/xbaseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/09-wave read while on/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/09-wave read while on/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/10-wave trigger while on/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/10-wave trigger while on/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/11-regs after power/baseline_0000.png create mode 100644 cinema/gb/blargg/cgb_sound/11-regs after power/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/12-wave/config.ini create mode 100644 cinema/gb/blargg/cgb_sound/12-wave/test.gb create mode 100644 cinema/gb/blargg/cgb_sound/12-wave/xbaseline_0000.png create mode 100644 cinema/gb/blargg/config.ini create mode 100644 cinema/gb/blargg/cpu_instrs/01-special/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/01-special/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/02-interrupts/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/02-interrupts/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/03-op sp,hl/config.ini create mode 100755 cinema/gb/blargg/cpu_instrs/03-op sp,hl/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/03-op sp,hl/xbaseline_0000.png create mode 100644 cinema/gb/blargg/cpu_instrs/04-op r,imm/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/04-op r,imm/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/05-op rp/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/05-op rp/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/06-ld r,r/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/06-ld r,r/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/07-jr,jp,call,ret,rst/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/07-jr,jp,call,ret,rst/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/08-misc instrs/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/08-misc instrs/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/09-op r,r/baseline_0000.png create mode 100755 cinema/gb/blargg/cpu_instrs/09-op r,r/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/10-bit ops/baseline_0000.png create mode 100644 cinema/gb/blargg/cpu_instrs/10-bit ops/config.ini create mode 100755 cinema/gb/blargg/cpu_instrs/10-bit ops/test.gb create mode 100644 cinema/gb/blargg/cpu_instrs/11-op a,(hl)/baseline_0000.png create mode 100644 cinema/gb/blargg/cpu_instrs/11-op a,(hl)/config.ini create mode 100755 cinema/gb/blargg/cpu_instrs/11-op a,(hl)/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/01-registers/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/01-registers/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/02-len ctr/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/02-len ctr/config.ini create mode 100644 cinema/gb/blargg/dmg_sound/02-len ctr/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/03-trigger/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/03-trigger/config.ini create mode 100644 cinema/gb/blargg/dmg_sound/03-trigger/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/04-sweep/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/04-sweep/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/05-sweep details/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/05-sweep details/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/06-overflow on trigger/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/06-overflow on trigger/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/07-len sweep period sync/config.ini create mode 100644 cinema/gb/blargg/dmg_sound/07-len sweep period sync/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/07-len sweep period sync/xbaseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/08-len ctr during power/config.ini create mode 100644 cinema/gb/blargg/dmg_sound/08-len ctr during power/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/08-len ctr during power/xbaseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/09-wave read while on/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/09-wave read while on/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/10-wave trigger while on/config.ini create mode 100644 cinema/gb/blargg/dmg_sound/10-wave trigger while on/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/10-wave trigger while on/xbaseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/11-regs after power/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/11-regs after power/test.gb create mode 100644 cinema/gb/blargg/dmg_sound/12-wave write while on/baseline_0000.png create mode 100644 cinema/gb/blargg/dmg_sound/12-wave write while on/test.gb create mode 100644 cinema/gb/blargg/instr_timing/baseline_0000.png create mode 100644 cinema/gb/blargg/instr_timing/test.gb diff --git a/cinema/gb/blargg/cgb_sound/01-registers/baseline_0000.png b/cinema/gb/blargg/cgb_sound/01-registers/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..9f55ed942a1ff02ed3db2053d3bbfa538979eafb GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Qf&r;B4q#hkadFZwkbNH{#a z_Tk_97=4cj-M9Di91l+Ze0N0;W09NT=F>~3sH|JRo8Mvo=>r99ZN>(38XxlTq$gM~ zAC{CjH@t;*TlKHNVEv8NpT*v`pTE_fKA+W# s+x)?oe|uxX3vcPn$uBv8o?3R~ua-B^*4%Q}6_hAFUHx3vIVCg!0C+w*&Hw-a literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/01-registers/test.gb b/cinema/gb/blargg/cgb_sound/01-registers/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..be180baf816f1cdbf2a7ac3dc36e72adf8636f43 GIT binary patch literal 32768 zcmeI4?{5?59l#$uiAjUwBs68$G?2#xJU1ib=tQto_gP>FG;JjmX)W4|?YzbpGI@5I zWW<1DoTQuDsV~-d&6w6~>n8QhI`(3eA+0fIJ3YdKhE}L6mF?Ws(Pq)irn?qGu=jn= zNu;v<1E}98cfRNQJl~(6=Xvhlg^2B zFI>O=-t_tN1J8zCH!fX&fBMz)=f1-3AvO!L9sUUE{MEueb0{JKB!C2v01`j~NB{{S z0VIF~kN^@u0!RP}AOR$R1dsp{Kmter2_OL^fCP{L5>2+;iF>2|J zXi`7>_R82hV(bZ8($o0?*5pcT&D71?w$a-WPsKszk9qAqmJ3h0_M)5w1Z`~Dcm(R& z3>iHF+0@ddp57i(3vuWtyQ8_JZh={@7B7kfB|BYm^)`C*E1F<*Q~GP3znGFb?FSF< zl)Dce-nEkk!u@nCa4bjKkQj*L<8^@D(wg5?98 z1^QPUK@P%Rdp%{dYwqSs!=ItVn(gCd5B-l`9fH1hUBe%S#SFyW26vm#=%sl*@l{fJ zt0I0*RbGW&g^;%h8LF(ddylfVoW52kFL%h~vh6Q#6Kk{my}Hjnv4n~^5o^nCi$jRQa7Vg-aIbl%oEae^Q82i8I!J>5yxl z8``13$Vd=Q4I|o_^im@0_trh({fE>f=JrLx!PS|GY-DLNI}ktXeE=*00{nt{xkByC z2Bu~)vBNA*z~)DBVl+HFgf^kU*X-B6tP6KyO`o}=}}sW)kjHlgubDec`<7u35x zdWL?gf4q|z1(LPJ*SQl}{_nKy6mcgi(19(s4(=wnD{ysT zsY|%p9~cY;`@sj$Ta{=hxcr{A+UuRQjBIJ7%XRd&rSbJJoX9Yotl;o)WLTVTfWsOJ zgs|GeRF=&Yp3kzs6>Kx?_XYb53lwT*7%9}wutb5(=y`K#3P3-f9q8;Kh33?m3~ahzXWV4cMfgAA`4d+Ko~*Sn zorM5D%d%UA(^>xXob+usdBssXww*3-t)sWZhw7-K8AuMYQ*e|2f7j9L%x3g40x>|R zPj5Lr=TOp)`nCsO-?9b#Bzu+aEUpk%5)I$Y~x?jmU zS|6*U%WN8IgHOncGH6_T!Pr~UuL|Xe$Mfi;Ez{XeZCg%4j9a-YYp)AQG$N5uC}h1s zLgf%#gh)*BJ7N-1Lz1jyeoWeX+IJM&=;1~I8ZOd|9)6uL;?qKRV6W16&H*v ziUNM4AyrjFQHZa^6b16Ko(f@#5{8fjX2DD)ev!W9Cl1lT4s3?N7D^Q@PBM$-Yne=j zsK?@QFckSh^IP#i!IF=KdMp`2iuiuv2Ox?j;y|$)zv>|{O67~Bm(GU7J1ORwe^@TrCe^rhtmOpSPWWfVuvGHIX z1pybxB8>R2NWx4kFaU^&y=nodjzd1M$kzUGNs=t=tnk2PNRph87U(HAe^K4K&?f|5 zFyh52mG!lwV2$Gs5WB literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/02-len ctr/baseline_0000.png b/cinema/gb/blargg/cgb_sound/02-len ctr/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..bfaf961a82435badaf820014249ca5e465735d52 GIT binary patch literal 729 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|V0nPZ!6KiaBp@A1rECU|9Tccm$^FK7HXXPoOm0R{aI1Fn(CZDB-(S~|D^tID zTeiv_}ij&jRlM8vxUyB&*OTLoVK!5n@eWYal?-dLlY`H!V{)V$bw?E7AsMYq*! zcA5PuI_)6-dR`LmpVpU`)}_7OK5+$*9b76bz5l)U`$g6Md);ikbM1Egn6ogt?3Vof z-&G+GYYgt#{5^KJeP8;&3DeCZ_pN-Gx$C8#=H2A4dsd}ZrpnCKE7mXhW^uE~6v#dO z-0I@N+KV@Bb^iLjSsylST6o)~i%cj^s~S5(x;PqKP%ln+4lBT%=LT1AFkBv lU61@@Epd*s9wRw@XMf-Cs&KqO^b#n^db;|#taD0e0st^PNk{+y literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/02-len ctr/config.ini b/cinema/gb/blargg/cgb_sound/02-len ctr/config.ini new file mode 100644 index 000000000..2c21cd188 --- /dev/null +++ b/cinema/gb/blargg/cgb_sound/02-len ctr/config.ini @@ -0,0 +1,2 @@ +[testinfo] +skip=600 diff --git a/cinema/gb/blargg/cgb_sound/02-len ctr/test.gb b/cinema/gb/blargg/cgb_sound/02-len ctr/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..eb5ca82b76bba016c588efbb905a21fce786102f GIT binary patch literal 32768 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 UM~6|;2bADEUHx3vIVCg!0HMAqEdT%j literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/04-sweep/test.gb b/cinema/gb/blargg/cgb_sound/04-sweep/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..75d63668b8034ffb846a197d8c5a604a23545bab GIT binary patch literal 32768 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 X{FLC(w3_`WD9L)d`njxgN@xNAQq@e> literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/05-sweep details/test.gb b/cinema/gb/blargg/cgb_sound/05-sweep details/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..383e0c1e3e6146768b409a047108e1b57748ccd8 GIT binary patch literal 32768 zcmeI4QE(H-8OPVMEsT+6o4Dx(9K6OLjEe^~Bt~hK9Zw)(I!$n9O4?3edcwLhYGp}S zGM0l-WSn%;J|yKW4l}L$(oA34@KT_>SW)im!#-NtK$V%0oYRPzYKUvWTmr_C`t8X! z80bu2Gx^SUy4&4vzyJ6BzP**6Ovu;#$oN_>d?w2?b!1&-l#CJwsUtOwEwBBOI6s^T zUA=PUgRyhx`g%joYcp3q9Q*CLv%AE3MB!C2v01`j~NB{{S z0VIF~kN^@u0!RP}AOR$R1dsp{Kmter2_OL^fCP{L5FSiPxnxgXlc1;d}3wXL#Cgjq@~3}z!hsW8bE11 zSUHr@P}5$MoU$TWL+Ha5sG7sHV61V*_1&?6H%1*YDcvmtwfU zHLB>fcv?F>wbb`M?|X_CG$q%^>Yb@AYV~x*R(dP!D%r{Ok#<{`<-%30I`2*cf(>lZ z*a&%Tf`~RkG*xt=tGkO-fe!tAcYHRjSzs2+$@3(^$VL~O-F5A`B}NqzVZTIuatw0n^#ywegT7b*ocjY&-@zb+(0j-i3Q57T%34t2xlQogTJGf1U^M7Q z%b`D6{Y=Pzm;bWsK#cbLh7Up};I2>dTbZmDDJy`d2Pz1h)`JzlV_&UU&L{+oVuv8B zA>T0dhoxv}TWncyby6)Ld2d1>cP9+%)hQPZ!dq3;`uoFL6(;yzDzX*3RSGuDJ9}2> zEf;<3njZ`vj1BmDffX;xU=;AjhQiyR2;u%nQ0kXLF^iJP)~w8C%@FE4P?J~hsR^t% zrtm&%js54om9VSk|B$2YgArKc^k8@}i@V{c@ww0T4bPqFd1-F+M@Q%AR{E){w0U61;T@6Li|K-97Hi*2 zD*FB@cw}_xUTfWF^?xe=Hib(4w9;{!-hvIgsOW8~-l^)lRQa`~-TEH2 zaJ9Zz>#?b8RCi|ol&J^~Q-O|kPXF2W`&DPH-mj`|2nM3I@2ooEUL5I(LvvW0&6#a& z9r;xDSbij%$RE!Z%3GnW1hqP>Xb@{o|GV;nFB;|LVoAKM!a zNy{T6+3>>gY+v$p`&yU@5a1KcizRAf6)@GDPwh14N8maR*XT~3`pR_!iZ!1)N7v7f z{Ds!dA3sZL=10%a%1l(z^J+#@J0Rb6@l*5*?Z&r>ktf-T(IwVOE>X%}^KrmWc3pq!XrR~*PPvz}( zG;QS#nx=kcQok`(&`-`}PRy8)U7=W!rB3edS@0qG!3PjrZqYVydBCdpI!6^Fo9pOe zHN9n7d@lt1a>y5?(!f9%c6wFAEX4!cDl`Q)xUop5ToF@FFmAq-M8rne@w^Y-c z{O8Fbdjq^V0roOn{DZ3CQ|NdG`b7gp9C9AT}?qK{2gn5G-tMsWjl(m(zS&mZLih6npyaB=M$kJ z`1!&e>BAa?3!mUc$t|4Bsx^=Sqpfdd?M;tW(?vE0xxo*IC1bF-{F?D}LA%6_!!FnM z?TusEM>lLf3K}Do!K28uFKD*yPI$ox4>fs zc{t&j&n)XezM%iJkjRJt4wAA=60*!s=odv1{KkW_EC=JDFD670;4AaOJ`(J*+91jGz1$B# zvUx>5&1iW8!H zsp+*d@NeOT{0S#5@_d-33vD?G?PhlZu=6?4&+NbiaDl!+JfHw|1p0790A7&i@3ER* zu)oFuz`bnG{qg+E?SyFg1BblLc|e;lJg6fl;Dk1p;r|PZPvZp!013WUEdb?yhzE*n ztskc#xcNLw9=JpV!2w}`op}8><)sVHgun*FH&3Cct-K0WKYkzqB!C2v01`j~NB{{S z0VIF~kN^@u0!RP}AOR$R1dsp{Kmter2_OL^fCP{L51&@RP literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/06-overflow on trigger/baseline_0000.png b/cinema/gb/blargg/cgb_sound/06-overflow on trigger/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..596217b874cbfbd179ba2a2355c41aef16bbcf4a GIT binary patch literal 1252 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|U!yPZ!6KiaBrRo}Tttfyd?T zoIn5djl1V4nz?OiIjVfM)O_wSmXlKsa$Gd7_R3V=u_w*i;g?h6!G#AN1SAw_7+8o% z$Z+xSv9h%@H9HSE;d8$~C*S`bGbQNM{H32dQ>L$~(|eSnFh4qb-+J4nB{@#N_HcB0 zb5}*DZkYdm^;`82_dTC3XndVoR4pHSd%ab`?J1}Iy_K)qt=y)3)@OU{l+*FY-+L%O zKD>3wjwy53{nEX=A>@D5yt}8T&)brJ{Ppr97vH|t4Y_^s`Knc~Tz{6cc*jm#`%GP- ztm@+LrT0VBY%dgZmcOixe`+}Y`W}D%#+z5||mOIEI`Yxq$@!OQj z$2OZ3*6Zq>Q|A7}J2~y>;w9SOrDdNiugrbESL@v21Op$Y_Cz79F)4F%$=e#HgK_H~ z*m_?2`lR#S{=Y6>3+}Sndv~9#*Si(1cPsA9x=U$a9cF$%(RcmbWV@4h=66ryJ6(BN zG%dHmyKMd5Y3+?I*~hQvUBA>9_kW6>PTt~*sMW{Qbf0dI3){W^d-KxUZ);<&CxzSh zW_|g*`^2oNr2*%Xck?M!@T=|M(_~B9zFOwUhTkjKE?W9#;r2iJ8{X_SpV$3v*Q~jD z;gMS6@h`KsFRVMN^!eb8Ek_Op{e7(Z+v|AV_U|523FS6XGBvBxyU)jX-&8N#TN<{( zy7jWsYDK%#*?azEHw$kpeE6%(J?Yo)2W#tNGPdvjfBeR|tTOiE;+(RTI|5d&pRzu! z+`xac=jmhhPntFP%#Nj>$_h65&;4mnNR5*>I)L=|o@Xl`{*s7t0>! zJ#3z}|6rb!qWqsFeHX(__nj~8F_+tV|3TOO_m2})Z91Y7U3D)ndUQS8x@z{NBj4`4 zD+W5)US{K z#YEg$9}=f(B>yK}@fdI^?+32VIQcHOwmb9K!3QkQo1NV@q#p5DR()h~ zW7%=xnfzr((~tc+W)|!HJ+f@Mz)XI-y0VWpdVh3xE5Dq?|Lxo~z1@M*I-B3{soBZD z`P+3pFJX_}(RT?=pAUAgxA>>P@$-RU*;hY}}0NxsamC+dnp^en0*x_We2W%mX6q;!Bpfn6SSV*`oQ&>X6a# zo!@t;s!Yw7nLAlyGVjx;v)0`c|M0AS`eY3W_U6O&9K2YIl>ZD%|4yy(aFXB$m0q5% KelF{r5}E+k4PJZz literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/06-overflow on trigger/test.gb b/cinema/gb/blargg/cgb_sound/06-overflow on trigger/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..b2d5c75a2fbb2e3f5530bb065ebf257325a390db GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/08-len ctr during power/xbaseline_0000.png b/cinema/gb/blargg/cgb_sound/08-len ctr during power/xbaseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..4dbe59509f81aece289326cc39adf71b2e832d38 GIT binary patch literal 968 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Rrvr;B4q#hkaZZx^jm5MU@h z{r`XJ`NLs?hkONk=dF7;U1g1=d$gNF`Q7ief_n3p3s0yHG>~CEJTi!z`|Pik^7{VX z*M2|yt?8j}w$l4&zHdAubF`+#`^S-$HJdpnWxeHKTW$2m_)ul_G~IuX_X&rr zVLAD(P0K~s?@qqjWAh}rWBOs6=Dn>BdfW3k_y3Xks)dIWRj#I;%}CiS6Wa8TOYnGS zaPR*!zt8Uc@m81rvAL2=*s06Eb>}_T{nxJIQna;A`$5dp%58P`Vs-Ba^mgYQpB-}~ z+yCI>H^1xdGbH6spMH7qi+L7Xt8aJyIJw-}F#F@@kjdZN{#-tOd-CTCwibKepSo{s zB_Xq`K$PeBR2_?#CA#wkTYb}?t^XvlR<7pipHR6c>9eNjm$ZC4_WyQm{5diILtTfB zMgLv@Gv!50%AU4V*?<0pvsjL23Smb5&1sjiir;D;x-grq|F|d9xjid`crJAmmsjh~ z-&1?`@KrfkIit@~Uj7G)3qP4hq{oS_n!E1eed+c}iF(PM3U(*c-$(A;qcZ=SP}P5? z-_?GnjefYceo1t$JF}QyI_q}-v6<(W*LGf!>;EQf-}5q)|My!Pd(Sz=H~&@Tn%P+O zB=;U$n_I86-}_Ui{)d?sTX`n$-Ew>S{ac@E9(`NlqJI0j-p3_>(rDN4=x9qro@tb0e9M5u7{=DEd_RICR zZ@;T%uw`G(wPid0ZeMjqP4#-=ho_rsuFTuQugh%u=!EZ|s23W3FT38`^Ot@PsJks( zytBDks5X&*^JY7z)h_D7Z%^9Z^p#KKJ-le1Tusu(-TU`WYd-V9Mxu}Z&qED~z9tmn ZoV`@hk}#9)AFhFNsHdx+%Q~loCIF^yuay7* literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/09-wave read while on/baseline_0000.png b/cinema/gb/blargg/cgb_sound/09-wave read while on/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae81c23333a6fd44c475d9edd63ec4e8a85538d GIT binary patch literal 1412 zcmbtUX;hL46y-FIn3s3UHrn37|oXR*`?>#cn$`sbluknj>=1O*IWEvc} zA^$LQKAWtYo|(;scW>9QS$U5*Qj?{vPWgY3E~%cx;qA-(ynPZbi(#q}^Tyojs|F)O zPxF>J{Kn)e-#_#1x)gmkU?I!iYYt=2W?odOzL(=Xg4)7K^~%Yf2ZVIRl6pxHP4Py! zor7$zV8-Y^nW}p!)@<2jytX;pLm4-&XOPa8<`+0qgKJMja^URG&Zs8bvQ9YrX@ETf z0nS%LY%7J_ml9}T%aOSrD>O@?dK&<*ElVOE< zz~H3Id@48?FO1`=u?4KuE0UA@C2JO7X`ST_7EkB|gHL!=*AV%YxNL#_s{p^jq%Oy= z(N1`*@1h+R^@uBMl)SVhBxakRiGL#f@}KLQm1d;v`## zg7;ZG9$2gi=trzhYSqiFL;9@fGrFNbe+*~VPZVH5cwrqD3W#wc1}51vCC+NCN zAc}-&yypt;F-=Y3aOQ{dc$8exsj#G8l|9^?Y4UOajzcZf6m~EK{)gvHr;ZO~`=qRF z5=_&7b)D^V)HBRYTIjbvCME(u?+F>K*ynt*8-MO%4yG7-*L-gZH`y7`K`_a8+whNK z%)%byhD}Ke#*FR*9nF=?XUcU9dKwBPh z;ahQ4CBU;pzMft{g~^HhD6T>d6p^JD@jI^w$3N6NqounSyH9_pV2C%BwH`(K$K~{^ z>_LxSA=j<46RxTwecHz6FyDM1Nxeg}o7xs$e~_-JLxoKDQP!0ubI~VbSS$xj_)UZda6kbk_V(kLw$mcegEGIF_t3 zkyeiL8k>|XBt2MRannMl%MNVyy4Q?Y^^77+Zi{z18tTSZJWKSyufx~EX7pHsj!naz zG^Uu}DM;Q@ZQ3#unMa&K-@UXqC1U<5HPpyZt(}JHh)lIXgl+`br{JG7|DEZ7S@}cT W)Gy?-PH+SXroW4{;rt5^5p-xDurxREf2SHw`*$ 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/10-wave trigger while on/baseline_0000.png b/cinema/gb/blargg/cgb_sound/10-wave trigger while on/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..d091bda68862c6b97fc30c6ae02ec884c79c6eee GIT binary patch literal 1498 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|VVa2w&+vdQ;?Itt9{enf`a|_^Y`Clny^_p?%}sp;R|fb zT@B9P`zW|mQ1IMmAGtZ3pR;9dn!YexF$zq_fBf>aVW}2dC1o!G`mRBMaiY` zvDK&MzkL~(;=aCGl=Gi$#_qgdiN321lVs$|tnJd}ef1RczLkG^@>JlpR_aq#|D4)s z!ogzCJ2od&Uf;Fkw#$otfz$Feb5hTT8@9hU(@goGFL99-H~6wg-PxBf%E_pXM*0`)20c{d-NKDj}ne)o%i zFXla$e0Shbo^dAo@s+op8~kKt?Vc}s=I*pF>u20qyzu43k2|YAb*{68Vx~2H}aLvVoS{Jva+P*38w6JGO-~a94xx{zPoxd{=K8jvcJo%m!&ozst zL)Uz#y?DNlf7`o#X@~#4sCQGnWvO-XoadB`(D-aQ*o|DkXTe_3D2#oTidAv0(HSr~rmmBJ-g z^PGDVmMwe5^K>82JDH{3^X~qQdoqo8-yELqjU^W~CdUVCn4l-Mbia#!;_LSZr)*g) z;%qf#i}N%0T^UpArgwZ!F8G!$|3>EJqPfZ!=N50v+vH+@$<^8&;k0mKTut7_b>3_vwwen z9Z$FJK7PblYnILv*3uv9N8%*hFIb*?F+WZHbxMR&^wGYZ#S;x()u+BccvAG6kL-%0 zyIO)e`@(OuZ}=v6u%2i7 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cgb_sound/10-wave trigger while on/test.gb b/cinema/gb/blargg/cgb_sound/10-wave trigger while on/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..56f0e901ea1f0ecb0b984536a14eb8870babf5e5 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/01-special/test.gb b/cinema/gb/blargg/cpu_instrs/01-special/test.gb new file mode 100755 index 0000000000000000000000000000000000000000..ad3e9984f967b77b7ffdf768842ce3c04517d059 GIT binary patch literal 32768 zcmeI)+iw(A7y$5Zx80$Z?a~4dM`&TnrIv<M@$w=uCK3`2FB)GYyojYQGo9TnBOD?LkTIcgH`+#5Y&z&DBJTQ~SxVyN5AgC$ z=FIFj=klHNn@isc@IT+|W#Mz*8^+l>SX?y#V-STpsA*XJ+UpRze71LXdiska6BGOP z^v157oxXhJ{fY6rv_FZBU>pjr8QZ`6Q{6v4+|~eQtiEk&qx|dgI{D|M4Q4ZR*bx55 z&zvSm0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{ z0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J|1AMqp1c%MZmd?| zT}pr&#L%`X4^^m7ti5y zCSPXpCX27N_$kxz`37sD5B~JBzQxO?<@iZ9;}5Zde}GN<2iX^Xie2=F*?B*k#AZVl zoAR>{Ji@N}+0O0k3g2b=XYS>9S>EiDQf)k(Ta;7mkn3kz)X(CD#j(BP7oM_Wwfre7 zr{H98CDNwq!^(}(t|W#-PGQDhySA-Z?G6_sxIhWlGQ*#*f!Q%Qf?3pUPEsm&skr9=F1Tw-yRWvJlB@(WNuEg@IFD_~FOp-tK+7 zU+NjGD10`ls%j}bId0i!C)tmcR#n)lzi*&tp%n`)Gz#i#s~_!@cRaZ9p+}+6Ty1Oc z?H{UZB0IWv$Xm8TAp}dao_~I5c76gAR7Yhm=pT_fw`_qz1HeV^4j-Kg!+2OOdk1s% zPs`th^miIwev$uT*>76e(5hdnk|$cF`OeZ?vTr%OK64%1+4{_J8z0DHb~7A`0sjWi zZ^X)Y)|MAnB6YFR)vgtrT)s2Io@|D9rRx0~)I1g%H=eOAhGQp*We23>8 z$9HdJb_6FQ-oDnR8NYd@+g4g6-{zI%)>^(b<9na9-`%^vP#K7iWpKiH#8I*{*PGm2 z4X#0xn^(Bf@;f8)4Q(Z^u7K|yX2oXM;?isR2R!GZXx!J*vSCBRO1EjnnuD0*TH*Yy z4-69v)`;Tp19W)FTnCQ>a7>kNDq@ye<;q_>vnn+`= zw4Rbgtm=A7v`>p>ih}J8v5T`NMdKo`*l(T{5Lpx^=8EZY$KRr7B@eC_^FQ0GYrt@T zv|&KXFvO16bzR4ClL^Bx5=qRjr*s|X6`Xa@biEf-0@h+T15`16rh+6k?1z2&u`e!F zY-z~Nl`iFSIWPv(Y3wNGi<=tc!v;Y-n7Aj1F{Q|_ig6H8Y$6YCK|VuO8Q@r#N^>}# zp^B-CdNGBH3+7uDbXx@-V)arOl0lq=`gkID>plRKOkKGds*;A|2fVm`5YoC>j~3*` z*hpjCsHBix^ug>A`q7 zpooPB#^S-l`zQor7>hLGzru)a;szr?N<6CpK;=5l2XAul{KObjM86DisA72iicAJRtiVPC5ef0$kIf%WY58UCBiFHDI~ zGb`PCbAn;$KmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2J tBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JBtQZrKmsH{0wh2JB=Bz&_#K5wPf-8> literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/02-interrupts/baseline_0000.png b/cinema/gb/blargg/cpu_instrs/02-interrupts/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..78abab9e429193b837e0008a5446d3b30481efc6 GIT binary patch literal 700 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/03-op sp,hl/xbaseline_0000.png b/cinema/gb/blargg/cpu_instrs/03-op sp,hl/xbaseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..f1bb46fdf753eb9bdcce80489a767d5ca2e8c02b GIT binary patch literal 669 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Qfvr;B4q#hkadZ~LuwU~mXD z`1fDGSZn=Q^xq&W|8{oNk`a-hOSThV1E$=bxIt_Aay7 z!}rZ>-_6~^Hbz&Ut)DX^{l|R0YrgU84?ecYo7eR9q-^-JkBP7S49;)1+_!B`dL?&d z*}UT0$7^B_vipC?oRz1Te>Oa) z%)KA)O4e8K-n;!TVcuDDuG0terERKX>aTx${jOX7@yzX+>dz{#{_(UIoMHZH`WlPI z$1Huq7Jd(KFn;ScuHCuwL_X&kSG)K5o1WfG4enp_^AT4%ll^Y9SGON+ul)J8Do{qh zTJtMU5=*j3WpYHAcGreQ)$Ahbmn_F&P_2~;x?&HD9516K%J@#{k2zuK1 Z%bXtgQR)-3K?*3@dAjb*0|Qf*r;B4q#hkadPv$inFfasK zKl)#P(^f%snz@2b_5ldq3X3EG$W>g<=i_uHx$Y5rHW@2gf$K5Oi_ zal%pA)YpG5+~WQ`v5J4)@s)PhA4nvB46L4SAJ+Br=(0Iqk5!wUm3Pq!%P*99R?PB! zTi`y$XO`jbK3U(-w)45q{`!%{d6SB@7I*JH4Ec6+))%$=4W-}%IG9mg8^PqTFh$H%e{S7UqHKhOWE{!`{)^!utS$~}3z zxc{olRk8n__3>a)$&PQjOM5F1FPDF1nfT$E{%bdl* zC7(O{BkSIsmG6Af%ie!ZUQ^yqJ3g=UZWSZn?e$Nsy0)J^^wX6cBa!@O4s80Rd$6PW Q3@Gt=y85}Sb4q9e0QY<;>i_@% literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/04-op r,imm/test.gb b/cinema/gb/blargg/cpu_instrs/04-op r,imm/test.gb new file mode 100755 index 0000000000000000000000000000000000000000..58ca7b8ac3c2b16efc9c8e401e790671c00022a2 GIT binary patch literal 32768 zcmeI4ZEO?g9l-x~k|Pbqu|w1yAuneVtPr4hD}zWgk1{}@y`p91iI-s1C}m)=&Ci}PS^)m|6_7tDiNZ`%vs1o!oe z{kL!2xc1Vyb332yci*{q~E)78){-D{jD zeGra=>Vuv*I6wB8Q-VZ*2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F z0z`la5P|t3>m;#d?jCJ;y z(NpT*EU`-esoHf)x?9lnDOH~z(_3PCdrUv8YL>nv_Rt1z3kfTxm(`eNg~hCOK+ISN z#T(Wk@tPG8-?WCrD^?1k^xKxD-l*yzZjSq=?kNHK+9yU_V%t^wK0^d!2$)W zC96Ld6P;zq=)J0jxn}io^-Is}-MeEuWEjMs8!uKH!OogBoj1jLKDU0Lf5*d_8e^a+ z7(1hG%Jj_o)`E(%V#KuN$4O6#bXy?OM>2rSBUr#FwTmp7AScq2w?mH!p0%GrK}Nw%0)h zkvx>7cI2|&euXTWYc*Ih*JfzAs*0^xdYiG+J6sl^>G-cVwl^OteOR31&o=GqtPeOXaO2HrJ}~XrpNYEHs`Z3v(ffb)Do!P z+_fG^n0+B z5|)BxFz2h%{Rg@U+jqG#k@o{&g|{*V?UW?oZv3NIRXH*&=H{Lau8qe>PJ04Q^gX@R zU)#nvetKcR^RN4UTbS?sYkNEPbnNcfzf5`~-m4DehkrHTzm^|4-eC^sNAWt6AH(Zt z6i*cWujBfb^ZKjfm2Cr%@!d;w<)$aQa(A&8C$o51+?!-uax;^-Snf~aYSfn|^^@bB z3o0fK$P}k1^_yxbEeXZD{4O(8S}L85l#9$_8(ElkdIBLL52QCyMV)>fbq^iM0=vqSBu;_VBs}j(Shq;o*Gw z@Zp+M-x&S=YewCKwf@_yyY6kMDgJiFvDoHKU4Obf)p$0ycGVk4JAV=A{mHY*l}~-S z_D9V>aDQ%k@6{uz>&dF$uk$4wt@oEBRy6qNu722&r(+5wdJ4g-;aBZTj|*pCX83~lE@ZY zjASj=z$9OjAvAufMw(#@vAPWI=!!CGOuS&OEogXTwip9`|B@x%g+@!$qC*&CI&br zlwdii;FKsv(P5Li#x2(j$dNKZ2`(*|q zI*2L?L==Vp@VP9@=r~cUaTKDX_?o>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0{;a9e+RrWAo2hJ literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/05-op rp/baseline_0000.png b/cinema/gb/blargg/cpu_instrs/05-op rp/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..ca6692d9968ee77452676b20ca0bc0713e6b4908 GIT binary patch literal 634 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|S$zr;B4q#hkad@8&IXU}y+T zd;EL+mPhPZIe(hQ}h>MZPYUy;dLNck}Cmd6%l!v6z3~{PkD$_rsfX zlF#k*+cEEK`g-g6Pwls@JO2IuzDghdTl}Z1*xuVmuD4k$^ly3g`$hfVA5WL%I&Yx2 ze%EWy&8GWy?mm9Ed3&C4xh(%<*5xk)zk7ebTmPZ!z@CZzn;sDe=yzLkzTJ-Ar}!=P z-{d)IALbNiUsRd@x}f&+ysc5E`<{kde?NS9?%Hm~ z+wl1Rk*C7^(T~H+j&6?K?Gj%(E3x)%to`XNru$~h%`e*J@_yz)^W^_l`|i~1KM&NI q-TT?mea?YGrsJG4>IG27cky!u_eHK9T=5>1raWE!T-G@yGywo^C@I|l literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/05-op rp/test.gb b/cinema/gb/blargg/cpu_instrs/05-op rp/test.gb new file mode 100755 index 0000000000000000000000000000000000000000..1c19d922f728bd11dcd8b289813fd0409f438157 GIT binary patch literal 32768 zcmeI4Uu;v?8Nfd~$t48iI3#12{2@0ucp<>J9fC!gIm##kRUOS<)=E`rZ#B5I!%6~Z zV2I;7$;7&8539O|@lu8+wVJfSkhbwpo33MQb7w9pT|pPENv{WHnnfeK)m?)L_P%o+ z*w$`&m^7){z9XM|&UeoD=X}3=&bfIC!2fwkG`p{UpsH7v!jhVUFaaJ|3iVB$uYM1_ z?_C+ZGc|Sd_{EERzd7i=du8gq<0mej-^e~eEQYen8B;yq_{7|2Ufj_Hn%CF6tX;a_ zvQ+vwoB*v0`V-*(%&(jlNCb!g5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la z5CI}U1c(3;_}?OskS1@`$#b1DTy?#D8T7N4ZT7xVqZPMEe|3b4u}ov{R!54u9Wi{` zD3|n4bI?U#6)R?qS>x7(ZYQtjx+W^y*FUxX>Gh`q^_jlRicD*#?0X?R^TCcIGv@}5 z&P+TrG9#^)ZU-u>4y@b1Za8}_UerhPZZndvF~wS@i*A<4yG-3KH(YvFGh8Mvfl2di zgVSb>wDuQUtTEowde2Jtin=kQ8O?E{BX0QP#sy8cjWzLyHrOpD?YL3V;<_CcbM_H2 zYabP->=E&%9TBhFqvAC?8Ai1uaWQQtw>~L;XeYPr6z>|(YIf$!#>RN@PGh;D&z)M7 zk`pe|PKq8oi33Z#yU)M7EADMDcEwXNE(S9ZHq^c*&y5X)Q9Pn&bGF~#o3AxT^L3b@ zfVt$1eR0uUfvmAp({ZgiV^aJ2iw6(x*$r6+iG7o$S~J*Fx25Nn*vRL$4Gr#jI8$d1 zl>~Ed^lZ;!v_uH_MD?=kDmSzXu?==%4C^@7i48pQNA(uIzC!Gxw5%|8L0VcEKQGl6 zCeBGUi2=A{nHwHAD)fk-`bM}qFcZ%`zOHMB6$uxLq_cp~U0<@m`aAY6_fMY8{+@er{j?R>Vg;<#RyQkR&|_B1r|{{?0ihnvd>FQg&7wOc(IAmY21y*@|1CA zvS&rr#0A;X?6h%9D`zC3bdUG4qvhq&g-AIi{W@_Xp0gKPL3VVZ+3-S>M;4kqy3pjv zLX+42b5nf@KpVhXfEs{i06)NDfE5610K8zVO?iF%Vev-+A9~lW)bswQ{W)y$5MEC{ z<=^h-1I1`IflwQhcn~39mp5Dpj!)d=(Tc^Wwjo)lP2y z>F+*wZtaQJQ+ zn+6Z#QR7y|?KCbJpXeo-D|MKuddz`IU9G0j@})XyjHQFkg)StwDu>hz_Ev3K3Q1KO9#S1^tFYs;Y*<7+;Af3a-m(6<~@oh#>)I z(M*LPU%nUwffuwxn_;xYRC$R)YNmW6l}dqnC>ljWzFsUrCmt#|@}baXN5+smevtb? zh`jJPSe$rjFen20x>24%e`=5~ozL?nRJmZhm5$j;=;zrBZU{Sa7<_%9)T8$RP}UTA zUJMEh{X2Luf8eAQo)2^4qO3+yZkHp7o!j6z6Oakw!uTTeVFY}SNFU2E!VB^I`y4Td z`gb`1Y^(a*AJ4xkM-;~&I^;6vfimBC_#Qa{FUmX&|F=urjK5$65aD~(0Z<*s_25f( z_K#N-Wp3w$M=ryn=)q;7p7P-v)vb$t0OM+k|Ft1+T0b-_9T;xle}34Oi;Y=so7MmQ zTb4MMHl9x#8#8!}17i8nxpAD(g9s1-B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U z1c(3;AOb{y2oM1xKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CJ0a HUn1}~7IqB+ literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/06-ld r,r/baseline_0000.png b/cinema/gb/blargg/cpu_instrs/06-ld r,r/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..da8a4ed838291cd54ffc85c5b0c118b885df7478 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|S$_r;B4q#hkadFXk$X4Nvt_QI#zU?Qv8W;)I(qh2uQK;dv^l<%vN zJYFa_Ygy*My6l?MHuc$`QV%K5ex&Mm_|by+zTYyLmj4ojp8hj`{*?dp=dWA&a(||M z>ervO_;dZ#><5K1%QK^iRyA~Z$-D3ACFbM_wroSi`|UZvS(kv zEGM~r-K(?f8q0T`tFuvl-zOidai05a?4t5{9udc)?SKxj>-eR3e$GMn`~%I^AD%~; gNk5mDMUU<~@{=9Tih0XdJOiaBPgg&ebxsLQ0JP5$wg3PC literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/06-ld r,r/test.gb b/cinema/gb/blargg/cpu_instrs/06-ld r,r/test.gb new file mode 100755 index 0000000000000000000000000000000000000000..d497bfd1275361bc847fa94dc87b43729f180b5d GIT binary patch literal 32768 zcmeH}dvFuS8NfgJaX5~UEyJ{jANY)o#&)5o2_>FJY@LKh8)BTM2{aVS5kLf@+6Dp$ zEGsrnLrSIvntz%;fXsB#X4=N3kMPP&PZkos+UE&vLXRexQ^2& z=`hp&m1)17+uQqgzsG*R+ub{W|ML=_lrwnQ>m8T~x94t#Zm`2dC~#Ij`%Q4XJMCk*6 z7?dh#3`5Sxe&#emB0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>>Y5g-CYfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1x zKm>@u{}zF;)O$MLeYMgJgSOZEKt0@NvU6IllAJ5OZwVQ#L}71ady=Xd(2A7~E~y{o zpo+jUMyJtb>@>PnGxFweRd;5=%*8X8%zVXF(BIHMrN6Y&UA)pia(UtQkt5AJM!J`_ zk4V#{3$DzxO*1ymXp5Z+CDo32jvk2T>S7*K#T*un+jP}T7oJ$AXf_?Ez@+PKq1DE; zlgeLBF<1MsQh!()ORCz4qD=~E6(OxUq#aXKQ>zQzu))V<#0+T}C8U~uaoF50#>^e! zS+iX{V+O=G%?|OD8S$gq_K zbTcB_%?Nhf?pSm5jTIqBp|&Cvb>n0(6Jb`~KKIqGWvn%n4o~U z3~Nt>#GDMov?fKxxejZ+%7d#mZ(h3wVhqAh^rrH3Pi_9(+Vf%&ADh?Ovi8PEzTTP= z^mW0*wYQ-qLclw!r)`7W&`fmBG80``cVg|H#S_0-&*SS$bRL&V5?#lniHV&@rGiBF z5h*v^tY~^Dd^A*#+1~CyBz>U1_nFMOIOq(F30RA;X0WMzQ55V@zV*#$?M+N{yg; zsl#3Wj=g_l?N~_dFxsK1Nr z+xQNh#7U!8iOC+|kNJ`wQX>wx6)1&|%>pD`FV+^BtcdFma-}@!k{|cMaFr`#O}`OS zNnL(_bF)W=$sF9X&b9IQh^wE5p5~=1 zTm_YUu{TiO!$5y3QoJUa2uU6Fc$VmFUL% z&LEyB+Mj#1 zYo}yQY!FM04r%9=biX8|#`sgLBYi|V7Dz{>--Hi@hRs{eAl7lKQU9$5x8G`T$E^n2 zZ#8)8zc*DI0qy~~7vMgCc>wbP762>+_yWKe0qzG_1n>Yr6To7CW`G9)z69_Pz?T6Y z26zNu3BXc-uK+v>ungd<0LuYZ0DKK#C4daD3g9t-)c|V%)&h6|)&V>YupVFoz!LyI zfUg6z0JH+M0c-@=1h5(4Nq{W?+W`Ck+W~d}v;zbHIsk$IPXRbU)1r=Ielz$jfj3on zEy9N4SB6-LZOLrs_xx2?hLT}?-$jwsl_71<3AOQaJ;JN~zx-+I-!^`K%X#0?+2gLm z%Z|<(ln9TBQqlYS zHm)CBkT{sz#C7TxzB7lnd*45}XYOOJmw)t7Xv_S|TN-yatzOb|Y-XB|@pjJc-%XqS zt=_ezZ)G07L;1@im+#*-i;w;AwXTaTzVF<1=u)_@B68rxM_awxug9-Fd1=yn-)^(7 zyv$p!7qLwp&-EXw6%zB(dnGfZYWw@FWAVh?KKwk+>Z^jCNOdc=yB!&9+2nW`9{llg zosGsTbnQZ)xV#F!E9Bu`y;_qmjq-!=aiJKG%=PRktnlw^zI2w^;?4Noz#!L&7GMrcsw&lm$#>*S zS6LZm7sJyptBe|_pEd4Hs`z=S&|6)ux;kf>UQs%&9b=5fPTl<75qSX-d_G*eSbS+8 zUH~GKJwiYPuTON#(PyB1PI*JC_inJ;?UtUS9PP>-(AI!$1Fm(iC*#2l0iqa0huPwG z%lLpR{CbgP$Pw)5un|1omaSf|2Sjc!22th%K?vGKyMX=na*r>Fv4V0y;Ic=S16)7I z)!c5>_wtLkOt3fbxcs`_x`9V=i+rva9xr_6mf1L%FUH@{A~O)tLD1`kfY-|}?3ZO3 z{rY`guh-|t_;Ns&ab8v{1C!+z3<)@jW?t~{>5Co^ctJa~X+v8;FIa*Q9Z8>#Mx)@} z8VsT#pDz}V6%Q3Gd8==ZC1Xe)-^2YNL|%9tELJ?P$0GvzI-MRte_jutIv?j#$a2AW zQ!TTp(8#kFa=>rNekgA6MQ^+YY}1PDzAkzMhW;(Qm_KmRGS7!uaZ&aLQ7(4}5IeWQ zekLFj#D(!iXut^g9+5tlHiYNn`8Qai2lX#;0N7^rxj&wNRu0IPKXk}t&I4t>@bEoy z0uGdU7?y1@e?S7K1AMJo0J8l!AAHHy`f-S&o7-98kxQE>+HqQ_C%?NtyL9mxKpQ{F zf6d%;X8P7hn`Ue(!uC@#PQys!w~aPg^yB``9I>Z*CmR3*CqS5g-CY zfCvx)B0vO)01+SpM1Tko0U|&IhyW2F0z`la5CI}U1c(3;AOb{y2oM1xKm>>Y5g-CY ffCvx)B0vO)01+SpM1Tko0U|&IhyW4z4+#7nJ{)}* literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/07-jr,jp,call,ret,rst/baseline_0000.png b/cinema/gb/blargg/cpu_instrs/07-jr,jp,call,ret,rst/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..b517e4e52ade2a30aab298e5fa60440ce87e40db GIT binary patch literal 745 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/08-misc instrs/baseline_0000.png b/cinema/gb/blargg/cpu_instrs/08-misc instrs/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb6c5a695087075a5febe0b7cdb9292ee445403 GIT binary patch literal 696 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QgNr;B4q#hkadZ}%-xU|ynhV4rZ+z1;Ym-hU_LA`Hy=~;ms*QQE}I|$s6#O7ENG3{(r@cpi}<7=d;aj_**@#Kl%Liil_JU z*3I~P@0j59y^G8H9{t#QFnjl>-rwE3>*s_=rWa^z)tvX@Z|Ma7O*i++tqiKI59&L+ z@Y|2S<%?GztL!Xg+wNb|V|dJBf8HOD;+IkHAI;95{M#|M`Sstmf8P2? zi|-8*rB@5*|N8THS-^fF{XI_89jD!PSYdyFPiDKtzw_qe$ItiQlY8}-|AB#h^Zb82 zyC&{`(LhWT1y>wD)#9&{@Ox1y+y0u|iG4F~?XKSUal(74*ynGKmTW&Hbp287rgYna z^WXf}8~$5#ZP$x{nTf~460IWTFYa>vUQ??aFL3{c+?=`mH|u`p?EZbdyu#@?vqg{n l=~B__u7`hi^I@c!@BDndff8$T_tt_^q^GN&%Q~loCIGD$JGlS= literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/08-misc instrs/test.gb b/cinema/gb/blargg/cpu_instrs/08-misc instrs/test.gb new file mode 100755 index 0000000000000000000000000000000000000000..4da139be35c0f82db12136c2b65b2571122a026b GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/10-bit ops/baseline_0000.png b/cinema/gb/blargg/cpu_instrs/10-bit ops/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..476b79e2731d250fedb3de5c783cbdb382ca634d GIT binary patch literal 664 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|QgMr;B4q#hkadFXk7TYFV~6aqEssske_rtV{Os1Tp94KTu&MBiloEh@3 z7iZ2oCh^%O-fl0Co|%8_ZQH{q(<>*Qm#mR2+Nu`0>Wy6Sy{dVy!+$=TY5Bpj`FW+? zj#K=s5&ZkkRN7ehoqvDV`qZGrJe&puWkv3EWHzbC)G?Z?7x+wUKJ_vzaOCd<6_ zt=FGh+Mkq*YSulF%=zct_YbkxZZWqWkm*=|kOO~g+&TWkzRd2&^1t0RXCK7xD_{BQ z+`3cI)hp%hvXy?avAKJ0+3x83_7dOAjOI()f1aWKYt}*bSo6HM=63hmb2jZedQtaR zRohy<_j_mO8@%b`-~8EkU*5&^v=4W0?0)?CFVdQ&MBb@0Kn=pl>h($ literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/10-bit ops/config.ini b/cinema/gb/blargg/cpu_instrs/10-bit ops/config.ini new file mode 100644 index 000000000..2c21cd188 --- /dev/null +++ b/cinema/gb/blargg/cpu_instrs/10-bit ops/config.ini @@ -0,0 +1,2 @@ +[testinfo] +skip=600 diff --git a/cinema/gb/blargg/cpu_instrs/10-bit ops/test.gb b/cinema/gb/blargg/cpu_instrs/10-bit ops/test.gb new file mode 100755 index 0000000000000000000000000000000000000000..8988458ea0eff185d7f3bd78ff85bb7717edccfa GIT binary patch literal 32768 zcmeI4dvp_38oi~z4V`7uv(jXK=+9GPz|xr1ELesUV0gf$D8JyZD~1HQ(r%0 z>KxFJP~yPgDOtxSn`lru^G zR}QiOQb?^-m#I~1wXC_nYE7>WjUGI9@DqbS$cn~1?2Achrua$rwhIM|+jbQ#X{&y+ zv`ri!p2-Sj%o{X!P>J`5Ga#4y^qw+bghz;!WI->vd^(S;1!MM2a40$tr67sd`Gk<5>&2e_WqZUP{;J(# zw7+_n7~v{%C?2P4w=;*T?QZ{2yd<~Z9Xja)j|A#%)Z(axsAWl&)I#b2X_1+ro;=ew zeOe573CRsf>`z=qg_v)^|quv(Dl; zO$__#klm!7WHjZRip9CvSDf;8HS0b#OC6wQN&yP`qMGSB54TnP(5v zrmqj5d>3pldU9e`bQ;_Em~4vw$9+G^&UXH>`I+-F=VmS%B!1y4bQJq5w-sj{^Dp}# zQ?2w@(S4b}n(kE<^o^o?*PuMJPubkiwQT^r=~vx3zRM?ad{?M-oM@#li>oK3WZ$(D zv{*V%&}vlL_bVSZWcTed(Sf()@(Ja%BZ#7*;|d#j%Y*IWp0eP6affSzvsJrQ2Hx^p z&Dw7@x%gI-OKvq;daKDJ|GBA*`G6w;M*`jtI12CqzyiRZ13m~i2Jj)khXD%#ivS-1 zd=&68z+V794mb|*Nx<=dPXSHZf>z=?p904;!%0jB^?1)K&r9dHKVvw$-JX8}G3 zXak%LSPWPKI2Ujp;C#RZfX@RiqFn~K7;p(-DPS33Ip9*jO2B1+Re;riF97}u@YjGZ z0lo~l9Pl@QD*%5B_zK`kz*T^&0oMS&3iuk}8-Qy8YXE--_$J^wz~2LI0Ne=p7U0`} z?*MKB`~%>-fLj2!0@eb)2lzhVHo)zGe+2vx@FT#F0Y3rU0aypP3vf5!9>99QPXRvz z+zaRcbOJU2x&Ze9x&ikC9sra94+0`!6QBZk2=FlA5x_41zXWUs{0i`EKo8(Cz;6J* z1w0Pe0(cTo1@r=*0z3_P2Cxw|g&n1$rg&VBpGYWpOhG2GW(Zp$cs}C*x=*rfWds_@Urwv%HW_IMi)@#+|H9cl-F?Ro;^JG%g_jh+11`X?dEv0+X@QrcfT0JSVZA*70 zZdX}{Z-^nd4ju10PJbWo**XnnlKb?B1pn9UCWQj{G67=ll90FO&~z_{saH9;#LEer4muUR#Pv z*XsKWZ~kq!@tZ=U58fVKYuArCG|#(b++#0a?mRj+-$w$+odVlfsz_LJ8}Glb-SyS1#Vrxs}c4Ovkm@H z!Ih%sl$Fo@;T@O`RkS7MP`}(5qFze$CDVb&m*SBw`%*p1aTK0OhqZ=C z`i;7l86{q32Y_b{@pM#}DJ`W2|Gq_uEt1YxMCT<6LjH`LJ zKyQd8hxuT(&RJ-+nn7UpLIufeq5>*ng;)bUk4-V#DkxTkrOd!&v&B-z^edQ}$wc~A z_F=tbh|Obh+2?w10v5$2uv{rTeQ3-qyW&v26o1wniv$8WsIXe0%xYyHdTy~;$gkaI zwOVaZvn|-nL{CgX35M7W|qES1_Qguj%-TEmP%z;1vIt=k2W?of^}g< z1sSq@=`x4okwRErX!~hcrjRVYnfW1z>|$}~3dggW%>t0Gqro=vXEn3b**r_3iwni; z7dGn$`K)?_9_(S+4)J-m#+&Z}An34|u8U@aME=8gseWLjEvz0X9G7Hk1<5I@i-maso^$YjQYWVZ0= zJu(7Dl35t`zuA}>d%*;tjIGr$fUf715545@`Y{TEiP?q26PFS}h^4eh&vJ2n*V3gi zfYN@D{Yi4SY4DVp3&i4*`7!LT6iwAh%T&E4MgQ%{>v|8BYE&j1qK%v-1aIz~up55k z1ULasfD_;ZH~~(86W|0m0ZxDu-~>1UPJk2O1ULasfD_;ZH~~(86W|0m0ZxDu-~>1U lPJk2O1ULasfD_;ZH~~(86W|0m0ZxDu-~>1UPT)T!@K+QR9VGw& literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/11-op a,(hl)/baseline_0000.png b/cinema/gb/blargg/cpu_instrs/11-op a,(hl)/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..6f1933e329b459d0983b8d9dc61a059e9b37bf44 GIT binary patch literal 685 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Qfur;B4q#hkadFBUZ!h%j7S z^7#M%qF)P?oF{pQ1VntdDK#=-Ue~ZqaeC0C9sl<2Wxh4N@gWaSdV&S>VM&Q|2MXBQ zj1A@tbD`-km(MBoS~+FYjYZ~l4%cISzwhP!Rt=7wvx{H#em`UWZf~42zXW=zqUypXbs#&R5<^=PaMw)caOH z_Wf*r{KU7_!F%n`d+rtb!K^R*#^l!`<+`qU>sZdd&b{;RY&qNe-l?<8=l)dPF4w>8 z_CvWC|EseVe~9e;akRqTGyIePooU;CEh=54pL6_U_k8QRQ-bdg-kLx#PNsjk)YX0V z=lMT#ZO%Q&)ZC1van z8<*GmU&$7zeta@`MegSwT)lDjddKs d(SVUa{%fdwSGkz5!xfYaJzf1=);T3K0RU(1HM0N! literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/cpu_instrs/11-op a,(hl)/config.ini b/cinema/gb/blargg/cpu_instrs/11-op a,(hl)/config.ini new file mode 100644 index 000000000..2c21cd188 --- /dev/null +++ b/cinema/gb/blargg/cpu_instrs/11-op a,(hl)/config.ini @@ -0,0 +1,2 @@ +[testinfo] +skip=600 diff --git a/cinema/gb/blargg/cpu_instrs/11-op a,(hl)/test.gb b/cinema/gb/blargg/cpu_instrs/11-op a,(hl)/test.gb new file mode 100755 index 0000000000000000000000000000000000000000..0634b7fdd19bd62c16860ab1bad05760d6ac5965 GIT binary patch literal 32768 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 HpAz^7^EI)n literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/01-registers/baseline_0000.png b/cinema/gb/blargg/dmg_sound/01-registers/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..9f55ed942a1ff02ed3db2053d3bbfa538979eafb GIT binary patch literal 699 zcmeAS@N?(olHy`uVBq!ia0vp^3xIe62NRHFxc>b*0|Qf&r;B4q#hkadFZwkbNH{#a z_Tk_97=4cj-M9Di91l+Ze0N0;W09NT=F>~3sH|JRo8Mvo=>r99ZN>(38XxlTq$gM~ zAC{CjH@t;*TlKHNVEv8NpT*v`pTE_fKA+W# s+x)?oe|uxX3vcPn$uBv8o?3R~ua-B^*4%Q}6_hAFUHx3vIVCg!0C+w*&Hw-a literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/01-registers/test.gb b/cinema/gb/blargg/dmg_sound/01-registers/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..69c3f80cac1b3fcd688735f9fa99140e4b5b4dff GIT binary patch literal 32768 zcmeI4U2I!d9l(zr+s#tPNxD$(va~twhw(x~Z-<&%ns>-b*Jy$@T?Y*D0M{(OX^^oq zr!?;BxK1+AHu}JxSQxONA*6|qQ6A_@B^LME&Ti9NQL%QOw8Hh6BVl!s-Er48&3yTv z>on2|ubUA1AKl~g_5b{xbMAe!X@0VW{I3-yGQNJ`@J8BH?)ZakN^@u0!RP}AOR$R1dsp{Kmter z2_OL^fCP{L5B}*q`&5?JeazIivN3&&YLr-`{%Q81 zzMjqMcX@p#tgL7DU(pYXRaN`cEUfbhSTk6Qwnt$nw4F*7zkfbp;5RVr_aWcv=V2cd{wHz2aN2(Iu5f)Zr1k-*L}B;lGhlb2hQ{9k-L-`D|fss(1bo;*(ygzR+5)7R`T ztw@5>RpGBC?U}5w*}m_<4zXw7ft@>OC^|^TLWjfjzylA{vH0+z@b-8(G)Ri;iKd@v zr%RSbTLTE+`;m3NJr!SVH=w}Ym zkSvEEKVIq?^-+WGxMiis`4KBISzfVJ4}*&IP>hBm5gHE< zje!=s17ac%>msoSaBSdHa# zYyQIyc#e%xu=U-L6@q00jD-eQ3_%QBUwJuevn$?Kv+2)}V#BuanvecVtxrMUzozLA zalQh+w?ggU5`DC!roTYU*G&F%%zP1gCLym8GP3%Dxcv_+6i5D&Q(W#6$$8sfUMJRJ z`+NPIeP9htej`>-o{`jcE8~1!z1lr-t#?h>&NjsX&ix3P%?b_~mPF$WCNWk!jS}YlxH+PrQh4J!4 zAz7X*R8{L_*-cW^jwvd{TGDi7e`s_x47Y|6CR86ks<7wQi&p#1S#3jJ8_R1yg$u1K@W&#nm!zo)@}5u()}TG2z+HherSVgw zeLZ944t@>oY)*5|Rkh!qRbD!4K!(+ttw258)ZWl=Bs>T%1;&8-^#Wb_WQDZhK0%vGmMlS zGb~*uGiu3LngZZY6^1tVl5vnvg7{~vV?|Zln^$_~a<+{(8xkk{uF9U;kEoGRHDPXv z6c$>ur}A+4ex3J{Ne|H~&_3%ip=Ism=>jOP+T*#N_If}N!o(hv&2XZ{T(!#iE*u6>{0QLRybleTZpsQ$5MXLJlc zXk1JC;T(huzhEU-T6&?7Z-fjO^*wcqQc%WN8QgHOqdFi2c_THjq&FLL3S&v(x~ zZPSGf9h;7VkL$$?tFH}#7b1{IBx1cuBDDxSga}Lux{?BsBZ4U9e?U5WI|DKKKH_$} zEjdpo=yiI?NC4Wv2qALN49c)12q`dFFQOj zkcTe>iHjG|1Dz4jg;aS-k^ExqQa+z2^5Ikp6nVT*f|frJu*QcYz1A39a{obY2O#po z{Xnt&$-$sNz}BVOBG{9IJaoR!L#T5Be;X~ejiirf@3NDGHBOM$KqSAq4}{caC2?gK zbTP1R;f4GOCoS=OnB^D7atg+sViK@(9hhe>U;?b*0|V0nPZ!6KiaBp@A1rECU|9Tccm$^FK7HXXPoOm0R{aI1Fn(CZDB-(S~|D^tID zTeiv_}ij&jRlM8vxUyB&*OTLoVK!5n@eWYal?-dLlY`H!V{)V$bw?E7AsMYq*! zcA5PuI_)6-dR`LmpVpU`)}_7OK5+$*9b76bz5l)U`$g6Md);ikbM1Egn6ogt?3Vof z-&G+GYYgt#{5^KJeP8;&3DeCZ_pN-Gx$C8#=H2A4dsd}ZrpnCKE7mXhW^uE~6v#dO z-0I@N+KV@Bb^iLjSsylST6o)~i%cj^s~S5(x;PqKP%ln+4lBT%=LT1AFkBv lU61@@Epd*s9wRw@XMf-Cs&KqO^b#n^db;|#taD0e0st^PNk{+y literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/02-len ctr/config.ini b/cinema/gb/blargg/dmg_sound/02-len ctr/config.ini new file mode 100644 index 000000000..2c21cd188 --- /dev/null +++ b/cinema/gb/blargg/dmg_sound/02-len ctr/config.ini @@ -0,0 +1,2 @@ +[testinfo] +skip=600 diff --git a/cinema/gb/blargg/dmg_sound/02-len ctr/test.gb b/cinema/gb/blargg/dmg_sound/02-len ctr/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..7b7a51a45fe3552df5f6b716646d535cc2a24e78 GIT binary patch literal 32768 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 UM~6|;2bADEUHx3vIVCg!0HMAqEdT%j literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/04-sweep/test.gb b/cinema/gb/blargg/dmg_sound/04-sweep/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..6000017017e260784caa0ebd25bade963d739939 GIT binary patch literal 32768 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 X{FLC(w3_`WD9L)d`njxgN@xNAQq@e> literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/05-sweep details/test.gb b/cinema/gb/blargg/dmg_sound/05-sweep details/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..267f43a9aa0bf5a33c33706cec4d43642de03d27 GIT binary patch literal 32768 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 KelF{r5}E+k4PJZz literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/06-overflow on trigger/test.gb b/cinema/gb/blargg/dmg_sound/06-overflow on trigger/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..7f8049557a577f091b7851d7dad7bc383b6785ac GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/09-wave read while on/baseline_0000.png b/cinema/gb/blargg/dmg_sound/09-wave read while on/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..a39b79d6acb7c764173eec64ae5ea4a9f5205647 GIT binary patch literal 1440 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 NhyW2F0ymw&e*loDbm0I1 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/10-wave trigger while on/config.ini b/cinema/gb/blargg/dmg_sound/10-wave trigger while on/config.ini new file mode 100644 index 000000000..7ddee425b --- /dev/null +++ b/cinema/gb/blargg/dmg_sound/10-wave trigger while on/config.ini @@ -0,0 +1,2 @@ +[testinfo] +fail=1 diff --git a/cinema/gb/blargg/dmg_sound/10-wave trigger while on/test.gb b/cinema/gb/blargg/dmg_sound/10-wave trigger while on/test.gb new file mode 100644 index 0000000000000000000000000000000000000000..dc9b64a0542cf6e7b4dbead96ba32a85af6b5b73 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/cinema/gb/blargg/dmg_sound/12-wave write while on/baseline_0000.png b/cinema/gb/blargg/dmg_sound/12-wave write while on/baseline_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..8b8d9a4272fef5dba66dea0487c2ed2751733849 GIT binary patch literal 1606 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 CRokxs literal 0 HcmV?d00001 From 739d8421296e5ed64bdb570d9cc2192d9fbe40f3 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Mar 2022 18:36:24 -0800 Subject: [PATCH 56/60] GB Audio: Fix channel 1/2 reseting edge cases (fixes #1925) --- CHANGES | 1 + src/gb/audio.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index fbe0ed504..a107ee4a1 100644 --- a/CHANGES +++ b/CHANGES @@ -18,6 +18,7 @@ Features: Emulation fixes: - ARM7: Fix unsigned multiply timing - GB: Copy logo from ROM if not running the BIOS intro (fixes mgba.io/i/2378) + - GB Audio: Fix channel 1/2 reseting edge cases (fixes mgba.io/i/1925) - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) - GB Serialize: Fix loading MBC1 states that affect bank 0 (fixes mgba.io/i/2402) - GB Video: Draw SGB border pieces that overlap GB graphics (fixes mgba.io/i/1339) diff --git a/src/gb/audio.c b/src/gb/audio.c index 9c06de737..88d934e1d 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -204,6 +204,7 @@ void GBAudioWriteNR14(struct GBAudio* audio, uint8_t value) { } } if (GBAudioRegisterControlIsRestart(value << 8)) { + bool wasDead = !audio->playingCh1; audio->playingCh1 = _resetEnvelope(&audio->ch1.envelope); audio->ch1.sweep.realFrequency = audio->ch1.control.frequency; _resetSweep(&audio->ch1.sweep); @@ -216,10 +217,10 @@ void GBAudioWriteNR14(struct GBAudio* audio, uint8_t value) { --audio->ch1.control.length; } } - if (audio->playingCh1 && audio->ch1.envelope.dead != 2) { - _updateSquareChannel(&audio->ch1); - mTimingDeschedule(audio->timing, &audio->ch1Event); + if (wasDead && audio->playingCh1) { mTimingSchedule(audio->timing, &audio->ch1Event, 0); + } else if (!audio->playingCh1) { + mTimingDeschedule(audio->timing, &audio->ch1Event); } } *audio->nr52 &= ~0x0001; @@ -257,6 +258,7 @@ void GBAudioWriteNR24(struct GBAudio* audio, uint8_t value) { } } if (GBAudioRegisterControlIsRestart(value << 8)) { + bool wasDead = !audio->playingCh2; audio->playingCh2 = _resetEnvelope(&audio->ch2.envelope); if (!audio->ch2.control.length) { @@ -265,10 +267,10 @@ void GBAudioWriteNR24(struct GBAudio* audio, uint8_t value) { --audio->ch2.control.length; } } - if (audio->playingCh2 && audio->ch2.envelope.dead != 2) { - _updateSquareChannel(&audio->ch2); - mTimingDeschedule(audio->timing, &audio->ch2Event); + if (wasDead && audio->playingCh2) { mTimingSchedule(audio->timing, &audio->ch2Event, 0); + } else if (!audio->playingCh2) { + mTimingDeschedule(audio->timing, &audio->ch2Event); } } *audio->nr52 &= ~0x0002; From 54bccfd2cdd128fc35cc73fcd5aab8f4c0334b38 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 7 Mar 2022 21:00:05 -0800 Subject: [PATCH 57/60] GB Audio: Mostly fix Telefang --- src/gb/audio.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/gb/audio.c b/src/gb/audio.c index 88d934e1d..5dc40ac62 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -37,6 +37,8 @@ static bool _updateSweep(struct GBAudioSquareChannel* sweep, bool initial); static void _updateSquareSample(struct GBAudioSquareChannel* ch); static int32_t _updateSquareChannel(struct GBAudioSquareChannel* ch); +static int32_t _cyclesToInvert(struct GBAudioSquareChannel* ch); + static int16_t _coalesceNoiseChannel(struct GBAudioNoiseChannel* ch); static void _updateFrame(struct mTiming* timing, void* user, uint32_t cyclesLate); @@ -217,8 +219,9 @@ void GBAudioWriteNR14(struct GBAudio* audio, uint8_t value) { --audio->ch1.control.length; } } + _updateSquareSample(&audio->ch1); if (wasDead && audio->playingCh1) { - mTimingSchedule(audio->timing, &audio->ch1Event, 0); + mTimingSchedule(audio->timing, &audio->ch1Event, _cyclesToInvert(&audio->ch1)); } else if (!audio->playingCh1) { mTimingDeschedule(audio->timing, &audio->ch1Event); } @@ -267,8 +270,9 @@ void GBAudioWriteNR24(struct GBAudio* audio, uint8_t value) { --audio->ch2.control.length; } } + _updateSquareSample(&audio->ch2); if (wasDead && audio->playingCh2) { - mTimingSchedule(audio->timing, &audio->ch2Event, 0); + mTimingSchedule(audio->timing, &audio->ch2Event, _cyclesToInvert(&audio->ch2)); } else if (!audio->playingCh2) { mTimingDeschedule(audio->timing, &audio->ch2Event); } @@ -777,6 +781,10 @@ static void _updateSquareSample(struct GBAudioSquareChannel* ch) { static int32_t _updateSquareChannel(struct GBAudioSquareChannel* ch) { ch->control.hi = !ch->control.hi; _updateSquareSample(ch); + return _cyclesToInvert(ch); +} + +static int32_t _cyclesToInvert(struct GBAudioSquareChannel* ch) { int period = 4 * (2048 - ch->control.frequency); switch (ch->envelope.duty) { case 0: From 095481ae2ef26d3e0e5f07cd357a7ecb795a0de1 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Mar 2022 23:52:18 -0800 Subject: [PATCH 58/60] GBA Video: Initialize offset values --- src/gba/renderers/gl.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/gba/renderers/gl.c b/src/gba/renderers/gl.c index 94e8514a6..6ef210585 100644 --- a/src/gba/renderers/gl.c +++ b/src/gba/renderers/gl.c @@ -808,6 +808,8 @@ void GBAVideoGLRendererInit(struct GBAVideoRenderer* renderer) { bg->affine.dmy = 256; bg->affine.sx = 0; bg->affine.sy = 0; + bg->offsetX = 0; + bg->offsetY = 0; glGenFramebuffers(1, &bg->fbo); glGenTextures(1, &bg->tex); } @@ -923,6 +925,9 @@ void GBAVideoGLRendererReset(struct GBAVideoRenderer* renderer) { glRenderer->shadowRegs[REG_DISPCNT >> 1] = glRenderer->dispcnt; glRenderer->regsDirty = 0xFFFFFFFFFFFEULL; + glRenderer->objOffsetX = 0; + glRenderer->objOffsetY = 0; + int i; for (i = 0; i < 512; ++i) { int r = M_R5(glRenderer->d.palette[i]); From 4a158427ee85da832530d4dedadb19f30b4241b5 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 10 Mar 2022 23:55:12 -0800 Subject: [PATCH 59/60] GBA Video: Move bg clearing to reset --- src/gba/renderers/gl.c | 49 +++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/gba/renderers/gl.c b/src/gba/renderers/gl.c index 6ef210585..b9d74b4df 100644 --- a/src/gba/renderers/gl.c +++ b/src/gba/renderers/gl.c @@ -788,28 +788,6 @@ void GBAVideoGLRendererInit(struct GBAVideoRenderer* renderer) { for (i = 0; i < 4; ++i) { struct GBAVideoGLBackground* bg = &glRenderer->bg[i]; bg->index = i; - bg->enabled = 0; - bg->priority = 0; - bg->charBase = 0; - bg->mosaic = 0; - bg->multipalette = 0; - bg->screenBase = 0; - bg->overflow = 0; - bg->size = 0; - bg->target1 = 0; - bg->target2 = 0; - bg->x = 0; - bg->y = 0; - bg->refx = 0; - bg->refy = 0; - bg->affine.dx = 256; - bg->affine.dmx = 0; - bg->affine.dy = 0; - bg->affine.dmy = 256; - bg->affine.sx = 0; - bg->affine.sy = 0; - bg->offsetX = 0; - bg->offsetY = 0; glGenFramebuffers(1, &bg->fbo); glGenTextures(1, &bg->tex); } @@ -929,6 +907,33 @@ void GBAVideoGLRendererReset(struct GBAVideoRenderer* renderer) { glRenderer->objOffsetY = 0; int i; + for (i = 0; i < 4; ++i) { + struct GBAVideoGLBackground* bg = &glRenderer->bg[i]; + bg->index = i; + bg->enabled = 0; + bg->priority = 0; + bg->charBase = 0; + bg->mosaic = 0; + bg->multipalette = 0; + bg->screenBase = 0; + bg->overflow = 0; + bg->size = 0; + bg->target1 = 0; + bg->target2 = 0; + bg->x = 0; + bg->y = 0; + bg->refx = 0; + bg->refy = 0; + bg->affine.dx = 256; + bg->affine.dmx = 0; + bg->affine.dy = 0; + bg->affine.dmy = 256; + bg->affine.sx = 0; + bg->affine.sy = 0; + bg->offsetX = 0; + bg->offsetY = 0; + } + for (i = 0; i < 512; ++i) { int r = M_R5(glRenderer->d.palette[i]); int g = M_G5(glRenderer->d.palette[i]) << 1; From 50e0fe9972aa9f4ab34a10e6d451877f048e6fa7 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 11 Mar 2022 19:22:00 -0800 Subject: [PATCH 60/60] Tools: Clean up snes-tile script --- tools/snes-tile.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/snes-tile.py b/tools/snes-tile.py index 62541ec20..85c985e8f 100644 --- a/tools/snes-tile.py +++ b/tools/snes-tile.py @@ -54,6 +54,10 @@ for tid in np.mgrid[:32, :28].reshape(2, -1).T: chardataRaw = bytearray(len(tiledata) * 32) +palette = np.array(im.getpalette(), np.uint16).reshape(-1, 3) +palette >>= 3 +palette = palette[:,0] | (palette[:,1] << 5) | (palette[:,2] << 10) + for i, tile in enumerate(tiledata): for y in range(8): tileData = [0] * 4 @@ -64,7 +68,6 @@ for i, tile in enumerate(tiledata): tileData[2] |= ((t & 4) >> 2) << (7 - x) tileData[3] |= ((t & 8) >> 3) << (7 - x) tileBase = i * 32 + y * 2 - print(tileBase) chardataRaw[tileBase + 0x00] = tileData[0] chardataRaw[tileBase + 0x01] = tileData[1] chardataRaw[tileBase + 0x10] = tileData[2] @@ -73,4 +76,19 @@ for i, tile in enumerate(tiledata): def printMem(mem): for i in range(len(mem) // 16): line = mem[i * 16:(i + 1) * 16] - print(', '.join([f'0x{b:02X}' for b in line]) + ',') + print('\t' + ', '.join([f'0x{b:02X}' for b in line]) + ',') + +print('uint16_t palette[] = {'); +for rgb in palette[:16]: + print(f'\t0x{rgb:04X},') +print('};') +print() + +print('uint8_t tilemap[] = {'); +printMem(tilemapRaw) +print('};') +print() + +print('uint8_t chardata[] = {'); +printMem(chardataRaw) +print('};')