diff --git a/CHANGES b/CHANGES index 829a225d7..60b43b2d7 100644 --- a/CHANGES +++ b/CHANGES @@ -44,29 +44,41 @@ Features: - Tool for converting scanned pictures of e-Reader cards to raw dotcode data - Options for muting when inactive, minimized, or for different players in multiplayer - Cheat code support in homebrew ports + - Acclerometer and gyro support for controllers on PC - Support for combo "Super Game Boy Color" SGB + GBC ROM hacks - Support for 64 kiB SRAM saves used in some bootlegs - Discord Rich Presence now supports time elapsed - Additional scaling shaders Emulation fixes: + - ARM7: Fix unsigned multiply timing - GB I/O: Fix incrementing SGB controller when P14 is low (fixes mgba.io/i/2202) - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032) - GB Video: Render SGB border when unmasking with ATTR/PAL_SET (fixes mgba.io/i/2261) - GBA: Improve timing when not booting from BIOS + - GBA I/O: Redo internal key input, enabling edge-based key IRQs + - GBA Memory: Fix misaligned 32-bit I/O loads (fixes mgba.io/i/2307) - GBA SIO: Fix SI value for unattached MULTI mode - GBA Video: Fix backdrop color if DISPCNT is first set to 0 (fixes mgba.io/i/2260) + - GBA Video: Don't iterate affine backgrounds when disabled + - GBA Video: Delay enabling backgrounds in bitmap modes (fixes mgba.io/i/1668) Other fixes: + - ARM Decoder: Fix decoding of lsl r0 (fixes mgba.io/i/2349) - Core: Don't attempt to restore rewind diffs past start of rewind - FFmpeg: Don't attempt to use YUV 4:2:0 for lossless videos (fixes mgba.io/i/2084) - GB Video: Fix memory leak when reseting SGB games - GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB + - GBA: Fix maximum tile ID in caching for 256-color modes - Libretro: Fix crash when using Game Boy codes (fixes mgba.io/i/2281) + - Qt: Fix corrupted savestate and fatal error text + - Qt: Fix sprite compositing when sprite tiles go out of bounds (fixes mgba.io/i/2348) Misc: - Core: Suspend runloop when a core crashes + - GBA I/O: Update KEYINPUT in internal I/O memory (fixes mgba.io/i/2235) - mGUI: Add margin to right-aligned menu text (fixes mgba.io/i/871) - Qt: Rearrange menus some - Qt: Clean up cheats dialog - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799) + - Wii: Add adjustable gyroscope settings (closes mgba.io/i/2245) 0.9.2: (2021-07-10) Emulation fixes: diff --git a/include/mgba-util/threading.h b/include/mgba-util/threading.h index 779a533a0..1a7fcceab 100644 --- a/include/mgba-util/threading.h +++ b/include/mgba-util/threading.h @@ -11,7 +11,7 @@ CXX_GUARD_START #ifndef DISABLE_THREADING -#if __STDC_VERSION__ >= 201112L +#if (__STDC_VERSION__ >= 201112L) && (__STDC_NO_THREADS__ != 1) #define ThreadLocal _Thread_local void* #define ThreadLocalInitKey(X) #define ThreadLocalSetKey(K, V) K = V diff --git a/include/mgba/internal/arm/isa-inlines.h b/include/mgba/internal/arm/isa-inlines.h index 2ee6aee7c..ebda28e41 100644 --- a/include/mgba/internal/arm/isa-inlines.h +++ b/include/mgba/internal/arm/isa-inlines.h @@ -37,7 +37,7 @@ #define ARM_V_ADDITION(M, N, D) (!(ARM_SIGN((M) ^ (N))) && (ARM_SIGN((M) ^ (D)))) #define ARM_V_SUBTRACTION(M, N, D) ((ARM_SIGN((M) ^ (N))) && (ARM_SIGN((M) ^ (D)))) -#define ARM_WAIT_MUL(R, WAIT) \ +#define ARM_WAIT_SMUL(R, WAIT) \ { \ int32_t wait = WAIT; \ if ((R & 0xFFFFFF00) == 0xFFFFFF00 || !(R & 0xFFFFFF00)) { \ @@ -52,6 +52,21 @@ currentCycles += cpu->memory.stall(cpu, wait); \ } +#define ARM_WAIT_UMUL(R, WAIT) \ + { \ + int32_t wait = WAIT; \ + if (!(R & 0xFFFFFF00)) { \ + wait += 1; \ + } else if (!(R & 0xFFFF0000)) { \ + wait += 2; \ + } else if (!(R & 0xFF000000)) { \ + wait += 3; \ + } else { \ + wait += 4; \ + } \ + currentCycles += cpu->memory.stall(cpu, wait); \ + } + #define ARM_STUB cpu->irqh.hitStub(cpu, opcode) #define ARM_ILL cpu->irqh.hitIllegal(cpu, opcode) diff --git a/include/mgba/internal/gba/gba.h b/include/mgba/internal/gba/gba.h index 6e8fe4990..d98cdab39 100644 --- a/include/mgba/internal/gba/gba.h +++ b/include/mgba/internal/gba/gba.h @@ -85,7 +85,8 @@ struct GBA { struct mTimingEvent irqEvent; uint32_t biosChecksum; - int* keySource; + uint16_t keysActive; + uint16_t keysLast; struct mRotationSource* rotationSource; struct GBALuminanceSource* luminanceSource; struct mRTCSource* rtcSource; diff --git a/src/arm/decoder-arm.c b/src/arm/decoder-arm.c index 63d6a21c0..dc323457d 100644 --- a/src/arm/decoder-arm.c +++ b/src/arm/decoder-arm.c @@ -24,7 +24,7 @@ #define ADDR_MODE_1_LSL \ ADDR_MODE_1_SHIFT(LSL) \ - if (!info->op3.shifterImm) { \ + if ((info->operandFormat & ARM_OPERAND_SHIFT_IMMEDIATE_3) && !info->op3.shifterImm) { \ info->operandFormat &= ~ARM_OPERAND_SHIFT_IMMEDIATE_3; \ info->op3.shifterOp = ARM_SHIFT_NONE; \ } diff --git a/src/arm/isa-arm.c b/src/arm/isa-arm.c index b20a51f90..5e969cfa1 100644 --- a/src/arm/isa-arm.c +++ b/src/arm/isa-arm.c @@ -339,38 +339,38 @@ ATTRIBUTE_NOINLINE static void _neutralS(struct ARMCore* cpu, int32_t d) { DEFINE_ALU_INSTRUCTION_EX_ARM(NAME ## _ROR, S_BODY, _shiftROR, BODY) \ DEFINE_ALU_INSTRUCTION_EX_ARM(NAME ## I, S_BODY, _immediate, BODY) -#define DEFINE_MULTIPLY_INSTRUCTION_EX_ARM(NAME, BODY, S_BODY) \ +#define DEFINE_MULTIPLY_INSTRUCTION_EX_ARM(NAME, BODY, S_BODY, SIGNED) \ DEFINE_INSTRUCTION_ARM(NAME, \ int rd = (opcode >> 16) & 0xF; \ int rs = (opcode >> 8) & 0xF; \ int rm = opcode & 0xF; \ if (rd != ARM_PC) { \ - ARM_WAIT_MUL(cpu->gprs[rs], 0); \ + ARM_WAIT_ ## SIGNED ## MUL(cpu->gprs[rs], 0); \ BODY; \ S_BODY; \ } \ currentCycles += cpu->memory.activeNonseqCycles32 - cpu->memory.activeSeqCycles32) -#define DEFINE_MULTIPLY_INSTRUCTION_2_EX_ARM(NAME, BODY, S_BODY, WAIT) \ +#define DEFINE_MULTIPLY_INSTRUCTION_2_EX_ARM(NAME, BODY, S_BODY, SIGNED, WAIT) \ DEFINE_INSTRUCTION_ARM(NAME, \ int rd = (opcode >> 12) & 0xF; \ int rdHi = (opcode >> 16) & 0xF; \ int rs = (opcode >> 8) & 0xF; \ int rm = opcode & 0xF; \ if (rdHi != ARM_PC && rd != ARM_PC) { \ - ARM_WAIT_MUL(cpu->gprs[rs], WAIT); \ + ARM_WAIT_ ## SIGNED ## MUL(cpu->gprs[rs], WAIT); \ BODY; \ S_BODY; \ } \ currentCycles += cpu->memory.activeNonseqCycles32 - cpu->memory.activeSeqCycles32) -#define DEFINE_MULTIPLY_INSTRUCTION_ARM(NAME, BODY, S_BODY) \ - DEFINE_MULTIPLY_INSTRUCTION_EX_ARM(NAME, BODY, ) \ - DEFINE_MULTIPLY_INSTRUCTION_EX_ARM(NAME ## S, BODY, S_BODY) +#define DEFINE_MULTIPLY_INSTRUCTION_ARM(NAME, BODY, S_BODY, SIGNED) \ + DEFINE_MULTIPLY_INSTRUCTION_EX_ARM(NAME, BODY, , SIGNED) \ + DEFINE_MULTIPLY_INSTRUCTION_EX_ARM(NAME ## S, BODY, S_BODY, SIGNED) -#define DEFINE_MULTIPLY_INSTRUCTION_2_ARM(NAME, BODY, S_BODY, WAIT) \ - DEFINE_MULTIPLY_INSTRUCTION_2_EX_ARM(NAME, BODY, , WAIT) \ - DEFINE_MULTIPLY_INSTRUCTION_2_EX_ARM(NAME ## S, BODY, S_BODY, WAIT) +#define DEFINE_MULTIPLY_INSTRUCTION_2_ARM(NAME, BODY, S_BODY, SIGNED, WAIT) \ + DEFINE_MULTIPLY_INSTRUCTION_2_EX_ARM(NAME, BODY, , SIGNED, WAIT) \ + DEFINE_MULTIPLY_INSTRUCTION_2_EX_ARM(NAME ## S, BODY, S_BODY, SIGNED, WAIT) #define DEFINE_MULTIPLY_INSTRUCTION_3_ARM(NAME, BODY) \ DEFINE_INSTRUCTION_ARM(NAME, \ @@ -588,15 +588,15 @@ DEFINE_ALU_INSTRUCTION_S_ONLY_ARM(TST, ARM_NEUTRAL_S(n, cpu->shifterOperand, alu // Begin multiply definitions -DEFINE_MULTIPLY_INSTRUCTION_2_ARM(MLA, cpu->gprs[rdHi] = cpu->gprs[rm] * cpu->gprs[rs] + cpu->gprs[rd], ARM_NEUTRAL_S(, , cpu->gprs[rdHi]), 1) -DEFINE_MULTIPLY_INSTRUCTION_ARM(MUL, cpu->gprs[rd] = cpu->gprs[rm] * cpu->gprs[rs], ARM_NEUTRAL_S(cpu->gprs[rm], cpu->gprs[rs], cpu->gprs[rd])) +DEFINE_MULTIPLY_INSTRUCTION_2_ARM(MLA, cpu->gprs[rdHi] = cpu->gprs[rm] * cpu->gprs[rs] + cpu->gprs[rd], ARM_NEUTRAL_S(, , cpu->gprs[rdHi]), S, 1) +DEFINE_MULTIPLY_INSTRUCTION_ARM(MUL, cpu->gprs[rd] = cpu->gprs[rm] * cpu->gprs[rs], ARM_NEUTRAL_S(cpu->gprs[rm], cpu->gprs[rs], cpu->gprs[rd]), S) DEFINE_MULTIPLY_INSTRUCTION_2_ARM(SMLAL, int64_t d = ((int64_t) cpu->gprs[rm]) * ((int64_t) cpu->gprs[rs]) + ((uint32_t) cpu->gprs[rd]); int32_t dHi = cpu->gprs[rdHi] + (d >> 32); cpu->gprs[rd] = d; cpu->gprs[rdHi] = dHi;, - ARM_NEUTRAL_HI_S(cpu->gprs[rd], dHi), 2) + ARM_NEUTRAL_HI_S(cpu->gprs[rd], dHi), S, 2) DEFINE_MULTIPLY_INSTRUCTION_XY_ARM(SMLA, int32_t dn = cpu->gprs[rn]; \ @@ -618,20 +618,20 @@ DEFINE_MULTIPLY_INSTRUCTION_2_ARM(SMULL, int64_t d = ((int64_t) cpu->gprs[rm]) * ((int64_t) cpu->gprs[rs]); cpu->gprs[rd] = d; cpu->gprs[rdHi] = d >> 32;, - ARM_NEUTRAL_HI_S(cpu->gprs[rd], cpu->gprs[rdHi]), 1) + ARM_NEUTRAL_HI_S(cpu->gprs[rd], cpu->gprs[rdHi]), S, 1) DEFINE_MULTIPLY_INSTRUCTION_2_ARM(UMLAL, uint64_t d = ARM_UXT_64(cpu->gprs[rm]) * ARM_UXT_64(cpu->gprs[rs]) + ((uint32_t) cpu->gprs[rd]); uint32_t dHi = ((uint32_t) cpu->gprs[rdHi]) + (d >> 32); cpu->gprs[rd] = d; cpu->gprs[rdHi] = dHi;, - ARM_NEUTRAL_HI_S(cpu->gprs[rd], dHi), 2) + ARM_NEUTRAL_HI_S(cpu->gprs[rd], dHi), U, 2) DEFINE_MULTIPLY_INSTRUCTION_2_ARM(UMULL, uint64_t d = ARM_UXT_64(cpu->gprs[rm]) * ARM_UXT_64(cpu->gprs[rs]); cpu->gprs[rd] = d; cpu->gprs[rdHi] = d >> 32;, - ARM_NEUTRAL_HI_S(cpu->gprs[rd], cpu->gprs[rdHi]), 1) + ARM_NEUTRAL_HI_S(cpu->gprs[rd], cpu->gprs[rdHi]), U, 1) // End multiply definitions diff --git a/src/arm/isa-thumb.c b/src/arm/isa-thumb.c index 59e7c24cc..e5cc037a0 100644 --- a/src/arm/isa-thumb.c +++ b/src/arm/isa-thumb.c @@ -232,7 +232,7 @@ DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(NEG, THUMB_SUBTRACTION(cpu->gprs[rd], 0, cp DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(CMP2, int32_t aluOut = cpu->gprs[rd] - cpu->gprs[rn]; THUMB_SUBTRACTION_S(cpu->gprs[rd], cpu->gprs[rn], aluOut)) DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(CMN, int32_t aluOut = cpu->gprs[rd] + cpu->gprs[rn]; THUMB_ADDITION_S(cpu->gprs[rd], cpu->gprs[rn], aluOut)) DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(ORR, cpu->gprs[rd] = cpu->gprs[rd] | cpu->gprs[rn]; THUMB_NEUTRAL_S( , , cpu->gprs[rd])) -DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(MUL, ARM_WAIT_MUL(cpu->gprs[rd], 0); cpu->gprs[rd] *= cpu->gprs[rn]; THUMB_NEUTRAL_S( , , cpu->gprs[rd]); currentCycles += cpu->memory.activeNonseqCycles16 - cpu->memory.activeSeqCycles16) +DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(MUL, ARM_WAIT_SMUL(cpu->gprs[rd], 0); cpu->gprs[rd] *= cpu->gprs[rn]; THUMB_NEUTRAL_S( , , cpu->gprs[rd]); currentCycles += cpu->memory.activeNonseqCycles16 - cpu->memory.activeSeqCycles16) DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(BIC, cpu->gprs[rd] = cpu->gprs[rd] & ~cpu->gprs[rn]; THUMB_NEUTRAL_S( , , cpu->gprs[rd])) DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(MVN, cpu->gprs[rd] = ~cpu->gprs[rn]; THUMB_NEUTRAL_S( , , cpu->gprs[rd])) diff --git a/src/debugger/gdb-stub.c b/src/debugger/gdb-stub.c index 706e1fde8..23cc52396 100644 --- a/src/debugger/gdb-stub.c +++ b/src/debugger/gdb-stub.c @@ -72,6 +72,8 @@ static void _gdbStubEntered(struct mDebugger* debugger, enum mDebuggerEntryReaso case WATCHPOINT_RW: type = "awatch"; break; + case WATCHPOINT_CHANGE: + break; } snprintf(stub->outgoing, GDB_STUB_MAX_LINE - 4, "T%02x%s:%08x;", SIGTRAP, type, info->address); } else { @@ -629,6 +631,7 @@ size_t _parseGDBMessage(struct GDBStub* stub, const char* message) { _readGPRs(stub, message); break; case 'H': + case 'T': // This is faked because we only have one thread strncpy(stub->outgoing, "OK", GDB_STUB_MAX_LINE - 4); _sendMessage(stub); diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c index b7bb72a1b..1d245819f 100644 --- a/src/feature/gui/gui-runner.c +++ b/src/feature/gui/gui-runner.c @@ -95,6 +95,9 @@ static bool _testExtensions(const char* name) { if (!strncmp(ext, "ini", PATH_MAX)) { return false; } + if (!strncmp(ext, "cheats", PATH_MAX)) { + return false; + } if (!strncmp(ext, "ss", 2)) { return false; } diff --git a/src/gba/core.c b/src/gba/core.c index 125c7f2c5..eb4d41253 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -150,7 +150,6 @@ struct GBACore { #ifndef DISABLE_THREADING struct mVideoThreadProxy threadProxy; #endif - int keys; struct mCPUComponent* components[CPU_COMPONENT_MAX]; const struct Configuration* overrides; struct mDebuggerPlatform* debuggerPlatform; @@ -209,9 +208,6 @@ static bool _GBACoreInit(struct mCore* core) { gbacore->proxyRenderer.logger = NULL; #endif - gbacore->keys = 0; - gba->keySource = &gbacore->keys; - #if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2 mDirectorySetInit(&core->dirs); #endif @@ -718,20 +714,20 @@ static bool _GBACoreSaveState(struct mCore* core, void* state) { } static void _GBACoreSetKeys(struct mCore* core, uint32_t keys) { - struct GBACore* gbacore = (struct GBACore*) core; - gbacore->keys = keys; - GBATestKeypadIRQ(core->board); + struct GBA* gba = core->board; + gba->keysActive = keys; + GBATestKeypadIRQ(gba); } static void _GBACoreAddKeys(struct mCore* core, uint32_t keys) { - struct GBACore* gbacore = (struct GBACore*) core; - gbacore->keys |= keys; - GBATestKeypadIRQ(core->board); + struct GBA* gba = core->board; + gba->keysActive |= keys; + GBATestKeypadIRQ(gba); } static void _GBACoreClearKeys(struct mCore* core, uint32_t keys) { - struct GBACore* gbacore = (struct GBACore*) core; - gbacore->keys &= ~keys; + struct GBA* gba = core->board; + gba->keysActive &= ~keys; } static void _GBACoreSetCursorLocation(struct mCore* core, int x, int y) { diff --git a/src/gba/gba.c b/src/gba/gba.c index ea3a91501..9372f23d5 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -90,7 +90,8 @@ static void GBAInit(void* cpu, struct mCPUComponent* component) { GBAHardwareInit(&gba->memory.hw, NULL); - gba->keySource = 0; + gba->keysActive = 0; + gba->keysLast = 0; gba->rotationSource = 0; gba->luminanceSource = 0; gba->rtcSource = 0; @@ -876,18 +877,22 @@ void GBAFrameEnded(struct GBA* gba) { } void GBATestKeypadIRQ(struct GBA* gba) { + if (gba->keysActive == gba->keysLast) { + return; + } uint16_t keycnt = gba->memory.io[REG_KEYCNT >> 1]; if (!(keycnt & 0x4000)) { return; } int isAnd = keycnt & 0x8000; - if (!gba->keySource) { - // TODO? - return; - } keycnt &= 0x3FF; - uint16_t keyInput = *gba->keySource & keycnt; + uint16_t keyInput = gba->keysActive & keycnt; + uint16_t lastInput = gba->keysLast & keycnt; + gba->keysLast = gba->keysActive; + if (keyInput == lastInput) { + return; + } if (isAnd && keycnt == keyInput) { GBARaiseIRQ(gba, IRQ_KEYPAD, 0); diff --git a/src/gba/io.c b/src/gba/io.c index 6ccb37116..82eb89138 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -743,28 +743,24 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) { callbacks->keysRead(callbacks->context); } } - uint16_t input = 0; if (gba->keyCallback) { - input = gba->keyCallback->readKeys(gba->keyCallback); - if (gba->keySource) { - *gba->keySource = input; + gba->keysActive = gba->keyCallback->readKeys(gba->keyCallback); + } + uint16_t input = gba->keysActive; + if (!gba->allowOpposingDirections) { + unsigned rl = input & 0x030; + unsigned ud = input & 0x0C0; + input &= 0x30F; + if (rl != 0x030) { + input |= rl; } - } else if (gba->keySource) { - input = *gba->keySource; - if (!gba->allowOpposingDirections) { - unsigned rl = input & 0x030; - unsigned ud = input & 0x0C0; - input &= 0x30F; - if (rl != 0x030) { - input |= rl; - } - if (ud != 0x0C0) { - input |= ud; - } + if (ud != 0x0C0) { + input |= ud; } } - return 0x3FF ^ input; + gba->memory.io[address >> 1] = 0x3FF ^ input; } + break; case REG_SIOCNT: return gba->sio.siocnt; case REG_RCNT: diff --git a/src/gba/memory.c b/src/gba/memory.c index d79010770..0842afc00 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -381,7 +381,7 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { wait += waitstatesRegion[REGION_WORKING_RAM]; #define LOAD_WORKING_IRAM LOAD_32(value, address & (SIZE_WORKING_IRAM - 4), memory->iwram); -#define LOAD_IO value = GBAIORead(gba, address & OFFSET_MASK & ~2) | (GBAIORead(gba, (address & OFFSET_MASK) | 2) << 16); +#define LOAD_IO value = GBAIORead(gba, address & OFFSET_MASK & ~3) | (GBAIORead(gba, (address & OFFSET_MASK & ~1) | 2) << 16); #define LOAD_PALETTE_RAM \ LOAD_32(value, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); \ diff --git a/src/gba/renderers/cache-set.c b/src/gba/renderers/cache-set.c index bc84deadd..95093ae9a 100644 --- a/src/gba/renderers/cache-set.c +++ b/src/gba/renderers/cache-set.c @@ -25,10 +25,10 @@ void GBAVideoCacheInit(struct mCacheSet* cache) { sysconfig = mTileCacheSystemInfoSetPaletteBPP(sysconfig, 3); // 2^(2^3) = 256 entries sysconfig = mTileCacheSystemInfoSetPaletteCount(sysconfig, 0); // 1 palettes - sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 2048); + sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 1024); mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 1), sysconfig, 0, 0); mTileCacheConfigure(mTileCacheSetGetPointer(&cache->tiles, 1), config); - sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 1024); + sysconfig = mTileCacheSystemInfoSetMaxTiles(sysconfig, 512); mTileCacheConfigureSystem(mTileCacheSetGetPointer(&cache->tiles, 3), sysconfig, 0x10000, 0x100); mTileCacheConfigure(mTileCacheSetGetPointer(&cache->tiles, 3), config); diff --git a/src/gba/renderers/gl.c b/src/gba/renderers/gl.c index a977491db..46c7ea8b6 100644 --- a/src/gba/renderers/gl.c +++ b/src/gba/renderers/gl.c @@ -1414,7 +1414,7 @@ void GBAVideoGLRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { if (y == 0) { glDisable(GL_SCISSOR_TEST); glClearColor(0, 0, 0, 0); -#ifdef BUILD_GLES3 +#ifdef GL_GLES_PROTOTYPES glClearDepthf(1.f); #else glClearDepth(1); @@ -1439,10 +1439,14 @@ void GBAVideoGLRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { } if (GBARegisterDISPCNTGetMode(glRenderer->dispcnt) != 0) { - glRenderer->bg[2].affine.sx += glRenderer->bg[2].affine.dmx; - glRenderer->bg[2].affine.sy += glRenderer->bg[2].affine.dmy; - glRenderer->bg[3].affine.sx += glRenderer->bg[3].affine.dmx; - glRenderer->bg[3].affine.sy += glRenderer->bg[3].affine.dmy; + if (glRenderer->bg[2].enabled == 4) { + glRenderer->bg[2].affine.sx += glRenderer->bg[2].affine.dmx; + glRenderer->bg[2].affine.sy += glRenderer->bg[2].affine.dmy; + } + if (glRenderer->bg[3].enabled == 4) { + glRenderer->bg[3].affine.sx += glRenderer->bg[3].affine.dmx; + glRenderer->bg[3].affine.sy += glRenderer->bg[3].affine.dmy; + } } } diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c index 0523d7f7f..e67452099 100644 --- a/src/gba/renderers/video-software.c +++ b/src/gba/renderers/video-software.c @@ -563,10 +563,14 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render if (!dirty) { if (GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) != 0) { - softwareRenderer->bg[2].sx += softwareRenderer->bg[2].dmx; - softwareRenderer->bg[2].sy += softwareRenderer->bg[2].dmy; - softwareRenderer->bg[3].sx += softwareRenderer->bg[3].dmx; - softwareRenderer->bg[3].sy += softwareRenderer->bg[3].dmy; + if (softwareRenderer->bg[2].enabled == 4) { + softwareRenderer->bg[2].sx += softwareRenderer->bg[2].dmx; + softwareRenderer->bg[2].sy += softwareRenderer->bg[2].dmy; + } + if (softwareRenderer->bg[3].enabled == 4) { + softwareRenderer->bg[3].sx += softwareRenderer->bg[3].dmx; + softwareRenderer->bg[3].sy += softwareRenderer->bg[3].dmy; + } } return; } @@ -645,25 +649,29 @@ static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* render GBAVideoSoftwareRendererPostprocessBuffer(softwareRenderer); if (GBARegisterDISPCNTGetMode(softwareRenderer->dispcnt) != 0) { - softwareRenderer->bg[2].sx += softwareRenderer->bg[2].dmx; - softwareRenderer->bg[2].sy += softwareRenderer->bg[2].dmy; - softwareRenderer->bg[3].sx += softwareRenderer->bg[3].dmx; - softwareRenderer->bg[3].sy += softwareRenderer->bg[3].dmy; + if (softwareRenderer->bg[2].enabled == 4) { + softwareRenderer->bg[2].sx += softwareRenderer->bg[2].dmx; + softwareRenderer->bg[2].sy += softwareRenderer->bg[2].dmy; + } + if (softwareRenderer->bg[3].enabled == 4) { + softwareRenderer->bg[3].sx += softwareRenderer->bg[3].dmx; + softwareRenderer->bg[3].sy += softwareRenderer->bg[3].dmy; + } } - if (softwareRenderer->bg[0].enabled > 0 && softwareRenderer->bg[0].enabled < 4) { + if (softwareRenderer->bg[0].enabled != 0 && softwareRenderer->bg[0].enabled < 4) { ++softwareRenderer->bg[0].enabled; DIRTY_SCANLINE(softwareRenderer, y); } - if (softwareRenderer->bg[1].enabled > 0 && softwareRenderer->bg[1].enabled < 4) { + if (softwareRenderer->bg[1].enabled != 0 && softwareRenderer->bg[1].enabled < 4) { ++softwareRenderer->bg[1].enabled; DIRTY_SCANLINE(softwareRenderer, y); } - if (softwareRenderer->bg[2].enabled > 0 && softwareRenderer->bg[2].enabled < 4) { + if (softwareRenderer->bg[2].enabled != 0 && softwareRenderer->bg[2].enabled < 4) { ++softwareRenderer->bg[2].enabled; DIRTY_SCANLINE(softwareRenderer, y); } - if (softwareRenderer->bg[3].enabled > 0 && softwareRenderer->bg[3].enabled < 4) { + if (softwareRenderer->bg[3].enabled != 0 && softwareRenderer->bg[3].enabled < 4) { ++softwareRenderer->bg[3].enabled; DIRTY_SCANLINE(softwareRenderer, y); } @@ -741,14 +749,22 @@ static void GBAVideoSoftwareRendererPutPixels(struct GBAVideoRenderer* renderer, static void _enableBg(struct GBAVideoSoftwareRenderer* renderer, int bg, bool active) { int wasActive = renderer->bg[bg].enabled; if (!active) { - renderer->bg[bg].enabled = 0; + if (renderer->nextY == 0 || (wasActive > 0 && wasActive < 4)) { + renderer->bg[bg].enabled = 0; + } else if (wasActive == 4) { + renderer->bg[bg].enabled = -2; + } } else if (!wasActive && active) { - if (renderer->nextY == 0 || GBARegisterDISPCNTGetMode(renderer->dispcnt) > 2) { + if (renderer->nextY == 0) { // TODO: Investigate in more depth how switching background works in different modes renderer->bg[bg].enabled = 4; + } else if (GBARegisterDISPCNTGetMode(renderer->dispcnt) > 2) { + renderer->bg[bg].enabled = 2; } else { renderer->bg[bg].enabled = 1; } + } else if (wasActive < 0 && active) { + renderer->bg[bg].enabled = 4; } } diff --git a/src/gba/sio/lockstep.c b/src/gba/sio/lockstep.c index ba1f3f0af..8438b2b8e 100644 --- a/src/gba/sio/lockstep.c +++ b/src/gba/sio/lockstep.c @@ -462,6 +462,8 @@ static void _GBASIOLockstepNodeProcessEvents(struct mTiming* timing, void* user, node->eventDiff = 0; } break; + default: + break; } } else if (node->nextEvent <= 0) { if (!node->id) { diff --git a/src/platform/python/_builder.h b/src/platform/python/_builder.h index e1d104cd6..d964e1949 100644 --- a/src/platform/python/_builder.h +++ b/src/platform/python/_builder.h @@ -23,10 +23,10 @@ #define CXX_GUARD_END #define PYCPARSE +#define va_list void* typedef int... time_t; typedef int... off_t; -typedef ... va_list; typedef ...* png_structp; typedef ...* png_infop; typedef ...* png_unknown_chunkp; diff --git a/src/platform/qt/ApplicationUpdatePrompt.ui b/src/platform/qt/ApplicationUpdatePrompt.ui index 31b3e6135..17ab4c125 100644 --- a/src/platform/qt/ApplicationUpdatePrompt.ui +++ b/src/platform/qt/ApplicationUpdatePrompt.ui @@ -20,7 +20,7 @@ - {text} + {text} true @@ -30,7 +30,7 @@ - {details} + {details} diff --git a/src/platform/qt/AssetView.cpp b/src/platform/qt/AssetView.cpp index e686f91a9..66574b0df 100644 --- a/src/platform/qt/AssetView.cpp +++ b/src/platform/qt/AssetView.cpp @@ -131,6 +131,7 @@ QImage AssetView::compositeMap(int map, mMapCacheEntry* mapStatus) { QImage AssetView::compositeObj(const ObjInfo& objInfo) { mTileCache* tileCache = mTileCacheSetGetPointer(&m_cacheSet->tiles, objInfo.paletteSet); + unsigned maxTiles = mTileCacheSystemInfoGetMaxTiles(tileCache->sysConfig); const color_t* rawPalette = mTileCacheGetPalette(tileCache, objInfo.paletteId); unsigned colors = 1 << objInfo.bits; QVector palette; @@ -142,10 +143,11 @@ QImage AssetView::compositeObj(const ObjInfo& objInfo) { QImage image = QImage(QSize(objInfo.width * 8, objInfo.height * 8), QImage::Format_Indexed8); image.setColorTable(palette); + image.fill(0); uchar* bits = image.bits(); unsigned t = objInfo.tile; - for (unsigned y = 0; y < objInfo.height; ++y) { - for (unsigned x = 0; x < objInfo.width; ++x, ++t) { + for (unsigned y = 0; y < objInfo.height && t < maxTiles; ++y) { + for (unsigned x = 0; x < objInfo.width && t < maxTiles; ++x, ++t) { compositeTile(static_cast(mTileCacheGetVRAM(tileCache, t)), bits, objInfo.width * 8, x * 8, y * 8, objInfo.bits); } t += objInfo.stride - objInfo.width; diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index 9500ea0bd..ca2018239 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -183,14 +183,17 @@ CoreController::CoreController(mCore* core, QObject* parent) return; } } - message = QString().vsprintf(format, args); + va_list argc; + va_copy(argc, args); + message = QString().vsprintf(format, argc); + va_end(argc); QMetaObject::invokeMethod(controller, "statusPosted", Q_ARG(const QString&, message)); } message = QString().vsprintf(format, args); QMetaObject::invokeMethod(controller, "logPosted", Q_ARG(int, level), Q_ARG(int, category), Q_ARG(const QString&, message)); if (level == mLOG_FATAL) { mCoreThreadMarkCrashed(controller->thread()); - QMetaObject::invokeMethod(controller, "crashed", Q_ARG(const QString&, QString().vsprintf(format, args))); + QMetaObject::invokeMethod(controller, "crashed", Q_ARG(const QString&, message)); } }; } diff --git a/src/platform/qt/ROMInfo.ui b/src/platform/qt/ROMInfo.ui index aeebdad7f..e4d2c3bb3 100644 --- a/src/platform/qt/ROMInfo.ui +++ b/src/platform/qt/ROMInfo.ui @@ -30,7 +30,7 @@ - {NAME} + {NAME} true @@ -50,7 +50,7 @@ - {TITLE} + {TITLE} Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse @@ -67,7 +67,7 @@ - {ID} + {ID} Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse @@ -84,7 +84,7 @@ - {SIZE} + {SIZE} Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse @@ -101,7 +101,7 @@ - {CRC} + {CRC} Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp index 70bd0a221..8ce54caa0 100644 --- a/src/platform/qt/SettingsView.cpp +++ b/src/platform/qt/SettingsView.cpp @@ -336,7 +336,8 @@ SettingsView::SettingsView(ConfigController* controller, InputController* inputC } }); - m_ui.languages->setItemData(0, QLocale("en")); + QLocale englishLocale("en"); + m_ui.languages->addItem(englishLocale.nativeLanguageName(), englishLocale); QDir ts(":/translations/"); for (auto name : ts.entryList()) { if (!name.endsWith(".qm") || !name.startsWith(binaryName)) { @@ -651,7 +652,7 @@ void SettingsView::updateConfig() { emit biosLoaded(mPLATFORM_GBA, m_ui.gbaBios->text()); } -void SettingsView::reloadConfig() { +void SettingsView::reloadConfig() { loadSetting("bios", m_ui.gbaBios); loadSetting("gba.bios", m_ui.gbaBios); loadSetting("gb.bios", m_ui.gbBios); @@ -825,7 +826,7 @@ void SettingsView::reloadConfig() { } else if (multiplayerAudio == QLatin1String("active")) { m_ui.multiplayerAudioActive->setChecked(true); } else { - m_ui.multiplayerAudioAll->setChecked(true); + m_ui.multiplayerAudioAll->setChecked(true); } } diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui index 11310ca76..d5bfd2942 100644 --- a/src/platform/qt/SettingsView.ui +++ b/src/platform/qt/SettingsView.ui @@ -523,13 +523,7 @@ - - - - English - - - + diff --git a/src/platform/qt/ts/medusa-emu-de.ts b/src/platform/qt/ts/medusa-emu-de.ts index 6ae20f8bf..8a9d0e0b0 100644 --- a/src/platform/qt/ts/medusa-emu-de.ts +++ b/src/platform/qt/ts/medusa-emu-de.ts @@ -58,16 +58,6 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.An update is available Ein Update ist verfügbar - - - {text} - {text} - - - - {details} - {details} - ArchiveInspector @@ -1255,22 +1245,22 @@ Download-Größe: %3 QGBA::ApplicationUpdater - + Stable Stabil - + Development Entwicklung - + Unknown Unbekannt - + (None) (keiner) @@ -1321,27 +1311,27 @@ Download-Größe: %3 QGBA::CoreController - + 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 @@ -4990,51 +4980,26 @@ Download-Größe: %3 Game name: Spielname: - - - {NAME} - {NAME} - Internal name: Interner Name: - - - {TITLE} - {TITLE} - Game ID: Spiele-ID: - - - {ID} - {ID} - File size: Dateigröße: - - - {SIZE} - {SIZE} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -5582,11 +5547,6 @@ Download-Größe: %3 Language Sprache - - - English - Englisch - List view diff --git a/src/platform/qt/ts/medusa-emu-es.ts b/src/platform/qt/ts/medusa-emu-es.ts index dd8b59e4f..f9b576404 100644 --- a/src/platform/qt/ts/medusa-emu-es.ts +++ b/src/platform/qt/ts/medusa-emu-es.ts @@ -41,17 +41,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. An update is available - - - - - {text} - - - - - {details} - + Hay una actualización disponible @@ -173,7 +163,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Add New Code - + Añadir nuevo código @@ -183,12 +173,12 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Add Lines - + Añadir líneas Code type - + Tipo de código @@ -1013,7 +1003,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. EEPROM 8kB - + EEPROM 8kB @@ -1023,7 +1013,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. SRAM 64kB (bootlegs only) - + SRAM 64kB (sólo bootlegs) @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Desconocido - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4911,51 +4901,26 @@ Download size: %3 Game name: Nombre del juego: - - - {NAME} - {NAME} - Internal name: Nombre interno: - - - {TITLE} - {TITLE} - Game ID: Id. de juego: - - - {ID} - {ID} - File size: Tamaño del archivo: - - - {SIZE} - {SIZE} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -5579,11 +5544,6 @@ Download size: %3 Language Idioma - - - English - English - Library: diff --git a/src/platform/qt/ts/medusa-emu-it.ts b/src/platform/qt/ts/medusa-emu-it.ts index 398cc2c21..09d32a059 100644 --- a/src/platform/qt/ts/medusa-emu-it.ts +++ b/src/platform/qt/ts/medusa-emu-it.ts @@ -43,16 +43,6 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Sconosciuto - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4911,51 +4901,26 @@ Download size: %3 Game name: Nome del gioco: - - - {NAME} - {NAME} - Internal name: Nome interno: - - - {TITLE} - {TITLE} - Game ID: ID del gioco: - - - {ID} - {ID} - File size: Dimensioni del file: - - - {SIZE} - {SIZE} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -5770,11 +5735,6 @@ Download size: %3 Language Lingua - - - English - inglese - List view diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index 1b8e79a8e..9ab28f26e 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -42,16 +42,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1236,22 +1226,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1302,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -4908,51 +4898,26 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: - - - {CRC} - - ReportView @@ -5510,11 +5475,6 @@ Download size: %3 Language - - - English - - Library: diff --git a/src/platform/qt/ts/mgba-fi.ts b/src/platform/qt/ts/mgba-fi.ts index 4efdf8d3e..33831462a 100644 --- a/src/platform/qt/ts/mgba-fi.ts +++ b/src/platform/qt/ts/mgba-fi.ts @@ -43,16 +43,6 @@ Game Boy Advance on Nintendo Co., Ltd rekisteröimä tuotemerkki. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -4909,51 +4899,26 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: - - - {CRC} - - ReportView @@ -5511,11 +5476,6 @@ Download size: %3 Language - - - English - - Library: diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index 32701fa9e..7b5306fa6 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -43,16 +43,6 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1238,22 +1228,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1304,27 +1294,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4930,51 +4920,26 @@ Download size: %3 Game name: Nom du jeu : - - - {NAME} - {NAME} - Internal name: Nom interne : - - - {TITLE} - {TITLE} - Game ID: ID du jeu : - - - {ID} - {ID} - File size: Taille du fichier : - - - {SIZE} - {SIZE} - CRC32: CRC32 : - - - {CRC} - {CRC} - ReportView @@ -5604,11 +5569,6 @@ Download size: %3 Language Langue - - - English - anglais - Library: diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index 1f6ea24f5..6420a63ef 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -43,16 +43,6 @@ A Game Boy Advance a Nintendo Co., Ltd. bejegyzett védjegye An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4907,51 +4897,26 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: - - - {CRC} - - ReportView @@ -5453,11 +5418,6 @@ Download size: %3 Language - - - English - - Library: diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index ff6e6d572..ea0878d30 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -43,16 +43,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown 不明 - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4909,51 +4899,26 @@ Download size: %3 Game name: ゲーム名: - - - {NAME} - {NAME} - Internal name: 内部名: - - - {TITLE} - {TITLE} - Game ID: ゲームID: - - - {ID} - {ID} - File size: ファイルサイズ: - - - {SIZE} - {SIZE} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -5607,11 +5572,6 @@ Download size: %3 Language 言語 - - - English - English - Library: diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index 5d208830d..a9a96cfac 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -43,16 +43,6 @@ Game Boy Advance는 Nintendo Co., Ltd.의 등록 상표입니다. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4909,51 +4899,26 @@ Download size: %3 Game name: 게임 이름: - - - {NAME} - {이름} - Internal name: 내부 이름: - - - {TITLE} - {제목} - Game ID: 게임 ID: - - - {ID} - {ID} - File size: 파일 크기: - - - {SIZE} - {크기} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -5768,11 +5733,6 @@ Download size: %3 Language 언어 - - - English - 영어 - List view diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index 8cb432553..c5e3e6237 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -42,16 +42,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1236,22 +1226,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1302,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4908,51 +4898,26 @@ Download size: %3 Game name: Nama permainan: - - - {NAME} - {NAME} - Internal name: Nama dalaman: - - - {TITLE} - {TITLE} - Game ID: ID Permainan: - - - {ID} - {ID} - File size: Saiz fail: - - - {SIZE} - {SIZE} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -5510,11 +5475,6 @@ Download size: %3 Language Bahasa - - - English - Inggeris - Library: diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index f517841ad..b569281c2 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -43,16 +43,6 @@ Game Boy Advance er et registrert varemerke tilhørende Nintendo Co., Ltd.An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Ukjent - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4909,51 +4899,26 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: - - - {CRC} - - ReportView @@ -5511,11 +5476,6 @@ Download size: %3 Language - - - English - - Library: diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index a26012320..3cf679d6b 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -40,17 +40,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - - - - - {text} - - - - - {details} - + Er is een update beschikbaar @@ -58,12 +48,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Open in archive... - + Open in archief... Loading... - + Aan het laden... @@ -71,32 +61,32 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Tile # - + Tegel # Palette # - + Palet # Address - + Adres Red - + Rood Green - + Groen Blue - + Blauw @@ -109,7 +99,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Chip name - + Chip naam @@ -119,22 +109,22 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Save - + Opslaan Load - + Laden Add - + Toevoegen Remove - + Verwijderen @@ -149,17 +139,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Chip ID - + Chip ID Update Chip data - + Update chip informatie Show advanced - + Geavanceerd tonen @@ -167,42 +157,42 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Cheats - + Cheats Add New Code - + Nieuwe code toevoegen Remove - + Verwijderen Add Lines - + Lijnen toevoegen Code type - + Code type Save - + Opslaan Load - + Laden Enter codes here... - + Hier code ingeven... @@ -210,12 +200,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Debugger - + Debugger Enter command (try `help` for more info) - + Commando ingeven (probeer `help` voor meer info) @@ -228,37 +218,37 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Connect to Dolphin - + Verbinden met Dolphin Local computer - + Lokale computer IP address - + IP adres Connect - + Verbind Disconnect - + Verbinding verbreken Close - + Sluiten Reset on connect - + Reset zodra verbonden @@ -271,7 +261,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Magnification - + Vergroting @@ -281,22 +271,22 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Backdrop color - + Achtergrond kleur Disable scanline effects - + Scanline effect uitzetten Export - + Exporteren Reset - + Resetten @@ -309,7 +299,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Start - + Start @@ -324,27 +314,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Stop - + Stop Select File - + Bestqnd selecteren APNG - + APNG GIF - + GIF WebP - + WebP @@ -352,17 +342,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. I/O Viewer - + I/O inspecteur 0x0000 - + 0x0000 B - + B @@ -370,27 +360,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Name - + Naam Location - + Locatie Platform - + Platform Size - + Grootte CRC32 - + CRC32 @@ -399,7 +389,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. %1 State - + %1 Staat @@ -412,57 +402,57 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. No Save - + Geen opslag 5 - + 5 6 - + 6 8 - + 8 4 - + 4 1 - + 1 3 - + 3 7 - + 7 9 - + 9 2 - + 2 Cancel - + Annuleren @@ -470,7 +460,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Logs - + Logboek @@ -480,7 +470,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Debug - + Debug @@ -490,17 +480,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Info - + Info Warning - + Waarschuwing Error - + Fout @@ -510,7 +500,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Game Error - + Spel fout @@ -538,12 +528,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Magnification - + Vergroting Export - + Exporteren @@ -584,7 +574,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Address - + Adres @@ -799,7 +789,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Load - + Laden @@ -847,7 +837,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Export - + Exporteren @@ -931,12 +921,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Address - + Adres Magnification - + Vergroting @@ -1100,17 +1090,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Red - + Rood Green - + Groen Blue - + Blauw @@ -1191,7 +1181,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Magnification - + Vergroting @@ -1199,7 +1189,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 2021 - + 2021 @@ -1236,22 +1226,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1302,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -1454,12 +1444,12 @@ Download size: %3 Stop - + Stop Start - + Start @@ -2116,7 +2106,7 @@ Download size: %3 Reset - + Resetten @@ -2144,28 +2134,28 @@ Download size: %3 0% - + 0% 100% - + 100% 50% - + 50% 25% - + 25% @@ -2173,7 +2163,7 @@ Download size: %3 75% - + 75% @@ -2191,13 +2181,13 @@ Download size: %3 15 - + 15 7 - + 7 @@ -2297,7 +2287,7 @@ Download size: %3 0 - + 0 @@ -2310,7 +2300,7 @@ Download size: %3 1 - + 1 @@ -2719,7 +2709,7 @@ Download size: %3 1/64 - + 1/64 @@ -2728,7 +2718,7 @@ Download size: %3 1/256 - + 1/256 @@ -2737,7 +2727,7 @@ Download size: %3 1/1024 - + 1/1024 @@ -2756,7 +2746,7 @@ Download size: %3 B - + B @@ -2768,7 +2758,7 @@ Download size: %3 Start - + Start @@ -2915,7 +2905,7 @@ Download size: %3 4 - + 4 @@ -2923,7 +2913,7 @@ Download size: %3 3 - + 3 @@ -2932,7 +2922,7 @@ Download size: %3 2 - + 2 @@ -2941,7 +2931,7 @@ Download size: %3 8 - + 8 @@ -3062,7 +3052,7 @@ Download size: %3 1/16 - + 1/16 @@ -3320,13 +3310,13 @@ Download size: %3 Red - + Rood Blue - + Blauw @@ -3417,22 +3407,22 @@ Download size: %3 Error - + Fout Warning - + Waarschuwing Info - + Info Debug - + Debug @@ -3442,7 +3432,7 @@ Download size: %3 Game Error - + Spel fout @@ -3515,7 +3505,7 @@ Download size: %3 Size - + Grootte @@ -3609,7 +3599,7 @@ Download size: %3 Load - + Laden @@ -4908,50 +4898,25 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: - - - - - {CRC} - + CRC32: @@ -4974,7 +4939,7 @@ Download size: %3 Save - + Opslaan @@ -5237,37 +5202,37 @@ Download size: %3 1536 - + 1536 512 - + 512 768 - + 768 1024 - + 1024 2048 - + 2048 3072 - + 3072 4096 - + 4096 @@ -5283,22 +5248,22 @@ Download size: %3 44100 - + 44100 22050 - + 22050 32000 - + 32000 48000 - + 48000 @@ -5545,11 +5510,6 @@ Download size: %3 Language - - - English - - Library: @@ -5839,7 +5799,7 @@ Download size: %3 Cheats - + Cheats @@ -5892,7 +5852,7 @@ Download size: %3 Name - + Naam @@ -5963,7 +5923,7 @@ Download size: %3 Magnification - + Vergroting @@ -5996,17 +5956,17 @@ Download size: %3 Start - + Start Stop - + Stop Select File - + Bestqnd selecteren @@ -6078,7 +6038,7 @@ Download size: %3 4K - + 4K @@ -6184,7 +6144,7 @@ Download size: %3 Show advanced - + Geavanceerd tonen diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index 38ec4785e..146386936 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -42,16 +42,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1236,22 +1226,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1302,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -4910,51 +4900,26 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: CRC32: - - - {CRC} - - ReportView @@ -5512,11 +5477,6 @@ Download size: %3 Language - - - English - - Library: diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index 072edf4a0..13f744748 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -43,16 +43,6 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Desconhecido - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4911,51 +4901,26 @@ Download size: %3 Game name: Nome do jogo: - - - {NAME} - {NAME} - Internal name: Nome interno: - - - {TITLE} - {TITLE} - Game ID: ID do Jogo: - - - {ID} - {ID} - File size: Tamanho do arquivo: - - - {SIZE} - {SIZE} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -5579,11 +5544,6 @@ Download size: %3 Language Idioma - - - English - Inglês - Library: diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 320b39374..806b28632 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -41,17 +41,7 @@ Game Boy Advance - зарегистрированная торговая мар An update is available - - - - - {text} - - - - - {details} - + Доступно обновление @@ -72,7 +62,7 @@ Game Boy Advance - зарегистрированная торговая мар Tile # - + Тайл # @@ -105,12 +95,12 @@ Game Boy Advance - зарегистрированная торговая мар BattleChip Gate - + Чип BattleChip Gate Chip name - + Имя чипа @@ -140,7 +130,7 @@ Game Boy Advance - зарегистрированная торговая мар Gate type - + Тип Gate @@ -150,17 +140,17 @@ Game Boy Advance - зарегистрированная торговая мар Chip ID - + ID чипа Update Chip data - + Обновление данных чипа Show advanced - + Расширенные настройки @@ -173,7 +163,7 @@ Game Boy Advance - зарегистрированная торговая мар Add New Code - + Добавить новый код @@ -183,12 +173,12 @@ Game Boy Advance - зарегистрированная торговая мар Add Lines - + Добавить линии Code type - + Тип кода @@ -229,37 +219,37 @@ Game Boy Advance - зарегистрированная торговая мар Connect to Dolphin - + Соединение с Dolphin Local computer - + Локальный компьютер IP address - + IP-адрес Connect - + Подключиться Disconnect - + Отключиться Close - + Закрыть Reset on connect - + Сброс при соединении @@ -277,7 +267,7 @@ Game Boy Advance - зарегистрированная торговая мар Freeze frame - + Зафиксировать фрейм @@ -297,7 +287,7 @@ Game Boy Advance - зарегистрированная торговая мар Reset - + Сброс @@ -353,17 +343,17 @@ Game Boy Advance - зарегистрированная торговая мар I/O Viewer - + Просмотр I/O 0x0000 - + 0x0000 B - + B @@ -371,27 +361,27 @@ Game Boy Advance - зарегистрированная торговая мар Name - + Имя Location - + Расположение Platform - + Платформа Size - + Размер CRC32 - + CRC32 @@ -413,57 +403,57 @@ Game Boy Advance - зарегистрированная торговая мар No Save - + Нет сохранений 5 - + 5 6 - + 6 8 - + 8 4 - + 4 1 - + 1 3 - + 3 7 - + 7 9 - + 9 2 - + 2 Cancel - + Отмена @@ -471,37 +461,37 @@ Game Boy Advance - зарегистрированная торговая мар Logs - + Логи Enabled Levels - + Активные уровни Debug - + Откладка Stub - + Заглушка Info - + Информация Warning - + Внимание Error - + Ошибка @@ -511,22 +501,22 @@ Game Boy Advance - зарегистрированная торговая мар Game Error - + Ошибка игры Advanced settings - + Расширенные настройки Clear - + Очистить Max Lines - + Макс. строк @@ -534,7 +524,7 @@ Game Boy Advance - зарегистрированная торговая мар Maps - + Карты @@ -544,12 +534,12 @@ Game Boy Advance - зарегистрированная торговая мар Export - Экспортировать + Экспорт Copy - + Копировать @@ -557,17 +547,17 @@ Game Boy Advance - зарегистрированная торговая мар Save Memory Range - + Сохранить область памяти Start Address: - + Исходный адрес: Byte Count: - + Количество байт: @@ -580,43 +570,43 @@ Game Boy Advance - зарегистрированная торговая мар Memory Search - + Поиск в памяти Address - Адрес + Адрес Current Value - + Текущее значение Type - + Тип Value - + Значение Numeric - + Число Text - + Текст Width - + Длина @@ -627,102 +617,102 @@ Game Boy Advance - зарегистрированная торговая мар 1 Byte (8-bit) - + 1 байт (8 бит) 2 Bytes (16-bit) - + 2 байта (16 бит) 4 Bytes (32-bit) - + 4 байта (32 бита) Number type - + Тип числа Decimal - + 10-ный Hexadecimal - + 16-ный Search type - + Тип поиска Equal to value - + Равно значению Greater than value - + Больше значения Less than value - + Меньше значения Unknown/changed - + Неизвестно/изменилось Changed by value - + Изменилось на значение Unchanged - + Не изменилось Increased - + Увеличилось Decreased - + Уменьшилось Search ROM - + Поиск в ROM New Search - + Новый поиск Search Within - + Поиск в результатах Open in Memory Viewer - + Открыть в просмотре памяти Refresh - + Обновить @@ -730,77 +720,77 @@ Game Boy Advance - зарегистрированная торговая мар Memory - + Память Inspect Address: - + Просмотр адреса: Set Alignment: - + Выравнивание: &1 Byte - + &1 байт &2 Bytes - + &2 байта &4 Bytes - + &4 байта Unsigned Integer: - + Целое число без знака: Signed Integer: - + Целое число со знаком: String: - + Строка: Load TBL - + Загрузить TBL Copy Selection - + Скопировать выделение Paste - + Вставить Save Selection - + Сохранить выделение Save Range - + Сохранить область Load - Загрузить + Загрузить @@ -808,136 +798,136 @@ Game Boy Advance - зарегистрированная торговая мар Sprites - + Спрайты Copy - + Скопировать Geometry - + Геометрия Position - + Позиция , - + , Dimensions - + Размеры × - + × Tile - + Тайл Export - Экспортировать + Экспорт Matrix - + Матрица Attributes - + Атрибуты Transform - + Трансформация Off - + Выкл. Palette - + Палитра Double Size - + Двойной размер Return, Ctrl+R - + Возврат, Ctrl+R Flipped - + Поворот H Short for horizontal - + Г V Short for vertical - + В Mode - + Режим Normal - + Обычный Mosaic - + Мозаика Enabled - + Включено Priority - + Приоритет Address - Адрес + Адрес Magnification - Увеличить + Увеличить @@ -945,12 +935,12 @@ Game Boy Advance - зарегистрированная торговая мар Game Overrides - + Переопределения игры Game Boy Advance - + Game Boy Advance @@ -958,97 +948,97 @@ Game Boy Advance - зарегистрированная торговая мар Autodetect - + Автоопределение Realtime clock - + Реальное время Gyroscope - + Гироскоп Tilt - + Наклон Light sensor - + Датчик света Rumble - + Отдача Save type - + Тип сохранения None - + Нет SRAM - + SRAM Flash 512kb - + Flash 512kb Flash 1Mb - + Flash 1Mb EEPROM 8kB - + EEPROM 8kB EEPROM 512 bytes - + EEPROM 512 bytes SRAM 64kB (bootlegs only) - + SRAM 64kB (только для бутлегов) Idle loop - + Холостой цикл Game Boy Player features - + Поддержка Game Boy Player VBA bug compatibility mode - + Режим совместимости с багами VBA Game Boy - + Game Boy Game Boy model - + Модель Game Boy @@ -1058,22 +1048,22 @@ Game Boy Advance - зарегистрированная торговая мар Background Colors - + Цвета фона Sprite Colors 1 - + Цвета спрайта 1 Sprite Colors 2 - + Цвета спрайта 2 Palette preset - + Пресет палитры @@ -1081,62 +1071,62 @@ Game Boy Advance - зарегистрированная торговая мар Palette - + Палитра Background - + Фон Objects - + Объекты Selection - + Выделение Red - Красный + Красный Green - Зеленый + Зеленый Blue - Синий + Синий 16-bit value - + 16-битное значение Hex code - + Hex-код Palette index - + Индекс палитры Export BG - + Экспорт BG Export OBJ - + Экспорт OBJ @@ -1144,27 +1134,27 @@ Game Boy Advance - зарегистрированная торговая мар Adjust placement - + Настройка положения All - + Все Offset - + Смещение X - + X Y - + Y @@ -1172,12 +1162,12 @@ Game Boy Advance - зарегистрированная торговая мар Game Boy Printer - + Принтер Game Boy Hurry up! - + Поторопись! @@ -1187,12 +1177,12 @@ Game Boy Advance - зарегистрированная торговая мар Copy - + Копировать Magnification - Увеличить + Увеличение @@ -1200,7 +1190,7 @@ Game Boy Advance - зарегистрированная торговая мар 2021 - + 2021 @@ -1209,52 +1199,55 @@ Game Boy Advance - зарегистрированная торговая мар An update to %1 is available. Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + Доступно обновление %1. +Загрузить и установить его сейчас? После завершения загрузки потребуется перезапустить эмулятор. Current version: %1 New version: %2 Download size: %3 - + Текущая версия: %1 +Новая версия: %2 +Размер файла: %3 Downloading update... - + Загрузка обновления... Downloading failed. Please update manually. - + Загрузка не удалась. Пожалуйста, загрузите обновление вручную. Downloading done. Press OK to restart %1 and install the update. - + Загрузка завершена. Нажмите OK для перезапуска и установки обновления. QGBA::ApplicationUpdater - + Stable - + Стабильная - + Development - + В разработке - + Unknown - + Неизвестно - + (None) - + (Нет) @@ -1262,14 +1255,14 @@ Download size: %3 %0%1%2 - + %0%1%2 0x%0 (%1) - + 0x%0 (%1) @@ -1277,12 +1270,12 @@ Download size: %3 (untitled) - + (без имени) Failed to open cheats file: %1 - + Не удалось открыть файл с чит-кодами: %1 @@ -1291,41 +1284,41 @@ Download size: %3 Autodetect (recommended) - + Автоопределение (рекомендовано) Select cheats file - + Выберите файл с чит-кодами QGBA::CoreController - + 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 @@ -1333,17 +1326,17 @@ Download size: %3 Failed to open game file: %1 - + Не удалось открыть файл игры: %1 Could not load game. Are you sure it's in the correct format? - + Не удалось загрузить игру. Вы уверены, что она в правильном формате? Failed to open save file. Is the save directory writable? - + Не удалось открыть файл сохранения. Разрешена ли запись для папки сохранений? @@ -1351,52 +1344,52 @@ Download size: %3 Export frame - + Экспорт кадра Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) None - + Нет Background - + Фон Window - + Окно Objwin - + Objwin Sprite - + Спрайт Backdrop - + Подложка Frame - + Кадр %1 %2 - + %1 %2 @@ -1404,7 +1397,7 @@ Download size: %3 Enable Discord Rich Presence - + Вкл. расширенный статус в Discord @@ -1412,22 +1405,22 @@ Download size: %3 Clear Button - + Сброс кнопки Clear Analog - + Сброс аналога Refresh - + Обновить Set all - + Назначить все @@ -1435,42 +1428,42 @@ Download size: %3 Server settings - + Настройки сервера Local port - + Локальный порт Bind address - + Привязка адреса Break - Прервать + Прервать Stop - Остановить + Стоп Start - Начать + Запуск Crash - + Сбой Could not start GDB server - + Не удалось запустить GDB-сервер @@ -1478,17 +1471,17 @@ Download size: %3 Failed to open output file: %1 - + Не удалось открыть выходной файл: %1 Select output file - + Выбор выходного файла Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) - + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) @@ -1496,102 +1489,102 @@ Download size: %3 Background mode - + Режим фона Mode 0: 4 tile layers - + Режим 0: 4 тайловых слоя Mode 1: 2 tile layers + 1 rotated/scaled tile layer - + Режим 1: 2 тайловых слоя + 1 тайл. слой с вращением/масштабированием Mode 2: 2 rotated/scaled tile layers - + Режим 2: 2 тайловых слоя с вращением/масштабированием Mode 3: Full 15-bit bitmap - + Режим 3: Полная 15-битная битовая карта Mode 4: Full 8-bit bitmap - + Режим 4: Полная 8-битная битовая карта Mode 5: Small 15-bit bitmap - + Режим 5: Малая 15-битная битовая карта CGB Mode - + Режим CGB Frame select - + Выбор кадра Unlocked HBlank - + Разблокированный HBlank Linear OBJ tile mapping - + Линейная отрисовка OBJ тайлов Force blank screen - + Принудительная очистка экрана Enable background 0 - + Вкл. фон 0 Enable background 1 - + Вкл. фон 1 Enable background 2 - + Вкл. фон 2 Enable background 3 - + Вкл. фон 3 Enable OBJ - + Вкл. OBJ Enable Window 0 - + Вкл. Окно 0 Enable Window 1 - + Вкл. Окно 1 Enable OBJ Window - + Вкл. Окно OBJ @@ -1644,7 +1637,7 @@ Download size: %3 Priority - + Приоритет @@ -2093,7 +2086,7 @@ Download size: %3 Sound frequency - + Частота звука @@ -2117,7 +2110,7 @@ Download size: %3 Reset - + Сбросить @@ -2133,7 +2126,7 @@ Download size: %3 Enable channel 3 - + Включить канал 3 @@ -2145,28 +2138,28 @@ Download size: %3 0% - + 0% 100% - + 100% 50% - + 50% 25% - + 25% @@ -2174,7 +2167,7 @@ Download size: %3 75% - + 75% @@ -2192,13 +2185,13 @@ Download size: %3 15 - + 15 7 - + 7 @@ -2298,7 +2291,7 @@ Download size: %3 0 - + 0 @@ -2311,7 +2304,7 @@ Download size: %3 1 - + 1 @@ -2703,7 +2696,7 @@ Download size: %3 Value - + Значение @@ -2720,7 +2713,7 @@ Download size: %3 1/64 - + 1/64 @@ -2729,7 +2722,7 @@ Download size: %3 1/256 - + 1/256 @@ -2738,7 +2731,7 @@ Download size: %3 1/1024 - + 1/1024 @@ -2757,7 +2750,7 @@ Download size: %3 B - + B @@ -2815,82 +2808,82 @@ Download size: %3 SC - + SC SD - + SD SI - + SI SO - + SO VCounter - + VCounter Timer 0 - + Таймер 0 Timer 1 - + Таймер 1 Timer 2 - + Таймер 2 Timer 3 - + Таймер 3 SIO - + SIO DMA 0 - + DMA 0 DMA 1 - + DMA 1 DMA 2 - + DMA 2 DMA 3 - + DMA 3 @@ -2916,7 +2909,7 @@ Download size: %3 4 - + 4 @@ -2924,7 +2917,7 @@ Download size: %3 3 - + 3 @@ -2933,7 +2926,7 @@ Download size: %3 2 - + 2 @@ -2942,7 +2935,7 @@ Download size: %3 8 - + 8 @@ -2983,22 +2976,22 @@ Download size: %3 Disable - + Отключить 4.19MHz - + 4.19 МГц 8.38MHz - + 8.38 МГц 16.78MHz - + 16.78 МГц @@ -3063,7 +3056,7 @@ Download size: %3 1/16 - + 1/16 @@ -3174,7 +3167,7 @@ Download size: %3 Mode - + Режим @@ -3303,7 +3296,7 @@ Download size: %3 Unknown - + Неизвестно @@ -3321,28 +3314,28 @@ Download size: %3 Red - Красный + Красный Blue - Синий + Синий Sprite ordering - + Порядок спрайтов OAM order - + Порядок OAM x coordinate sorting - + Сортировка x координат @@ -3371,7 +3364,7 @@ Download size: %3 Menu - + Меню @@ -3379,12 +3372,12 @@ Download size: %3 Load State - + Загрузить состояние Save State - + Сохранить состояние @@ -3394,12 +3387,12 @@ Download size: %3 Corrupted - + Повреждено Slot %1 - + Слот %1 @@ -3408,7 +3401,7 @@ Download size: %3 Default - + По умолчанию @@ -3418,32 +3411,32 @@ Download size: %3 Error - + Ошибка Warning - + Внимание Info - + Информация Debug - + Откладка Stub - + Заглушка Game Error - + Ошибка игры @@ -3451,12 +3444,12 @@ Download size: %3 [%1] %2: %3 - + [%1] %2: %3 An error occurred - + Произошла ошибка @@ -3471,7 +3464,7 @@ Download size: %3 INFO - + ИНФОРМАЦИЯ @@ -3499,7 +3492,7 @@ Download size: %3 Priority - + Приоритет @@ -3516,13 +3509,13 @@ Download size: %3 Size - + Размер Offset - + Смещение @@ -3532,22 +3525,22 @@ Download size: %3 Map Addr. - + Адрес карты Mirror - + Зеркально None - + Нет Both - + Оба @@ -3564,17 +3557,17 @@ Download size: %3 N/A - + Н/Д Export map - + Экспорт карты Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) @@ -3582,12 +3575,12 @@ Download size: %3 Save memory region - + Сохранить область памяти Failed to open output file: %1 - + Не удалось открыть выходной файл: %1 @@ -3595,62 +3588,62 @@ Download size: %3 Copy selection - + Копировать выделение Save selection - + Сохранить выделение Paste - + Вставить Load - Загрузить + Загрузить All - + Все Load TBL - + Загрузить TBL Save selected memory - + Сохранение выделенной памяти Failed to open output file: %1 - + Не удалось открыть выходной файл: %1 Load memory - + Загрузка памяти Failed to open input file: %1 - + Не удалось загрузить входной файл: %1 TBL - + TBL ISO-8859-1 - + ISO-8859-1 @@ -3658,17 +3651,17 @@ Download size: %3 (%0/%1×) - + (%0/%1×) (⅟%0×) - + (⅟%0×) (%0×) - + (%0×) @@ -3687,7 +3680,7 @@ Download size: %3 Off - + Выкл. @@ -3704,12 +3697,12 @@ Download size: %3 Normal - + Обычный Trans - + Прозрач. @@ -3719,23 +3712,23 @@ Download size: %3 Invalid - + Неверно N/A - + Н/Д Export sprite - + Экспорт спрайта Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) @@ -3743,17 +3736,17 @@ Download size: %3 Official MBCs - + Официальные MBC Licensed MBCs - + Лицензионные MBC Unlicensed MBCs - + Нелицензионные MBC @@ -3774,22 +3767,22 @@ Download size: %3 0x%0 (%1) - + 0x%0 (%1) Export palette - + Экспорт палитры Windows PAL (*.pal);;Adobe Color Table (*.act) - + Windows PAL (*.pal);;Adobe Color Table (*.act) Failed to open output palette file: %1 - + Не удалось открыть файл палитры: %1 @@ -3801,18 +3794,18 @@ Download size: %3 (unknown) - + (неизвестно) bytes - + байт (no database present) - + (нет в базе данных) @@ -3820,12 +3813,12 @@ Download size: %3 Bug report archive - + Архив отчётов об ошибках ZIP archive (*.zip) - + ZIP архив (*.zip) @@ -3833,62 +3826,62 @@ Download size: %3 Save games and save states (%1) - + Игровые сохранения и сохранения состояний (%1) Select save game or save state - + Выбор игрового сохранения или сохранения состояния Save games (%1) - + Игровые сохранения (%1) Select save game - + Выбор игрового сохранения Conversion failed - + Ошибка конвертации Failed to convert the save game. This is probably a bug. - + Не удалось сконвертировать игровое сохранение. Возможно, это баг. No file selected - + Не выбран файл Could not open file - + Не удалось открыть файл No valid formats found - + Совместимые форматы не найдены Please select a valid input file - + Пожалуйста, выберите совместимый входной файл No valid conversions found - + Совместимые конверсии не найдены Cannot convert save games between platforms - + Нельзя сконвертировать сохранения для разных платформ @@ -3922,43 +3915,43 @@ Download size: %3 None - + Нет None (Still Image) - + Нет (статичное изображение) Keyboard - + Клавиатура Controllers - + Контроллеры Shortcuts - + Сочетания клавиш Shaders - + Шейдеры Select BIOS - + Выбор BIOS Select directory - + Выбор папки @@ -3968,34 +3961,34 @@ Download size: %3 Never - + Никогда Just now - + Только сейчас Less than an hour ago - + Менее часа назад %n hour(s) ago - - - - + + %n час назад + %n часа назад + %n часов назад %n day(s) ago - - - - + + %n день назад + %n дня назад + %n дней назад @@ -4004,32 +3997,32 @@ Download size: %3 No shader active - + Нет активных шейдеров Load shader - + Загрузка шейдера No shader loaded - + Нет загруженных шейдеров by %1 - + автор %1 Preprocessing - + Предобработка Pass %1 - + Проход %1 @@ -4037,17 +4030,17 @@ Download size: %3 Action - + Действие Keyboard - + Клавиатура Gamepad - + Геймпад @@ -4055,18 +4048,18 @@ Download size: %3 Export tiles - + Экспорт тайлов Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) Export tile - + Экспорт тайла @@ -4074,17 +4067,17 @@ Download size: %3 Failed to open output video file: %1 - + Не удалось открыть выходной видеофайл: %1 Native (%0x%1) - + Нативно (%0x%1) Select output file - + Выбор выходного файла @@ -4092,17 +4085,17 @@ Download size: %3 Game Boy Advance ROMs (%1) - + Игры Game Boy Advance (%1) Game Boy ROMs (%1) - + Игры Game Boy (%1) All ROMs (%1) - + Все игры (%1) @@ -4112,128 +4105,130 @@ Download size: %3 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 - + В игре произошёл сбой со следующей ошибкой: + +%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. - + Для применения некоторых изменений требуется перезапустить эмулятор. @@ -4258,7 +4253,7 @@ Download size: %3 &File - + &Файл @@ -4268,53 +4263,53 @@ Download size: %3 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 успешно сконвертировано. @@ -4520,7 +4515,7 @@ Download size: %3 %0x - + %0x @@ -4600,7 +4595,7 @@ Download size: %3 %1× - + %1× @@ -4840,7 +4835,7 @@ Download size: %3 Clear - + Очистить @@ -4911,50 +4906,25 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: - - - - - {CRC} - + CRC32: @@ -5036,7 +5006,7 @@ Download size: %3 SRAM - + SRAM @@ -5109,7 +5079,7 @@ Download size: %3 Realtime clock - + Реальное время @@ -5139,7 +5109,7 @@ Download size: %3 Light sensor - + Датчик света @@ -5166,7 +5136,7 @@ Download size: %3 Gyroscope - + Гироскоп @@ -5224,7 +5194,7 @@ Download size: %3 Game Boy - + Game Boy @@ -5240,37 +5210,37 @@ Download size: %3 1536 - + 1536 512 - + 512 768 - + 768 1024 - + 1024 2048 - + 2048 3072 - + 3072 4096 - + 4096 @@ -5286,22 +5256,22 @@ Download size: %3 44100 - + 44100 22050 - + 22050 32000 - + 32000 48000 - + 48000 @@ -5548,11 +5518,6 @@ Download size: %3 Language - - - English - - Library: @@ -5627,7 +5592,7 @@ Download size: %3 Enable Discord Rich Presence - + Вкл. расширенный статус в Discord @@ -5885,7 +5850,7 @@ Download size: %3 Shaders - + Шейдеры @@ -5895,7 +5860,7 @@ Download size: %3 Name - + Имя @@ -5928,17 +5893,17 @@ Download size: %3 Keyboard - + Клавиатура Gamepad - + Геймпад Clear - + Очистить @@ -6081,7 +6046,7 @@ Download size: %3 4K - + 4K @@ -6112,7 +6077,7 @@ Download size: %3 None - + Нет @@ -6177,7 +6142,7 @@ Download size: %3 Dimensions - + Размеры @@ -6187,7 +6152,7 @@ Download size: %3 Show advanced - + Расширенные настройки diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 0e12c7789..0c6898d9a 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -42,16 +42,6 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1236,22 +1226,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -1302,27 +1292,27 @@ Download size: %3 QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -4906,51 +4896,26 @@ Download size: %3 Game name: - - - {NAME} - - Internal name: - - - {TITLE} - - Game ID: - - - {ID} - - File size: - - - {SIZE} - - CRC32: - - - {CRC} - - ReportView @@ -5508,11 +5473,6 @@ Download size: %3 Language - - - English - - Library: diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index a40ee6343..8f2b83467 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -43,16 +43,6 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.An update is available - - - {text} - - - - - {details} - - ArchiveInspector @@ -1237,22 +1227,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Bilinmeyen - + (None) @@ -1303,27 +1293,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -4909,51 +4899,26 @@ Download size: %3 Game name: Oyun adı: - - - {NAME} - - Internal name: Dahili İsim: - - - {TITLE} - - Game ID: - - - {ID} - - File size: Dosya boyutu: - - - {SIZE} - - CRC32: - - - {CRC} - - ReportView @@ -5546,11 +5511,6 @@ Download size: %3 Language Dil - - - English - İngilizce - Library: diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index 467a6afa0..a7a4a0c4d 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -41,17 +41,7 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 An update is available - - - - - {text} - - - - - {details} - + 有可用的更新 @@ -173,7 +163,7 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 Add New Code - + 添加作弊码 @@ -183,12 +173,12 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 Add Lines - + 添加行 Code type - + 作弊码类型 @@ -1013,17 +1003,17 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 EEPROM 8kB - + EEPROM 8kB EEPROM 512 bytes - + EEPROM 512 字节 SRAM 64kB (bootlegs only) - + SRAM 64kB(盗版专用) @@ -1073,7 +1063,7 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 Palette preset - + 调色板预设 @@ -1209,52 +1199,55 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 An update to %1 is available. Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + %1 有更新可用。 +您想要现在下载并安装它吗?在下载完成后,您将需要重新启动模拟器。 Current version: %1 New version: %2 Download size: %3 - + 当前版本:%1 +新版本:%2 +更新大小:%3 Downloading update... - + 正在下载更新... Downloading failed. Please update manually. - + 下载失败。请手动更新。 Downloading done. Press OK to restart %1 and install the update. - + 下载完成。按确定按钮以重新启动 %1 并安装更新。 QGBA::ApplicationUpdater - + Stable - + 稳定版 - + Development - + 开发版 - + Unknown - + 未知 - + (None) - + (无) @@ -1291,7 +1284,7 @@ Download size: %3 Autodetect (recommended) - + 自动检测(推荐) @@ -1303,27 +1296,27 @@ Download size: %3 QGBA::CoreController - + 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 @@ -1746,7 +1739,7 @@ Download size: %3 Integer part (low) - 整数部分(低) + 整数部分(低) @@ -1754,7 +1747,7 @@ Download size: %3 Integer part (high) - 整数部分(高) + 整数部分(高) @@ -2464,7 +2457,7 @@ Download size: %3 Address (low) - 地址(低) + 地址(低) @@ -2476,21 +2469,21 @@ Download size: %3 Address (high) - 地址(高) + 地址(高) Sound frequency (low) - 声音频率(低) + 声音频率(低) Sound frequency (high) - 声音频率(高) + 声音频率(高) @@ -2516,13 +2509,13 @@ Download size: %3 Green (low) - 绿色(低) + 绿色(低) Green (high) - 绿色(高) + 绿色(高) @@ -3038,7 +3031,7 @@ Download size: %3 Active face buttons - + 活跃正面按钮 @@ -3048,7 +3041,7 @@ Download size: %3 32× clocking (CGB only) - 32×时钟(仅 CGB) + 32× 时钟(CGB 特有) @@ -3058,7 +3051,7 @@ Download size: %3 Divider - + 除数 @@ -3081,33 +3074,33 @@ Download size: %3 Serial - 串口 + 串口 Joypad - 游戏手柄 + 手柄 Volume right - 右音量 + 右侧音量 Output right - 输出右侧 + 右侧输出 Volume left - + 左侧音量 Output left - + 左侧输出 @@ -3117,59 +3110,59 @@ Download size: %3 Enable sprites - 启用精灵图 + 启用精灵 Double-height sprites - + 二倍高度精灵 Background tile map - 背景瓦片地图 + 背景图块集 0x9800 – 0x9BFF - + 0x9800 – 0x9BFF 0x9C00 – 0x9FFF - + 0x9C00 – 0x9FFF Background tile data - + 背景图块数据 0x8800 – 0x87FF - + 0x8800 – 0x87FF 0x8000 – 0x8FFF - + 0x8000 – 0x8FFF Enable window - + 启用窗口 Window tile map - + 窗口图块集 Enable LCD - + 启用 LCD @@ -3179,143 +3172,143 @@ Download size: %3 0: HBlank - + 0:HBlank 1: VBlank - + 1:VBlank 2: OAM scan - + 2:OAM 扫描 3: HDraw - + 3:HDraw In LYC - + 在 LYC 中 Enable HBlank (mode 0) IRQ - + 启用 HBlank(模式 0)IRQ Enable VBlank (mode 1) IRQ - + 启用 VBlank(模式 1)IRQ Enable OAM (mode 2) IRQ - + 启用 OAM(模式 2)IRQ Enable LYC IRQ - + 启用 LYC IRQ Current Y coordinate - + 当前 Y 坐标 Comparison Y coordinate - + 对比 Y 坐标 Start upper byte - + 开始上部字节 Color 0 shade - + 颜色 0 阴影 Color 1 shade - + 颜色 1 阴影 Color 2 shade - + 颜色 2 阴影 Color 3 shade - + 颜色 3 阴影 Prepare to switch speed - + 准备切换速度 Double speed - + 双倍速度 VRAM bank - + 显存库 Length - + 长度 Timing - + 定时 Write bit - + 写位 Read bit - + 读位 Unknown - + 未知 Current index - + 当前索引 Auto-increment - + 自动递增 @@ -3332,22 +3325,22 @@ Download size: %3 Sprite ordering - + 精灵排序 OAM order - + OAM 顺序 x coordinate sorting - + x 坐标排序 WRAM bank - + 内存库 @@ -3361,12 +3354,12 @@ Download size: %3 Super (L) - Super (L) + Super(L) Super (R) - Super (R) + Super(R) @@ -3833,62 +3826,62 @@ Download size: %3 Save games and save states (%1) - + 保存游戏和即时存档(%1) Select save game or save state - + 选择保存游戏或即时存档 Save games (%1) - + 保存游戏(%1) Select save game - + 选择保存游戏 Conversion failed - + 转换失败 Failed to convert the save game. This is probably a bug. - + 未能转换保存游戏。这可能是一个错误。 No file selected - + 未选择文件 Could not open file - + 无法打开文件 No valid formats found - + 未找到有效格式 Please select a valid input file - + 请选择一个有效的输入文件 No valid conversions found - + 未发现有效转换 Cannot convert save games between platforms - + 无法在平台之间转换保存游戏 @@ -3958,7 +3951,7 @@ Download size: %3 Select directory - + 选择目录 @@ -3968,30 +3961,30 @@ Download size: %3 Never - + 从不 Just now - + 刚刚 Less than an hour ago - + 不到一小时前 %n hour(s) ago - - + + %n 小时前 %n day(s) ago - - + + %n 天前 @@ -4251,7 +4244,7 @@ Download size: %3 %1 - %2 (%3 fps) - %4 - %1 - %2 (%3 fps) - %4 + %1 - %2(%3 fps)- %4 @@ -4276,53 +4269,53 @@ Download size: %3 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... - + 加载临时保存游戏... @@ -4347,7 +4340,7 @@ Download size: %3 Convert e-Reader card image to raw... - + 将 e-Reader 卡片图像转换为原始数据... @@ -4428,7 +4421,7 @@ Download size: %3 Convert save game... - + 转换保存游戏... @@ -4448,7 +4441,7 @@ Download size: %3 Connect to Dolphin... - + 连接到 Dolphin... @@ -4846,17 +4839,17 @@ Download size: %3 %1 byte - + %1字节 %1 kiB - + %1 kiB %1 MiB - + %1 兆字节 @@ -4909,51 +4902,26 @@ Download size: %3 Game name: 游戏名称: - - - {NAME} - {NAME} - Internal name: 内部名称: - - - {TITLE} - {TITLE} - Game ID: 游戏 ID: - - - {ID} - {ID} - File size: 文件大小: - - - {SIZE} - {SIZE} - CRC32: CRC32: - - - {CRC} - {CRC} - ReportView @@ -4998,12 +4966,12 @@ Download size: %3 Convert/Extract Save Game - + 转换或提取保存游戏 Input file - + 输入文件 @@ -5014,22 +4982,22 @@ Download size: %3 Output file - + 输出文件 %1 %2 save game - + %1 %2 保存游戏 little endian - + 小端 big endian - + 大端 @@ -5039,62 +5007,62 @@ Download size: %3 %1 flash - + %1 闪存 %1 EEPROM - + %1 EEPROM %1 SRAM + RTC - + %1 SRAM + RTC %1 SRAM - + %1 SRAM packed MBC2 - + 包装的MBC2 unpacked MBC2 - + 未包装的 MBC2 MBC6 flash - + MBC6 闪存 MBC6 combined SRAM + flash - + MBC6组合SRAM+闪存 MBC6 SRAM - + MBC6 SRAM TAMA5 - + TAMA5 %1 (%2) - + %1(%2) %1 save state with embedded %2 save game - + 带嵌入的 %2 保存游戏的 %1 保存状态 @@ -5192,7 +5160,7 @@ Download size: %3 Update - + 更新 @@ -5327,22 +5295,22 @@ Download size: %3 Audio in multiplayer: - + 多人游戏中的音频: All windows - + 所有窗口 Player 1 window only - + 仅 P1 窗口 Currently active player window - + 当前活跃的玩家窗口 @@ -5409,92 +5377,92 @@ 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: - + 来源: @@ -5511,11 +5479,6 @@ Download size: %3 Language 语言 - - - English - 英语 - Library: @@ -5655,58 +5618,58 @@ Download size: %3 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: - + 预设: @@ -5728,7 +5691,7 @@ Download size: %3 Enable VBA bug compatibility in ROM hacks - + 启用用于改版的 VBA 漏洞兼容模式 @@ -6170,7 +6133,7 @@ Download size: %3 CRF - + CRF diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c index 763952728..425ed5a69 100644 --- a/src/platform/sdl/sdl-events.c +++ b/src/platform/sdl/sdl-events.c @@ -37,6 +37,34 @@ static int32_t _mSDLReadTiltY(struct mRotationSource* rumble); static int32_t _mSDLReadGyroZ(struct mRotationSource* rumble); static void _mSDLRotationSample(struct mRotationSource* source); +static struct SDL_JoystickCombo* _mSDLOpenJoystick(struct mSDLEvents* events, int i) { + SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i); + if (!sdlJoystick) { + return NULL; + } + struct SDL_JoystickCombo* joystick = SDL_JoystickListAppend(&events->joysticks); + joystick->index = SDL_JoystickListSize(&events->joysticks) - 1; + joystick->joystick = sdlJoystick; +#if SDL_VERSION_ATLEAST(2, 0, 0) + joystick->id = SDL_JoystickInstanceID(joystick->joystick); + joystick->haptic = SDL_HapticOpenFromJoystick(joystick->joystick); + joystick->controller = SDL_GameControllerOpen(i); +#if SDL_VERSION_ATLEAST(2, 0, 14) + if (joystick->controller) { + if (SDL_GameControllerHasSensor(joystick->controller, SDL_SENSOR_GYRO) && !SDL_GameControllerIsSensorEnabled(joystick->controller, SDL_SENSOR_GYRO)) { + SDL_GameControllerSetSensorEnabled(joystick->controller, SDL_SENSOR_GYRO, SDL_TRUE); + } + if (SDL_GameControllerHasSensor(joystick->controller, SDL_SENSOR_ACCEL) && !SDL_GameControllerIsSensorEnabled(joystick->controller, SDL_SENSOR_ACCEL)) { + SDL_GameControllerSetSensorEnabled(joystick->controller, SDL_SENSOR_ACCEL, SDL_TRUE); + } + } +#endif +#else + joystick->id = SDL_JoystickIndex(joystick->joystick); +#endif + return joystick; +} + bool mSDLInitEvents(struct mSDLEvents* context) { #if SDL_VERSION_ATLEAST(2, 0, 4) SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "1"); @@ -50,6 +78,9 @@ bool mSDLInitEvents(struct mSDLEvents* context) { if (SDL_InitSubSystem(SDL_INIT_HAPTIC) < 0) { mLOG(SDL_EVENTS, ERROR, "SDL haptic initialization failed: %s", SDL_GetError()); } + if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER) < 0) { + mLOG(SDL_EVENTS, ERROR, "SDL game controller initialization failed: %s", SDL_GetError()); + } if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { mLOG(SDL_EVENTS, ERROR, "SDL video initialization failed: %s", SDL_GetError()); } @@ -64,19 +95,7 @@ bool mSDLInitEvents(struct mSDLEvents* context) { if (!SDL_JoystickListSize(&context->joysticks)) { int i; for (i = 0; i < nJoysticks; ++i) { - SDL_Joystick* sdlJoystick = SDL_JoystickOpen(i); - if (!sdlJoystick) { - continue; - } - struct SDL_JoystickCombo* joystick = SDL_JoystickListAppend(&context->joysticks); - joystick->joystick = sdlJoystick; - joystick->index = SDL_JoystickListSize(&context->joysticks) - 1; -#if SDL_VERSION_ATLEAST(2, 0, 0) - joystick->id = SDL_JoystickInstanceID(joystick->joystick); - joystick->haptic = SDL_HapticOpenFromJoystick(joystick->joystick); -#else - joystick->id = SDL_JoystickIndex(joystick->joystick); -#endif + _mSDLOpenJoystick(context, i); } } } @@ -101,6 +120,7 @@ void mSDLDeinitEvents(struct mSDLEvents* context) { for (i = 0; i < SDL_JoystickListSize(&context->joysticks); ++i) { struct SDL_JoystickCombo* joystick = SDL_JoystickListGetPointer(&context->joysticks, i); #if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_GameControllerClose(joystick->controller); SDL_HapticClose(joystick->haptic); #endif SDL_JoystickClose(joystick->joystick); @@ -347,10 +367,6 @@ void mSDLUpdateJoysticks(struct mSDLEvents* events, const struct Configuration* SDL_Event event; while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED) > 0) { if (event.type == SDL_JOYDEVICEADDED) { - SDL_Joystick* sdlJoystick = SDL_JoystickOpen(event.jdevice.which); - if (!sdlJoystick) { - continue; - } ssize_t joysticks[MAX_PLAYERS]; ssize_t i; // Pointers can get invalidated, so we'll need to refresh them @@ -358,38 +374,26 @@ void mSDLUpdateJoysticks(struct mSDLEvents* events, const struct Configuration* joysticks[i] = events->players[i]->joystick ? (ssize_t) SDL_JoystickListIndex(&events->joysticks, events->players[i]->joystick) : -1; events->players[i]->joystick = NULL; } - struct SDL_JoystickCombo* joystick = SDL_JoystickListAppend(&events->joysticks); - joystick->joystick = sdlJoystick; - joystick->id = SDL_JoystickInstanceID(joystick->joystick); - joystick->index = SDL_JoystickListSize(&events->joysticks) - 1; -#if SDL_VERSION_ATLEAST(2, 0, 0) - joystick->haptic = SDL_HapticOpenFromJoystick(joystick->joystick); -#endif + struct SDL_JoystickCombo* joystick = _mSDLOpenJoystick(events, event.jdevice.which); + for (i = 0; i < events->playersAttached && i < MAX_PLAYERS; ++i) { if (joysticks[i] != -1) { events->players[i]->joystick = SDL_JoystickListGetPointer(&events->joysticks, joysticks[i]); } } -#if SDL_VERSION_ATLEAST(2, 0, 0) char joystickName[34] = {0}; SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(joystick->joystick), joystickName, sizeof(joystickName)); -#else - const char* joystickName = SDL_JoystickName(SDL_JoystickIndex(joystick->joystick)); - if (joystickName) -#endif - { - for (i = 0; (int) i < events->playersAttached; ++i) { - if (events->players[i]->joystick) { - continue; - } - if (events->preferredJoysticks[i] && strcmp(events->preferredJoysticks[i], joystickName) == 0) { - events->players[i]->joystick = joystick; - if (config && events->players[i]->bindings) { - mInputProfileLoad(events->players[i]->bindings, SDL_BINDING_BUTTON, config, joystickName); - } - return; + for (i = 0; (int) i < events->playersAttached; ++i) { + if (events->players[i]->joystick) { + continue; + } + if (events->preferredJoysticks[i] && strcmp(events->preferredJoysticks[i], joystickName) == 0) { + events->players[i]->joystick = joystick; + if (config) { + mInputProfileLoad(events->players[i]->bindings, SDL_BINDING_BUTTON, config, joystickName); } + return; } } for (i = 0; (int) i < events->playersAttached; ++i) { @@ -397,11 +401,7 @@ void mSDLUpdateJoysticks(struct mSDLEvents* events, const struct Configuration* continue; } events->players[i]->joystick = joystick; - if (config && events->players[i]->bindings -#if !SDL_VERSION_ATLEAST(2, 0, 0) - && joystickName -#endif - ) { + if (config && joystickName[0]) { mInputProfileLoad(events->players[i]->bindings, SDL_BINDING_BUTTON, config, joystickName); } break; @@ -726,11 +726,17 @@ static int32_t _readTilt(struct mSDLPlayer* player, int axis) { static int32_t _mSDLReadTiltX(struct mRotationSource* source) { struct mSDLRotation* rotation = (struct mSDLRotation*) source; + if (rotation->axisX < 0) { + return rotation->accelX * -0x2000000; + } return _readTilt(rotation->p, rotation->axisX); } static int32_t _mSDLReadTiltY(struct mRotationSource* source) { struct mSDLRotation* rotation = (struct mSDLRotation*) source; + if (rotation->axisY < 0) { + return rotation->accelY * -0x2000000; + } return _readTilt(rotation->p, rotation->axisY); } @@ -747,6 +753,30 @@ static void _mSDLRotationSample(struct mRotationSource* source) { return; } +#if SDL_VERSION_ATLEAST(2, 0, 14) + if (rotation->p->joystick->controller) { + SDL_GameController* controller = rotation->p->joystick->controller; + if (SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL)) { + float accel[3]; + int count = SDL_GameControllerGetSensorData(controller, SDL_SENSOR_ACCEL, accel, 3); + if (count >= 0) { + rotation->accelX = accel[0]; + rotation->accelY = accel[2]; + rotation->axisX = -1; + rotation->axisY = -1; + } + } + if (SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO)) { + float theta[3]; + int count = SDL_GameControllerGetSensorData(controller, SDL_SENSOR_GYRO, theta, 3); + if (count >= 0) { + rotation->zDelta = theta[1] / -10.f; + } + return; + } + } +#endif + int x = SDL_JoystickGetAxis(rotation->p->joystick->joystick, rotation->gyroX); int y = SDL_JoystickGetAxis(rotation->p->joystick->joystick, rotation->gyroY); union { diff --git a/src/platform/sdl/sdl-events.h b/src/platform/sdl/sdl-events.h index 8cb1aede2..1763865e2 100644 --- a/src/platform/sdl/sdl-events.h +++ b/src/platform/sdl/sdl-events.h @@ -38,6 +38,7 @@ struct SDL_JoystickCombo { size_t index; SDL_Joystick* joystick; #if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_GameController* controller; SDL_Haptic* haptic; SDL_JoystickID id; #else @@ -88,6 +89,8 @@ struct mSDLPlayer { // Tilt int axisX; int axisY; + float accelX; + float accelY; // Gyro int gyroX; diff --git a/src/platform/wii/main.c b/src/platform/wii/main.c index 8149ce285..3e435f6e2 100644 --- a/src/platform/wii/main.c +++ b/src/platform/wii/main.c @@ -43,7 +43,7 @@ #define ANALOG_DEADZONE 0x30 -static void _mapKey(struct mInputMap* map, uint32_t binding, int nativeKey, enum GBAKey key) { +static void _mapKey(struct mInputMap* map, uint32_t binding, int nativeKey, int key) { mInputBindKey(map, binding, __builtin_ctz(nativeKey), key); } @@ -124,6 +124,7 @@ static bool sgbCrop = false; static int32_t tiltX; static int32_t tiltY; static int32_t gyroZ; +static float gyroSensitivity = 1.f; static uint32_t retraceCount; static uint32_t referenceRetraceCount; static bool frameLimiter = true; @@ -564,8 +565,26 @@ int main(int argc, char* argv[]) { }, .nStates = 8 }, + { + .title = "Gyroscope sensitivity", + .data = GUI_V_S("gyroSensitivity"), + .submenu = 0, + .state = 0, + .validStates = (const char*[]) { + "1x", "1x flipped", "2x", "2x flipped", "1/2x", "1/2x flipped" + }, + .stateMappings = (const struct GUIVariant[]) { + GUI_V_F(1.f), + GUI_V_F(-1.f), + GUI_V_F(2.f), + GUI_V_F(-2.f), + GUI_V_F(0.5f), + GUI_V_F(-0.5f), + }, + .nStates = 6 + }, }, - .nConfigExtra = 5, + .nConfigExtra = 6, .setup = _setup, .teardown = 0, .gameLoaded = _gameLoaded, @@ -976,6 +995,7 @@ void _unpaused(struct mGUIRunner* runner) { if (mCoreConfigGetFloatValue(&runner->config, "stretchHeight", &stretch)) { hStretch = fminf(1.0f, fmaxf(0.5f, stretch)); } + mCoreConfigGetFloatValue(&runner->config, "gyroSensitivity", &gyroSensitivity); } void _prepareForFrame(struct mGUIRunner* runner) { @@ -1220,7 +1240,7 @@ int32_t _readTiltY(struct mRotationSource* source) { int32_t _readGyroZ(struct mRotationSource* source) { UNUSED(source); - return gyroZ; + return gyroZ * gyroSensitivity; } static s8 WPAD_StickX(u8 chan, u8 right) {