Merge branch 'master' (early part) into medusa
jump to
@@ -24,14 +24,30 @@ - ARM: Fix ALU reading PC after shifting
- ARM: Fix STR storing PC after address calculation - GBA DMA: Linger last DMA on bus (fixes mgba.io/i/301 and mgba.io/i/1320) - GBA Memory: Misaligned SRAM writes are ignored + - GBA Memory: Improve gamepak prefetch timing - GBA Serialize: Fix serializing DMA transfer register - GBA Serialize: Fix audio serialization for desynced FIFOs - GBA Serialize: Fix audio DMA timing deserialization - GBA Video: Fix OAM not invalidating after reset (fixes mgba.io/i/1630) + - GBA Video: Latch scanline at end of Hblank (fixes mgba.io/i/1319) + - GBA Video: Fix Hblank timing + - GBA Video: Fix backdrop blending on lines without sprites (fixes mgba.io/i/1647) + - GBA Video: Fix OpenGL sprite flag priority Other fixes: + - Core: Fix race condition initializing thread proxy - Qt: Only dynamically reset video scale if a game is running - Qt: Fix race condition with proxied video events - Qt: Force OpenGL paint engine creation thread (fixes mgba.io/i/1642) + - Qt: Fix color selection in asset view (fixes mgba.io/i/1648) + - Qt: Fix missing OSD messages + - Qt: Fix crash unloading shaders + - Qt: Fix toggled actions on gamepads (fixes mgba.io/i/1650) + - Qt: Fix extraneous dialog (fixes mgba.io/i/1654) + - Util: Fix crash reading invalid ELFs +Misc: + - Qt: Renderer can be changed while a game is running + - Qt: Fix non-SDL build (fixes mgba.io/i/1656) + - Switch: Make OpenGL scale adjustable while running 0.8.0: (2020-01-21) Features:
@@ -91,7 +91,6 @@ struct GBALuminanceSource* luminanceSource;
struct mRTCSource* rtcSource; struct mRumble* rumble; - struct GBARRContext* rr; bool isPristine; size_t pristineRomSize; size_t yankedRomSize;
@@ -44,7 +44,6 @@
struct GBAVideoGLBackground { GLuint fbo; GLuint tex; - GLuint flags; unsigned index; int enabled;@@ -96,7 +95,6 @@ GBA_GL_BG_SCREENBASE,
GBA_GL_BG_CHARBASE, GBA_GL_BG_SIZE, GBA_GL_BG_OFFSET, - GBA_GL_BG_INFLAGS, GBA_GL_BG_TRANSFORM, GBA_GL_BG_RANGE, GBA_GL_BG_MOSAIC,
@@ -1,87 +0,0 @@
-/* Copyright (c) 2013-2015 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef RR_MGM_H -#define RR_MGM_H - -#include <mgba-util/common.h> - -CXX_GUARD_START - -#include <mgba/internal/gba/rr/rr.h> - -struct GBA; -struct VDir; -struct VFile; - -enum GBAMGMTag { - // Playback tags - TAG_INVALID = 0x00, - TAG_INPUT = 0x01, - TAG_FRAME = 0x02, - TAG_LAG = 0x03, - TAG_RESET = 0x04, - - // Stream chunking tags - TAG_BEGIN = 0x10, - TAG_END = 0x11, - TAG_PREVIOUSLY = 0x12, - TAG_NEXT_TIME = 0x13, - TAG_MAX_STREAM = 0x14, - - // Recording information tags - TAG_FRAME_COUNT = 0x20, - TAG_LAG_COUNT = 0x21, - TAG_RR_COUNT = 0x22, - TAG_INIT = 0x24, - TAG_INIT_EX_NIHILO = 0x24 | INIT_EX_NIHILO, - TAG_INIT_FROM_SAVEGAME = 0x24 | INIT_FROM_SAVEGAME, - TAG_INIT_FROM_SAVESTATE = 0x24 | INIT_FROM_SAVESTATE, - TAG_INIT_FROM_BOTH = 0x24 | INIT_FROM_BOTH, - - // User metadata tags - TAG_AUTHOR = 0x30, - TAG_COMMENT = 0x31, - - TAG_EOF = INT_MAX -}; - -struct GBAMGMContext { - struct GBARRContext d; - - // Playback state - bool isPlaying; - bool autorecord; - - // Recording state - bool isRecording; - bool inputThisFrame; - - // Metadata - uint32_t streamId; - - uint32_t maxStreamId; - off_t maxStreamIdOffset; - off_t initFromOffset; - off_t rrCountOffset; - - // Streaming state - struct VDir* streamDir; - struct VFile* metadataFile; - struct VFile* movieStream; - uint16_t currentInput; - enum GBAMGMTag peekedTag; - uint32_t nextTime; - uint32_t previously; -}; - -void GBAMGMContextCreate(struct GBAMGMContext*); - -bool GBAMGMSetStream(struct GBAMGMContext* mgm, struct VDir* stream); -bool GBAMGMCreateStream(struct GBAMGMContext* mgm, enum GBARRInitFrom initFrom); - -CXX_GUARD_END - -#endif
@@ -1,65 +0,0 @@
-/* Copyright (c) 2013-2015 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef GBA_RR_H -#define GBA_RR_H - -#include <mgba-util/common.h> - -CXX_GUARD_START - -#include <mgba/core/log.h> -#include <mgba/internal/gba/serialize.h> - -struct VFile; - -mLOG_DECLARE_CATEGORY(GBA_RR); - -enum GBARRInitFrom { - INIT_EX_NIHILO = 0, - INIT_FROM_SAVEGAME = 1, - INIT_FROM_SAVESTATE = 2, - INIT_FROM_BOTH = 3, -}; - -struct GBARRContext { - void (*destroy)(struct GBARRContext*); - - bool (*startPlaying)(struct GBARRContext*, bool autorecord); - void (*stopPlaying)(struct GBARRContext*); - bool (*startRecording)(struct GBARRContext*); - void (*stopRecording)(struct GBARRContext*); - - bool (*isPlaying)(const struct GBARRContext*); - bool (*isRecording)(const struct GBARRContext*); - - void (*nextFrame)(struct GBARRContext*); - void (*logInput)(struct GBARRContext*, uint16_t input); - uint16_t (*queryInput)(struct GBARRContext*); - bool (*queryReset)(struct GBARRContext*); - - void (*stateSaved)(struct GBARRContext*, struct GBASerializedState*); - void (*stateLoaded)(struct GBARRContext*, const struct GBASerializedState*); - - struct VFile* (*openSavedata)(struct GBARRContext* mgm, int flags); - struct VFile* (*openSavestate)(struct GBARRContext* mgm, int flags); - - uint32_t frames; - uint32_t lagFrames; - enum GBARRInitFrom initFrom; - - uint32_t rrCount; - - struct VFile* savedata; -}; - -void GBARRDestroy(struct GBARRContext*); - -void GBARRInitRecord(struct GBA*); -void GBARRInitPlay(struct GBA*); - -CXX_GUARD_END - -#endif
@@ -1,30 +0,0 @@
-/* Copyright (c) 2013-2015 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#ifndef GBA_VBM_H -#define GBA_VBM_H - -#include <mgba-util/common.h> - -CXX_GUARD_START - -#include <mgba/internal/gba/rr/rr.h> - -struct GBAVBMContext { - struct GBARRContext d; - - bool isPlaying; - - struct VFile* vbmFile; - int32_t inputOffset; -}; - -void GBAVBMContextCreate(struct GBAVBMContext*); - -bool GBAVBMSetStream(struct GBAVBMContext*, struct VFile*); - -CXX_GUARD_END - -#endif
@@ -92,7 +92,8 @@ * | bit 5: Has channel 1 sweep occurred?
* | bits 6 - 7: Reserved * 0x001E0 - 0x001FF: Video miscellaneous state * | 0x001E0 - 0x001E3: Next event - * | 0x001E4 - 0x001FB: Reserved + * | 0x001E4 - 0x001F7: Reserved + * | 0x001F8 - 0x001FB: Miscellaneous flags * | 0x001FC - 0x001FF: Frame counter * 0x00200 - 0x00213: Timer 0 * | 0x00200 - 0x00201: Reload value@@ -192,8 +193,7 @@ * 0x002F4 - 0x002FF: Prefetch
* | 0x002F4 - 0x002F7: GBA BIOS bus prefetch * | 0x002F8 - 0x002FB: CPU prefecth (decode slot) * | 0x002FC - 0x002FF: CPU prefetch (fetch slot) - * 0x00300 - 0x00303: Associated movie stream ID for record/replay (or 0 if no stream) - * 0x00304 - 0x00317: Savestate creation time (usec since 1970) + * 0x00300 - 0x00317: Reserved (leave zero) * 0x00318 - 0x0031B: Last prefetched program counter * 0x0031C - 0x0031F: Miscellaneous flags * | bit 0: Is CPU halted?@@ -210,6 +210,9 @@ * 0x21000 - 0x60FFF: WRAM
* Total size: 0x61000 (397,312) bytes */ +DECL_BITFIELD(GBASerializedVideoFlags, uint32_t); +DECL_BITS(GBASerializedVideoFlags, Mode, 0, 2); + DECL_BITFIELD(GBASerializedHWFlags1, uint16_t); DECL_BIT(GBASerializedHWFlags1, ReadWrite, 0); DECL_BIT(GBASerializedHWFlags1, GyroEdge, 1);@@ -267,7 +270,8 @@ } audio;
struct { int32_t nextEvent; - int32_t reserved[6]; + int32_t reserved[5]; + GBASerializedVideoFlags flags; int32_t frameCounter; } video;@@ -322,8 +326,7 @@
uint32_t biosPrefetch; uint32_t cpuPrefetch[2]; - uint32_t associatedStreamId; - uint32_t reservedRr[5]; + uint32_t reservedCpu[6]; uint32_t lastPrefetchedPc; GBASerializedMiscFlags miscFlags;
@@ -18,8 +18,9 @@ mLOG_DECLARE_CATEGORY(GBA_VIDEO);
enum { VIDEO_HBLANK_PIXELS = 68, - VIDEO_HDRAW_LENGTH = 1006, - VIDEO_HBLANK_LENGTH = 226, + VIDEO_HDRAW_LENGTH = 960, + VIDEO_HBLANK_LENGTH = 272, + VIDEO_HBLANK_FLIP = 46, VIDEO_HORIZONTAL_LENGTH = 1232, VIDEO_VBLANK_PIXELS = 68,
@@ -489,16 +489,16 @@ }
} } - if (softwareRenderer->bg[0].enabled > 0 && softwareRenderer->bg[0].enabled < 4) { + if (softwareRenderer->bg[0].enabled > 0 && softwareRenderer->bg[0].enabled < 3) { ++softwareRenderer->bg[0].enabled; } - if (softwareRenderer->bg[1].enabled > 0 && softwareRenderer->bg[1].enabled < 4) { + if (softwareRenderer->bg[1].enabled > 0 && softwareRenderer->bg[1].enabled < 3) { ++softwareRenderer->bg[1].enabled; } - if (softwareRenderer->bg[2].enabled > 0 && softwareRenderer->bg[2].enabled < 4) { + if (softwareRenderer->bg[2].enabled > 0 && softwareRenderer->bg[2].enabled < 3) { ++softwareRenderer->bg[2].enabled; } - if (softwareRenderer->bg[3].enabled > 0 && softwareRenderer->bg[3].enabled < 4) { + if (softwareRenderer->bg[3].enabled > 0 && softwareRenderer->bg[3].enabled < 3) { ++softwareRenderer->bg[3].enabled; }
@@ -137,8 +137,10 @@ static void _postEvent(struct mVideoLogger* logger, enum mVideoLoggerEvent event) {
struct mVideoThreadProxy* proxyRenderer = (struct mVideoThreadProxy*) logger; MutexLock(&proxyRenderer->mutex); proxyRenderer->event = event; - ConditionWake(&proxyRenderer->toThreadCond); - ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex); + while (proxyRenderer->event) { + ConditionWake(&proxyRenderer->toThreadCond); + ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex); + } MutexUnlock(&proxyRenderer->mutex); }@@ -179,6 +181,7 @@ struct mVideoThreadProxy* proxyRenderer = logger;
ThreadSetName("Proxy Renderer Thread"); MutexLock(&proxyRenderer->mutex); + ConditionWake(&proxyRenderer->fromThreadCond); while (proxyRenderer->threadState != PROXY_THREAD_STOPPED) { ConditionWait(&proxyRenderer->toThreadCond, &proxyRenderer->mutex); if (proxyRenderer->threadState == PROXY_THREAD_STOPPED) {
@@ -39,10 +39,7 @@
set(EXTRA_FILES extra/audio-mixer.c extra/battlechip.c - extra/proxy.c - rr/mgm.c - rr/rr.c - rr/vbm.c) + extra/proxy.c) set(DEBUGGER_FILES debugger/cli.c)
@@ -355,8 +355,9 @@ gba->allowOpposingDirections = fakeBool;
} return; } + + struct GBACore* gbacore = (struct GBACore*) core; #if defined(BUILD_GLES2) || defined(BUILD_GLES3) - struct GBACore* gbacore = (struct GBACore*) core; if (strcmp("videoScale", option) == 0) { if (config != &core->config) { mCoreConfigCopyValue(&core->config, config, "videoScale");@@ -369,6 +370,31 @@ }
return; } #endif + if (strcmp("hwaccelVideo", option) == 0) { + struct GBAVideoRenderer* renderer = NULL; + if (gbacore->renderer.outputBuffer) { + renderer = &gbacore->renderer.d; + } + int fakeBool; +#if defined(BUILD_GLES2) || defined(BUILD_GLES3) + if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) { + mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale); + renderer = &gbacore->glRenderer.d; + } else { + gbacore->glRenderer.scale = 1; + } +#endif +#ifndef MINIMAL_CORE + if (renderer && core->videoLogger) { + gbacore->proxyRenderer.logger = core->videoLogger; + GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer); + renderer = &gbacore->proxyRenderer.d; + } +#endif + if (renderer) { + GBAVideoAssociateRenderer(&gba->video, renderer); + } + } } static void _GBACoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {@@ -540,8 +566,10 @@ }
int fakeBool; #if defined(BUILD_GLES2) || defined(BUILD_GLES3) if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) { - renderer = &gbacore->glRenderer.d; mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale); + renderer = &gbacore->glRenderer.d; + } else { + gbacore->glRenderer.scale = 1; } #endif #ifndef DISABLE_THREADING
@@ -157,8 +157,8 @@
if (!proxyRenderer->logger->block) { proxyRenderer->backend->deinit(proxyRenderer->backend); } else { - proxyRenderer->logger->postEvent(proxyRenderer->logger, LOGGER_EVENT_DEINIT); mVideoLoggerRendererFlush(proxyRenderer->logger); + proxyRenderer->logger->postEvent(proxyRenderer->logger, LOGGER_EVENT_DEINIT); } mVideoLoggerRendererDeinit(proxyRenderer->logger);
@@ -13,7 +13,6 @@ #include <mgba/internal/gba/bios.h>
#include <mgba/internal/gba/cheats.h> #include <mgba/internal/gba/io.h> #include <mgba/internal/gba/overrides.h> -#include <mgba/internal/gba/rr/rr.h> #include <mgba-util/patch.h> #include <mgba-util/crc32.h>@@ -96,7 +95,6 @@ gba->rotationSource = 0;
gba->luminanceSource = 0; gba->rtcSource = 0; gba->rumble = 0; - gba->rr = 0; gba->romVf = 0; gba->biosVf = 0;@@ -170,7 +168,6 @@ GBAMemoryDeinit(gba);
GBAVideoDeinit(&gba->video); GBAAudioDeinit(&gba->audio); GBASIODeinit(&gba->sio); - gba->rr = 0; mTimingDeinit(&gba->timing); mCoreCallbacksListDeinit(&gba->coreCallbacks); }@@ -196,10 +193,8 @@ ARMSetPrivilegeMode(cpu, MODE_SYSTEM);
cpu->gprs[ARM_SP] = SP_BASE_SYSTEM; struct GBA* gba = (struct GBA*) cpu->master; - if (!gba->rr || (!gba->rr->isPlaying(gba->rr) && !gba->rr->isRecording(gba->rr))) { - gba->memory.savedata.maskWriteback = false; - GBASavedataUnmask(&gba->memory.savedata); - } + gba->memory.savedata.maskWriteback = false; + GBASavedataUnmask(&gba->memory.savedata); gba->cpuBlocked = false; gba->earlyExit = false;@@ -811,10 +806,6 @@ }
void GBAFrameEnded(struct GBA* gba) { GBASavedataClean(&gba->memory.savedata, gba->video.frameCounter); - - if (gba->rr) { - gba->rr->nextFrame(gba->rr); - } if (gba->cpu->components && gba->cpu->components[CPU_COMPONENT_CHEAT_DEVICE]) { struct mCheatDevice* device = (struct mCheatDevice*) gba->cpu->components[CPU_COMPONENT_CHEAT_DEVICE];
@@ -8,7 +8,6 @@
#include <mgba/internal/arm/macros.h> #include <mgba/internal/gba/dma.h> #include <mgba/internal/gba/gba.h> -#include <mgba/internal/gba/rr/rr.h> #include <mgba/internal/gba/serialize.h> mLOG_DEFINE_CATEGORY(GBA_IO, "GBA I/O", "gba.io");@@ -734,31 +733,24 @@ callbacks->keysRead(callbacks->context);
} } } - if (gba->rr && gba->rr->isPlaying(gba->rr)) { - return 0x3FF ^ gba->rr->queryInput(gba->rr); - } else { - uint16_t input = 0; - if (gba->keyCallback) { - input = gba->keyCallback->readKeys(gba->keyCallback); - if (gba->keySource) { - *gba->keySource = input; + uint16_t input = 0; + if (gba->keyCallback) { + input = gba->keyCallback->readKeys(gba->keyCallback); + if (gba->keySource) { + *gba->keySource = input; + } + } 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; } - } 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; } - } - if (gba->rr && gba->rr->isRecording(gba->rr)) { - gba->rr->logInput(gba->rr, input); } return 0x3FF ^ input; }
@@ -1626,17 +1626,19 @@ previousLoads = dist >> 1;
maxLoads -= previousLoads; } - int32_t s = cpu->memory.activeSeqCycles16 + 1; + int32_t s = cpu->memory.activeSeqCycles16; int32_t n2s = cpu->memory.activeNonseqCycles16 - cpu->memory.activeSeqCycles16 + 1; // Figure out how many sequential loads we can jam in - int32_t stall = s; + int32_t stall = s + 1; int32_t loads = 1; while (stall < wait && loads < maxLoads) { stall += s; ++loads; } + memory->lastPrefetchedPc = cpu->gprs[ARM_PC] + WORD_SIZE_THUMB * (loads + previousLoads - 1); + if (stall > wait) { // The wait cannot take less time than the prefetch stalls wait = stall;@@ -1645,10 +1647,9 @@
// This instruction used to have an N, convert it to an S. wait -= n2s; - memory->lastPrefetchedPc = cpu->gprs[ARM_PC] + WORD_SIZE_THUMB * (loads + previousLoads - 1); + // The next |loads|S waitstates disappear entirely, so long as they're all in a row + wait -= stall - 1; - // The next |loads|S waitstates disappear entirely, so long as they're all in a row - cpu->cycles -= (s - 1) * loads; return wait; }
@@ -117,7 +117,6 @@ { "screenBase", GBA_GL_BG_SCREENBASE, },
{ "charBase", GBA_GL_BG_CHARBASE, }, { "size", GBA_GL_BG_SIZE, }, { "offset", GBA_GL_BG_OFFSET, }, - { "inflags", GBA_GL_BG_INFLAGS, }, { "mosaic", GBA_GL_BG_MOSAIC, }, { 0 } };@@ -130,10 +129,8 @@ "uniform int screenBase;\n"
"uniform int charBase;\n" "uniform int size;\n" "uniform int offset[160];\n" - "uniform ivec4 inflags;\n" "uniform ivec2 mosaic;\n" "OUT(0) out vec4 color;\n" - "OUT(1) out ivec4 flags;\n" "vec4 renderTile(int tile, int paletteId, ivec2 localCoord);\n"@@ -171,7 +168,6 @@ " coord.y ^= 7;\n"
" }\n" " int tile = int(map.a * 15.9) + int(map.b * 15.9) * 16 + (tileFlags & 0x3) * 256;\n" " color = renderTile(tile, int(map.r * 15.9), coord & 7);\n" - " flags = inflags;\n" "}"; static const char* const _fetchTileOverflow =@@ -199,7 +195,6 @@ { "palette", GBA_GL_BG_PALETTE, },
{ "screenBase", GBA_GL_BG_SCREENBASE, }, { "charBase", GBA_GL_BG_CHARBASE, }, { "size", GBA_GL_BG_SIZE, }, - { "inflags", GBA_GL_BG_INFLAGS, }, { "offset", GBA_GL_BG_OFFSET, }, { "transform", GBA_GL_BG_TRANSFORM, }, { "range", GBA_GL_BG_RANGE, },@@ -235,12 +230,10 @@ "uniform int palette[256];\n"
"uniform int screenBase;\n" "uniform int charBase;\n" "uniform int size;\n" - "uniform ivec4 inflags;\n" "uniform ivec4 transform[160];\n" "uniform ivec2 range;\n" "uniform ivec2 mosaic;\n" "OUT(0) out vec4 color;\n" - "OUT(1) out ivec4 flags;\n" "vec4 fetchTile(ivec2 coord);\n" "vec2 interpolate(ivec2 arr[4], float x);\n"@@ -284,7 +277,6 @@ " float lin = start + y * 0.25;\n"
" vec2 mixedTransform = interpolate(mat, lin);\n" " vec2 mixedOffset = interpolate(offset, lin);\n" " color = fetchTile(ivec2(mixedTransform * incoord.x + mixedOffset));\n" - " flags = inflags;\n" "}"; static const struct GBAVideoGLUniform _uniformsMode35[] = {@@ -293,7 +285,6 @@ { "maxPos", GBA_GL_VS_MAXPOS, },
{ "vram", GBA_GL_BG_VRAM, }, { "charBase", GBA_GL_BG_CHARBASE, }, { "size", GBA_GL_BG_SIZE, }, - { "inflags", GBA_GL_BG_INFLAGS, }, { "offset", GBA_GL_BG_OFFSET, }, { "transform", GBA_GL_BG_TRANSFORM, }, { "range", GBA_GL_BG_RANGE, },@@ -306,12 +297,10 @@ "in vec2 texCoord;\n"
"uniform sampler2D vram;\n" "uniform int charBase;\n" "uniform ivec2 size;\n" - "uniform ivec4 inflags;\n" "uniform ivec4 transform[160];\n" "uniform ivec2 range;\n" "uniform ivec2 mosaic;\n" "OUT(0) out vec4 color;\n" - "OUT(1) out ivec4 flags;\n" "vec2 interpolate(ivec2 arr[4], float x);\n" "void loadAffine(int y, out ivec2 mat[4], out ivec2 aff[4]);\n"@@ -347,7 +336,6 @@ " int address = charBase + (coord.x >> 8) + (coord.y >> 8) * size.x;\n"
" ivec4 entry = ivec4(texelFetch(vram, ivec2(address & 255, address >> 8), 0) * 15.9);\n" " int sixteen = (entry.x << 12) | (entry.y << 8) | (entry.z << 4) | entry.w;\n" " color = vec4(float(sixteen & 0x1F) / 31., float((sixteen >> 5) & 0x1F) / 31., float((sixteen >> 10) & 0x1F) / 31., 1.);\n" - " flags = inflags;\n" "}"; static const struct GBAVideoGLUniform _uniformsMode4[] = {@@ -357,7 +345,6 @@ { "vram", GBA_GL_BG_VRAM, },
{ "palette", GBA_GL_BG_PALETTE, }, { "charBase", GBA_GL_BG_CHARBASE, }, { "size", GBA_GL_BG_SIZE, }, - { "inflags", GBA_GL_BG_INFLAGS, }, { "offset", GBA_GL_BG_OFFSET, }, { "transform", GBA_GL_BG_TRANSFORM, }, { "range", GBA_GL_BG_RANGE, },@@ -371,12 +358,10 @@ "uniform sampler2D vram;\n"
"uniform int palette[256];\n" "uniform int charBase;\n" "uniform ivec2 size;\n" - "uniform ivec4 inflags;\n" "uniform ivec4 transform[160];\n" "uniform ivec2 range;\n" "uniform ivec2 mosaic;\n" "OUT(0) out vec4 color;\n" - "OUT(1) out ivec4 flags;\n" "vec2 interpolate(ivec2 arr[4], float x);\n" "void loadAffine(int y, out ivec2 mat[4], out ivec2 aff[4]);\n"@@ -413,7 +398,6 @@ " vec4 twoEntries = texelFetch(vram, ivec2((address >> 1) & 255, address >> 9), 0);\n"
" ivec2 entry = ivec2(twoEntries[3 - 2 * (address & 1)] * 15.9, twoEntries[2 - 2 * (address & 1)] * 15.9);\n" " int paletteEntry = palette[entry.y * 16 + entry.x];\n" " color = vec4(PALETTE_ENTRY(paletteEntry), 1.);\n" - " flags = inflags;\n" "}"; static const struct GBAVideoGLUniform _uniformsObj[] = {@@ -567,7 +551,7 @@ { "loc", GBA_GL_VS_LOC, },
{ "maxPos", GBA_GL_VS_MAXPOS, }, { "scale", GBA_GL_FINALIZE_SCALE, }, { "layers", GBA_GL_FINALIZE_LAYERS, }, - { "flags", GBA_GL_FINALIZE_FLAGS, }, + { "objFlags", GBA_GL_FINALIZE_FLAGS, }, { "window", GBA_GL_FINALIZE_WINDOW, }, { "backdrop", GBA_GL_FINALIZE_BACKDROP, }, { "backdropFlags", GBA_GL_FINALIZE_BACKDROPFLAGS, },@@ -578,7 +562,7 @@ static const char* const _finalize =
"in vec2 texCoord;\n" "uniform int scale;\n" "uniform sampler2D layers[5];\n" - "uniform isampler2D flags[5];\n" + "uniform isampler2D objFlags;\n" "uniform isampler2D window;\n" "uniform sampler2D backdrop;\n" "uniform isampler2D backdropFlags;\n"@@ -610,35 +594,35 @@ " int layerWindow = windowFlags.x;\n"
" if ((layerWindow & 16) != 0) {\n" " vec4 pix = texelFetch(layers[4], coord, 0);\n" " if (pix.a != 0.) {\n" - " ivec4 inflags = ivec4(texelFetch(flags[4], coord, 0));\n" + " ivec4 inflags = ivec4(texelFetch(objFlags, coord, 0));\n" " composite(pix, inflags, topPixel, topFlags, bottomPixel, bottomFlags);\n" " }\n" " }\n" " if ((layerWindow & 1) != 0) {\n" " vec4 pix = texelFetch(layers[0], coord, 0);\n" " if (pix.a != 0.) {\n" - " ivec4 inflags = ivec4(texelFetch(flags[0], coord, 0).xyz, 0);\n" + " ivec4 inflags = ivec4(texelFetch(backdropFlags, ivec2(1, texCoord.y), 0));\n" " composite(pix, inflags, topPixel, topFlags, bottomPixel, bottomFlags);\n" " }\n" " }\n" " if ((layerWindow & 2) != 0) {\n" " vec4 pix = texelFetch(layers[1], coord, 0);\n" " if (pix.a != 0.) {\n" - " ivec4 inflags = ivec4(texelFetch(flags[1], coord, 0).xyz, 0);\n" + " ivec4 inflags = ivec4(texelFetch(backdropFlags, ivec2(2, texCoord.y), 0));\n" " composite(pix, inflags, topPixel, topFlags, bottomPixel, bottomFlags);\n" " }\n" " }\n" " if ((layerWindow & 4) != 0) {\n" " vec4 pix = texelFetch(layers[2], coord, 0);\n" " if (pix.a != 0.) {\n" - " ivec4 inflags = ivec4(texelFetch(flags[2], coord, 0).xyz, 0);\n" + " ivec4 inflags = ivec4(texelFetch(backdropFlags, ivec2(3, texCoord.y), 0));\n" " composite(pix, inflags, topPixel, topFlags, bottomPixel, bottomFlags);\n" " }\n" " }\n" " if ((layerWindow & 8) != 0) {\n" " vec4 pix = texelFetch(layers[3], coord, 0);\n" " if (pix.a != 0.) {\n" - " ivec4 inflags = ivec4(texelFetch(flags[3], coord, 0).xyz, 0);\n" + " ivec4 inflags = ivec4(texelFetch(backdropFlags, ivec2(4, texCoord.y), 0));\n" " composite(pix, inflags, topPixel, topFlags, bottomPixel, bottomFlags);\n" " }\n" " }\n"@@ -747,7 +731,7 @@ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, scale > 0 ? GBA_VIDEO_HORIZONTAL_PIXELS * scale : 1, GBA_VIDEO_VERTICAL_PIXELS * (scale > 0 ? scale : 1), 0, format, type, 0); + glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, scale > 0 ? GBA_VIDEO_HORIZONTAL_PIXELS * scale : 8, GBA_VIDEO_VERTICAL_PIXELS * (scale > 0 ? scale : 1), 0, format, type, 0); glFramebufferTexture2D(GL_FRAMEBUFFER, attachment, GL_TEXTURE_2D, tex, 0); }@@ -764,7 +748,7 @@ _initFramebufferTextureEx(glRenderer->layers[GBA_GL_TEX_OBJ_DEPTH], GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH_STENCIL_ATTACHMENT, glRenderer->scale);
glBindFramebuffer(GL_FRAMEBUFFER, glRenderer->fbo[GBA_GL_FBO_BACKDROP]); _initFramebufferTexture(glRenderer->layers[GBA_GL_TEX_BACKDROP_COLOR], GL_RGB, GL_COLOR_ATTACHMENT0, 0); - _initFramebufferTextureEx(glRenderer->layers[GBA_GL_TEX_BACKDROP_FLAGS], GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE, GL_COLOR_ATTACHMENT1, glRenderer->scale); + _initFramebufferTextureEx(glRenderer->layers[GBA_GL_TEX_BACKDROP_FLAGS], GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE, GL_COLOR_ATTACHMENT1, 0); glBindFramebuffer(GL_FRAMEBUFFER, glRenderer->fbo[GBA_GL_FBO_WINDOW]); _initFramebufferTextureEx(glRenderer->layers[GBA_GL_TEX_WINDOW], GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE, GL_COLOR_ATTACHMENT0, glRenderer->scale);@@ -777,7 +761,6 @@ for (i = 0; i < 4; ++i) {
struct GBAVideoGLBackground* bg = &glRenderer->bg[i]; glBindFramebuffer(GL_FRAMEBUFFER, bg->fbo); _initFramebufferTexture(bg->tex, GL_RGBA, GL_COLOR_ATTACHMENT0, glRenderer->scale); - _initFramebufferTextureEx(bg->flags, GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE, GL_COLOR_ATTACHMENT1, glRenderer->scale); } glBindFramebuffer(GL_FRAMEBUFFER, 0); }@@ -825,7 +808,6 @@ bg->affine.sx = 0;
bg->affine.sy = 0; glGenFramebuffers(1, &bg->fbo); glGenTextures(1, &bg->tex); - glGenTextures(1, &bg->flags); } _initFramebuffers(glRenderer);@@ -924,7 +906,6 @@ for (i = 0; i < 4; ++i) {
struct GBAVideoGLBackground* bg = &glRenderer->bg[i]; glDeleteFramebuffers(1, &bg->fbo); glDeleteTextures(1, &bg->tex); - glDeleteTextures(1, &bg->flags); } }@@ -1400,12 +1381,12 @@ glClearDepth(1);
#endif glClearStencil(0); glBindFramebuffer(GL_FRAMEBUFFER, glRenderer->fbo[GBA_GL_FBO_OBJ]); - glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }); + glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 }); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); for (i = 0; i < 4; ++i) { glBindFramebuffer(GL_FRAMEBUFFER, glRenderer->bg[i].fbo); - glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }); + glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 }); glClear(GL_COLOR_BUFFER_BIT); } }@@ -1428,11 +1409,21 @@ glBindFramebuffer(GL_FRAMEBUFFER, glRenderer->fbo[GBA_GL_FBO_BACKDROP]);
glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }); glClearBufferfv(GL_COLOR, 0, (GLfloat[]) { ((backdrop >> 16) & 0xF8) / 248., ((backdrop >> 8) & 0xF8) / 248., (backdrop & 0xF8) / 248., 1.f }); glClearBufferiv(GL_COLOR, 1, (GLint[]) { 32, glRenderer->target1Bd | (glRenderer->target2Bd * 2) | (glRenderer->blendEffect * 4), glRenderer->blda, 0 }); + + glDrawBuffers(2, (GLenum[]) { GL_NONE, GL_COLOR_ATTACHMENT1 }); + int i; + for (i = 0; i < 4; ++i) { + glScissor(i + 1, glRenderer->firstY, i + 2, y - glRenderer->firstY + 1); + glClearBufferiv(GL_COLOR, 1, (GLint[]) { glRenderer->bg[i].priority, + glRenderer->bg[i].target1 | (glRenderer->bg[i].target2 << 1) | (glRenderer->blendEffect << 2), + glRenderer->blda, 0 }); + } + + glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 }); GBAVideoGLRendererDrawWindow(glRenderer, y); if (GBARegisterDISPCNTIsObjEnable(glRenderer->dispcnt) && !glRenderer->d.disableOBJ) { - int i; glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); glEnable(GL_STENCIL_TEST); glDepthFunc(GL_LESS);@@ -1615,33 +1606,25 @@ glBindTexture(GL_TEXTURE_2D, renderer->layers[GBA_GL_TEX_OBJ_FLAGS]);
glActiveTexture(GL_TEXTURE0 + 3); glBindTexture(GL_TEXTURE_2D, renderer->bg[0].tex); glActiveTexture(GL_TEXTURE0 + 4); - glBindTexture(GL_TEXTURE_2D, renderer->bg[0].flags); - glActiveTexture(GL_TEXTURE0 + 5); glBindTexture(GL_TEXTURE_2D, renderer->bg[1].tex); - glActiveTexture(GL_TEXTURE0 + 6); - glBindTexture(GL_TEXTURE_2D, renderer->bg[1].flags); - glActiveTexture(GL_TEXTURE0 + 7); + glActiveTexture(GL_TEXTURE0 + 5); glBindTexture(GL_TEXTURE_2D, renderer->bg[2].tex); - glActiveTexture(GL_TEXTURE0 + 8); - glBindTexture(GL_TEXTURE_2D, renderer->bg[2].flags); - glActiveTexture(GL_TEXTURE0 + 9); + glActiveTexture(GL_TEXTURE0 + 6); glBindTexture(GL_TEXTURE_2D, renderer->bg[3].tex); - glActiveTexture(GL_TEXTURE0 + 10); - glBindTexture(GL_TEXTURE_2D, renderer->bg[3].flags); - glActiveTexture(GL_TEXTURE0 + 11); + glActiveTexture(GL_TEXTURE0 + 7); glBindTexture(GL_TEXTURE_2D, renderer->layers[GBA_GL_TEX_BACKDROP_COLOR]); - glActiveTexture(GL_TEXTURE0 + 12); + glActiveTexture(GL_TEXTURE0 + 8); glBindTexture(GL_TEXTURE_2D, renderer->layers[GBA_GL_TEX_BACKDROP_FLAGS]); glUniform2i(uniforms[GBA_GL_VS_LOC], GBA_VIDEO_VERTICAL_PIXELS, 0); glUniform2i(uniforms[GBA_GL_VS_MAXPOS], GBA_VIDEO_HORIZONTAL_PIXELS, GBA_VIDEO_VERTICAL_PIXELS); glUniform1i(uniforms[GBA_GL_FINALIZE_SCALE], renderer->scale); - glUniform1iv(uniforms[GBA_GL_FINALIZE_LAYERS], 5, (GLint[]) { 3, 5, 7, 9, 1 }); - glUniform1iv(uniforms[GBA_GL_FINALIZE_FLAGS], 5, (GLint[]) { 4, 6, 8, 10, 2 }); + glUniform1iv(uniforms[GBA_GL_FINALIZE_LAYERS], 5, (GLint[]) { 3, 4, 5, 6, 1 }); + glUniform1i(uniforms[GBA_GL_FINALIZE_FLAGS], 2); glUniform1i(uniforms[GBA_GL_FINALIZE_WINDOW], 0); glUniform1i(uniforms[GBA_GL_FINALIZE_WINDOW], 0); - glUniform1i(uniforms[GBA_GL_FINALIZE_BACKDROP], 11); - glUniform1i(uniforms[GBA_GL_FINALIZE_BACKDROPFLAGS], 12); + glUniform1i(uniforms[GBA_GL_FINALIZE_BACKDROP], 7); + glUniform1i(uniforms[GBA_GL_FINALIZE_BACKDROPFLAGS], 8); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); } glBindFramebuffer(GL_FRAMEBUFFER, 0);@@ -1734,13 +1717,13 @@ uniforms = shader->uniforms;
glStencilFunc(GL_EQUAL, 1, 1); glUseProgram(shader->program); glDrawBuffers(2, (GLenum[]) { GL_NONE, GL_COLOR_ATTACHMENT1 }); - glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); glBindVertexArray(shader->vao); glUniform2i(uniforms[GBA_GL_VS_LOC], totalHeight, 0); glUniform2i(uniforms[GBA_GL_VS_MAXPOS], totalWidth, totalHeight); - glUniform4i(uniforms[GBA_GL_OBJ_INFLAGS], GBAObjAttributesCGetPriority(sprite->c), 0, 0, 0); + glUniform4i(uniforms[GBA_GL_OBJ_INFLAGS], GBAObjAttributesCGetPriority(sprite->c), + (renderer->target1Obj || GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_SEMITRANSPARENT) | (renderer->target2Obj * 2) | (renderer->blendEffect * 4), + renderer->blda, GBAObjAttributesAGetMode(sprite->a) == OBJ_MODE_SEMITRANSPARENT); glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 }); }@@ -1758,10 +1741,7 @@ glUniform2i(uniforms[GBA_GL_BG_MOSAIC], GBAMosaicControlGetBgV(renderer->mosaic) + 1, GBAMosaicControlGetBgH(renderer->mosaic) + 1);
} else { glUniform2i(uniforms[GBA_GL_BG_MOSAIC], 0, 0); } - glUniform4i(uniforms[GBA_GL_BG_INFLAGS], background->priority, - background->target1 | (background->target2 * 2) | (renderer->blendEffect * 4), - renderer->blda, 0); - glDrawBuffers(2, (GLenum[]) { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 }); + glDrawBuffers(1, (GLenum[]) { GL_COLOR_ATTACHMENT0 }); } void GBAVideoGLRendererDrawBackgroundMode0(struct GBAVideoGLRenderer* renderer, struct GBAVideoGLBackground* background, int y) {
@@ -234,7 +234,7 @@ localY = y; \
} #define TEST_LAYER_ENABLED(X) \ - (softwareRenderer->bg[X].enabled == 4 && \ + (softwareRenderer->bg[X].enabled == 3 && \ (GBAWindowControlIsBg ## X ## Enable(softwareRenderer->currentWindow.packed) || \ (GBARegisterDISPCNTIsObjwinEnable(softwareRenderer->dispcnt) && GBAWindowControlIsBg ## X ## Enable (softwareRenderer->objwin.packed))) && \ softwareRenderer->bg[X].priority == priority)
@@ -691,19 +691,19 @@ 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 < 3) { ++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 < 3) { ++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 < 3) { ++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 < 3) { ++softwareRenderer->bg[3].enabled; DIRTY_SCANLINE(softwareRenderer, y); }@@ -737,16 +737,16 @@ softwareRenderer->bg[3].sx = softwareRenderer->bg[3].refx;
softwareRenderer->bg[3].sy = softwareRenderer->bg[3].refy; if (softwareRenderer->bg[0].enabled > 0) { - softwareRenderer->bg[0].enabled = 4; + softwareRenderer->bg[0].enabled = 3; } if (softwareRenderer->bg[1].enabled > 0) { - softwareRenderer->bg[1].enabled = 4; + softwareRenderer->bg[1].enabled = 3; } if (softwareRenderer->bg[2].enabled > 0) { - softwareRenderer->bg[2].enabled = 4; + softwareRenderer->bg[2].enabled = 3; } if (softwareRenderer->bg[3].enabled > 0) { - softwareRenderer->bg[3].enabled = 4; + softwareRenderer->bg[3].enabled = 3; } }@@ -773,7 +773,7 @@ renderer->bg[bg].enabled = 0;
} else if (!wasActive && active) { if (renderer->nextY == 0 || GBARegisterDISPCNTGetMode(renderer->dispcnt) > 2) { // TODO: Investigate in more depth how switching background works in different modes - renderer->bg[bg].enabled = 4; + renderer->bg[bg].enabled = 3; } else { renderer->bg[bg].enabled = 1; }
@@ -1,590 +0,0 @@
-/* Copyright (c) 2013-2015 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include <mgba/internal/gba/rr/mgm.h> - -#include <mgba/internal/gba/gba.h> -#include <mgba/internal/gba/serialize.h> -#include <mgba-util/vfs.h> - -#define BINARY_EXT ".mgm" -#define BINARY_MAGIC "GBAb" -#define METADATA_FILENAME "metadata" BINARY_EXT - -enum { - INVALID_INPUT = 0x8000 -}; - -static void GBAMGMContextDestroy(struct GBARRContext*); - -static bool GBAMGMStartPlaying(struct GBARRContext*, bool autorecord); -static void GBAMGMStopPlaying(struct GBARRContext*); -static bool GBAMGMStartRecording(struct GBARRContext*); -static void GBAMGMStopRecording(struct GBARRContext*); - -static bool GBAMGMIsPlaying(const struct GBARRContext*); -static bool GBAMGMIsRecording(const struct GBARRContext*); - -static void GBAMGMNextFrame(struct GBARRContext*); -static void GBAMGMLogInput(struct GBARRContext*, uint16_t input); -static uint16_t GBAMGMQueryInput(struct GBARRContext*); -static bool GBAMGMQueryReset(struct GBARRContext*); - -static void GBAMGMStateSaved(struct GBARRContext* rr, struct GBASerializedState* state); -static void GBAMGMStateLoaded(struct GBARRContext* rr, const struct GBASerializedState* state); - -static bool _loadStream(struct GBAMGMContext*, uint32_t streamId); -static bool _incrementStream(struct GBAMGMContext*, bool recursive); -static bool _finishSegment(struct GBAMGMContext*); -static bool _skipSegment(struct GBAMGMContext*); -static bool _markRerecord(struct GBAMGMContext*); - -static bool _emitMagic(struct GBAMGMContext*, struct VFile* vf); -static bool _verifyMagic(struct GBAMGMContext*, struct VFile* vf); -static enum GBAMGMTag _readTag(struct GBAMGMContext*, struct VFile* vf); -static bool _seekTag(struct GBAMGMContext*, struct VFile* vf, enum GBAMGMTag tag); -static bool _emitTag(struct GBAMGMContext*, struct VFile* vf, uint8_t tag); -static bool _emitEnd(struct GBAMGMContext*, struct VFile* vf); - -static bool _parseMetadata(struct GBAMGMContext*, struct VFile* vf); - -static bool _markStreamNext(struct GBAMGMContext*, uint32_t newStreamId, bool recursive); -static void _streamEndReached(struct GBAMGMContext*); - -static struct VFile* GBAMGMOpenSavedata(struct GBARRContext*, int flags); -static struct VFile* GBAMGMOpenSavestate(struct GBARRContext*, int flags); - -void GBAMGMContextCreate(struct GBAMGMContext* mgm) { - memset(mgm, 0, sizeof(*mgm)); - - mgm->d.destroy = GBAMGMContextDestroy; - - mgm->d.startPlaying = GBAMGMStartPlaying; - mgm->d.stopPlaying = GBAMGMStopPlaying; - mgm->d.startRecording = GBAMGMStartRecording; - mgm->d.stopRecording = GBAMGMStopRecording; - - mgm->d.isPlaying = GBAMGMIsPlaying; - mgm->d.isRecording = GBAMGMIsRecording; - - mgm->d.nextFrame = GBAMGMNextFrame; - mgm->d.logInput = GBAMGMLogInput; - mgm->d.queryInput = GBAMGMQueryInput; - mgm->d.queryReset = GBAMGMQueryReset; - - mgm->d.stateSaved = GBAMGMStateSaved; - mgm->d.stateLoaded = GBAMGMStateLoaded; - - mgm->d.openSavedata = GBAMGMOpenSavedata; - mgm->d.openSavestate = GBAMGMOpenSavestate; -} - -void GBAMGMContextDestroy(struct GBARRContext* rr) { - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - if (mgm->metadataFile) { - mgm->metadataFile->close(mgm->metadataFile); - } -} - -bool GBAMGMSetStream(struct GBAMGMContext* mgm, struct VDir* stream) { - if (mgm->movieStream && !mgm->movieStream->close(mgm->movieStream)) { - return false; - } - - if (mgm->metadataFile && !mgm->metadataFile->close(mgm->metadataFile)) { - return false; - } - - mgm->streamDir = stream; - mgm->metadataFile = mgm->streamDir->openFile(mgm->streamDir, METADATA_FILENAME, O_CREAT | O_RDWR); - mgm->currentInput = INVALID_INPUT; - if (!_parseMetadata(mgm, mgm->metadataFile)) { - mgm->metadataFile->close(mgm->metadataFile); - mgm->metadataFile = 0; - mgm->maxStreamId = 0; - } - mgm->streamId = 1; - mgm->movieStream = 0; - return true; -} - -bool GBAMGMCreateStream(struct GBAMGMContext* mgm, enum GBARRInitFrom initFrom) { - if (mgm->metadataFile) { - mgm->metadataFile->truncate(mgm->metadataFile, 0); - } else { - mgm->metadataFile = mgm->streamDir->openFile(mgm->streamDir, METADATA_FILENAME, O_CREAT | O_TRUNC | O_RDWR); - } - _emitMagic(mgm, mgm->metadataFile); - - mgm->d.initFrom = initFrom; - mgm->initFromOffset = mgm->metadataFile->seek(mgm->metadataFile, 0, SEEK_CUR); - _emitTag(mgm, mgm->metadataFile, TAG_INIT | initFrom); - - mgm->streamId = 0; - mgm->maxStreamId = 0; - _emitTag(mgm, mgm->metadataFile, TAG_MAX_STREAM); - mgm->maxStreamIdOffset = mgm->metadataFile->seek(mgm->metadataFile, 0, SEEK_CUR); - mgm->metadataFile->write(mgm->metadataFile, &mgm->maxStreamId, sizeof(mgm->maxStreamId)); - - mgm->d.rrCount = 0; - _emitTag(mgm, mgm->metadataFile, TAG_RR_COUNT); - mgm->rrCountOffset = mgm->metadataFile->seek(mgm->metadataFile, 0, SEEK_CUR); - mgm->metadataFile->write(mgm->metadataFile, &mgm->d.rrCount, sizeof(mgm->d.rrCount)); - return true; -} - -bool _loadStream(struct GBAMGMContext* mgm, uint32_t streamId) { - if (mgm->movieStream && !mgm->movieStream->close(mgm->movieStream)) { - return false; - } - mgm->movieStream = 0; - mgm->streamId = streamId; - mgm->currentInput = INVALID_INPUT; - char buffer[14]; - snprintf(buffer, sizeof(buffer), "%u" BINARY_EXT, streamId); - if (mgm->d.isRecording(&mgm->d)) { - int flags = O_CREAT | O_RDWR; - if (streamId > mgm->maxStreamId) { - flags |= O_TRUNC; - } - mgm->movieStream = mgm->streamDir->openFile(mgm->streamDir, buffer, flags); - } else if (mgm->d.isPlaying(&mgm->d)) { - mgm->movieStream = mgm->streamDir->openFile(mgm->streamDir, buffer, O_RDONLY); - mgm->peekedTag = TAG_INVALID; - if (!mgm->movieStream || !_verifyMagic(mgm, mgm->movieStream) || !_seekTag(mgm, mgm->movieStream, TAG_BEGIN)) { - mgm->d.stopPlaying(&mgm->d); - } - } - mLOG(GBA_RR, DEBUG, "Loading segment: %u", streamId); - mgm->d.frames = 0; - mgm->d.lagFrames = 0; - return true; -} - -bool _incrementStream(struct GBAMGMContext* mgm, bool recursive) { - uint32_t newStreamId = mgm->maxStreamId + 1; - uint32_t oldStreamId = mgm->streamId; - if (mgm->d.isRecording(&mgm->d) && mgm->movieStream) { - if (!_markStreamNext(mgm, newStreamId, recursive)) { - return false; - } - } - if (!_loadStream(mgm, newStreamId)) { - return false; - } - mLOG(GBA_RR, DEBUG, "New segment: %u", newStreamId); - _emitMagic(mgm, mgm->movieStream); - mgm->maxStreamId = newStreamId; - _emitTag(mgm, mgm->movieStream, TAG_PREVIOUSLY); - mgm->movieStream->write(mgm->movieStream, &oldStreamId, sizeof(oldStreamId)); - _emitTag(mgm, mgm->movieStream, TAG_BEGIN); - - mgm->metadataFile->seek(mgm->metadataFile, mgm->maxStreamIdOffset, SEEK_SET); - mgm->metadataFile->write(mgm->metadataFile, &mgm->maxStreamId, sizeof(mgm->maxStreamId)); - mgm->previously = oldStreamId; - return true; -} - -bool GBAMGMStartPlaying(struct GBARRContext* rr, bool autorecord) { - if (rr->isRecording(rr) || rr->isPlaying(rr)) { - return false; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - mgm->isPlaying = true; - if (!_loadStream(mgm, 1)) { - mgm->isPlaying = false; - return false; - } - mgm->autorecord = autorecord; - return true; -} - -void GBAMGMStopPlaying(struct GBARRContext* rr) { - if (!rr->isPlaying(rr)) { - return; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - mgm->isPlaying = false; - if (mgm->movieStream) { - mgm->movieStream->close(mgm->movieStream); - mgm->movieStream = 0; - } -} - -bool GBAMGMStartRecording(struct GBARRContext* rr) { - if (rr->isRecording(rr) || rr->isPlaying(rr)) { - return false; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - if (!mgm->maxStreamIdOffset) { - _emitTag(mgm, mgm->metadataFile, TAG_MAX_STREAM); - mgm->maxStreamIdOffset = mgm->metadataFile->seek(mgm->metadataFile, 0, SEEK_CUR); - mgm->metadataFile->write(mgm->metadataFile, &mgm->maxStreamId, sizeof(mgm->maxStreamId)); - } - - mgm->isRecording = true; - return _incrementStream(mgm, false); -} - -void GBAMGMStopRecording(struct GBARRContext* rr) { - if (!rr->isRecording(rr)) { - return; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - mgm->isRecording = false; - if (mgm->movieStream) { - _emitEnd(mgm, mgm->movieStream); - mgm->movieStream->close(mgm->movieStream); - mgm->movieStream = 0; - } -} - -bool GBAMGMIsPlaying(const struct GBARRContext* rr) { - const struct GBAMGMContext* mgm = (const struct GBAMGMContext*) rr; - return mgm->isPlaying; -} - -bool GBAMGMIsRecording(const struct GBARRContext* rr) { - const struct GBAMGMContext* mgm = (const struct GBAMGMContext*) rr; - return mgm->isRecording; -} - -void GBAMGMNextFrame(struct GBARRContext* rr) { - if (!rr->isRecording(rr) && !rr->isPlaying(rr)) { - return; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - if (rr->isPlaying(rr)) { - while (mgm->peekedTag == TAG_INPUT) { - _readTag(mgm, mgm->movieStream); - mLOG(GBA_RR, WARN, "Desync detected!"); - } - if (mgm->peekedTag == TAG_LAG) { - mLOG(GBA_RR, DEBUG, "Lag frame marked in stream"); - if (mgm->inputThisFrame) { - mLOG(GBA_RR, WARN, "Lag frame in stream does not match movie"); - } - } - } - - ++mgm->d.frames; - mLOG(GBA_RR, DEBUG, "Frame: %u", mgm->d.frames); - if (!mgm->inputThisFrame) { - ++mgm->d.lagFrames; - mLOG(GBA_RR, DEBUG, "Lag frame: %u", mgm->d.lagFrames); - } - - if (rr->isRecording(rr)) { - if (!mgm->inputThisFrame) { - _emitTag(mgm, mgm->movieStream, TAG_LAG); - } - _emitTag(mgm, mgm->movieStream, TAG_FRAME); - mgm->inputThisFrame = false; - } else { - if (!_seekTag(mgm, mgm->movieStream, TAG_FRAME)) { - _streamEndReached(mgm); - } - } -} - -void GBAMGMLogInput(struct GBARRContext* rr, uint16_t keys) { - if (!rr->isRecording(rr)) { - return; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - if (keys != mgm->currentInput) { - _emitTag(mgm, mgm->movieStream, TAG_INPUT); - mgm->movieStream->write(mgm->movieStream, &keys, sizeof(keys)); - mgm->currentInput = keys; - } - mLOG(GBA_RR, DEBUG, "Input log: %03X", mgm->currentInput); - mgm->inputThisFrame = true; -} - -uint16_t GBAMGMQueryInput(struct GBARRContext* rr) { - if (!rr->isPlaying(rr)) { - return 0; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - if (mgm->peekedTag == TAG_INPUT) { - _readTag(mgm, mgm->movieStream); - } - mgm->inputThisFrame = true; - if (mgm->currentInput == INVALID_INPUT) { - mLOG(GBA_RR, WARN, "Stream did not specify input"); - } - mLOG(GBA_RR, DEBUG, "Input replay: %03X", mgm->currentInput); - return mgm->currentInput; -} - -bool GBAMGMQueryReset(struct GBARRContext* rr) { - if (!rr->isPlaying(rr)) { - return 0; - } - - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - return mgm->peekedTag == TAG_RESET; -} - -void GBAMGMStateSaved(struct GBARRContext* rr, struct GBASerializedState* state) { - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - if (rr->isRecording(rr)) { - state->associatedStreamId = mgm->streamId; - _finishSegment(mgm); - } -} - -void GBAMGMStateLoaded(struct GBARRContext* rr, const struct GBASerializedState* state) { - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - if (rr->isRecording(rr)) { - if (state->associatedStreamId != mgm->streamId) { - _loadStream(mgm, state->associatedStreamId); - _incrementStream(mgm, true); - } else { - _finishSegment(mgm); - } - _markRerecord(mgm); - } else if (rr->isPlaying(rr)) { - _loadStream(mgm, state->associatedStreamId); - _skipSegment(mgm); - } -} - -bool _finishSegment(struct GBAMGMContext* mgm) { - if (mgm->movieStream) { - if (!_emitEnd(mgm, mgm->movieStream)) { - return false; - } - } - return _incrementStream(mgm, false); -} - -bool _skipSegment(struct GBAMGMContext* mgm) { - mgm->nextTime = 0; - while (_readTag(mgm, mgm->movieStream) != TAG_EOF); - if (!mgm->nextTime || !_loadStream(mgm, mgm->nextTime)) { - _streamEndReached(mgm); - return false; - } - return true; -} - -bool _markRerecord(struct GBAMGMContext* mgm) { - ++mgm->d.rrCount; - mgm->metadataFile->seek(mgm->metadataFile, mgm->rrCountOffset, SEEK_SET); - mgm->metadataFile->write(mgm->metadataFile, &mgm->d.rrCount, sizeof(mgm->d.rrCount)); - return true; -} - -bool _emitMagic(struct GBAMGMContext* mgm, struct VFile* vf) { - UNUSED(mgm); - return vf->write(vf, BINARY_MAGIC, 4) == 4; -} - -bool _verifyMagic(struct GBAMGMContext* mgm, struct VFile* vf) { - UNUSED(mgm); - char buffer[4]; - if (vf->read(vf, buffer, sizeof(buffer)) != sizeof(buffer)) { - return false; - } - if (memcmp(buffer, BINARY_MAGIC, sizeof(buffer)) != 0) { - return false; - } - return true; -} - -enum GBAMGMTag _readTag(struct GBAMGMContext* mgm, struct VFile* vf) { - if (!mgm || !vf) { - return TAG_EOF; - } - - enum GBAMGMTag tag = mgm->peekedTag; - switch (tag) { - case TAG_INPUT: - vf->read(vf, &mgm->currentInput, sizeof(uint16_t)); - break; - case TAG_PREVIOUSLY: - vf->read(vf, &mgm->previously, sizeof(mgm->previously)); - break; - case TAG_NEXT_TIME: - vf->read(vf, &mgm->nextTime, sizeof(mgm->nextTime)); - break; - case TAG_MAX_STREAM: - vf->read(vf, &mgm->maxStreamId, sizeof(mgm->maxStreamId)); - break; - case TAG_FRAME_COUNT: - vf->read(vf, &mgm->d.frames, sizeof(mgm->d.frames)); - break; - case TAG_LAG_COUNT: - vf->read(vf, &mgm->d.lagFrames, sizeof(mgm->d.lagFrames)); - break; - case TAG_RR_COUNT: - vf->read(vf, &mgm->d.rrCount, sizeof(mgm->d.rrCount)); - break; - - case TAG_INIT_EX_NIHILO: - mgm->d.initFrom = INIT_EX_NIHILO; - break; - case TAG_INIT_FROM_SAVEGAME: - mgm->d.initFrom = INIT_FROM_SAVEGAME; - break; - case TAG_INIT_FROM_SAVESTATE: - mgm->d.initFrom = INIT_FROM_SAVESTATE; - break; - case TAG_INIT_FROM_BOTH: - mgm->d.initFrom = INIT_FROM_BOTH; - break; - - // To be spec'd - case TAG_AUTHOR: - case TAG_COMMENT: - break; - - // Empty markers - case TAG_FRAME: - case TAG_LAG: - case TAG_RESET: - case TAG_BEGIN: - case TAG_END: - case TAG_INVALID: - case TAG_EOF: - break; - } - - uint8_t tagBuffer; - if (vf->read(vf, &tagBuffer, 1) != 1) { - mgm->peekedTag = TAG_EOF; - } else { - mgm->peekedTag = tagBuffer; - } - - if (mgm->peekedTag == TAG_END) { - _skipSegment(mgm); - } - return tag; -} - -bool _seekTag(struct GBAMGMContext* mgm, struct VFile* vf, enum GBAMGMTag tag) { - enum GBAMGMTag readTag; - while ((readTag = _readTag(mgm, vf)) != tag) { - if (readTag == TAG_EOF) { - return false; - } - } - return true; -} - -bool _emitTag(struct GBAMGMContext* mgm, struct VFile* vf, uint8_t tag) { - UNUSED(mgm); - return vf->write(vf, &tag, sizeof(tag)) == sizeof(tag); -} - -bool _parseMetadata(struct GBAMGMContext* mgm, struct VFile* vf) { - if (!_verifyMagic(mgm, vf)) { - return false; - } - while (_readTag(mgm, vf) != TAG_EOF) { - switch (mgm->peekedTag) { - case TAG_MAX_STREAM: - mgm->maxStreamIdOffset = vf->seek(vf, 0, SEEK_CUR); - break; - case TAG_INIT_EX_NIHILO: - case TAG_INIT_FROM_SAVEGAME: - case TAG_INIT_FROM_SAVESTATE: - case TAG_INIT_FROM_BOTH: - mgm->initFromOffset = vf->seek(vf, 0, SEEK_CUR); - break; - case TAG_RR_COUNT: - mgm->rrCountOffset = vf->seek(vf, 0, SEEK_CUR); - break; - default: - break; - } - } - return true; -} - -bool _emitEnd(struct GBAMGMContext* mgm, struct VFile* vf) { - // TODO: Error check - _emitTag(mgm, vf, TAG_END); - _emitTag(mgm, vf, TAG_FRAME_COUNT); - vf->write(vf, &mgm->d.frames, sizeof(mgm->d.frames)); - _emitTag(mgm, vf, TAG_LAG_COUNT); - vf->write(vf, &mgm->d.lagFrames, sizeof(mgm->d.lagFrames)); - _emitTag(mgm, vf, TAG_NEXT_TIME); - - uint32_t newStreamId = 0; - vf->write(vf, &newStreamId, sizeof(newStreamId)); - return true; -} - -bool _markStreamNext(struct GBAMGMContext* mgm, uint32_t newStreamId, bool recursive) { - if (mgm->movieStream->seek(mgm->movieStream, -sizeof(newStreamId) - 1, SEEK_END) < 0) { - return false; - } - - uint8_t tagBuffer; - if (mgm->movieStream->read(mgm->movieStream, &tagBuffer, 1) != 1) { - return false; - } - if (tagBuffer != TAG_NEXT_TIME) { - return false; - } - if (mgm->movieStream->write(mgm->movieStream, &newStreamId, sizeof(newStreamId)) != sizeof(newStreamId)) { - return false; - } - if (recursive) { - if (mgm->movieStream->seek(mgm->movieStream, 0, SEEK_SET) < 0) { - return false; - } - if (!_verifyMagic(mgm, mgm->movieStream)) { - return false; - } - _readTag(mgm, mgm->movieStream); - if (_readTag(mgm, mgm->movieStream) != TAG_PREVIOUSLY) { - return false; - } - if (mgm->previously == 0) { - return true; - } - uint32_t currentStreamId = mgm->streamId; - if (!_loadStream(mgm, mgm->previously)) { - return false; - } - return _markStreamNext(mgm, currentStreamId, mgm->previously); - } - return true; -} - -void _streamEndReached(struct GBAMGMContext* mgm) { - if (!mgm->d.isPlaying(&mgm->d)) { - return; - } - - uint32_t endStreamId = mgm->streamId; - mgm->d.stopPlaying(&mgm->d); - if (mgm->autorecord) { - mgm->isRecording = true; - _loadStream(mgm, endStreamId); - _incrementStream(mgm, false); - } -} - -struct VFile* GBAMGMOpenSavedata(struct GBARRContext* rr, int flags) { - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - return mgm->streamDir->openFile(mgm->streamDir, "movie.sav", flags); -} - -struct VFile* GBAMGMOpenSavestate(struct GBARRContext* rr, int flags) { - struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; - return mgm->streamDir->openFile(mgm->streamDir, "movie.ssm", flags); -}
@@ -1,77 +0,0 @@
-/* Copyright (c) 2013-2015 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include <mgba/internal/gba/rr/rr.h> - -#include <mgba/core/log.h> -#include <mgba/core/serialize.h> -#include <mgba-util/vfs.h> - -mLOG_DEFINE_CATEGORY(GBA_RR, "GBA RR", "gba.rr"); - -void GBARRInitRecord(struct GBA* gba) { - if (!gba || !gba->rr) { - return; - } - - if (gba->rr->initFrom & INIT_FROM_SAVEGAME) { - if (gba->rr->savedata) { - gba->rr->savedata->close(gba->rr->savedata); - } - gba->rr->savedata = gba->rr->openSavedata(gba->rr, O_TRUNC | O_CREAT | O_WRONLY); - GBASavedataClone(&gba->memory.savedata, gba->rr->savedata); - gba->rr->savedata->close(gba->rr->savedata); - gba->rr->savedata = gba->rr->openSavedata(gba->rr, O_RDONLY); - GBASavedataMask(&gba->memory.savedata, gba->rr->savedata, false); - } else { - GBASavedataMask(&gba->memory.savedata, 0, false); - } - - if (gba->rr->initFrom & INIT_FROM_SAVESTATE) { - struct VFile* vf = gba->rr->openSavestate(gba->rr, O_TRUNC | O_CREAT | O_RDWR); - //GBASaveStateNamed(gba, vf, SAVESTATE_SAVEDATA); - vf->close(vf); - } else { - ARMReset(gba->cpu); - } -} - -void GBARRInitPlay(struct GBA* gba) { - if (!gba || !gba->rr) { - return; - } - - if (gba->rr->initFrom & INIT_FROM_SAVEGAME) { - if (gba->rr->savedata) { - gba->rr->savedata->close(gba->rr->savedata); - } - gba->rr->savedata = gba->rr->openSavedata(gba->rr, O_RDONLY); - GBASavedataMask(&gba->memory.savedata, gba->rr->savedata, false); - } else { - GBASavedataMask(&gba->memory.savedata, 0, false); - } - - if (gba->rr->initFrom & INIT_FROM_SAVESTATE) { - struct VFile* vf = gba->rr->openSavestate(gba->rr, O_RDONLY); - //GBALoadStateNamed(gba, vf, SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA); - vf->close(vf); - } else { - ARMReset(gba->cpu); - } -} - -void GBARRDestroy(struct GBARRContext* rr) { - if (rr->isPlaying(rr)) { - rr->stopPlaying(rr); - } - if (rr->isRecording(rr)) { - rr->stopRecording(rr); - } - if (rr->savedata) { - rr->savedata->close(rr->savedata); - rr->savedata = 0; - } - rr->destroy(rr); -}
@@ -1,274 +0,0 @@
-/* Copyright (c) 2013-2015 Jeffrey Pfau - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include <mgba/internal/gba/rr/vbm.h> - -#include <mgba/internal/gba/gba.h> -#include <mgba/internal/gba/serialize.h> -#include <mgba-util/vfs.h> - -#ifdef USE_ZLIB -#include <zlib.h> -#endif - -static const char VBM_MAGIC[] = "VBM\x1A"; - -static void GBAVBMContextDestroy(struct GBARRContext*); - -static bool GBAVBMStartPlaying(struct GBARRContext*, bool autorecord); -static void GBAVBMStopPlaying(struct GBARRContext*); -static bool GBAVBMStartRecording(struct GBARRContext*); -static void GBAVBMStopRecording(struct GBARRContext*); - -static bool GBAVBMIsPlaying(const struct GBARRContext*); -static bool GBAVBMIsRecording(const struct GBARRContext*); - -static void GBAVBMNextFrame(struct GBARRContext*); -static uint16_t GBAVBMQueryInput(struct GBARRContext*); -static bool GBAVBMQueryReset(struct GBARRContext*); - -static void GBAVBMStateSaved(struct GBARRContext* rr, struct GBASerializedState* state); -static void GBAVBMStateLoaded(struct GBARRContext* rr, const struct GBASerializedState* state); - -static struct VFile* GBAVBMOpenSavedata(struct GBARRContext*, int flags); -static struct VFile* GBAVBMOpenSavestate(struct GBARRContext*, int flags); - -void GBAVBMContextCreate(struct GBAVBMContext* vbm) { - memset(vbm, 0, sizeof(*vbm)); - - vbm->d.destroy = GBAVBMContextDestroy; - - vbm->d.startPlaying = GBAVBMStartPlaying; - vbm->d.stopPlaying = GBAVBMStopPlaying; - vbm->d.startRecording = GBAVBMStartRecording; - vbm->d.stopRecording = GBAVBMStopRecording; - - vbm->d.isPlaying = GBAVBMIsPlaying; - vbm->d.isRecording = GBAVBMIsRecording; - - vbm->d.nextFrame = GBAVBMNextFrame; - vbm->d.logInput = 0; - vbm->d.queryInput = GBAVBMQueryInput; - vbm->d.queryReset = GBAVBMQueryReset; - - vbm->d.stateSaved = GBAVBMStateSaved; - vbm->d.stateLoaded = GBAVBMStateLoaded; - - vbm->d.openSavedata = GBAVBMOpenSavedata; - vbm->d.openSavestate = GBAVBMOpenSavestate; -} - -bool GBAVBMStartPlaying(struct GBARRContext* rr, bool autorecord) { - if (rr->isRecording(rr) || rr->isPlaying(rr) || autorecord) { - return false; - } - - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - vbm->isPlaying = true; - vbm->vbmFile->seek(vbm->vbmFile, vbm->inputOffset, SEEK_SET); - return true; -} - -void GBAVBMStopPlaying(struct GBARRContext* rr) { - if (!rr->isPlaying(rr)) { - return; - } - - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - vbm->isPlaying = false; -} - -bool GBAVBMStartRecording(struct GBARRContext* rr) { - UNUSED(rr); - return false; -} - -void GBAVBMStopRecording(struct GBARRContext* rr) { - UNUSED(rr); -} - -bool GBAVBMIsPlaying(const struct GBARRContext* rr) { - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - return vbm->isPlaying; -} - -bool GBAVBMIsRecording(const struct GBARRContext* rr) { - UNUSED(rr); - return false; -} - -void GBAVBMNextFrame(struct GBARRContext* rr) { - if (!rr->isPlaying(rr)) { - return; - } - - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - vbm->vbmFile->seek(vbm->vbmFile, sizeof(uint16_t), SEEK_CUR); -} - -uint16_t GBAVBMQueryInput(struct GBARRContext* rr) { - if (!rr->isPlaying(rr)) { - return 0; - } - - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - uint16_t input; - vbm->vbmFile->read(vbm->vbmFile, &input, sizeof(input)); - vbm->vbmFile->seek(vbm->vbmFile, -sizeof(input), SEEK_CUR); - return input & 0x3FF; -} - -bool GBAVBMQueryReset(struct GBARRContext* rr) { - if (!rr->isPlaying(rr)) { - return false; - } - - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - uint16_t input; - vbm->vbmFile->read(vbm->vbmFile, &input, sizeof(input)); - vbm->vbmFile->seek(vbm->vbmFile, -sizeof(input), SEEK_CUR); - return input & 0x800; -} - -void GBAVBMStateSaved(struct GBARRContext* rr, struct GBASerializedState* state) { - UNUSED(rr); - UNUSED(state); -} - -void GBAVBMStateLoaded(struct GBARRContext* rr, const struct GBASerializedState* state) { - UNUSED(rr); - UNUSED(state); -} - -struct VFile* GBAVBMOpenSavedata(struct GBARRContext* rr, int flags) { - UNUSED(flags); -#ifndef USE_ZLIB - UNUSED(rr); - return 0; -#else - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - off_t pos = vbm->vbmFile->seek(vbm->vbmFile, 0, SEEK_CUR); - uint32_t saveType, flashSize, sramOffset; - vbm->vbmFile->seek(vbm->vbmFile, 0x18, SEEK_SET); - vbm->vbmFile->read(vbm->vbmFile, &saveType, sizeof(saveType)); - vbm->vbmFile->read(vbm->vbmFile, &flashSize, sizeof(flashSize)); - vbm->vbmFile->seek(vbm->vbmFile, 0x38, SEEK_SET); - vbm->vbmFile->read(vbm->vbmFile, &sramOffset, sizeof(sramOffset)); - if (!sramOffset) { - vbm->vbmFile->seek(vbm->vbmFile, pos, SEEK_SET); - return 0; - } - vbm->vbmFile->seek(vbm->vbmFile, sramOffset, SEEK_SET); - struct VFile* save = VFileMemChunk(0, 0); - size_t size; - switch (saveType) { - case 1: - size = SIZE_CART_SRAM; - break; - case 2: - size = flashSize; - if (size > SIZE_CART_FLASH1M) { - size = SIZE_CART_FLASH1M; - } - break; - case 3: - size = SIZE_CART_EEPROM; - break; - default: - size = SIZE_CART_FLASH1M; - break; - } - uLong zlen = vbm->inputOffset - sramOffset; - char buffer[8761]; - char* zbuffer = malloc(zlen); - vbm->vbmFile->read(vbm->vbmFile, zbuffer, zlen); - z_stream zstr; - zstr.zalloc = Z_NULL; - zstr.zfree = Z_NULL; - zstr.opaque = Z_NULL; - zstr.avail_in = zlen; - zstr.next_in = (Bytef*) zbuffer; - zstr.avail_out = 0; - inflateInit2(&zstr, 31); - // Skip header, we know where the save file is - zstr.avail_out = sizeof(buffer); - zstr.next_out = (Bytef*) &buffer; - int err = inflate(&zstr, 0); - while (err != Z_STREAM_END && !zstr.avail_out) { - zstr.avail_out = sizeof(buffer); - zstr.next_out = (Bytef*) &buffer; - int err = inflate(&zstr, 0); - if (err < 0) { - break; - } - save->write(save, buffer, sizeof(buffer) - zstr.avail_out); - } - inflateEnd(&zstr); - vbm->vbmFile->seek(vbm->vbmFile, pos, SEEK_SET); - return save; -#endif -} - -struct VFile* GBAVBMOpenSavestate(struct GBARRContext* rr, int flags) { - UNUSED(rr); - UNUSED(flags); - return 0; -} - -void GBAVBMContextDestroy(struct GBARRContext* rr) { - struct GBAVBMContext* vbm = (struct GBAVBMContext*) rr; - if (vbm->vbmFile) { - vbm->vbmFile->close(vbm->vbmFile); - } -} - -bool GBAVBMSetStream(struct GBAVBMContext* vbm, struct VFile* vf) { - vf->seek(vf, 0, SEEK_SET); - char magic[4]; - vf->read(vf, magic, sizeof(magic)); - if (memcmp(magic, VBM_MAGIC, sizeof(magic)) != 0) { - return false; - } - - uint32_t id; - vf->read(vf, &id, sizeof(id)); - if (id != 1) { - return false; - } - - vf->seek(vf, 4, SEEK_CUR); - vf->read(vf, &vbm->d.frames, sizeof(vbm->d.frames)); - vf->read(vf, &vbm->d.rrCount, sizeof(vbm->d.rrCount)); - - uint8_t flags; - vf->read(vf, &flags, sizeof(flags)); - if (flags & 2) { -#ifdef USE_ZLIB - vbm->d.initFrom = INIT_FROM_SAVEGAME; -#else - // zlib is needed to parse the savegame - return false; -#endif - } - if (flags & 1) { - // Incompatible savestate format - return false; - } - - vf->seek(vf, 1, SEEK_CUR); - vf->read(vf, &flags, sizeof(flags)); - if ((flags & 0x7) != 1) { - // Non-GBA movie - return false; - } - - // TODO: parse more flags - - vf->seek(vf, 0x3C, SEEK_SET); - vf->read(vf, &vbm->inputOffset, sizeof(vbm->inputOffset)); - vf->seek(vf, vbm->inputOffset, SEEK_SET); - vbm->vbmFile = vf; - return true; -}
@@ -7,7 +7,6 @@ #include <mgba/internal/gba/serialize.h>
#include <mgba/internal/arm/macros.h> #include <mgba/internal/gba/io.h> -#include <mgba/internal/gba/rr/rr.h> #include <mgba-util/memory.h> #include <mgba-util/vfs.h>@@ -73,11 +72,6 @@ GBAIOSerialize(gba, state);
GBAVideoSerialize(&gba->video, state); GBAAudioSerialize(&gba->audio, state); GBASavedataSerialize(&gba->memory.savedata, state); - - state->associatedStreamId = 0; - if (gba->rr) { - gba->rr->stateSaved(gba->rr, state); - } } bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) {@@ -194,10 +188,6 @@ GBAMemoryDeserialize(&gba->memory, state);
GBAIODeserialize(gba, state); GBAAudioDeserialize(&gba->audio, state); GBASavedataDeserialize(&gba->memory.savedata, state); - - if (gba->rr) { - gba->rr->stateLoaded(gba->rr, state); - } gba->timing.reroot = gba->timing.root; gba->timing.root = NULL;
@@ -31,6 +31,7 @@ static void GBAVideoDummyRendererGetPixels(struct GBAVideoRenderer* renderer, size_t* stride, const void** pixels);
static void GBAVideoDummyRendererPutPixels(struct GBAVideoRenderer* renderer, size_t stride, const void* pixels); static void _startHblank(struct mTiming*, void* context, uint32_t cyclesLate); +static void _midHblank(struct mTiming*, void* context, uint32_t cyclesLate); static void _startHdraw(struct mTiming*, void* context, uint32_t cyclesLate); static uint16_t _zeroes[0x2000] = {};@@ -137,10 +138,17 @@ renderer->oam = &video->oam;
video->renderer->init(video->renderer); } -void _startHdraw(struct mTiming* timing, void* context, uint32_t cyclesLate) { +void _midHblank(struct mTiming* timing, void* context, uint32_t cyclesLate) { struct GBAVideo* video = context; GBARegisterDISPSTAT dispstat = video->p->memory.io[REG_DISPSTAT >> 1]; dispstat = GBARegisterDISPSTATClearInHblank(dispstat); + video->p->memory.io[REG_DISPSTAT >> 1] = dispstat; + video->event.callback = _startHdraw; + mTimingSchedule(timing, &video->event, VIDEO_HBLANK_FLIP - cyclesLate); +} + +void _startHdraw(struct mTiming* timing, void* context, uint32_t cyclesLate) { + struct GBAVideo* video = context; video->event.callback = _startHblank; mTimingSchedule(timing, &video->event, VIDEO_HDRAW_LENGTH - cyclesLate);@@ -150,6 +158,11 @@ video->vcount = 0;
} video->p->memory.io[REG_VCOUNT >> 1] = video->vcount; + if (video->vcount < GBA_VIDEO_VERTICAL_PIXELS && video->frameskipCounter <= 0) { + video->renderer->drawScanline(video->renderer, video->vcount); + } + + GBARegisterDISPSTAT dispstat = video->p->memory.io[REG_DISPSTAT >> 1]; if (video->vcount == GBARegisterDISPSTATGetVcountSetting(dispstat)) { dispstat = GBARegisterDISPSTATFillVcounter(dispstat); if (GBARegisterDISPSTATIsVcounterIRQ(dispstat)) {@@ -190,16 +203,12 @@ }
void _startHblank(struct mTiming* timing, void* context, uint32_t cyclesLate) { struct GBAVideo* video = context; - GBARegisterDISPSTAT dispstat = video->p->memory.io[REG_DISPSTAT >> 1]; - dispstat = GBARegisterDISPSTATFillInHblank(dispstat); - video->event.callback = _startHdraw; - mTimingSchedule(timing, &video->event, VIDEO_HBLANK_LENGTH - cyclesLate); + video->event.callback = _midHblank; + mTimingSchedule(timing, &video->event, VIDEO_HBLANK_LENGTH - VIDEO_HBLANK_FLIP - cyclesLate); // Begin Hblank + GBARegisterDISPSTAT dispstat = video->p->memory.io[REG_DISPSTAT >> 1]; dispstat = GBARegisterDISPSTATFillInHblank(dispstat); - if (video->vcount < GBA_VIDEO_VERTICAL_PIXELS && video->frameskipCounter <= 0) { - video->renderer->drawScanline(video->renderer, video->vcount); - } if (video->vcount < GBA_VIDEO_VERTICAL_PIXELS) { GBADMARunHblank(video->p, -cyclesLate);@@ -324,6 +333,15 @@ memcpy(state->vram, video->vram, SIZE_VRAM);
memcpy(state->oam, video->oam.raw, SIZE_OAM); memcpy(state->pram, video->palette, SIZE_PALETTE_RAM); STORE_32(video->event.when - mTimingCurrentTime(&video->p->timing), 0, &state->video.nextEvent); + int32_t flags = 0; + if (video->event.callback == _startHdraw) { + flags = GBASerializedVideoFlagsSetMode(flags, 1); + } else if (video->event.callback == _startHblank) { + flags = GBASerializedVideoFlagsSetMode(flags, 2); + } else if (video->event.callback == _midHblank) { + flags = GBASerializedVideoFlagsSetMode(flags, 3); + } + STORE_32(flags, 0, &state->video.flags); STORE_32(video->frameCounter, 0, &state->video.frameCounter); }@@ -341,14 +359,28 @@ GBAStore16(video->p->cpu, BASE_PALETTE_RAM | i, value, 0);
} LOAD_32(video->frameCounter, 0, &state->video.frameCounter); - uint32_t when; - LOAD_32(when, 0, &state->video.nextEvent); + int32_t flags; + LOAD_32(flags, 0, &state->video.flags); GBARegisterDISPSTAT dispstat = state->io[REG_DISPSTAT >> 1]; - if (GBARegisterDISPSTATIsInHblank(dispstat)) { + switch (GBASerializedVideoFlagsGetMode(flags)) { + case 0: + if (GBARegisterDISPSTATIsInHblank(dispstat)) { + video->event.callback = _startHdraw; + } else { + video->event.callback = _startHblank; + } + case 1: video->event.callback = _startHdraw; - } else { + break; + case 2: video->event.callback = _startHblank; + break; + case 3: + video->event.callback = _midHblank; + break; } + uint32_t when; + LOAD_32(when, 0, &state->video.nextEvent); mTimingSchedule(&video->p->timing, &video->event, when); LOAD_16(video->vcount, REG_VCOUNT, state->io);
@@ -137,9 +137,9 @@ color_t color = data[index];
m_ui.color->setColor(0, color); m_ui.color->update(); - uint32_t r = M_R8(color); - uint32_t g = M_G8(color); - uint32_t b = M_B8(color); + uint32_t r = ((color & 0xF8) * 0x21) >> 5; + uint32_t g = (((color >> 8) & 0xF8) * 0x21) >> 5; + uint32_t b = (((color >> 16) & 0xF8) * 0x21) >> 5; m_ui.r->setText(tr("0x%0 (%1)").arg(r, 2, 16, QChar('0')).arg(r, 2, 10, QChar('0'))); m_ui.g->setText(tr("0x%0 (%1)").arg(g, 2, 16, QChar('0')).arg(g, 2, 10, QChar('0'))); m_ui.b->setText(tr("0x%0 (%1)").arg(b, 2, 16, QChar('0')).arg(b, 2, 10, QChar('0')));
@@ -81,9 +81,7 @@ }
controller->m_resetActions.clear(); - if (!controller->m_hwaccel) { - context->core->setVideoBuffer(context->core, reinterpret_cast<color_t*>(controller->m_activeBuffer.data()), controller->screenDimensions().width()); - } + context->core->setVideoBuffer(context->core, reinterpret_cast<color_t*>(controller->m_activeBuffer.data()), controller->screenDimensions().width()); QMetaObject::invokeMethod(controller, "didReset"); controller->finishFrame();@@ -363,14 +361,12 @@ connect(this, &CoreController::logPosted, m_log, &LogController::postLog);
} void CoreController::start() { - if (!m_hwaccel) { - QSize size(256, 384); - m_activeBuffer.resize(size.width() * size.height() * sizeof(color_t)); - m_activeBuffer.fill(0xFF); - m_completeBuffer = m_activeBuffer; + QSize size(256, 384); + m_activeBuffer.resize(size.width() * size.height() * sizeof(color_t)); + m_activeBuffer.fill(0xFF); + m_completeBuffer = m_activeBuffer; - m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast<color_t*>(m_activeBuffer.data()), size.width()); - } + m_threadContext.core->setVideoBuffer(m_threadContext.core, reinterpret_cast<color_t*>(m_activeBuffer.data()), size.width()); if (!m_patched) { mCoreAutoloadPatch(m_threadContext.core);@@ -848,10 +844,22 @@
void CoreController::setFramebufferHandle(int fb) { Interrupter interrupter(this); if (fb < 0) { + if (!m_hwaccel) { + return; + } + mCoreConfigSetIntValue(&m_threadContext.core->config, "hwaccelVideo", 0); + m_threadContext.core->setVideoGLTex(m_threadContext.core, -1); m_hwaccel = false; } else { + mCoreConfigSetIntValue(&m_threadContext.core->config, "hwaccelVideo", 1); m_threadContext.core->setVideoGLTex(m_threadContext.core, fb); + if (m_hwaccel) { + return; + } m_hwaccel = true; + } + if (hasStarted()) { + m_threadContext.core->reloadConfigOption(m_threadContext.core, "hwaccelVideo", NULL); } }
@@ -83,6 +83,7 @@ }
mCore* core = mCoreFindVF(vf); if (!core) { + LOG(QT, ERROR) << tr("Could not load game. Are you sure it's in the correct format?"); return nullptr; }
@@ -578,9 +578,18 @@ if (!supportsShaders()) {
return; } #ifdef BUILD_GLES2 + if (!m_started) { + m_gl->makeCurrent(m_surface); +#if defined(_WIN32) && defined(USE_EPOXY) + epoxy_handle_external_wglMakeCurrent(); +#endif + } if (m_shader.passes) { mGLES2ShaderDetach(reinterpret_cast<mGLES2Context*>(m_backend)); mGLES2ShaderFree(&m_shader); + } + if (!m_started) { + m_gl->doneCurrent(); } #endif }
@@ -45,6 +45,12 @@ }
void LogController::load(const ConfigController* config) { mLogFilterLoad(&m_filter, config->config()); + if (!levels(mLogCategoryById("gba.bios"))) { + mLogFilterSet(&m_filter, "gba.bios", mLOG_STUB | mLOG_FATAL); + } + if (!levels(mLogCategoryById("core.status"))) { + mLogFilterSet(&m_filter, "core.status", mLOG_ALL & ~mLOG_DEBUG); + } setLogFile(config->getOption("logFile")); logToStdout(config->getOption("logToStdout").toInt()); logToFile(config->getOption("logToFile").toInt());@@ -114,7 +120,7 @@ }
void LogController::clearLevels(int category) { auto id = mLogCategoryId(category); - mLogFilterReset (&m_filter, id); + mLogFilterReset(&m_filter, id); } void LogController::logToFile(bool log) {
@@ -487,12 +487,13 @@ emit languageChanged();
} int videoScale = m_controller->getOption("videoScale", 1).toInt(); + saveSetting("videoScale", m_ui.videoScale); + int hwaccelVideo = m_controller->getOption("hwaccelVideo").toInt(); + saveSetting("hwaccelVideo", m_ui.hwaccelVideo->currentIndex()); if (hwaccelVideo != m_ui.hwaccelVideo->currentIndex()) { emit videoRendererChanged(); } - saveSetting("videoScale", m_ui.videoScale); - saveSetting("hwaccelVideo", m_ui.hwaccelVideo->currentIndex()); m_logModel.save(m_controller); m_logModel.logger()->setLogFile(m_ui.logFile->text());
@@ -159,7 +159,11 @@ return false;
} Action* action = item.value()->action(); if (action) { - action->trigger(); + if (m_actions->isHeld(action->name())) { + action->trigger(true); + } else { + action->trigger(!action->isActive()); + } } event->accept(); return true;@@ -170,7 +174,7 @@ if (item == m_buttons.end()) {
return false; } Action* action = item.value()->action(); - if (action) { + if (action && m_actions->isHeld(action->name())) { action->trigger(false); } event->accept();@@ -184,7 +188,15 @@ return false;
} Action* action = item.value()->action(); if (action) { - action->trigger(gae->isNew()); + if (gae->isNew()) { + if (m_actions->isHeld(action->name())) { + action->trigger(true); + } else { + action->trigger(!action->isActive()); + } + } else if (m_actions->isHeld(action->name())) { + action->trigger(false); + } } event->accept(); return true;
@@ -510,7 +510,7 @@ connect(settingsWindow, &SettingsView::displayDriverChanged, this, &Window::reloadDisplayDriver);
connect(settingsWindow, &SettingsView::audioDriverChanged, this, &Window::reloadAudioDriver); connect(settingsWindow, &SettingsView::cameraDriverChanged, this, &Window::mustRestart); connect(settingsWindow, &SettingsView::cameraChanged, &m_inputController, &InputController::setCamera); - connect(settingsWindow, &SettingsView::videoRendererChanged, this, &Window::mustRestart); + connect(settingsWindow, &SettingsView::videoRendererChanged, this, &Window::changeRenderer); connect(settingsWindow, &SettingsView::languageChanged, this, &Window::mustRestart); connect(settingsWindow, &SettingsView::pathsChanged, this, &Window::reloadConfig); #ifdef USE_SQLITE3@@ -926,8 +926,8 @@ crash->show();
} void Window::gameFailed() { - QMessageBox* fail = new QMessageBox(QMessageBox::Warning, tr("Couldn't Load"), - tr("Could not load game. Are you sure it's in the correct format?"), + QMessageBox* fail = new QMessageBox(QMessageBox::Warning, tr("Couldn't Start"), + tr("Could not start game."), QMessageBox::Ok, this, Qt::Sheet); fail->setAttribute(Qt::WA_DeleteOnClose); fail->show();@@ -949,10 +949,6 @@ }
void Window::reloadDisplayDriver() { if (m_controller) { - if (m_controller->hardwareAccelerated()) { - mustRestart(); - return; - } m_display->stopDrawing(); detachWidget(m_display.get()); }@@ -990,14 +986,7 @@ }
#endif if (m_controller) { - connect(m_controller.get(), &CoreController::stateLoaded, m_display.get(), &Display::resizeContext); - connect(m_controller.get(), &CoreController::stateLoaded, m_display.get(), &Display::forceDraw); - connect(m_controller.get(), &CoreController::rewound, m_display.get(), &Display::forceDraw); - connect(m_controller.get(), &CoreController::paused, m_display.get(), &Display::pauseDrawing); - connect(m_controller.get(), &CoreController::unpaused, m_display.get(), &Display::unpauseDrawing); - connect(m_controller.get(), &CoreController::frameAvailable, m_display.get(), &Display::framePosted); - connect(m_controller.get(), &CoreController::statusPosted, m_display.get(), &Display::showMessage); - connect(m_controller.get(), &CoreController::didReset, m_display.get(), &Display::resizeContext); + attachDisplay(); attachWidget(m_display.get()); m_display->startDrawing(m_controller);@@ -1028,6 +1017,27 @@ connect(m_controller.get(), &CoreController::stopping, m_audioProcessor.get(), &AudioProcessor::stop);
connect(m_controller.get(), &CoreController::fastForwardChanged, m_audioProcessor.get(), &AudioProcessor::inputParametersChanged); } +void Window::changeRenderer() { + if (!m_controller) { + return; + } + if (m_config->getOption("hwaccelVideo").toInt() && m_display->supportsShaders() && m_controller->supportsFeature(CoreController::Feature::OPENGL)) { + std::shared_ptr<VideoProxy> proxy = m_display->videoProxy(); + if (!proxy) { + proxy = std::make_shared<VideoProxy>(); + } + m_display->setVideoProxy(proxy); + proxy->attach(m_controller.get()); + + int fb = m_display->framebufferHandle(); + if (fb >= 0) { + m_controller->setFramebufferHandle(fb); + } + } else { + m_controller->setFramebufferHandle(-1); + } +} + void Window::tryMakePortable() { QMessageBox* confirm = new QMessageBox(QMessageBox::Question, tr("Really make portable?"), tr("This will make the emulator load its configuration from the same directory as the executable. Do you want to continue?"),@@ -1267,10 +1277,10 @@ m_actions.addAction(tr("Load camera image..."), "loadCamImage", this, &Window::loadCamImage, "file");
#ifdef M_CORE_GBA m_actions.addSeparator("file"); - Action* importShark = addGameAction(tr("Import GameShark Save"), "importShark", this, &Window::importSharkport, "file"); + Action* importShark = addGameAction(tr("Import GameShark Save..."), "importShark", this, &Window::importSharkport, "file"); m_platformActions.insert(PLATFORM_GBA, importShark); - Action* exportShark = addGameAction(tr("Export GameShark Save"), "exportShark", this, &Window::exportSharkport, "file"); + Action* exportShark = addGameAction(tr("Export GameShark Save..."), "exportShark", this, &Window::exportSharkport, "file"); m_platformActions.insert(PLATFORM_GBA, exportShark); #endif@@ -1828,7 +1838,6 @@ }
void Window::setController(CoreController* controller, const QString& fname) { if (!controller) { - gameFailed(); return; } if (m_pendingClose) {@@ -1849,17 +1858,6 @@ }
if (!m_display) { reloadDisplayDriver(); - } - - if (m_config->getOption("hwaccelVideo").toInt() && m_display->supportsShaders() && controller->supportsFeature(CoreController::Feature::OPENGL)) { - std::shared_ptr<VideoProxy> proxy = std::make_shared<VideoProxy>(); - m_display->setVideoProxy(proxy); - proxy->attach(controller); - - int fb = m_display->framebufferHandle(); - if (fb >= 0) { - controller->setFramebufferHandle(fb); - } } m_controller = std::shared_ptr<CoreController>(controller);@@ -1901,14 +1899,7 @@ connect(m_controller.get(), &CoreController::unpaused, [this]() {
emit paused(false); }); - connect(m_controller.get(), &CoreController::stateLoaded, m_display.get(), &Display::resizeContext); - connect(m_controller.get(), &CoreController::stateLoaded, m_display.get(), &Display::forceDraw); - connect(m_controller.get(), &CoreController::rewound, m_display.get(), &Display::forceDraw); - connect(m_controller.get(), &CoreController::paused, m_display.get(), &Display::pauseDrawing); - connect(m_controller.get(), &CoreController::unpaused, m_display.get(), &Display::unpauseDrawing); - connect(m_controller.get(), &CoreController::frameAvailable, m_display.get(), &Display::framePosted); - connect(m_controller.get(), &CoreController::statusPosted, m_display.get(), &Display::showMessage); - connect(m_controller.get(), &CoreController::didReset, m_display.get(), &Display::resizeContext); + attachDisplay(); connect(m_controller.get(), &CoreController::unpaused, &m_inputController, &InputController::suspendScreensaver); connect(m_controller.get(), &CoreController::frameAvailable, this, &Window::recordFrame);@@ -1963,6 +1954,18 @@ if (m_pendingPause) {
m_controller->setPaused(true); m_pendingPause = false; } +} + +void Window::attachDisplay() { + connect(m_controller.get(), &CoreController::stateLoaded, m_display.get(), &Display::resizeContext); + connect(m_controller.get(), &CoreController::stateLoaded, m_display.get(), &Display::forceDraw); + connect(m_controller.get(), &CoreController::rewound, m_display.get(), &Display::forceDraw); + connect(m_controller.get(), &CoreController::paused, m_display.get(), &Display::pauseDrawing); + connect(m_controller.get(), &CoreController::unpaused, m_display.get(), &Display::unpauseDrawing); + connect(m_controller.get(), &CoreController::frameAvailable, m_display.get(), &Display::framePosted); + connect(m_controller.get(), &CoreController::statusPosted, m_display.get(), &Display::showMessage); + connect(m_controller.get(), &CoreController::didReset, m_display.get(), &Display::resizeContext); + changeRenderer(); } WindowBackground::WindowBackground(QWidget* parent)
@@ -130,6 +130,7 @@ void unimplementedBiosCall(int);
void reloadAudioDriver(); void reloadDisplayDriver(); + void changeRenderer(); void tryMakePortable(); void mustRestart();@@ -155,6 +156,7 @@ void clearMRU();
void updateMRU(); void openView(QWidget* widget); + void attachDisplay(); template <typename T, typename... A> std::function<void()> openTView(A... arg); template <typename T, typename... A> std::function<void()> openControllerTView(A... arg);
@@ -387,9 +387,21 @@ void InputController::setPreferredGamepad(uint32_t type, int index) {
if (!m_config) { return; } +#ifdef BUILD_SDL char name[34] = {0}; +#if SDL_VERSION_ATLEAST(2, 0, 0) SDL_JoystickGetGUIDString(SDL_JoystickGetGUID(SDL_JoystickListGetPointer(&s_sdlEvents.joysticks, index)->joystick), name, sizeof(name)); +#else + const char* name = SDL_JoystickName(SDL_JoystickIndex(SDL_JoystickListGetPointer(&s_sdlEvents.joysticks, index)->joystick)); + if (!name) { + return; + } +#endif mInputSetPreferredDevice(m_config->input(), "gba", type, m_playerId, name); +#else + UNUSED(type); + UNUSED(index); +#endif } mRumble* InputController::rumble() {
@@ -0,0 +1,5383 @@
+<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="ru_RU" sourcelanguage="en_US"> +<context> + <name>AboutScreen</name> + <message> + <location filename="../AboutScreen.ui" line="14"/> + <source>About</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="23"/> + <source><a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="41"/> + <source>Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="58"/> + <source>{projectName}</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="68"/> + <source>{projectName} would like to thank the following patrons from Patreon:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="86"/> + <source>© 2013 – 2020 Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 +Game Boy Advance is a registered trademark of Nintendo Co., Ltd.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="106"/> + <source>{projectVersion}</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="155"/> + <source>{logo}</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="177"/> + <source>{projectName} is an open-source Game Boy Advance emulator</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="190"/> + <source>{patrons}</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ArchiveInspector</name> + <message> + <location filename="../ArchiveInspector.ui" line="14"/> + <source>Open in archive...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ArchiveInspector.ui" line="20"/> + <source>Loading...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AssetTile</name> + <message> + <location filename="../AssetTile.ui" line="20"/> + <source>AssetTile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="41"/> + <source>Tile #</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="48"/> + <location filename="../AssetTile.ui" line="72"/> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="65"/> + <source>Palette #</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="86"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="93"/> + <source>0x06000000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="135"/> + <source>Red</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="142"/> + <source>Green</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="149"/> + <source>Blue</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="163"/> + <location filename="../AssetTile.ui" line="170"/> + <location filename="../AssetTile.ui" line="177"/> + <source>0x00 (00)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>BattleChipView</name> + <message> + <location filename="../BattleChipView.ui" line="14"/> + <source>BattleChip Gate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="67"/> + <source>Chip name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="76"/> + <source>Insert</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="87"/> + <source>Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="94"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="114"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="121"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="138"/> + <source>Gate type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="145"/> + <source>Ba&ttleChip Gate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="155"/> + <source>Progress &Gate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="162"/> + <source>Beast &Link Gate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="180"/> + <source>Inserted</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="194"/> + <source>Chip ID</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="207"/> + <source>Update Chip data</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.ui" line="219"/> + <source>Show advanced</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>CheatsView</name> + <message> + <location filename="../CheatsView.ui" line="14"/> + <source>Cheats</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.ui" line="20"/> + <source>Remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.ui" line="34"/> + <source>Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.ui" line="41"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.ui" line="48"/> + <source>Add New Set</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.ui" line="55"/> + <source>Add</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.ui" line="95"/> + <source>Enter codes here...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>DebuggerConsole</name> + <message> + <location filename="../DebuggerConsole.ui" line="14"/> + <source>Debugger</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../DebuggerConsole.ui" line="25"/> + <source>Enter command (try `help` for more info)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../DebuggerConsole.ui" line="32"/> + <source>Break</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>FrameView</name> + <message> + <location filename="../FrameView.ui" line="14"/> + <source>Inspect frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.ui" line="28"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.ui" line="41"/> + <source>Magnification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.ui" line="50"/> + <source>Freeze frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.ui" line="84"/> + <source>Backdrop color</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.ui" line="132"/> + <source>Disable scanline effects</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.ui" line="145"/> + <source>Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.ui" line="152"/> + <source>Reset</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>GIFView</name> + <message> + <location filename="../GIFView.ui" line="14"/> + <source>Record GIF</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GIFView.ui" line="36"/> + <source>Frameskip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GIFView.ui" line="68"/> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GIFView.ui" line="84"/> + <source>Stop</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GIFView.ui" line="110"/> + <source>Select File</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>IOViewer</name> + <message> + <location filename="../IOViewer.ui" line="14"/> + <source>I/O Viewer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="26"/> + <source>0x0000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="58"/> + <source>2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="82"/> + <source>5</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="100"/> + <source>4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="118"/> + <source>7</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="136"/> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="157"/> + <source>9</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="178"/> + <source>1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="196"/> + <source>3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="217"/> + <source>8</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="241"/> + <source>C</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="259"/> + <source>E</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="283"/> + <source>6</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="310"/> + <source>D</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="328"/> + <source>F</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="346"/> + <source>A</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.ui" line="364"/> + <source>B</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LibraryTree</name> + <message> + <location filename="../library/LibraryTree.cpp" line="46"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../library/LibraryTree.cpp" line="47"/> + <source>Location</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../library/LibraryTree.cpp" line="48"/> + <source>Platform</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../library/LibraryTree.cpp" line="49"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../library/LibraryTree.cpp" line="50"/> + <source>CRC32</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LoadSaveState</name> + <message> + <location filename="../LoadSaveState.ui" line="14"/> + <location filename="../LoadSaveState.ui" line="66"/> + <source>%1 State</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="41"/> + <location filename="../LoadSaveState.ui" line="85"/> + <location filename="../LoadSaveState.ui" line="107"/> + <location filename="../LoadSaveState.ui" line="129"/> + <location filename="../LoadSaveState.ui" line="151"/> + <location filename="../LoadSaveState.ui" line="173"/> + <location filename="../LoadSaveState.ui" line="195"/> + <location filename="../LoadSaveState.ui" line="217"/> + <location filename="../LoadSaveState.ui" line="239"/> + <source>No Save</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="50"/> + <source>5</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="94"/> + <source>6</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="116"/> + <source>8</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="138"/> + <source>4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="160"/> + <source>1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="182"/> + <source>3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="204"/> + <source>7</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="226"/> + <source>9</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="248"/> + <source>2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="261"/> + <source>Cancel</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LogView</name> + <message> + <location filename="../LogView.ui" line="14"/> + <source>Logs</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="22"/> + <source>Enabled Levels</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="28"/> + <source>Debug</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="38"/> + <source>Stub</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="48"/> + <source>Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="58"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="68"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="78"/> + <source>Fatal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="95"/> + <source>Game Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="121"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogView.ui" line="130"/> + <source>Max Lines</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MapView</name> + <message> + <location filename="../MapView.ui" line="14"/> + <source>Maps</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.ui" line="30"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.ui" line="43"/> + <source>Magnification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.ui" line="124"/> + <source>Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.ui" line="139"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MemoryDump</name> + <message> + <location filename="../MemoryDump.ui" line="14"/> + <source>Save Memory Range</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryDump.ui" line="20"/> + <source>Start Address:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryDump.ui" line="42"/> + <source>:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryDump.ui" line="58"/> + <location filename="../MemoryDump.ui" line="89"/> + <source>0x</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryDump.ui" line="76"/> + <source>Byte Count:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryDump.ui" line="108"/> + <source>Dump across banks</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MemorySearch</name> + <message> + <location filename="../MemorySearch.ui" line="26"/> + <source>Memory Search</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="51"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="56"/> + <source>Current Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="61"/> + <location filename="../MemorySearch.ui" line="81"/> + <source>Type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="71"/> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="88"/> + <source>Numeric</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="101"/> + <source>Text</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="118"/> + <source>Width</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="125"/> + <location filename="../MemorySearch.ui" line="185"/> + <source>Guess</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="138"/> + <source>1 Byte (8-bit)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="148"/> + <source>2 Bytes (16-bit)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="158"/> + <source>4 Bytes (32-bit)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="178"/> + <source>Number type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="195"/> + <source>Decimal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="202"/> + <source>Hexadecimal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="216"/> + <source>Search type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="223"/> + <source>Equal to value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="236"/> + <source>Greater than value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="246"/> + <source>Less than value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="256"/> + <source>Unknown/changed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="269"/> + <source>Changed by value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="282"/> + <source>Unchanged</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="295"/> + <source>Increased</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="308"/> + <source>Decreased</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="318"/> + <source>Search ROM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="336"/> + <source>New Search</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="343"/> + <source>Search Within</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="350"/> + <source>Open in Memory Viewer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.ui" line="357"/> + <source>Refresh</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>MemoryView</name> + <message> + <location filename="../MemoryView.ui" line="14"/> + <source>Memory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="38"/> + <source>Inspect Address:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="58"/> + <source>:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="68"/> + <source>0x</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="88"/> + <source>Set Alignment:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="108"/> + <source>&1 Byte</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="131"/> + <source>&2 Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="151"/> + <source>&4 Bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="187"/> + <source>Unsigned Integer:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="205"/> + <source>Signed Integer:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="223"/> + <source>String:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="237"/> + <source>Load TBL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="250"/> + <source>Copy Selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="257"/> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="277"/> + <source>Save Selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="284"/> + <source>Save Range</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="291"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ObjView</name> + <message> + <location filename="../ObjView.ui" line="14"/> + <source>Sprites</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="20"/> + <source>Copy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="27"/> + <source>Geometry</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="35"/> + <source>Position</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="61"/> + <location filename="../ObjView.ui" line="87"/> + <location filename="../ObjView.ui" line="278"/> + <location filename="../ObjView.ui" line="508"/> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="71"/> + <source>, </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="101"/> + <source>Dimensions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="127"/> + <location filename="../ObjView.ui" line="153"/> + <source>8</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="137"/> + <location filename="../ObjView.ui" line="568"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="205"/> + <source>Tile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="212"/> + <source>Export</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="219"/> + <source>Attributes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="227"/> + <source>Transform</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="247"/> + <source>Off</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="258"/> + <source>Palette</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="292"/> + <source>Double Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="318"/> + <location filename="../ObjView.ui" line="362"/> + <location filename="../ObjView.ui" line="375"/> + <location filename="../ObjView.ui" line="443"/> + <source>Return, Ctrl+R</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="336"/> + <source>Flipped</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="359"/> + <source>H</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="372"/> + <source>V</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="386"/> + <source>Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="406"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="417"/> + <source>Mosaic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="454"/> + <source>Enabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="488"/> + <source>Priority</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="538"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="545"/> + <source>0x07000000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="581"/> + <source>Magnification</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>OverrideView</name> + <message> + <location filename="../OverrideView.ui" line="20"/> + <source>Game Overrides</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="30"/> + <source>Game Boy Advance</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="42"/> + <location filename="../OverrideView.ui" line="121"/> + <location filename="../OverrideView.ui" line="248"/> + <location filename="../OverrideView.ui" line="284"/> + <source>Autodetect</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="55"/> + <source>Realtime clock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="65"/> + <source>Gyroscope</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="75"/> + <source>Tilt</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="85"/> + <source>Light sensor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="95"/> + <source>Rumble</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="113"/> + <source>Save type</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="126"/> + <location filename="../OverrideView.ui" line="289"/> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="131"/> + <source>SRAM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="136"/> + <source>Flash 512kb</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="141"/> + <source>Flash 1Mb</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="146"/> + <source>EEPROM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="154"/> + <source>Idle loop</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="195"/> + <source>Game Boy Player features</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="234"/> + <source>Game Boy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="240"/> + <source>Game Boy model</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="253"/> + <source>Game Boy (DMG)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="258"/> + <source>Super Game Boy (SGB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="263"/> + <source>Game Boy Color (CGB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="268"/> + <source>Game Boy Advance (AGB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="276"/> + <source>Memory bank controller</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="294"/> + <source>MBC1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="299"/> + <source>MBC2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="304"/> + <source>MBC3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="309"/> + <source>MBC3 + RTC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="314"/> + <source>MBC5</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="319"/> + <source>MBC5 + Rumble</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="324"/> + <source>MBC6</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="329"/> + <source>MBC7</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="334"/> + <source>MMM01</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="339"/> + <source>Pocket Cam</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="344"/> + <source>TAMA5</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="349"/> + <source>HuC-1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="354"/> + <source>HuC-3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="362"/> + <source>Background Colors</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="449"/> + <source>Sprite Colors 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../OverrideView.ui" line="456"/> + <source>Sprite Colors 2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PaletteView</name> + <message> + <location filename="../PaletteView.ui" line="14"/> + <source>Palette</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="44"/> + <source>Background</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="94"/> + <source>Objects</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="153"/> + <source>Selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="184"/> + <source>Red</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="191"/> + <source>Green</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="198"/> + <source>Blue</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="212"/> + <location filename="../PaletteView.ui" line="219"/> + <location filename="../PaletteView.ui" line="226"/> + <source>0x00 (00)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="244"/> + <source>16-bit value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="251"/> + <source>Hex code</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="258"/> + <source>Palette index</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="272"/> + <source>0x0000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="282"/> + <source>#000000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="292"/> + <source>000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="322"/> + <source>Export BG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.ui" line="342"/> + <source>Export OBJ</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PlacementControl</name> + <message> + <location filename="../PlacementControl.ui" line="20"/> + <source>Adjust placement</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="26"/> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="65"/> + <source>Offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="72"/> + <source>X</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PlacementControl.ui" line="79"/> + <source>Y</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>PrinterView</name> + <message> + <location filename="../PrinterView.ui" line="14"/> + <source>Game Boy Printer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PrinterView.ui" line="130"/> + <source>Hurry up!</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PrinterView.ui" line="137"/> + <source>Tear off</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PrinterView.ui" line="167"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PrinterView.ui" line="180"/> + <source>Magnification</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::AssetTile</name> + <message> + <location filename="../AssetTile.cpp" line="104"/> + <source>%0%1%2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.cpp" line="143"/> + <location filename="../AssetTile.cpp" line="144"/> + <location filename="../AssetTile.cpp" line="145"/> + <source>0x%0 (%1)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::AudioDevice</name> + <message> + <location filename="../AudioDevice.cpp" line="26"/> + <source>Can't set format of context-less audio device</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AudioDevice.cpp" line="48"/> + <source>Audio device is missing its core</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AudioDevice.cpp" line="64"/> + <source>Writing data to read-only audio device</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::AudioProcessorQt</name> + <message> + <location filename="../AudioProcessorQt.cpp" line="43"/> + <source>Can't start an audio processor without input</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::AudioProcessorSDL</name> + <message> + <location filename="../AudioProcessorSDL.cpp" line="34"/> + <source>Can't start an audio processor without input</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::BattleChipView</name> + <message> + <location filename="../BattleChipView.cpp" line="114"/> + <source>BattleChip data missing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.cpp" line="115"/> + <source>BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.cpp" line="181"/> + <location filename="../BattleChipView.cpp" line="200"/> + <source>Select deck file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.cpp" line="212"/> + <source>Incompatible deck</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../BattleChipView.cpp" line="213"/> + <source>The selected deck is not compatible with this Chip Gate</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::CheatsModel</name> + <message> + <location filename="../CheatsModel.cpp" line="54"/> + <source>(untitled)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsModel.cpp" line="213"/> + <source>Failed to open cheats file: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::CheatsView</name> + <message> + <location filename="../CheatsView.cpp" line="49"/> + <location filename="../CheatsView.cpp" line="74"/> + <source>Add GameShark</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="55"/> + <source>Add Pro Action Replay</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="61"/> + <source>Add CodeBreaker</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="80"/> + <source>Add GameGenie</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="112"/> + <location filename="../CheatsView.cpp" line="119"/> + <source>Select cheats file</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::CoreController</name> + <message> + <location filename="../CoreController.cpp" line="593"/> + <source>Failed to open save file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CoreController.cpp" line="622"/> + <source>Failed to open game file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CoreController.cpp" line="694"/> + <source>Failed to open snapshot file for reading: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../CoreController.cpp" line="710"/> + <source>Failed to open snapshot file for writing: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::CoreManager</name> + <message> + <location filename="../CoreManager.cpp" line="54"/> + <source>Failed to open game file: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::FrameView</name> + <message> + <location filename="../FrameView.cpp" line="430"/> + <source>Export frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.cpp" line="431"/> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.cpp" line="449"/> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.cpp" line="451"/> + <source>Background</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.cpp" line="454"/> + <source>Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.cpp" line="457"/> + <source>Sprite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.cpp" line="460"/> + <source>Backdrop</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../FrameView.cpp" line="466"/> + <source>%1 %2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::GBAApp</name> + <message> + <location filename="../GBAApp.cpp" line="69"/> + <source>Enable Discord Rich Presence</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::GBAKeyEditor</name> + <message> + <location filename="../GBAKeyEditor.cpp" line="68"/> + <source>Clear Button</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GBAKeyEditor.cpp" line="80"/> + <source>Clear Analog</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GBAKeyEditor.cpp" line="91"/> + <source>Refresh</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GBAKeyEditor.cpp" line="101"/> + <source>Set all</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::GDBWindow</name> + <message> + <location filename="../GDBWindow.cpp" line="28"/> + <source>Server settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="34"/> + <source>Local port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="36"/> + <source>Bind address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="55"/> + <source>Break</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="104"/> + <source>Stop</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="114"/> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="122"/> + <source>Crash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="122"/> + <source>Could not start GDB server</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::GIFView</name> + <message> + <location filename="../GIFView.cpp" line="49"/> + <source>Failed to open output GIF file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GIFView.cpp" line="67"/> + <source>Select output file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GIFView.cpp" line="67"/> + <source>Graphics Interchange Format (*.gif)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::IOViewer</name> + <message> + <location filename="../IOViewer.cpp" line="30"/> + <source>Background mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="31"/> + <source>Mode 0: 4 tile layers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="32"/> + <source>Mode 1: 2 tile layers + 1 rotated/scaled tile layer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="33"/> + <source>Mode 2: 2 rotated/scaled tile layers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="34"/> + <source>Mode 3: Full 15-bit bitmap</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="35"/> + <source>Mode 4: Full 8-bit bitmap</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="36"/> + <source>Mode 5: Small 15-bit bitmap</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="40"/> + <source>CGB Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="41"/> + <source>Frame select</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="42"/> + <source>Unlocked HBlank</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="43"/> + <source>Linear OBJ tile mapping</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="44"/> + <source>Force blank screen</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="45"/> + <source>Enable background 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="46"/> + <source>Enable background 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="47"/> + <source>Enable background 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="48"/> + <source>Enable background 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="49"/> + <source>Enable OBJ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="50"/> + <source>Enable Window 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="51"/> + <source>Enable Window 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="52"/> + <source>Enable OBJ Window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="58"/> + <source>Currently in VBlank</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="59"/> + <source>Currently in HBlank</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="60"/> + <source>Currently in VCounter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="61"/> + <source>Enable VBlank IRQ generation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="62"/> + <source>Enable HBlank IRQ generation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="63"/> + <source>Enable VCounter IRQ generation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="64"/> + <source>VCounter scanline</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="68"/> + <source>Current scanline</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="72"/> + <location filename="../IOViewer.cpp" line="81"/> + <location filename="../IOViewer.cpp" line="90"/> + <location filename="../IOViewer.cpp" line="100"/> + <source>Priority</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="73"/> + <location filename="../IOViewer.cpp" line="82"/> + <location filename="../IOViewer.cpp" line="91"/> + <location filename="../IOViewer.cpp" line="101"/> + <source>Tile data base (* 16kB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="74"/> + <location filename="../IOViewer.cpp" line="83"/> + <location filename="../IOViewer.cpp" line="92"/> + <location filename="../IOViewer.cpp" line="102"/> + <source>Enable mosaic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="75"/> + <location filename="../IOViewer.cpp" line="84"/> + <location filename="../IOViewer.cpp" line="93"/> + <location filename="../IOViewer.cpp" line="103"/> + <source>Enable 256-color</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="76"/> + <location filename="../IOViewer.cpp" line="85"/> + <location filename="../IOViewer.cpp" line="94"/> + <location filename="../IOViewer.cpp" line="104"/> + <source>Tile map base (* 2kB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="77"/> + <location filename="../IOViewer.cpp" line="86"/> + <location filename="../IOViewer.cpp" line="96"/> + <location filename="../IOViewer.cpp" line="106"/> + <source>Background dimensions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="95"/> + <location filename="../IOViewer.cpp" line="105"/> + <source>Overflow wraps</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="110"/> + <location filename="../IOViewer.cpp" line="118"/> + <location filename="../IOViewer.cpp" line="126"/> + <location filename="../IOViewer.cpp" line="134"/> + <source>Horizontal offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="114"/> + <location filename="../IOViewer.cpp" line="122"/> + <location filename="../IOViewer.cpp" line="130"/> + <location filename="../IOViewer.cpp" line="138"/> + <source>Vertical offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="142"/> + <location filename="../IOViewer.cpp" line="147"/> + <location filename="../IOViewer.cpp" line="152"/> + <location filename="../IOViewer.cpp" line="157"/> + <location filename="../IOViewer.cpp" line="162"/> + <location filename="../IOViewer.cpp" line="171"/> + <location filename="../IOViewer.cpp" line="180"/> + <location filename="../IOViewer.cpp" line="185"/> + <location filename="../IOViewer.cpp" line="190"/> + <location filename="../IOViewer.cpp" line="195"/> + <location filename="../IOViewer.cpp" line="200"/> + <location filename="../IOViewer.cpp" line="209"/> + <source>Fractional part</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="143"/> + <location filename="../IOViewer.cpp" line="148"/> + <location filename="../IOViewer.cpp" line="153"/> + <location filename="../IOViewer.cpp" line="158"/> + <location filename="../IOViewer.cpp" line="181"/> + <location filename="../IOViewer.cpp" line="186"/> + <location filename="../IOViewer.cpp" line="191"/> + <location filename="../IOViewer.cpp" line="196"/> + <source>Integer part</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="163"/> + <location filename="../IOViewer.cpp" line="172"/> + <location filename="../IOViewer.cpp" line="201"/> + <location filename="../IOViewer.cpp" line="210"/> + <source>Integer part (bottom)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="167"/> + <location filename="../IOViewer.cpp" line="176"/> + <location filename="../IOViewer.cpp" line="205"/> + <location filename="../IOViewer.cpp" line="214"/> + <source>Integer part (top)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="218"/> + <location filename="../IOViewer.cpp" line="223"/> + <source>End x</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="219"/> + <location filename="../IOViewer.cpp" line="224"/> + <source>Start x</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="228"/> + <location filename="../IOViewer.cpp" line="233"/> + <source>End y</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="229"/> + <location filename="../IOViewer.cpp" line="234"/> + <source>Start y</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="238"/> + <source>Window 0 enable BG 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="239"/> + <source>Window 0 enable BG 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="240"/> + <source>Window 0 enable BG 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="241"/> + <source>Window 0 enable BG 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="242"/> + <source>Window 0 enable OBJ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="243"/> + <source>Window 0 enable blend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="244"/> + <source>Window 1 enable BG 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="245"/> + <source>Window 1 enable BG 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="246"/> + <source>Window 1 enable BG 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="247"/> + <source>Window 1 enable BG 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="248"/> + <source>Window 1 enable OBJ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="249"/> + <source>Window 1 enable blend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="253"/> + <source>Outside window enable BG 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="254"/> + <source>Outside window enable BG 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="255"/> + <source>Outside window enable BG 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="256"/> + <source>Outside window enable BG 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="257"/> + <source>Outside window enable OBJ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="258"/> + <source>Outside window enable blend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="259"/> + <source>OBJ window enable BG 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="260"/> + <source>OBJ window enable BG 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="261"/> + <source>OBJ window enable BG 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="262"/> + <source>OBJ window enable BG 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="263"/> + <source>OBJ window enable OBJ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="264"/> + <source>OBJ window enable blend</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="268"/> + <source>Background mosaic size vertical</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="269"/> + <source>Background mosaic size horizontal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="270"/> + <source>Object mosaic size vertical</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="271"/> + <source>Object mosaic size horizontal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="277"/> + <source>BG 0 target 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="278"/> + <source>BG 1 target 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="279"/> + <source>BG 2 target 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="280"/> + <source>BG 3 target 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="281"/> + <source>OBJ target 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="282"/> + <source>Backdrop target 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="283"/> + <source>Blend mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="284"/> + <source>Disabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="285"/> + <source>Additive blending</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="286"/> + <source>Brighten</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="287"/> + <source>Darken</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="289"/> + <source>BG 0 target 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="290"/> + <source>BG 1 target 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="291"/> + <source>BG 2 target 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="292"/> + <source>BG 3 target 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="293"/> + <source>OBJ target 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="294"/> + <source>Backdrop target 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="298"/> + <source>Blend A (target 1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="299"/> + <source>Blend B (target 2)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="303"/> + <source>Blend Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="317"/> + <source>Sweep shifts</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="318"/> + <source>Sweep subtract</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="319"/> + <source>Sweep time (in 1/128s)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="323"/> + <location filename="../IOViewer.cpp" line="339"/> + <location filename="../IOViewer.cpp" line="363"/> + <location filename="../IOViewer.cpp" line="385"/> + <source>Sound length</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="324"/> + <location filename="../IOViewer.cpp" line="340"/> + <source>Duty cycle</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="325"/> + <location filename="../IOViewer.cpp" line="341"/> + <location filename="../IOViewer.cpp" line="386"/> + <source>Envelope step time</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="326"/> + <location filename="../IOViewer.cpp" line="342"/> + <location filename="../IOViewer.cpp" line="387"/> + <source>Envelope increase</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="327"/> + <location filename="../IOViewer.cpp" line="343"/> + <location filename="../IOViewer.cpp" line="388"/> + <source>Initial volume</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="331"/> + <location filename="../IOViewer.cpp" line="349"/> + <location filename="../IOViewer.cpp" line="377"/> + <source>Sound frequency</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="332"/> + <location filename="../IOViewer.cpp" line="350"/> + <location filename="../IOViewer.cpp" line="378"/> + <location filename="../IOViewer.cpp" line="400"/> + <source>Timed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="333"/> + <location filename="../IOViewer.cpp" line="351"/> + <location filename="../IOViewer.cpp" line="379"/> + <location filename="../IOViewer.cpp" line="401"/> + <source>Reset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="357"/> + <source>Double-size wave table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="358"/> + <source>Active wave table</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="359"/> + <source>Enable channel 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="364"/> + <source>Volume</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="365"/> + <source>0%</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="366"/> + <location filename="../IOViewer.cpp" line="423"/> + <source>100%</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="367"/> + <location filename="../IOViewer.cpp" line="422"/> + <source>50%</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="368"/> + <location filename="../IOViewer.cpp" line="421"/> + <source>25%</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="369"/> + <location filename="../IOViewer.cpp" line="370"/> + <location filename="../IOViewer.cpp" line="371"/> + <location filename="../IOViewer.cpp" line="372"/> + <source>75%</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="394"/> + <source>Clock divider</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="395"/> + <source>Register stages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="396"/> + <source>15</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="397"/> + <source>7</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="399"/> + <source>Shifter frequency</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="407"/> + <source>PSG volume right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="408"/> + <source>PSG volume left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="409"/> + <source>Enable channel 1 right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="410"/> + <source>Enable channel 2 right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="411"/> + <source>Enable channel 3 right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="412"/> + <source>Enable channel 4 right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="413"/> + <source>Enable channel 1 left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="414"/> + <source>Enable channel 2 left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="415"/> + <source>Enable channel 3 left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="416"/> + <source>Enable channel 4 left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="420"/> + <source>PSG master volume</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="426"/> + <source>Loud channel A</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="427"/> + <source>Loud channel B</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="428"/> + <source>Enable channel A right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="429"/> + <source>Enable channel A left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="430"/> + <source>Channel A timer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="431"/> + <location filename="../IOViewer.cpp" line="438"/> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="432"/> + <location filename="../IOViewer.cpp" line="439"/> + <location filename="../IOViewer.cpp" line="768"/> + <location filename="../IOViewer.cpp" line="783"/> + <location filename="../IOViewer.cpp" line="799"/> + <location filename="../IOViewer.cpp" line="815"/> + <location filename="../IOViewer.cpp" line="987"/> + <location filename="../IOViewer.cpp" line="997"/> + <location filename="../IOViewer.cpp" line="1007"/> + <source>1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="434"/> + <source>Channel A reset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="435"/> + <source>Enable channel B right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="436"/> + <source>Enable channel B left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="437"/> + <source>Channel B timer</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="441"/> + <source>Channel B reset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="445"/> + <source>Active channel 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="446"/> + <source>Active channel 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="447"/> + <source>Active channel 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="448"/> + <source>Active channel 4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="449"/> + <source>Enable audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="455"/> + <source>Bias</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="456"/> + <source>Resolution</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="466"/> + <location filename="../IOViewer.cpp" line="467"/> + <location filename="../IOViewer.cpp" line="468"/> + <location filename="../IOViewer.cpp" line="469"/> + <location filename="../IOViewer.cpp" line="473"/> + <location filename="../IOViewer.cpp" line="474"/> + <location filename="../IOViewer.cpp" line="475"/> + <location filename="../IOViewer.cpp" line="476"/> + <location filename="../IOViewer.cpp" line="480"/> + <location filename="../IOViewer.cpp" line="481"/> + <location filename="../IOViewer.cpp" line="482"/> + <location filename="../IOViewer.cpp" line="483"/> + <location filename="../IOViewer.cpp" line="487"/> + <location filename="../IOViewer.cpp" line="488"/> + <location filename="../IOViewer.cpp" line="489"/> + <location filename="../IOViewer.cpp" line="490"/> + <location filename="../IOViewer.cpp" line="494"/> + <location filename="../IOViewer.cpp" line="495"/> + <location filename="../IOViewer.cpp" line="496"/> + <location filename="../IOViewer.cpp" line="497"/> + <location filename="../IOViewer.cpp" line="501"/> + <location filename="../IOViewer.cpp" line="502"/> + <location filename="../IOViewer.cpp" line="503"/> + <location filename="../IOViewer.cpp" line="504"/> + <location filename="../IOViewer.cpp" line="508"/> + <location filename="../IOViewer.cpp" line="509"/> + <location filename="../IOViewer.cpp" line="510"/> + <location filename="../IOViewer.cpp" line="511"/> + <location filename="../IOViewer.cpp" line="515"/> + <location filename="../IOViewer.cpp" line="516"/> + <location filename="../IOViewer.cpp" line="517"/> + <location filename="../IOViewer.cpp" line="518"/> + <location filename="../IOViewer.cpp" line="522"/> + <location filename="../IOViewer.cpp" line="523"/> + <location filename="../IOViewer.cpp" line="527"/> + <location filename="../IOViewer.cpp" line="528"/> + <location filename="../IOViewer.cpp" line="532"/> + <location filename="../IOViewer.cpp" line="533"/> + <location filename="../IOViewer.cpp" line="537"/> + <location filename="../IOViewer.cpp" line="538"/> + <source>Sample</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="550"/> + <location filename="../IOViewer.cpp" line="558"/> + <location filename="../IOViewer.cpp" line="595"/> + <location filename="../IOViewer.cpp" line="603"/> + <location filename="../IOViewer.cpp" line="640"/> + <location filename="../IOViewer.cpp" line="648"/> + <location filename="../IOViewer.cpp" line="685"/> + <location filename="../IOViewer.cpp" line="693"/> + <source>Address (bottom)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="554"/> + <location filename="../IOViewer.cpp" line="562"/> + <location filename="../IOViewer.cpp" line="599"/> + <location filename="../IOViewer.cpp" line="607"/> + <location filename="../IOViewer.cpp" line="644"/> + <location filename="../IOViewer.cpp" line="652"/> + <location filename="../IOViewer.cpp" line="689"/> + <location filename="../IOViewer.cpp" line="697"/> + <source>Address (top)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="566"/> + <location filename="../IOViewer.cpp" line="611"/> + <location filename="../IOViewer.cpp" line="656"/> + <location filename="../IOViewer.cpp" line="701"/> + <source>Word count</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="570"/> + <location filename="../IOViewer.cpp" line="615"/> + <location filename="../IOViewer.cpp" line="660"/> + <location filename="../IOViewer.cpp" line="705"/> + <source>Destination offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="571"/> + <location filename="../IOViewer.cpp" line="577"/> + <location filename="../IOViewer.cpp" line="616"/> + <location filename="../IOViewer.cpp" line="622"/> + <location filename="../IOViewer.cpp" line="661"/> + <location filename="../IOViewer.cpp" line="667"/> + <location filename="../IOViewer.cpp" line="706"/> + <location filename="../IOViewer.cpp" line="712"/> + <source>Increment</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="572"/> + <location filename="../IOViewer.cpp" line="578"/> + <location filename="../IOViewer.cpp" line="617"/> + <location filename="../IOViewer.cpp" line="623"/> + <location filename="../IOViewer.cpp" line="662"/> + <location filename="../IOViewer.cpp" line="668"/> + <location filename="../IOViewer.cpp" line="707"/> + <location filename="../IOViewer.cpp" line="713"/> + <source>Decrement</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="573"/> + <location filename="../IOViewer.cpp" line="579"/> + <location filename="../IOViewer.cpp" line="618"/> + <location filename="../IOViewer.cpp" line="624"/> + <location filename="../IOViewer.cpp" line="663"/> + <location filename="../IOViewer.cpp" line="669"/> + <location filename="../IOViewer.cpp" line="708"/> + <location filename="../IOViewer.cpp" line="714"/> + <source>Fixed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="574"/> + <location filename="../IOViewer.cpp" line="619"/> + <location filename="../IOViewer.cpp" line="664"/> + <location filename="../IOViewer.cpp" line="709"/> + <source>Increment and reload</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="576"/> + <location filename="../IOViewer.cpp" line="621"/> + <location filename="../IOViewer.cpp" line="666"/> + <location filename="../IOViewer.cpp" line="711"/> + <source>Source offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="582"/> + <location filename="../IOViewer.cpp" line="627"/> + <location filename="../IOViewer.cpp" line="672"/> + <location filename="../IOViewer.cpp" line="718"/> + <source>Repeat</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="583"/> + <location filename="../IOViewer.cpp" line="628"/> + <location filename="../IOViewer.cpp" line="673"/> + <location filename="../IOViewer.cpp" line="719"/> + <source>32-bit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="584"/> + <location filename="../IOViewer.cpp" line="629"/> + <location filename="../IOViewer.cpp" line="674"/> + <location filename="../IOViewer.cpp" line="720"/> + <source>Start timing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="585"/> + <location filename="../IOViewer.cpp" line="630"/> + <location filename="../IOViewer.cpp" line="675"/> + <location filename="../IOViewer.cpp" line="721"/> + <source>Immediate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="586"/> + <location filename="../IOViewer.cpp" line="631"/> + <location filename="../IOViewer.cpp" line="676"/> + <location filename="../IOViewer.cpp" line="722"/> + <location filename="../IOViewer.cpp" line="939"/> + <location filename="../IOViewer.cpp" line="956"/> + <source>VBlank</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="587"/> + <location filename="../IOViewer.cpp" line="632"/> + <location filename="../IOViewer.cpp" line="677"/> + <location filename="../IOViewer.cpp" line="723"/> + <location filename="../IOViewer.cpp" line="940"/> + <location filename="../IOViewer.cpp" line="957"/> + <source>HBlank</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="590"/> + <location filename="../IOViewer.cpp" line="635"/> + <location filename="../IOViewer.cpp" line="680"/> + <location filename="../IOViewer.cpp" line="726"/> + <location filename="../IOViewer.cpp" line="773"/> + <location filename="../IOViewer.cpp" line="789"/> + <location filename="../IOViewer.cpp" line="805"/> + <location filename="../IOViewer.cpp" line="821"/> + <location filename="../IOViewer.cpp" line="881"/> + <source>IRQ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="591"/> + <location filename="../IOViewer.cpp" line="636"/> + <location filename="../IOViewer.cpp" line="681"/> + <location filename="../IOViewer.cpp" line="727"/> + <location filename="../IOViewer.cpp" line="774"/> + <location filename="../IOViewer.cpp" line="790"/> + <location filename="../IOViewer.cpp" line="806"/> + <location filename="../IOViewer.cpp" line="822"/> + <source>Enable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="633"/> + <location filename="../IOViewer.cpp" line="678"/> + <location filename="../IOViewer.cpp" line="724"/> + <source>Audio FIFO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="715"/> + <source>Video Capture</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="717"/> + <source>DRQ</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="763"/> + <location filename="../IOViewer.cpp" line="778"/> + <location filename="../IOViewer.cpp" line="794"/> + <location filename="../IOViewer.cpp" line="810"/> + <source>Value</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="767"/> + <location filename="../IOViewer.cpp" line="782"/> + <location filename="../IOViewer.cpp" line="798"/> + <location filename="../IOViewer.cpp" line="814"/> + <source>Scale</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="769"/> + <location filename="../IOViewer.cpp" line="784"/> + <location filename="../IOViewer.cpp" line="800"/> + <location filename="../IOViewer.cpp" line="816"/> + <source>1/64</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="770"/> + <location filename="../IOViewer.cpp" line="785"/> + <location filename="../IOViewer.cpp" line="801"/> + <location filename="../IOViewer.cpp" line="817"/> + <source>1/256</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="771"/> + <location filename="../IOViewer.cpp" line="786"/> + <location filename="../IOViewer.cpp" line="802"/> + <location filename="../IOViewer.cpp" line="818"/> + <source>1/1024</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="788"/> + <location filename="../IOViewer.cpp" line="804"/> + <location filename="../IOViewer.cpp" line="820"/> + <source>Cascade</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="858"/> + <location filename="../IOViewer.cpp" line="871"/> + <source>A</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="859"/> + <location filename="../IOViewer.cpp" line="872"/> + <source>B</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="860"/> + <location filename="../IOViewer.cpp" line="873"/> + <source>Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="861"/> + <location filename="../IOViewer.cpp" line="874"/> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="862"/> + <location filename="../IOViewer.cpp" line="875"/> + <source>Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="863"/> + <location filename="../IOViewer.cpp" line="876"/> + <source>Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="864"/> + <location filename="../IOViewer.cpp" line="877"/> + <source>Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="865"/> + <location filename="../IOViewer.cpp" line="878"/> + <source>Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="866"/> + <location filename="../IOViewer.cpp" line="879"/> + <source>R</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="867"/> + <location filename="../IOViewer.cpp" line="880"/> + <source>L</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="882"/> + <source>Condition</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="886"/> + <source>SC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="887"/> + <source>SD</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="888"/> + <source>SI</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="889"/> + <source>SO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="941"/> + <location filename="../IOViewer.cpp" line="958"/> + <source>VCounter</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="942"/> + <location filename="../IOViewer.cpp" line="959"/> + <source>Timer 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="943"/> + <location filename="../IOViewer.cpp" line="960"/> + <source>Timer 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="944"/> + <location filename="../IOViewer.cpp" line="961"/> + <source>Timer 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="945"/> + <location filename="../IOViewer.cpp" line="962"/> + <source>Timer 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="946"/> + <location filename="../IOViewer.cpp" line="963"/> + <source>SIO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="947"/> + <location filename="../IOViewer.cpp" line="964"/> + <source>DMA 0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="948"/> + <location filename="../IOViewer.cpp" line="965"/> + <source>DMA 1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="949"/> + <location filename="../IOViewer.cpp" line="966"/> + <source>DMA 2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="950"/> + <location filename="../IOViewer.cpp" line="967"/> + <source>DMA 3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="951"/> + <location filename="../IOViewer.cpp" line="968"/> + <source>Keypad</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="952"/> + <location filename="../IOViewer.cpp" line="969"/> + <source>Gamepak</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="973"/> + <source>SRAM wait</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="974"/> + <location filename="../IOViewer.cpp" line="980"/> + <location filename="../IOViewer.cpp" line="990"/> + <location filename="../IOViewer.cpp" line="996"/> + <location filename="../IOViewer.cpp" line="1000"/> + <source>4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="975"/> + <location filename="../IOViewer.cpp" line="981"/> + <location filename="../IOViewer.cpp" line="991"/> + <location filename="../IOViewer.cpp" line="1001"/> + <source>3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="976"/> + <location filename="../IOViewer.cpp" line="982"/> + <location filename="../IOViewer.cpp" line="986"/> + <location filename="../IOViewer.cpp" line="992"/> + <location filename="../IOViewer.cpp" line="1002"/> + <source>2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="977"/> + <location filename="../IOViewer.cpp" line="983"/> + <location filename="../IOViewer.cpp" line="993"/> + <location filename="../IOViewer.cpp" line="1003"/> + <location filename="../IOViewer.cpp" line="1006"/> + <source>8</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="979"/> + <source>Cart 0 non-sequential</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="985"/> + <source>Cart 0 sequential</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="989"/> + <source>Cart 1 non-sequential</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="995"/> + <source>Cart 1 sequential</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="999"/> + <source>Cart 2 non-sequential</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1005"/> + <source>Cart 2 sequential</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1009"/> + <source>PHI terminal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1010"/> + <source>Disable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1011"/> + <source>4.19MHz</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1012"/> + <source>8.38MHz</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1013"/> + <source>16.78MHz</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1015"/> + <source>Gamepak prefetch</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1021"/> + <source>Enable IRQs</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::KeyEditor</name> + <message> + <location filename="../KeyEditor.cpp" line="33"/> + <location filename="../KeyEditor.cpp" line="207"/> + <source>---</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::LoadSaveState</name> + <message> + <location filename="../LoadSaveState.cpp" line="74"/> + <source>Load State</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="74"/> + <source>Save State</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="183"/> + <source>Empty</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="192"/> + <source>Corrupted</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="221"/> + <source>Slot %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::LogConfigModel</name> + <message> + <location filename="../LogConfigModel.cpp" line="79"/> + <location filename="../LogConfigModel.cpp" line="100"/> + <source>Default</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogConfigModel.cpp" line="81"/> + <source>Fatal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogConfigModel.cpp" line="83"/> + <source>Error</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogConfigModel.cpp" line="85"/> + <source>Warning</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogConfigModel.cpp" line="87"/> + <source>Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogConfigModel.cpp" line="89"/> + <source>Debug</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogConfigModel.cpp" line="91"/> + <source>Stub</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogConfigModel.cpp" line="93"/> + <source>Game Error</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::LogController</name> + <message> + <location filename="../LogController.cpp" line="62"/> + <source>[%1] %2: %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="73"/> + <source>An error occurred</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="145"/> + <source>DEBUG</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="147"/> + <source>STUB</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="149"/> + <source>INFO</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="151"/> + <source>WARN</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="153"/> + <source>ERROR</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="155"/> + <source>FATAL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LogController.cpp" line="157"/> + <source>GAME ERROR</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::MapView</name> + <message> + <location filename="../MapView.cpp" line="48"/> + <source>Priority</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="49"/> + <location filename="../MapView.cpp" line="61"/> + <source>Map base</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="50"/> + <location filename="../MapView.cpp" line="62"/> + <source>Tile base</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="51"/> + <source>Size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="52"/> + <location filename="../MapView.cpp" line="63"/> + <source>Offset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="53"/> + <source>Xform</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="107"/> + <source>Map Addr.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="108"/> + <source>Mirror</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="136"/> + <source>None</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="138"/> + <source>Both</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="140"/> + <source>Horizontal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="142"/> + <source>Vertical</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="168"/> + <location filename="../MapView.cpp" line="169"/> + <location filename="../MapView.cpp" line="217"/> + <source>N/A</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="260"/> + <source>Export map</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MapView.cpp" line="261"/> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::MemoryDump</name> + <message> + <location filename="../MemoryDump.cpp" line="24"/> + <source>Save memory region</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryDump.cpp" line="30"/> + <source>Failed to open output file: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::MemoryModel</name> + <message> + <location filename="../MemoryModel.cpp" line="44"/> + <source>Copy selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="49"/> + <source>Save selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="54"/> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="59"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="104"/> + <source>All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="149"/> + <source>Load TBL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="203"/> + <source>Save selected memory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="209"/> + <source>Failed to open output file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="217"/> + <source>Load memory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="223"/> + <source>Failed to open input file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="339"/> + <source>TBL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="339"/> + <source>ISO-8859-1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::MemorySearch</name> + <message> + <location filename="../MemorySearch.cpp" line="221"/> + <source> (%0/%1×)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.cpp" line="223"/> + <source> (⅟%0×)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.cpp" line="226"/> + <source> (%0×)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemorySearch.cpp" line="230"/> + <source>%1 byte%2</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::ObjView</name> + <message> + <location filename="../ObjView.cpp" line="151"/> + <location filename="../ObjView.cpp" line="225"/> + <source>0x%0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="162"/> + <source>Off</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="167"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="170"/> + <source>Trans</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="173"/> + <source>OBJWIN</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="176"/> + <source>Invalid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="232"/> + <location filename="../ObjView.cpp" line="233"/> + <source>N/A</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="258"/> + <source>Export sprite</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="259"/> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::PaletteView</name> + <message> + <location filename="../PaletteView.cpp" line="121"/> + <source>#%0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="122"/> + <source>0x%0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="123"/> + <source>%0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="124"/> + <location filename="../PaletteView.cpp" line="125"/> + <location filename="../PaletteView.cpp" line="126"/> + <source>0x%0 (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="138"/> + <source>Export palette</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="139"/> + <source>Windows PAL (*.pal);;Adobe Color Table (*.act)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="142"/> + <source>Failed to open output palette file: %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::PrinterView</name> + <message> + <location filename="../PrinterView.cpp" line="52"/> + <source>Save Printout</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../PrinterView.cpp" line="52"/> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::ROMInfo</name> + <message> + <location filename="../ROMInfo.cpp" line="44"/> + <location filename="../ROMInfo.cpp" line="65"/> + <location filename="../ROMInfo.cpp" line="76"/> + <location filename="../ROMInfo.cpp" line="85"/> + <location filename="../ROMInfo.cpp" line="86"/> + <source>(unknown)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.cpp" line="53"/> + <location filename="../ROMInfo.cpp" line="60"/> + <source> bytes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.cpp" line="79"/> + <source>(no database present)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::SettingsView</name> + <message> + <location filename="../SettingsView.cpp" line="148"/> + <location filename="../SettingsView.cpp" line="191"/> + <source>Qt Multimedia</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="155"/> + <source>SDL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="163"/> + <source>Software (Qt)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="169"/> + <source>OpenGL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="176"/> + <source>OpenGL (force version 1.x)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="184"/> + <source>None (Still Image)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="275"/> + <source>Keyboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="284"/> + <source>Controllers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="328"/> + <source>Shortcuts</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="340"/> + <location filename="../SettingsView.cpp" line="350"/> + <source>Shaders</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="357"/> + <source>Select BIOS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="661"/> + <source>(%1×%2)</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::ShaderSelector</name> + <message> + <location filename="../ShaderSelector.cpp" line="52"/> + <source>No shader active</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="65"/> + <source>Load shader</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="105"/> + <source>No shader loaded</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="113"/> + <source>by %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="124"/> + <source>Preprocessing</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="131"/> + <source>Pass %1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::ShortcutModel</name> + <message> + <location filename="../ShortcutModel.cpp" line="67"/> + <source>Action</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShortcutModel.cpp" line="69"/> + <source>Keyboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShortcutModel.cpp" line="71"/> + <source>Gamepad</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::TileView</name> + <message> + <location filename="../TileView.cpp" line="178"/> + <source>Export tiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.cpp" line="179"/> + <location filename="../TileView.cpp" line="191"/> + <source>Portable Network Graphics (*.png)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.cpp" line="190"/> + <source>Export tile</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::VideoView</name> + <message> + <location filename="../VideoView.cpp" line="216"/> + <source>Failed to open output video file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.cpp" line="237"/> + <source>Native (%0x%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.cpp" line="252"/> + <source>Select output file</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::Window</name> + <message> + <location filename="../Window.cpp" line="293"/> + <source>Game Boy Advance ROMs (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="310"/> + <source>Game Boy ROMs (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="314"/> + <source>All ROMs (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="315"/> + <source>%1 Video Logs (*.mvl)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="330"/> + <source>Archives (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="335"/> + <location filename="../Window.cpp" line="343"/> + <location filename="../Window.cpp" line="370"/> + <source>Select ROM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="361"/> + <source>Select folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="378"/> + <source>Game Boy Advance save files (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="379"/> + <location filename="../Window.cpp" line="440"/> + <location filename="../Window.cpp" line="447"/> + <source>Select save</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="387"/> + <source>mGBA savestate files (%1)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="389"/> + <location filename="../Window.cpp" line="394"/> + <source>Select savestate</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="416"/> + <source>Select patch</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="416"/> + <source>Patches (*.ips *.ups *.bps)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="433"/> + <source>Select image</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="433"/> + <source>Image file (*.png *.gif *.jpg *.jpeg);;All files (*)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="440"/> + <location filename="../Window.cpp" line="447"/> + <source>GameShark saves (*.sps *.xps)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="474"/> + <source>Select video log</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="474"/> + <source>Video logs (*.mvl)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="855"/> + <source>Crash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="856"/> + <source>The game has crashed with the following error: + +%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="863"/> + <source>Couldn't Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="864"/> + <source>Could not load game. Are you sure it's in the correct format?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="877"/> + <source>Unimplemented BIOS call</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="878"/> + <source>This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="966"/> + <source>Really make portable?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="967"/> + <source>This will make the emulator load its configuration from the same directory as the executable. Do you want to continue?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="979"/> + <source>Restart needed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="980"/> + <source>Some changes will not take effect until the emulator is restarted.</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1028"/> + <source> - Player %1 of %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1039"/> + <source>%1 - %2</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1041"/> + <source>%1 - %2 - %3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1043"/> + <source>%1 - %2 (%3 fps) - %4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1084"/> + <source>&File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1086"/> + <source>Load &ROM...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1089"/> + <source>Load ROM in archive...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1090"/> + <source>Add folder to library...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1093"/> + <source>Load alternate save...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1096"/> + <source>Load temporary save...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1100"/> + <source>Load &patch...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1103"/> + <source>Boot BIOS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1108"/> + <source>Replace ROM...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1110"/> + <source>ROM &info...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1112"/> + <source>Recent</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1115"/> + <source>Make portable</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1118"/> + <source>&Load state</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1123"/> + <source>Load state file...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1128"/> + <source>&Save state</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1133"/> + <source>Save state file...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1138"/> + <source>Quick load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1139"/> + <source>Quick save</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1141"/> + <source>Load recent</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1146"/> + <source>Save recent</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1154"/> + <source>Undo load state</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1159"/> + <source>Undo save state</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1168"/> + <location filename="../Window.cpp" line="1173"/> + <source>State &%1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1180"/> + <source>Load camera image...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1184"/> + <source>Import GameShark Save...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1187"/> + <source>Export GameShark Save...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1192"/> + <source>New multiplayer window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1200"/> + <source>About...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1203"/> + <source>E&xit</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1206"/> + <source>&Emulation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1207"/> + <source>&Reset</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1211"/> + <source>Sh&utdown</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1215"/> + <source>Yank game pak</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1221"/> + <source>&Pause</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1230"/> + <source>&Next frame</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1236"/> + <source>Fast forward (held)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1242"/> + <source>&Fast forward</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1246"/> + <source>Fast forward speed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1251"/> + <source>Unbounded</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1255"/> + <source>%0x</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1259"/> + <source>Rewind (held)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1266"/> + <source>Re&wind</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1271"/> + <source>Step backwards</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1277"/> + <source>Sync to &video</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1284"/> + <source>Sync to &audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1292"/> + <source>Solar sensor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1293"/> + <source>Increase solar level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1294"/> + <source>Decrease solar level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1295"/> + <source>Brightest solar level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1298"/> + <source>Darkest solar level</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1304"/> + <source>Brightness %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1310"/> + <source>Game Boy Printer...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1319"/> + <source>BattleChip Gate...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1323"/> + <source>Audio/&Video</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1324"/> + <source>Frame size</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1326"/> + <source>%1×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1351"/> + <source>Toggle fullscreen</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1354"/> + <source>Lock aspect ratio</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1366"/> + <source>Force integer scaling</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1378"/> + <source>Interframe blending</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1387"/> + <source>Bilinear filtering</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1396"/> + <source>Frame&skip</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1409"/> + <source>Mute</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1418"/> + <source>FPS target</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1426"/> + <source>Native (59.7275)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1441"/> + <source>Take &screenshot</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1443"/> + <source>F12</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1447"/> + <source>Record A/V...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1448"/> + <source>Record GIF...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1452"/> + <source>Video layers</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1453"/> + <source>Audio channels</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1455"/> + <source>Adjust layer placement...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1457"/> + <source>&Tools</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1458"/> + <source>View &logs...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1460"/> + <source>Game &overrides...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1472"/> + <source>Game Pak sensors...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1483"/> + <source>&Cheats...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1486"/> + <source>Settings...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1490"/> + <source>Open debugger console...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1492"/> + <source>Start &GDB server...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1498"/> + <source>View &palette...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1499"/> + <source>View &sprites...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1500"/> + <source>View &tiles...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1501"/> + <source>View &map...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1504"/> + <source>&Frame inspector...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1522"/> + <source>View memory...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1523"/> + <source>Search memory...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1526"/> + <source>View &I/O registers...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1531"/> + <source>Record debug video log...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1532"/> + <source>Stop debug video log</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1627"/> + <source>Exit fullscreen</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1629"/> + <source>GameShark Button (held)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1635"/> + <source>Autofire</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1636"/> + <source>Autofire A</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1641"/> + <source>Autofire B</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1646"/> + <source>Autofire L</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1651"/> + <source>Autofire R</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1656"/> + <source>Autofire Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1661"/> + <source>Autofire Select</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1666"/> + <source>Autofire Up</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1671"/> + <source>Autofire Right</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1676"/> + <source>Autofire Down</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1681"/> + <source>Autofire Left</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1735"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QObject</name> + <message> + <location filename="../utils.cpp" line="29"/> + <source>GBA</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../utils.cpp" line="33"/> + <source>GB</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../utils.cpp" line="36"/> + <source>?</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ROMInfo</name> + <message> + <location filename="../ROMInfo.ui" line="14"/> + <source>ROM Info</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="26"/> + <source>Game name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="33"/> + <source>{NAME}</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="46"/> + <source>Internal name:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="53"/> + <source>{TITLE}</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="63"/> + <source>Game ID:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="70"/> + <source>{ID}</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="80"/> + <source>File size:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="87"/> + <source>{SIZE}</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="97"/> + <source>CRC32:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="104"/> + <source>{CRC}</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SensorView</name> + <message> + <location filename="../SensorView.ui" line="20"/> + <source>Sensors</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="31"/> + <source>Realtime clock</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="37"/> + <source>Fixed time</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="47"/> + <source>System time</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="60"/> + <source>Start time at</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="70"/> + <source>Now</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="97"/> + <source>MM/dd/yy hh:mm:ss AP</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="107"/> + <source>Light sensor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="113"/> + <source>Brightness</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="150"/> + <source>Tilt sensor</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="158"/> + <location filename="../SensorView.ui" line="247"/> + <source>Set Y</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="168"/> + <location filename="../SensorView.ui" line="257"/> + <source>Set X</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="239"/> + <source>Gyroscope</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SensorView.ui" line="267"/> + <source>Sensitivity</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>SettingsView</name> + <message> + <location filename="../SettingsView.ui" line="20"/> + <source>Settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="52"/> + <source>Audio/Video</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="57"/> + <source>Interface</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="62"/> + <source>Emulation</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="67"/> + <source>Enhancements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="72"/> + <source>BIOS</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="77"/> + <source>Paths</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="82"/> + <source>Logging</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="87"/> + <source>Game Boy</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="105"/> + <source>Audio driver:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="122"/> + <source>Audio buffer:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="134"/> + <location filename="../SettingsView.ui" line="156"/> + <source>1536</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="141"/> + <source>512</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="146"/> + <source>768</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="151"/> + <source>1024</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="161"/> + <source>2048</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="166"/> + <source>3072</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="171"/> + <source>4096</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="179"/> + <source>samples</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="188"/> + <source>Sample rate:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="200"/> + <location filename="../SettingsView.ui" line="217"/> + <source>44100</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="207"/> + <source>22050</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="212"/> + <source>32000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="222"/> + <source>48000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="230"/> + <source>Hz</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="239"/> + <source>Volume:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="270"/> + <location filename="../SettingsView.ui" line="310"/> + <source>Mute</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="279"/> + <source>Fast forward volume:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="326"/> + <source>Display driver:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="343"/> + <source>Frameskip:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="352"/> + <source>Skip every</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="362"/> + <location filename="../SettingsView.ui" line="803"/> + <source>frames</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="371"/> + <source>FPS target:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="396"/> + <source>frames per second</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="412"/> + <source>Sync:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="421"/> + <source>Video</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="428"/> + <source>Audio</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="437"/> + <source>Lock aspect ratio</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="444"/> + <source>Force integer scaling</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="451"/> + <source>Bilinear filtering</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="458"/> + <source>Native (59.7275)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="465"/> + <source>Interframe blending</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="476"/> + <source>Language</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="484"/> + <source>English</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="499"/> + <source>Library:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="507"/> + <source>List view</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="512"/> + <source>Tree view</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="520"/> + <source>Show when no game open</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="530"/> + <source>Clear cache</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="544"/> + <source>Allow opposing input directions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="551"/> + <source>Suspend screensaver</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="561"/> + <source>Pause when inactive</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="568"/> + <source>Pause when minimized</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="582"/> + <source>Show FPS in title bar</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="592"/> + <source>Enable Discord Rich Presence</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="606"/> + <source>Automatically save state</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="616"/> + <source>Automatically load state</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="633"/> + <source>Automatically save cheats</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="643"/> + <source>Automatically load cheats</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="653"/> + <source>Show OSD messages</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="670"/> + <source>Fast forward speed:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="682"/> + <location filename="../SettingsView.ui" line="725"/> + <location filename="../SettingsView.ui" line="974"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="701"/> + <location filename="../SettingsView.ui" line="744"/> + <source>Unbounded</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="713"/> + <source>Fast forward (held) speed:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="756"/> + <source>Autofire interval:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="780"/> + <source>Enable rewind</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="787"/> + <source>Rewind history:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="819"/> + <source>Idle loops:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="827"/> + <source>Run all</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="832"/> + <source>Remove known</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="837"/> + <source>Detect and remove</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="845"/> + <source>Preload entire ROM into memory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="859"/> + <source>Savestate extra data:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="866"/> + <location filename="../SettingsView.ui" line="910"/> + <source>Screenshot</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="876"/> + <location filename="../SettingsView.ui" line="920"/> + <source>Save data</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="886"/> + <location filename="../SettingsView.ui" line="927"/> + <source>Cheat codes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="903"/> + <source>Load extra data:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="938"/> + <source>Video renderer:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="946"/> + <source>Software</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="951"/> + <source>OpenGL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="959"/> + <source>OpenGL enhancements</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="965"/> + <source>High-resolution scale:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1003"/> + <source>(240×160)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1028"/> + <source>XQ GBA audio (experimental)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1039"/> + <source>GB BIOS file:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1058"/> + <location filename="../SettingsView.ui" line="1096"/> + <location filename="../SettingsView.ui" line="1131"/> + <location filename="../SettingsView.ui" line="1159"/> + <location filename="../SettingsView.ui" line="1200"/> + <location filename="../SettingsView.ui" line="1248"/> + <location filename="../SettingsView.ui" line="1296"/> + <location filename="../SettingsView.ui" line="1344"/> + <location filename="../SettingsView.ui" line="1392"/> + <source>Browse</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1067"/> + <source>Use BIOS file if found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1077"/> + <source>Skip BIOS intro</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1105"/> + <source>GBA BIOS file:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1112"/> + <source>GBC BIOS file:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1140"/> + <source>SGB BIOS file:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1175"/> + <source>Save games</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1209"/> + <location filename="../SettingsView.ui" line="1257"/> + <location filename="../SettingsView.ui" line="1305"/> + <location filename="../SettingsView.ui" line="1353"/> + <location filename="../SettingsView.ui" line="1401"/> + <source>Same directory as the ROM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1223"/> + <source>Save states</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1271"/> + <source>Screenshots</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1319"/> + <source>Patches</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1367"/> + <source>Cheats</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1424"/> + <source>Log to file</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1431"/> + <source>Log to console</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1445"/> + <source>Select Log File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1458"/> + <source>Game Boy model:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1466"/> + <location filename="../SettingsView.ui" line="1502"/> + <location filename="../SettingsView.ui" line="1538"/> + <source>Autodetect</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1471"/> + <location filename="../SettingsView.ui" line="1507"/> + <location filename="../SettingsView.ui" line="1543"/> + <source>Game Boy (DMG)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1476"/> + <location filename="../SettingsView.ui" line="1512"/> + <location filename="../SettingsView.ui" line="1548"/> + <source>Super Game Boy (SGB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1481"/> + <location filename="../SettingsView.ui" line="1517"/> + <location filename="../SettingsView.ui" line="1553"/> + <source>Game Boy Color (CGB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1486"/> + <location filename="../SettingsView.ui" line="1522"/> + <location filename="../SettingsView.ui" line="1558"/> + <source>Game Boy Advance (AGB)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1494"/> + <source>Super Game Boy model:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1530"/> + <source>Game Boy Color model:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1573"/> + <source>Default BG colors:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1740"/> + <source>Super Game Boy borders</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1754"/> + <source>Camera driver:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1851"/> + <source>Default sprite colors 1:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1858"/> + <source>Default sprite colors 2:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1865"/> + <source>Use GBC colors in GB games</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="1872"/> + <source>Camera:</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ShaderSelector</name> + <message> + <location filename="../ShaderSelector.ui" line="14"/> + <source>Shaders</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="28"/> + <source>Active Shader:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="35"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="45"/> + <source>Author</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="62"/> + <source>Description</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="88"/> + <source>Unload Shader</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="95"/> + <source>Load New Shader</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>ShortcutView</name> + <message> + <location filename="../ShortcutView.ui" line="14"/> + <source>Edit Shortcuts</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShortcutView.ui" line="29"/> + <source>Keyboard</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShortcutView.ui" line="39"/> + <source>Gamepad</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ShortcutView.ui" line="46"/> + <source>Clear</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>TileView</name> + <message> + <location filename="../TileView.ui" line="14"/> + <source>Tiles</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="20"/> + <source>Export Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="27"/> + <source>Export All</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="43"/> + <source>256 colors</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="56"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="69"/> + <source>Magnification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="92"/> + <source>Tiles per row</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="99"/> + <source>Fit to window</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="192"/> + <source>Copy Selected</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../TileView.ui" line="199"/> + <source>Copy All</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>VideoView</name> + <message> + <location filename="../VideoView.ui" line="20"/> + <source>Record Video</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="40"/> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="56"/> + <source>Stop</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="69"/> + <source>Select File</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="101"/> + <source>Presets</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="109"/> + <source>High &Quality</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="119"/> + <source>&YouTube</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="129"/> + <location filename="../VideoView.ui" line="237"/> + <source>WebM</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="139"/> + <source>&Lossless</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="156"/> + <source>&1080p</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="166"/> + <source>&720p</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="176"/> + <source>&480p</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="189"/> + <source>&Native</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="222"/> + <source>Format</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="232"/> + <source>MKV</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="242"/> + <source>AVI</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="247"/> + <source>MP4</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="259"/> + <source>h.264</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="264"/> + <source>h.264 (NVENC)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="269"/> + <source>HEVC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="274"/> + <source>HEVC (NVENC)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="279"/> + <source>VP8</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="284"/> + <source>VP9</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="289"/> + <source>FFV1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="301"/> + <source>FLAC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="306"/> + <source>Opus</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="311"/> + <source>Vorbis</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="316"/> + <source>MP3</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="321"/> + <source>AAC</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="326"/> + <source>Uncompressed</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="337"/> + <source> Bitrate (kbps)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="343"/> + <source>VBR </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="388"/> + <source>ABR</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="404"/> + <source>Dimensions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="410"/> + <source>:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="420"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="470"/> + <source>Lock aspect ratio</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../VideoView.ui" line="485"/> + <source>Show advanced</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS>
@@ -320,6 +320,11 @@ }
} } + int scale; + if (mCoreConfigGetUIntValue(&runner->config, "videoScale", &scale)) { + runner->core->reloadConfigOption(runner->core, "videoScale", &runner->config); + } + rumble.up = 0; rumble.down = 0; }@@ -857,7 +862,7 @@ },
.nStates = 16 }, { - .title = "GPU-accelerated renderer (experimental, requires game reload)", + .title = "GPU-accelerated renderer (requires game reload)", .data = "hwaccelVideo", .submenu = 0, .state = 0,
@@ -84,6 +84,9 @@ void ELFGetProgramHeaders(struct ELF* elf, struct ELFProgramHeaders* ph) {
ELFProgramHeadersClear(ph); Elf32_Ehdr* hdr = elf32_getehdr(elf->e); Elf32_Phdr* phdr = elf32_getphdr(elf->e); + if (!hdr || !phdr) { + return; + } ELFProgramHeadersResize(ph, hdr->e_phnum); memcpy(ELFProgramHeadersGetPointer(ph, 0), phdr, sizeof(*phdr) * hdr->e_phnum); }