Merge branch 'master' into medusa
jump to
@@ -8,6 +8,10 @@ - Debugging console
- Improved memory viewer - GB: LR35902/GB-Z80 disassembler - Configuration of gamepad hats + - Qt: Spanish translation (by Kevin López) + - Add option for whether rewinding restores save games + - Qt: German translation (by Lothar Serra Mari) + - Savestates now contain any RTC override data Bugfixes: - LR35902: Fix core never exiting with certain event patterns - GB Timer: Improve DIV reset behavior@@ -23,6 +27,12 @@ - LR35902: Fix pc overflowing current region off-by-one
- GB MBC: Fix ROM bank overflows getting set to bank 0 - Qt: Fix timing issues on high refresh rate monitors - GBA Savedata: Fix savedata unmasking (fixes mgba.io/i/441) + - Util: Fix overflow when loading invalid UPS patches + - Tools: Fix recurring multiple times over the same library + - GBA I/O: Handle audio registers specially when deserializing + - Util: Fix highest-fd socket not being returned by SocketAccept + - Qt: Fix linking after some windows have been closed + - GBA Video: Fix wrong palette on 256-color sprites in OBJWIN Misc: - SDL: Remove scancode key input - GBA Video: Clean up unused timers@@ -60,6 +70,12 @@ - Qt: Merge "Save" and "OK" buttons in shader options
- SDL: Automatically map controllers when plugged in - Qt: Automatically load controller profile when plugged in - OpenGL: Add xBR-lv2 shader + - GBA, GB: ROM is now unloaded if a patch is applied + - Util: Add 8-bit PNG write support + - Qt: Rename "Resample video" option to "Bilinear filtering" + - GBA Video: Optimize when BLD* registers are written frequently + - Core: Cores can now have multiple sets of callbacks + - GBA: Ignore invalid opcodes used by the Wii U VC emulator 0.5.2: (2016-12-31) Bugfixes:
@@ -96,9 +96,15 @@ This will build and install mGBA into `/usr/bin` and `/usr/lib`. Dependencies that are installed will be automatically detected, and features that are disabled if the dependencies are not found will be shown after running the `cmake` command after warnings about being unable to find them.
#### Windows developer building -To build on Windows for development, using MSYS2 is recommended. Follow the installation steps found on their [website](https://msys2.github.io). Make sure you're running the 32-bit version ("MinGW-w64 Win32 Shell") and run this additional command (including the braces) to install the needed dependencies (please note that this involves downloading over 500MiB of packages, so it will take a long time): +To build on Windows for development, using MSYS2 is recommended. Follow the installation steps found on their [website](https://msys2.github.io). Make sure you're running the 32-bit version ("MinGW-w64 Win32 Shell") (or the 64-bit version "MinGW-w64 Win64 Shell" if you want to build for x86_64) and run this additional command (including the braces) to install the needed dependencies (please note that this involves downloading over 500MiB of packages, so it will take a long time): +For x86 (32 bit) builds: + pacman -Sy mingw-w64-i686-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2} + +For x86_64 (64 bit) builds: + + pacman -Sy mingw-w64-x86_64-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2} Check out the source code by running this command:@@ -112,7 +118,7 @@ cd build
cmake .. -G "MSYS Makefiles" make -Please note that this build of mGBA for Windows is not suitable for distribution, due to the scattering of DLLs it needs to run, but is perfect for development. +Please note that this build of mGBA for Windows is not suitable for distribution, due to the scattering of DLLs it needs to run, but is perfect for development. However, if distributing such a build is desired (e.g. for testing on machines that don't have the MSYS2 environment installed), a tool called "[Dependency Walker](http://dependencywalker.com)" can be used to see which additional DLL files need to be shipped with the mGBA executable. ### Dependencies
@@ -38,6 +38,7 @@ bool ConfigurationWrite(const struct Configuration*, const char* path);
bool ConfigurationWriteSection(const struct Configuration*, const char* path, const char* section); void ConfigurationEnumerateSections(const struct Configuration* configuration, void (*handler)(const char* sectionName, void* user), void* user); +void ConfigurationEnumerate(const struct Configuration* configuration, const char* section, void (*handler)(const char* key, const char* value, void* user), void* user); CXX_GUARD_END
@@ -22,7 +22,10 @@ };
png_structp PNGWriteOpen(struct VFile* source); png_infop PNGWriteHeader(png_structp png, unsigned width, unsigned height); +png_infop PNGWriteHeader8(png_structp png, unsigned width, unsigned height); +bool PNGWritePalette(png_structp png, png_infop info, const uint32_t* palette, unsigned entries); bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels); +bool PNGWritePixels8(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels); bool PNGWriteCustomChunk(png_structp png, const char* name, size_t size, void* data); void PNGWriteClose(png_structp png, png_infop info);
@@ -293,10 +293,11 @@ FD_SET(errors[i], &eset);
errors[i] = INVALID_SOCKET; } } + ++maxFd; struct timeval tv; tv.tv_sec = timeoutMillis / 1000; tv.tv_usec = (timeoutMillis % 1000) * 1000; - int result = select(maxFd + 1, &rset, &wset, &eset, timeoutMillis < 0 ? 0 : &tv); + int result = select(maxFd, &rset, &wset, &eset, timeoutMillis < 0 ? 0 : &tv); int r = 0; int w = 0; int e = 0;
@@ -21,6 +21,7 @@ #endif
char* strnrstr(const char* restrict s1, const char* restrict s2, size_t len); bool endswith(const char* restrict s1, const char* restrict end); +bool startswith(const char* restrict s1, const char* restrict start); size_t toUtf8(uint32_t unichar, char* buffer); int utfcmp(const uint16_t* utf16, const char* utf8, size_t utf16Length, size_t utf8Length);
@@ -27,7 +27,8 @@ void NAME ## Shift(struct NAME* vector, size_t location, size_t difference); \
void NAME ## Unshift(struct NAME* vector, size_t location, size_t difference); \ void NAME ## EnsureCapacity(struct NAME* vector, size_t capacity); \ size_t NAME ## Size(const struct NAME* vector); \ - size_t NAME ## Index(const struct NAME* vector, const TYPE* member); + size_t NAME ## Index(const struct NAME* vector, const TYPE* member); \ + void NAME ## Copy(struct NAME* dest, const struct NAME* src); #define DEFINE_VECTOR(NAME, TYPE) \ void NAME ## Init(struct NAME* vector, size_t capacity) { \@@ -84,6 +85,11 @@ return vector->size; \
} \ size_t NAME ## Index(const struct NAME* vector, const TYPE* member) { \ return member - (const TYPE*) vector->vector; \ + } \ + void NAME ## Copy(struct NAME* dest, const struct NAME* src) { \ + NAME ## EnsureCapacity(dest, src->size); \ + memcpy(dest->vector, src->vector, src->size * sizeof(TYPE)); \ + dest->size = src->size; \ } \ CXX_GUARD_END
@@ -19,6 +19,12 @@ struct Configuration overridesTable;
char* port; }; +enum mCoreConfigLevel { + mCONFIG_LEVEL_DEFAULT = 0, + mCONFIG_LEVEL_CUSTOM, + mCONFIG_LEVEL_OVERRIDE, +}; + struct mCoreOptions { char* bios; bool skipBios;@@ -27,6 +33,7 @@ int logLevel;
int frameskip; bool rewindEnable; int rewindBufferCapacity; + bool rewindSave; float fpsTarget; size_t audioBuffers; unsigned sampleRate;@@ -88,6 +95,8 @@ void mCoreConfigCopyValue(struct mCoreConfig* config, const struct mCoreConfig* src, const char* key);
void mCoreConfigMap(const struct mCoreConfig* config, struct mCoreOptions* opts); void mCoreConfigLoadDefaults(struct mCoreConfig* config, const struct mCoreOptions* opts); + +void mCoreConfigEnumerate(const struct mCoreConfig* config, const char* prefix, void (*handler)(const char* key, const char* value, enum mCoreConfigLevel type, void* user), void* user); struct Configuration* mCoreConfigGetInput(struct mCoreConfig*); struct Configuration* mCoreConfigGetOverrides(struct mCoreConfig*);
@@ -40,7 +40,6 @@ enum mCoreChecksumType {
CHECKSUM_CRC32, }; -struct mRTCSource; struct mCoreConfig; struct mCoreSync; struct mStateExtdata;@@ -58,6 +57,8 @@ const struct mInputPlatformInfo* inputInfo;
#endif struct mCoreConfig config; struct mCoreOptions opts; + + struct mRTCGenericSource rtc; bool (*init)(struct mCore*); void (*deinit)(struct mCore*);@@ -77,7 +78,8 @@ struct blip_t* (*getAudioChannel)(struct mCore*, int ch);
void (*setAudioBufferSize)(struct mCore*, size_t samples); size_t (*getAudioBufferSize)(struct mCore*); - void (*setCoreCallbacks)(struct mCore*, struct mCoreCallbacks*); + void (*addCoreCallbacks)(struct mCore*, struct mCoreCallbacks*); + void (*clearCoreCallbacks)(struct mCore*); void (*setAVStream)(struct mCore*, struct mAVStream*); bool (*isROM)(struct VFile* vf);@@ -115,7 +117,6 @@
void (*getGameTitle)(const struct mCore*, char* title); void (*getGameCode)(const struct mCore*, char* title); - void (*setRTC)(struct mCore*, struct mRTCSource*); void (*setRotation)(struct mCore*, struct mRotationSource*); void (*setRumble)(struct mCore*, struct mRumble*);@@ -173,6 +174,8 @@
void mCoreInitConfig(struct mCore* core, const char* port); void mCoreLoadConfig(struct mCore* core); void mCoreLoadForeignConfig(struct mCore* core, const struct mCoreConfig* config); + +void mCoreSetRTC(struct mCore* core, struct mRTCSource* rtc); CXX_GUARD_END
@@ -10,7 +10,10 @@ #include <mgba-util/common.h>
CXX_GUARD_START +#include <mgba-util/vector.h> + struct mCore; +struct mStateExtdataItem; #ifdef COLOR_16_BIT typedef uint16_t color_t;@@ -36,6 +39,8 @@ void (*videoFrameStarted)(void* context);
void (*videoFrameEnded)(void* context); void (*coreCrashed)(void* context); }; + +DECLARE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks); struct mAVStream { void (*videoDimensionsChanged)(struct mAVStream*, unsigned width, unsigned height);@@ -65,18 +70,29 @@ struct mRTCSource {
void (*sample)(struct mRTCSource*); time_t (*unixTime)(struct mRTCSource*); + + void (*serialize)(struct mRTCSource*, struct mStateExtdataItem*); + bool (*deserialize)(struct mRTCSource*, const struct mStateExtdataItem*); }; enum mRTCGenericType { RTC_NO_OVERRIDE, RTC_FIXED, - RTC_FAKE_EPOCH + RTC_FAKE_EPOCH, + RTC_CUSTOM_START = 0x1000 }; struct mRTCGenericSource { struct mRTCSource d; struct mCore* p; enum mRTCGenericType override; + int64_t value; + struct mRTCSource* custom; +}; + +struct mRTCGenericState { + int32_t type; + int32_t padding; int64_t value; };
@@ -10,6 +10,8 @@ #include <mgba-util/common.h>
CXX_GUARD_START +#include <mgba-util/table.h> + enum mLogLevel { mLOG_FATAL = 0x01, mLOG_ERROR = 0x02,@@ -22,29 +24,47 @@
mLOG_ALL = 0x7F }; +struct Table; +struct mLogFilter { + int defaultLevels; + struct Table categories; + struct Table levels; +}; + struct mLogger { void (*log)(struct mLogger*, int category, enum mLogLevel level, const char* format, va_list args); + struct mLogFilter* filter; }; struct mLogger* mLogGetContext(void); void mLogSetDefaultLogger(struct mLogger*); -int mLogGenerateCategory(const char*); +int mLogGenerateCategory(const char*, const char*); const char* mLogCategoryName(int); +const char* mLogCategoryId(int); +int mLogCategoryById(const char*); + +struct mCoreConfig; +void mLogFilterInit(struct mLogFilter*); +void mLogFilterDeinit(struct mLogFilter*); +void mLogFilterLoad(struct mLogFilter*, const struct mCoreConfig*); +void mLogFilterSet(struct mLogFilter*, const char* category, int levels); +bool mLogFilterTest(struct mLogFilter*, int category, enum mLogLevel level); ATTRIBUTE_FORMAT(printf, 3, 4) void mLog(int category, enum mLogLevel level, const char* format, ...); #define mLOG(CATEGORY, LEVEL, ...) mLog(_mLOG_CAT_ ## CATEGORY (), mLOG_ ## LEVEL, __VA_ARGS__) -#define mLOG_DECLARE_CATEGORY(CATEGORY) int _mLOG_CAT_ ## CATEGORY (void); -#define mLOG_DEFINE_CATEGORY(CATEGORY, NAME) \ +#define mLOG_DECLARE_CATEGORY(CATEGORY) int _mLOG_CAT_ ## CATEGORY (void); extern const char* _mLOG_CAT_ ## CATEGORY ## _ID; +#define mLOG_DEFINE_CATEGORY(CATEGORY, NAME, ID) \ int _mLOG_CAT_ ## CATEGORY (void) { \ static int category = 0; \ if (!category) { \ - category = mLogGenerateCategory(NAME); \ + category = mLogGenerateCategory(NAME, ID); \ } \ return category; \ - } + } \ + const char* _mLOG_CAT_ ## CATEGORY ## _ID = ID; mLOG_DECLARE_CATEGORY(STATUS)
@@ -19,6 +19,7 @@ struct mCoreRewindContext {
struct mCoreRewindPatches patchMemory; size_t current; size_t size; + int stateFlags; struct VFile* previousState; struct VFile* currentState; };
@@ -15,12 +15,14 @@ EXTDATA_NONE = 0,
EXTDATA_SCREENSHOT = 1, EXTDATA_SAVEDATA = 2, EXTDATA_CHEATS = 3, + EXTDATA_RTC = 4, EXTDATA_MAX }; #define SAVESTATE_SCREENSHOT 1 #define SAVESTATE_SAVEDATA 2 #define SAVESTATE_CHEATS 4 +#define SAVESTATE_RTC 8 struct mStateExtdataItem { int32_t size;
@@ -58,7 +58,6 @@ int interruptDepth;
bool frameWasOn; struct mThreadLogger logger; - enum mLogLevel logLevel; ThreadCallback startCallback; ThreadCallback resetCallback; ThreadCallback cleanCallback;
@@ -58,6 +58,8 @@ void mTileCacheSetPalette(struct mTileCache* cache, int palette);
const uint16_t* mTileCacheGetTile(struct mTileCache* cache, unsigned tileId, unsigned paletteId); const uint16_t* mTileCacheGetTileIfDirty(struct mTileCache* cache, struct mTileCacheEntry* entry, unsigned tileId, unsigned paletteId); +const uint8_t* mTileCacheGetRawTile(struct mTileCache* cache, unsigned tileId); +const uint16_t* mTileCacheGetPalette(struct mTileCache* cache, unsigned paletteId); CXX_GUARD_END
@@ -113,7 +113,7 @@ struct VFile* firmwareVf;
struct mAVStream* stream; struct mKeyCallback* keyCallback; - struct mCoreCallbacks* coreCallbacks; + struct mCoreCallbacksList coreCallbacks; struct mTimingEvent divEvent; struct mTimingEvent sqrtEvent;
@@ -11,6 +11,7 @@
CXX_GUARD_START #include <mgba/core/cpu.h> +#include <mgba/core/interface.h> #include <mgba/core/log.h> #include <mgba/core/timing.h>@@ -46,7 +47,6 @@
struct LR35902Core; struct mCoreSync; struct mAVStream; -struct mCoreCallbacks; struct GB { struct mCPUComponent d;@@ -63,7 +63,7 @@ struct mTiming timing;
uint8_t* keySource; - void* pristineRom; + bool isPristine; size_t pristineRomSize; size_t yankedRomSize; uint32_t romCrc32;@@ -76,7 +76,7 @@ int sramDirty;
int32_t sramDirtAge; bool sramMaskWriteback; - struct mCoreCallbacks* coreCallbacks; + struct mCoreCallbacksList coreCallbacks; struct mAVStream* stream; bool cpuBlocked;
@@ -17,7 +17,7 @@
struct GB; struct GBMemory; void GBMBCInit(struct GB* gb); -void GBMBCSwitchBank(struct GBMemory* memory, int bank); +void GBMBCSwitchBank(struct GB* gb, int bank); void GBMBCSwitchSramBank(struct GB* gb, int bank); struct GBMBCRTCSaveBuffer {
@@ -90,7 +90,7 @@ struct mRTCSource* rtcSource;
struct mRumble* rumble; struct GBARRContext* rr; - void* pristineRom; + bool isPristine; size_t pristineRomSize; size_t yankedRomSize; uint32_t romCrc32;@@ -100,7 +100,7 @@
struct mAVStream* stream; struct mKeyCallback* keyCallback; struct mStopCallback* stopCallback; - struct mCoreCallbacks* coreCallbacks; + struct mCoreCallbacksList coreCallbacks; enum GBAIdleLoopOptimization idleOptimization; uint32_t idleLoop;
@@ -129,6 +129,7 @@ unsigned target1Obj;
unsigned target1Bd; unsigned target2Obj; unsigned target2Bd; + bool blendDirty; enum BlendEffect blendEffect; color_t normalPalette[512]; color_t variantPalette[512];
@@ -0,0 +1,11 @@
+[shader] +name=Wii U +author=Prof. 9 +description=Uses the color palette from the Wii U Virtual Console. Enable bilinear filtering to further mimic Wii U output. +passes=1 + +[pass.0] +fragmentShader=wiiu.fs +blend=1 +width=960 +height=640
@@ -0,0 +1,22 @@
+varying vec2 texCoord; +uniform sampler2D tex; +uniform vec2 texSize; + +const float scale[32] = float[]( + 0.0/255.0, 6.0/255.0, 12.0/255.0, 18.0/255.0, 24.0/255.0, 31.0/255.0, 37.0/255.0, 43.0/255.0, + 49.0/255.0, 55.0/255.0, 61.0/255.0, 67.0/255.0, 73.0/255.0, 79.0/255.0, 86.0/255.0, 92.0/255.0, + 98.0/255.0, 104.0/255.0, 111.0/255.0, 117.0/255.0, 123.0/255.0, 129.0/255.0, 135.0/255.0, 141.0/255.0, + 148.0/255.0, 154.0/255.0, 159.0/255.0, 166.0/255.0, 172.0/255.0, 178.0/255.0, 184.0/255.0, 191.0/255.0 +); + +void main() { + vec4 color = texture2D(tex, texCoord); + color.rgb = round(color.rgb * 31.0); + color = vec4( + scale[int(color.r)], + scale[int(color.g)], + scale[int(color.b)], + 1.0 + ); + gl_FragColor = color; +}
@@ -13,7 +13,7 @@ #define MAX_LINE_LENGTH 128
const uint32_t M_CHEAT_DEVICE_ID = 0xABADC0DE; -mLOG_DEFINE_CATEGORY(CHEATS, "Cheats"); +mLOG_DEFINE_CATEGORY(CHEATS, "Cheats", "core.cheats"); DEFINE_VECTOR(mCheatList, struct mCheat); DEFINE_VECTOR(mCheatSets, struct mCheatSet*);
@@ -29,6 +29,13 @@ #endif
#define SECTION_NAME_MAX 128 +struct mCoreConfigEnumerateData { + void (*handler)(const char* key, const char* value, enum mCoreConfigLevel type, void* user); + const char* prefix; + void* user; + enum mCoreConfigLevel level; +}; + static const char* _lookupValue(const struct mCoreConfig* config, const char* key) { const char* value; if (config->port) {@@ -321,6 +328,7 @@ _lookupIntValue(config, "logLevel", &opts->logLevel);
_lookupIntValue(config, "frameskip", &opts->frameskip); _lookupIntValue(config, "volume", &opts->volume); _lookupIntValue(config, "rewindBufferCapacity", &opts->rewindBufferCapacity); + _lookupIntValue(config, "rewindSave", &opts->rewindSave); _lookupFloatValue(config, "fpsTarget", &opts->fpsTarget); unsigned audioBuffers; if (_lookupUIntValue(config, "audioBuffers", &audioBuffers)) {@@ -376,6 +384,7 @@ ConfigurationSetIntValue(&config->defaultsTable, 0, "logLevel", opts->logLevel);
ConfigurationSetIntValue(&config->defaultsTable, 0, "frameskip", opts->frameskip); ConfigurationSetIntValue(&config->defaultsTable, 0, "rewindEnable", opts->rewindEnable); ConfigurationSetIntValue(&config->defaultsTable, 0, "rewindBufferCapacity", opts->rewindBufferCapacity); + ConfigurationSetIntValue(&config->defaultsTable, 0, "rewindSave", opts->rewindSave); ConfigurationSetFloatValue(&config->defaultsTable, 0, "fpsTarget", opts->fpsTarget); ConfigurationSetUIntValue(&config->defaultsTable, 0, "audioBuffers", opts->audioBuffers); ConfigurationSetUIntValue(&config->defaultsTable, 0, "sampleRate", opts->sampleRate);@@ -389,6 +398,22 @@ ConfigurationSetIntValue(&config->defaultsTable, 0, "mute", opts->mute);
ConfigurationSetIntValue(&config->defaultsTable, 0, "lockAspectRatio", opts->lockAspectRatio); ConfigurationSetIntValue(&config->defaultsTable, 0, "resampleVideo", opts->resampleVideo); ConfigurationSetIntValue(&config->defaultsTable, 0, "suspendScreensaver", opts->suspendScreensaver); +} + +static void _configEnum(const char* key, const char* value, void* user) { + struct mCoreConfigEnumerateData* data = user; + if (!data->prefix || startswith(key, data->prefix)) { + data->handler(key, value, data->level, data->user); + } +} + +void mCoreConfigEnumerate(const struct mCoreConfig* config, const char* prefix, void (*handler)(const char* key, const char* value, enum mCoreConfigLevel type, void* user), void* user) { + struct mCoreConfigEnumerateData handlerData = { handler, prefix, user, mCONFIG_LEVEL_DEFAULT }; + ConfigurationEnumerate(&config->defaultsTable, config->port, _configEnum, &handlerData); + handlerData.level = mCONFIG_LEVEL_CUSTOM; + ConfigurationEnumerate(&config->configTable, config->port, _configEnum, &handlerData); + handlerData.level = mCONFIG_LEVEL_OVERRIDE; + ConfigurationEnumerate(&config->overridesTable, config->port, _configEnum, &handlerData); } // These two are basically placeholders in case the internal layout changes, e.g. for loading separate files
@@ -240,3 +240,8 @@ core->setAudioBufferSize(core, core->opts.audioBuffers);
} core->loadConfig(core, config); } + +void mCoreSetRTC(struct mCore* core, struct mRTCSource* rtc) { + core->rtc.custom = rtc; + core->rtc.override = RTC_CUSTOM_START; +}
@@ -6,24 +6,103 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <mgba/core/interface.h> #include <mgba/core/core.h> +#include <mgba/core/serialize.h> -static time_t _rtcGenericCallback(struct mRTCSource* source) { +DEFINE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks); + +static void _rtcGenericSample(struct mRTCSource* source) { struct mRTCGenericSource* rtc = (struct mRTCGenericSource*) source; switch (rtc->override) { + default: + if (rtc->custom->sample) { + return rtc->custom->sample(rtc->custom); + } + break; case RTC_NO_OVERRIDE: + case RTC_FIXED: + case RTC_FAKE_EPOCH: + break; + } +} + +static time_t _rtcGenericCallback(struct mRTCSource* source) { + struct mRTCGenericSource* rtc = (struct mRTCGenericSource*) source; + switch (rtc->override) { default: + if (rtc->custom->unixTime) { + return rtc->custom->unixTime(rtc->custom); + } + // Fall through + case RTC_NO_OVERRIDE: return time(0); case RTC_FIXED: - return rtc->value; + return rtc->value / 1000LL; case RTC_FAKE_EPOCH: - return rtc->value + rtc->p->frameCounter(rtc->p) * (int64_t) rtc->p->frameCycles(rtc->p) / rtc->p->frequency(rtc->p); + return (rtc->value + rtc->p->frameCounter(rtc->p) * (rtc->p->frameCycles(rtc->p) * 1000LL) / rtc->p->frequency(rtc->p)) / 1000LL; + } +} + +static void _rtcGenericSerialize(struct mRTCSource* source, struct mStateExtdataItem* item) { + struct mRTCGenericSource* rtc = (struct mRTCGenericSource*) source; + struct mRTCGenericState state = { + .type = rtc->override, + .padding = 0, + .value = rtc->value + }; + void* data; + if (rtc->override >= RTC_CUSTOM_START && rtc->custom->serialize) { + rtc->custom->serialize(rtc->custom, item); + data = malloc(item->size + sizeof(state)); + uint8_t* oldData = data; + oldData += sizeof(state); + memcpy(oldData, item->data, item->size); + item->size += sizeof(state); + if (item->clean) { + item->clean(item->data); + } + } else { + item->size = sizeof(state); + data = malloc(item->size); + } + memcpy(data, &state, sizeof(state)); + item->data = data; + item->clean = free; +} + +static bool _rtcGenericDeserialize(struct mRTCSource* source, const struct mStateExtdataItem* item) { + struct mRTCGenericSource* rtc = (struct mRTCGenericSource*) source; + struct mRTCGenericState* state = item->data; + if (!state || item->size < (ssize_t) sizeof(*state)) { + return false; + } + if (state->type >= RTC_CUSTOM_START) { + if (!rtc->custom) { + return false; + } + if (rtc->custom->deserialize) { + uint8_t* oldData = item->data; + oldData += sizeof(state); + struct mStateExtdataItem fakeItem = { + .size = item->size - sizeof(*state), + .data = oldData, + .clean = NULL + }; + if (!rtc->custom->deserialize(rtc->custom, &fakeItem)) { + return false; + } + } } + rtc->value = state->value; + rtc->override = state->type; + return true; } void mRTCGenericSourceInit(struct mRTCGenericSource* rtc, struct mCore* core) { rtc->p = core; rtc->override = RTC_NO_OVERRIDE; rtc->value = 0; - rtc->d.sample = 0; + rtc->d.sample = _rtcGenericSample; rtc->d.unixTime = _rtcGenericCallback; + rtc->d.serialize = _rtcGenericSerialize; + rtc->d.deserialize = _rtcGenericDeserialize; }
@@ -5,6 +5,7 @@ * 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/core/log.h> +#include <mgba/core/config.h> #include <mgba/core/thread.h> #define MAX_CATEGORY 64@@ -28,20 +29,39 @@ }
static int _category = 0; static const char* _categoryNames[MAX_CATEGORY]; +static const char* _categoryIds[MAX_CATEGORY]; -int mLogGenerateCategory(const char* name) { - ++_category; +int mLogGenerateCategory(const char* name, const char* id) { if (_category < MAX_CATEGORY) { _categoryNames[_category] = name; + _categoryIds[_category] = id; } - return _category; + ++_category; + return _category - 1; } const char* mLogCategoryName(int category) { if (category < MAX_CATEGORY) { return _categoryNames[category]; } - return 0; + return NULL; +} + +const char* mLogCategoryId(int category) { + if (category < MAX_CATEGORY) { + return _categoryIds[category]; + } + return NULL; +} + +int mLogCategoryById(const char* id) { + int i; + for (i = 0; i < _category; ++i) { + if (strcmp(_categoryIds[i], id) == 0) { + return i; + } + } + return -1; } void mLog(int category, enum mLogLevel level, const char* format, ...) {@@ -49,7 +69,9 @@ struct mLogger* context = mLogGetContext();
va_list args; va_start(args, format); if (context) { - context->log(context, category, level, format, args); + if (!context->filter || mLogFilterTest(context->filter, category, level)) { + context->log(context, category, level, format, args); + } } else { printf("%s: ", mLogCategoryName(category)); vprintf(format, args);@@ -58,4 +80,67 @@ }
va_end(args); } -mLOG_DEFINE_CATEGORY(STATUS, "Status") +void mLogFilterInit(struct mLogFilter* filter) { + HashTableInit(&filter->categories, 8, NULL); + TableInit(&filter->levels, 8, NULL); +} + +void mLogFilterDeinit(struct mLogFilter* filter) { + HashTableDeinit(&filter->categories); + TableDeinit(&filter->levels); +} + +static void _setFilterLevel(const char* key, const char* value, enum mCoreConfigLevel level, void* user) { + UNUSED(level); + struct mLogFilter* filter = user; + key = strchr(key, '.'); + if (!key || !key[1]) { + return; + } + if (!value) { + return; + } + ++key; + char* end; + int ivalue = strtol(value, &end, 10); + if (ivalue == 0) { + ivalue = INT_MIN; // Zero is reserved + } + if (!end) { + return; + } + mLogFilterSet(filter, key, ivalue); +} + +void mLogFilterLoad(struct mLogFilter* filter, const struct mCoreConfig* config) { + mCoreConfigEnumerate(config, "logLevel.", _setFilterLevel, filter); + filter->defaultLevels = mLOG_ALL; + mCoreConfigGetIntValue(config, "logLevel", &filter->defaultLevels); +} + +void mLogFilterSet(struct mLogFilter* filter, const char* category, int levels) { + HashTableInsert(&filter->categories, category, (void*)(intptr_t) levels); + // Can't do this eagerly because not all categories are initialized immediately + int cat = mLogCategoryById(category); + if (cat >= 0) { + TableInsert(&filter->levels, cat, (void*)(intptr_t) levels); + } + +} +bool mLogFilterTest(struct mLogFilter* filter, int category, enum mLogLevel level) { + int value = (int) TableLookup(&filter->levels, category); + if (value) { + return value & level; + } + const char* cat = mLogCategoryId(category); + if (cat) { + value = (int) HashTableLookup(&filter->categories, cat); + if (value) { + TableInsert(&filter->levels, category, (void*)(intptr_t) value); + return value & level; + } + } + return level & filter->defaultLevels; +} + +mLOG_DEFINE_CATEGORY(STATUS, "Status", "core.status")
@@ -6,6 +6,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <mgba/core/rewind.h> #include <mgba/core/core.h> +#include <mgba/core/serialize.h> #include <mgba-util/patch/fast.h> #include <mgba-util/vfs.h>@@ -20,6 +21,7 @@ }
context->previousState = VFileMemChunk(0, 0); context->currentState = VFileMemChunk(0, 0); context->size = 0; + context->stateFlags = SAVESTATE_SAVEDATA; } void mCoreRewindContextDeinit(struct mCoreRewindContext* context) {@@ -41,7 +43,7 @@ }
if (context->current >= mCoreRewindPatchesSize(&context->patchMemory)) { context->current = 0; } - mCoreSaveStateNamed(core, nextState, 0); + mCoreSaveStateNamed(core, nextState, context->stateFlags); struct PatchFast* patch = mCoreRewindPatchesGetPointer(&context->patchMemory, context->current); size_t size2 = nextState->size(nextState); size_t size = context->currentState->size(context->currentState);@@ -75,7 +77,7 @@ void* previous = context->previousState->map(context->previousState, size, MAP_WRITE);
patch->d.applyPatch(&patch->d, current, size, previous, size); context->currentState->unmap(context->currentState, current, size); context->previousState->unmap(context->previousState, previous, size); - mCoreLoadStateNamed(core, context->previousState, 0); + mCoreLoadStateNamed(core, context->previousState, context->stateFlags); struct VFile* nextState = context->previousState; context->previousState = context->currentState; context->currentState = nextState;
@@ -7,6 +7,7 @@ #include <mgba/core/serialize.h>
#include <mgba/core/core.h> #include <mgba/core/cheats.h> +#include <mgba/core/interface.h> #include <mgba-util/memory.h> #include <mgba-util/vfs.h>@@ -16,7 +17,7 @@ #include <png.h>
#include <zlib.h> #endif -mLOG_DEFINE_CATEGORY(SAVESTATE, "Savestate"); +mLOG_DEFINE_CATEGORY(SAVESTATE, "Savestate", "core.serialize"); struct mBundledState { size_t stateSize;@@ -328,6 +329,14 @@ };
mStateExtdataPut(&extdata, EXTDATA_CHEATS, &item); } } + if (flags & SAVESTATE_RTC) { + mLOG(SAVESTATE, INFO, "Loading RTC"); + struct mStateExtdataItem item; + if (core->rtc.d.serialize) { + core->rtc.d.serialize(&core->rtc.d, &item); + mStateExtdataPut(&extdata, EXTDATA_RTC, &item); + } + } #ifdef USE_PNG if (!(flags & SAVESTATE_SCREENSHOT)) { #else@@ -423,6 +432,12 @@ mCheatDeviceClear(device);
mCheatParseFile(device, svf); svf->close(svf); } + } + } + if (flags & SAVESTATE_RTC && mStateExtdataGet(&extdata, EXTDATA_RTC, &item)) { + mLOG(SAVESTATE, INFO, "Loading RTC"); + if (core->rtc.d.deserialize) { + core->rtc.d.deserialize(&core->rtc.d, &item); } } mStateExtdataDeinit(&extdata);
@@ -6,6 +6,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <mgba/core/thread.h> #include <mgba/core/core.h> +#include <mgba/core/serialize.h> #include <mgba-util/patch.h> #include <mgba-util/vfs.h>@@ -34,6 +35,8 @@ _contextKey = TlsAlloc();
return TRUE; } #endif + +static void _mCoreLog(struct mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args); static void _changeState(struct mCoreThread* threadContext, enum mCoreThreadState newState, bool broadcast) { MutexLock(&threadContext->stateMutex);@@ -142,12 +145,20 @@ .videoFrameEnded = _frameEnded,
.coreCrashed = _crashed, .context = threadContext }; - core->setCoreCallbacks(core, &callbacks); + core->addCoreCallbacks(core, &callbacks); core->setSync(core, &threadContext->sync); core->reset(core); + struct mLogFilter filter; + if (!threadContext->logger.d.filter) { + threadContext->logger.d.filter = &filter; + mLogFilterInit(threadContext->logger.d.filter); + mLogFilterLoad(threadContext->logger.d.filter, &core->config); + } + if (core->opts.rewindEnable && core->opts.rewindBufferCapacity > 0) { mCoreRewindContextInit(&threadContext->rewind, core->opts.rewindBufferCapacity); + threadContext->rewind.stateFlags = core->opts.rewindSave ? SAVESTATE_SAVEDATA : 0; } _changeState(threadContext, THREAD_RUNNING, true);@@ -221,7 +232,9 @@
if (threadContext->cleanCallback) { threadContext->cleanCallback(threadContext); } - core->setCoreCallbacks(core, NULL); + core->clearCoreCallbacks(core); + + threadContext->logger.d.filter = NULL; return 0; }@@ -229,7 +242,10 @@
bool mCoreThreadStart(struct mCoreThread* threadContext) { threadContext->state = THREAD_INITIALIZED; threadContext->logger.p = threadContext; - threadContext->logLevel = threadContext->core->opts.logLevel; + if (!threadContext->logger.d.log) { + threadContext->logger.d.log = _mCoreLog; + threadContext->logger.d.filter = NULL; + } if (!threadContext->sync.fpsTarget) { threadContext->sync.fpsTarget = _defaultFPSTarget;@@ -542,10 +558,7 @@ #endif
static void _mCoreLog(struct mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args) { UNUSED(logger); - struct mCoreThread* thread = mCoreThreadGet(); - if (thread && !(thread->logLevel & level)) { - return; - } + UNUSED(level); printf("%s: ", mLogCategoryName(category)); vprintf(format, args); printf("\n");@@ -554,9 +567,6 @@
struct mLogger* mCoreThreadLogger(void) { struct mCoreThread* thread = mCoreThreadGet(); if (thread) { - if (!thread->logger.d.log) { - thread->logger.d.log = _mCoreLog; - } return &thread->logger.d; } return NULL;
@@ -283,3 +283,27 @@ entry[paletteId] = *status;
} return tile; } + +const uint8_t* mTileCacheGetRawTile(struct mTileCache* cache, unsigned tileId) { + unsigned bpp = cache->bpp; + switch (bpp) { + case 0: + return NULL; + default: + return (uint8_t*) &cache->vram[tileId << (2 + bpp)]; + } +} + +const uint16_t* mTileCacheGetPalette(struct mTileCache* cache, unsigned paletteId) { + unsigned bpp = cache->bpp; + switch (bpp) { + default: + return NULL; + case 1: + return &cache->palette[paletteId << 2]; + case 2: + return &cache->palette[paletteId << 4]; + case 3: + return &cache->palette[paletteId << 8]; + } +}
@@ -15,7 +15,7 @@ #endif
const uint32_t DEBUGGER_ID = 0xDEADBEEF; -mLOG_DEFINE_CATEGORY(DEBUGGER, "Debugger"); +mLOG_DEFINE_CATEGORY(DEBUGGER, "Debugger", "core.debugger"); static void mDebuggerInit(void* cpu, struct mCPUComponent* component); static void mDebuggerDeinit(struct mCPUComponent* component);
@@ -7,7 +7,7 @@ #include <mgba/internal/ds/bios.h>
#include <mgba/internal/arm/arm.h> -mLOG_DEFINE_CATEGORY(DS_BIOS, "DS BIOS"); +mLOG_DEFINE_CATEGORY(DS_BIOS, "DS BIOS", "ds.bios"); const uint32_t DS7_BIOS_CHECKSUM = 0x1280F0D5; const uint32_t DS9_BIOS_CHECKSUM = 0x2AB23573;
@@ -156,9 +156,14 @@ static size_t _DSCoreGetAudioBufferSize(struct mCore* core) {
return 2048; } -static void _DSCoreSetCoreCallbacks(struct mCore* core, struct mCoreCallbacks* coreCallbacks) { +static void _DSCoreAddCoreCallbacks(struct mCore* core, struct mCoreCallbacks* coreCallbacks) { + struct DS* ds = core->board; + *mCoreCallbacksListAppend(&ds->coreCallbacks) = *coreCallbacks; +} + +static void _DSCoreClearCoreCallbacks(struct mCore* core) { struct DS* ds = core->board; - ds->coreCallbacks = coreCallbacks; + mCoreCallbacksListClear(&ds->coreCallbacks); } static void _DSCoreSetAVStream(struct mCore* core, struct mAVStream* stream) {@@ -370,11 +375,6 @@ static void _DSCoreGetGameCode(const struct mCore* core, char* title) {
DSGetGameCode(core->board, title); } -static void _DSCoreSetRTC(struct mCore* core, struct mRTCSource* rtc) { - struct DS* ds = core->board; - ds->rtcSource = rtc; -} - static void _DSCoreSetRotation(struct mCore* core, struct mRotationSource* rotation) { }@@ -513,7 +513,8 @@ core->putPixels = _DSCorePutPixels;
core->getAudioChannel = _DSCoreGetAudioChannel; core->setAudioBufferSize = _DSCoreSetAudioBufferSize; core->getAudioBufferSize = _DSCoreGetAudioBufferSize; - core->setCoreCallbacks = _DSCoreSetCoreCallbacks; + core->addCoreCallbacks = _DSCoreAddCoreCallbacks; + core->clearCoreCallbacks = _DSCoreClearCoreCallbacks; core->setAVStream = _DSCoreSetAVStream; core->isROM = DSIsROM; core->loadROM = _DSCoreLoadROM;@@ -539,7 +540,6 @@ core->frameCycles = _DSCoreFrameCycles;
core->frequency = _DSCoreFrequency; core->getGameTitle = _DSCoreGetGameTitle; core->getGameCode = _DSCoreGetGameCode; - core->setRTC = _DSCoreSetRTC; core->setRotation = _DSCoreSetRotation; core->setRumble = _DSCoreSetRumble; core->busRead8 = _DSCoreBusRead8;
@@ -18,7 +18,7 @@ #include <mgba-util/vfs.h>
#define SLICE_CYCLES 2048 -mLOG_DEFINE_CATEGORY(DS, "DS"); +mLOG_DEFINE_CATEGORY(DS, "DS", "ds"); const uint32_t DS_ARM946ES_FREQUENCY = 0x1FF61FE; const uint32_t DS_ARM7TDMI_FREQUENCY = 0xFFB0FF;@@ -209,7 +209,9 @@
ds->romVf = NULL; DSSlot1SPIInit(ds, NULL); + ds->stream = NULL; ds->keyCallback = NULL; + mCoreCallbacksListInit(&ds->coreCallbacks, 0); ds->divEvent.name = "DS Hardware Divide"; ds->divEvent.callback = _divide;@@ -240,6 +242,7 @@ DSMemoryDeinit(ds);
DSGXDeinit(&ds->gx); mTimingDeinit(&ds->ds7.timing); mTimingDeinit(&ds->ds9.timing); + mCoreCallbacksListDeinit(&ds->coreCallbacks); } void DS7InterruptHandlerInit(struct ARMInterruptHandler* irqh) {@@ -824,16 +827,22 @@ }
} void DSFrameStarted(struct DS* ds) { - struct mCoreCallbacks* callbacks = ds->coreCallbacks; - if (callbacks && callbacks->videoFrameStarted) { - callbacks->videoFrameStarted(callbacks->context); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&ds->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&ds->coreCallbacks, c); + if (callbacks->videoFrameStarted) { + callbacks->videoFrameStarted(callbacks->context); + } } } void DSFrameEnded(struct DS* ds) { - struct mCoreCallbacks* callbacks = ds->coreCallbacks; - if (callbacks && callbacks->videoFrameEnded) { - callbacks->videoFrameEnded(callbacks->context); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&ds->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&ds->coreCallbacks, c); + if (callbacks->videoFrameEnded) { + callbacks->videoFrameEnded(callbacks->context); + } } if (ds->stream && ds->stream->postVideoFrame) {
@@ -8,7 +8,7 @@
#include <mgba/internal/ds/ds.h> #include <mgba/internal/ds/io.h> -mLOG_DEFINE_CATEGORY(DS_GX, "DS GX"); +mLOG_DEFINE_CATEGORY(DS_GX, "DS GX", "ds.gx"); #define DS_GX_FIFO_SIZE 256 #define DS_GX_PIPE_SIZE 4
@@ -12,7 +12,7 @@ #include <mgba/internal/ds/ipc.h>
#include <mgba/internal/ds/slot1.h> #include <mgba/internal/ds/spi.h> -mLOG_DEFINE_CATEGORY(DS_IO, "DS I/O"); +mLOG_DEFINE_CATEGORY(DS_IO, "DS I/O", "ds.io"); static void _DSHaltCNT(struct DSCommon* dscore, uint8_t value) { switch (value >> 6) {
@@ -8,7 +8,7 @@
#include <mgba/internal/ds/ds.h> #include <mgba/internal/ds/io.h> -mLOG_DEFINE_CATEGORY(DS_IPC, "DS IPC"); +mLOG_DEFINE_CATEGORY(DS_IPC, "DS IPC", "ds.ipc"); void DSIPCWriteSYNC(struct ARMCore* remoteCpu, uint16_t* remoteIo, int16_t value) { remoteIo[DS_REG_IPCSYNC >> 1] &= 0xFFF0;
@@ -12,7 +12,7 @@ #include <mgba/internal/ds/io.h>
#include <mgba-util/math.h> #include <mgba-util/memory.h> -mLOG_DEFINE_CATEGORY(DS_MEM, "DS Memory"); +mLOG_DEFINE_CATEGORY(DS_MEM, "DS Memory", "ds.memory"); static uint32_t _deadbeef[1] = { 0xE710B710 }; // Illegal instruction on both ARM and Thumb const uint32_t redzoneInstruction = 0xE7F0DEF0;
@@ -11,7 +11,7 @@ #include <mgba/internal/ds/dma.h>
#include <mgba-util/math.h> #include <mgba-util/vfs.h> -mLOG_DEFINE_CATEGORY(DS_SLOT1, "DS Slot-1"); +mLOG_DEFINE_CATEGORY(DS_SLOT1, "DS Slot-1", "ds.slot1"); static void _slot1SPI(struct mTiming*, void* context, uint32_t cyclesLate); static void _transferEvent(struct mTiming* timing, void* context, uint32_t cyclesLate);
@@ -8,7 +8,7 @@
#include <mgba/internal/ds/ds.h> #include <mgba-util/vfs.h> -mLOG_DEFINE_CATEGORY(DS_SPI, "DS SPI"); +mLOG_DEFINE_CATEGORY(DS_SPI, "DS SPI", "ds.spi"); static void _tscEvent(struct mTiming*, void* context, uint32_t cyclesLate); static void _firmwareEvent(struct mTiming* timing, void* context, uint32_t cyclesLate);
@@ -13,7 +13,7 @@ #include <mgba/internal/gba/video.h>
#include <mgba-util/memory.h> -mLOG_DEFINE_CATEGORY(DS_VIDEO, "DS Video"); +mLOG_DEFINE_CATEGORY(DS_VIDEO, "DS Video", "ds.video"); static void DSVideoDummyRendererInit(struct DSVideoRenderer* renderer); static void DSVideoDummyRendererReset(struct DSVideoRenderer* renderer);
@@ -25,7 +25,7 @@
#include <sys/time.h> mLOG_DECLARE_CATEGORY(GUI_RUNNER); -mLOG_DEFINE_CATEGORY(GUI_RUNNER, "GUI Runner"); +mLOG_DEFINE_CATEGORY(GUI_RUNNER, "GUI Runner", "gui.runner"); #define FPS_GRANULARITY 120 #define FPS_BUFFER_SIZE 3@@ -434,7 +434,7 @@ case RUNNER_SAVE_STATE:
mCoreSaveState(runner->core, ((int) item->data) >> 16, SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA); break; case RUNNER_LOAD_STATE: - mCoreLoadState(runner->core, ((int) item->data) >> 16, SAVESTATE_SCREENSHOT); + mCoreLoadState(runner->core, ((int) item->data) >> 16, SAVESTATE_SCREENSHOT | SAVESTATE_RTC); break; case RUNNER_SCREENSHOT: mCoreTakeScreenshot(runner->core);
@@ -953,6 +953,9 @@ audio->playingCh3 = !!(*audio->nr52 & 0x0004);
audio->playingCh4 = !!(*audio->nr52 & 0x0008); audio->enable = GBAudioEnableGetEnable(*audio->nr52); + LOAD_32LE(when, 0, &state->ch1.nextFrame); + mTimingSchedule(audio->timing, &audio->frameEvent, when); + LOAD_32LE(flags, 0, flagsIn); LOAD_32LE(ch1Flags, 0, &state->ch1.envelope); audio->ch1.envelope.currentVolume = GBSerializedAudioFlagsGetCh1Volume(flags);@@ -964,7 +967,6 @@ audio->ch1.control.length = GBSerializedAudioEnvelopeGetLength(ch1Flags);
audio->ch1.envelope.nextStep = GBSerializedAudioEnvelopeGetNextStep(ch1Flags); audio->ch1.sweep.realFrequency = GBSerializedAudioEnvelopeGetFrequency(ch1Flags); LOAD_32LE(when, 0, &state->ch1.nextEvent); - mTimingDeschedule(audio->timing, &audio->ch1Event); if (audio->ch1.envelope.dead < 2 && audio->playingCh1) { mTimingSchedule(audio->timing, &audio->ch1Event, when); }@@ -976,7 +978,6 @@ audio->ch2.control.hi = GBSerializedAudioFlagsGetCh2Hi(flags);
audio->ch2.control.length = GBSerializedAudioEnvelopeGetLength(ch2Flags); audio->ch2.envelope.nextStep = GBSerializedAudioEnvelopeGetNextStep(ch2Flags); LOAD_32LE(when, 0, &state->ch2.nextEvent); - mTimingDeschedule(audio->timing, &audio->ch2Event); if (audio->ch2.envelope.dead < 2 && audio->playingCh2) { mTimingSchedule(audio->timing, &audio->ch2Event, when); }@@ -986,7 +987,6 @@ // TODO: Big endian?
memcpy(audio->ch3.wavedata32, state->ch3.wavebanks, sizeof(audio->ch3.wavedata32)); LOAD_16LE(audio->ch3.length, 0, &state->ch3.length); LOAD_32LE(when, 0, &state->ch3.nextEvent); - mTimingDeschedule(audio->timing, &audio->ch3Event); if (audio->playingCh3) { mTimingSchedule(audio->timing, &audio->ch3Event, when); }@@ -1002,7 +1002,6 @@ audio->ch4.length = GBSerializedAudioEnvelopeGetLength(ch4Flags);
audio->ch4.envelope.nextStep = GBSerializedAudioEnvelopeGetNextStep(ch4Flags); LOAD_32LE(audio->ch4.lfsr, 0, &state->ch4.lfsr); LOAD_32LE(when, 0, &state->ch4.nextEvent); - mTimingDeschedule(audio->timing, &audio->ch4Event); if (audio->ch4.envelope.dead < 2 && audio->playingCh4) { mTimingSchedule(audio->timing, &audio->ch4Event, when); }@@ -1017,6 +1016,5 @@ void GBAudioDeserialize(struct GBAudio* audio, const struct GBSerializedState* state) {
GBAudioPSGDeserialize(audio, &state->audio.psg, &state->audio.flags); uint32_t when; LOAD_32LE(when, 0, &state->audio.nextSample); - mTimingDeschedule(audio->timing, &audio->sampleEvent); mTimingSchedule(audio->timing, &audio->sampleEvent, when); }
@@ -54,6 +54,8 @@ GBCreate(gb);
memset(gbcore->components, 0, sizeof(gbcore->components)); LR35902SetComponents(cpu, &gb->d, CPU_COMPONENT_MAX, gbcore->components); LR35902Init(cpu); + mRTCGenericSourceInit(&core->rtc, core); + gb->memory.rtc = &core->rtc.d; GBVideoSoftwareRendererCreate(&gbcore->renderer); gbcore->renderer.outputBuffer = NULL;@@ -164,9 +166,14 @@ struct GB* gb = core->board;
return gb->audio.samples; } -static void _GBCoreSetCoreCallbacks(struct mCore* core, struct mCoreCallbacks* coreCallbacks) { +static void _GBCoreAddCoreCallbacks(struct mCore* core, struct mCoreCallbacks* coreCallbacks) { struct GB* gb = core->board; - gb->coreCallbacks = coreCallbacks; + *mCoreCallbacksListAppend(&gb->coreCallbacks) = *coreCallbacks; +} + +static void _GBCoreClearCoreCallbacks(struct mCore* core) { + struct GB* gb = core->board; + mCoreCallbacksListClear(&gb->coreCallbacks); } static void _GBCoreSetAVStream(struct mCore* core, struct mAVStream* stream) {@@ -403,11 +410,6 @@ static void _GBCoreGetGameCode(const struct mCore* core, char* title) {
GBGetGameCode(core->board, title); } -static void _GBCoreSetRTC(struct mCore* core, struct mRTCSource* rtc) { - struct GB* gb = core->board; - gb->memory.rtc = rtc; -} - static void _GBCoreSetRotation(struct mCore* core, struct mRotationSource* rotation) { struct GB* gb = core->board; gb->memory.rotation = rotation;@@ -595,7 +597,8 @@ core->getAudioChannel = _GBCoreGetAudioChannel;
core->setAudioBufferSize = _GBCoreSetAudioBufferSize; core->getAudioBufferSize = _GBCoreGetAudioBufferSize; core->setAVStream = _GBCoreSetAVStream; - core->setCoreCallbacks = _GBCoreSetCoreCallbacks; + core->addCoreCallbacks = _GBCoreAddCoreCallbacks; + core->clearCoreCallbacks = _GBCoreClearCoreCallbacks; core->isROM = GBIsROM; core->loadROM = _GBCoreLoadROM; core->loadBIOS = _GBCoreLoadBIOS;@@ -621,7 +624,6 @@ core->frameCycles = _GBCoreFrameCycles;
core->frequency = _GBCoreFrequency; core->getGameTitle = _GBCoreGetGameTitle; core->getGameCode = _GBCoreGetGameCode; - core->setRTC = _GBCoreSetRTC; core->setRotation = _GBCoreSetRotation; core->setRumble = _GBCoreSetRumble; core->busRead8 = _GBCoreBusRead8;
@@ -101,7 +101,7 @@ }
struct GBCLIDebugger* gbDebugger = (struct GBCLIDebugger*) debugger->system; - mCoreLoadState(gbDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT); + mCoreLoadState(gbDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT | SAVESTATE_RTC); } static void _save(struct CLIDebugger* debugger, struct CLIDebugVector* dv) {@@ -118,5 +118,5 @@ }
struct GBCLIDebugger* gbDebugger = (struct GBCLIDebugger*) debugger->system; - mCoreSaveState(gbDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT); + mCoreSaveState(gbDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT | SAVESTATE_RTC); }
@@ -30,7 +30,7 @@ #define DMG_BIOS_CHECKSUM 0xC2F5CC97
#define DMG_2_BIOS_CHECKSUM 0x59C8598E #define CGB_BIOS_CHECKSUM 0x41884E46 -mLOG_DEFINE_CATEGORY(GB, "GB"); +mLOG_DEFINE_CATEGORY(GB, "GB", "gb"); static void GBInit(void* cpu, struct mCPUComponent* component); static void GBDeinit(struct mCPUComponent* component);@@ -79,11 +79,11 @@ gb->romVf = NULL;
gb->sramVf = NULL; gb->sramRealVf = NULL; - gb->pristineRom = 0; + gb->isPristine = false; gb->pristineRomSize = 0; gb->yankedRomSize = 0; - gb->coreCallbacks = NULL; + mCoreCallbacksListInit(&gb->coreCallbacks, 0); gb->stream = NULL; mTimingInit(&gb->timing, &gb->cpu->cycles, &gb->cpu->nextEvent);@@ -108,24 +108,23 @@ GBUnloadROM(gb);
gb->romVf = vf; gb->pristineRomSize = vf->size(vf); vf->seek(vf, 0, SEEK_SET); + gb->isPristine = true; #ifdef _3DS - gb->pristineRom = 0; if (gb->pristineRomSize <= romBufferSize) { - gb->pristineRom = romBuffer; + gb->memory.rom = romBuffer; vf->read(vf, romBuffer, gb->pristineRomSize); } #else - gb->pristineRom = vf->map(vf, gb->pristineRomSize, MAP_READ); + gb->memory.rom = vf->map(vf, gb->pristineRomSize, MAP_READ); #endif - if (!gb->pristineRom) { + if (!gb->memory.rom) { return false; } gb->yankedRomSize = 0; - gb->memory.rom = gb->pristineRom; gb->memory.romBase = gb->memory.rom; gb->memory.romSize = gb->pristineRomSize; gb->romCrc32 = doCrc32(gb->memory.rom, gb->memory.romSize); - GBMBCSwitchBank(&gb->memory, gb->memory.currentBank); + GBMBCSwitchBank(gb, gb->memory.currentBank); if (gb->cpu) { struct LR35902Core* cpu = gb->cpu;@@ -263,26 +262,25 @@ }
void GBUnloadROM(struct GB* gb) { // TODO: Share with GBAUnloadROM - if (gb->memory.rom && gb->memory.romBase != gb->memory.rom && gb->memory.romBase != gb->pristineRom) { + if (gb->memory.rom && gb->memory.romBase != gb->memory.rom && !gb->isPristine) { free(gb->memory.romBase); } - if (gb->memory.rom && gb->pristineRom != gb->memory.rom) { + if (gb->memory.rom && !gb->isPristine) { if (gb->yankedRomSize) { gb->yankedRomSize = 0; } mappedMemoryFree(gb->memory.rom, GB_SIZE_CART_MAX); - gb->memory.rom = gb->pristineRom; } - gb->memory.rom = 0; if (gb->romVf) { #ifndef _3DS - gb->romVf->unmap(gb->romVf, gb->pristineRom, gb->pristineRomSize); + gb->romVf->unmap(gb->romVf, gb->memory.rom, gb->pristineRomSize); #endif gb->romVf->close(gb->romVf); - gb->romVf = 0; + gb->romVf = NULL; } - gb->pristineRom = 0; + gb->memory.rom = NULL; + gb->isPristine = false; GBSavedataUnmask(gb); GBSramDeinit(gb);@@ -317,14 +315,26 @@ }
if (patchedSize > GB_SIZE_CART_MAX) { patchedSize = GB_SIZE_CART_MAX; } - gb->memory.rom = anonymousMemoryMap(GB_SIZE_CART_MAX); - if (!patch->applyPatch(patch, gb->pristineRom, gb->pristineRomSize, gb->memory.rom, patchedSize)) { - mappedMemoryFree(gb->memory.rom, patchedSize); - gb->memory.rom = gb->pristineRom; + void* newRom = anonymousMemoryMap(GB_SIZE_CART_MAX); + if (!patch->applyPatch(patch, gb->memory.rom, gb->pristineRomSize, newRom, patchedSize)) { + mappedMemoryFree(newRom, GB_SIZE_CART_MAX); return; } + if (gb->romVf) { +#ifndef _3DS + gb->romVf->unmap(gb->romVf, gb->memory.rom, gb->pristineRomSize); +#endif + gb->romVf->close(gb->romVf); + gb->romVf = NULL; + } + gb->isPristine = false; + if (gb->memory.romBase == gb->memory.rom) { + gb->memory.romBase = newRom; + } + gb->memory.rom = newRom; gb->memory.romSize = patchedSize; gb->romCrc32 = doCrc32(gb->memory.rom, gb->memory.romSize); + gb->cpu->memory.setActiveRegion(gb->cpu, gb->cpu->pc); } void GBDestroy(struct GB* gb) {@@ -339,6 +349,7 @@ GBMemoryDeinit(gb);
GBAudioDeinit(&gb->audio); GBVideoDeinit(&gb->video); GBSIODeinit(&gb->sio); + mCoreCallbacksListDeinit(&gb->coreCallbacks); } void GBInterruptHandlerInit(struct LR35902InterruptHandler* irqh) {@@ -652,9 +663,6 @@ const struct GBCartridge* cart = NULL;
if (gb->memory.rom) { cart = (const struct GBCartridge*) &gb->memory.rom[0x100]; } - if (gb->pristineRom) { - cart = (const struct GBCartridge*) &((uint8_t*) gb->pristineRom)[0x100]; - } if (!cart) { return; }@@ -670,9 +678,6 @@ memset(out, 0, 8);
const struct GBCartridge* cart = NULL; if (gb->memory.rom) { cart = (const struct GBCartridge*) &gb->memory.rom[0x100]; - } - if (gb->pristineRom) { - cart = (const struct GBCartridge*) &((uint8_t*) gb->pristineRom)[0x100]; } if (!cart) { return;
@@ -9,7 +9,7 @@ #include <mgba/internal/gb/gb.h>
#include <mgba/internal/gb/sio.h> #include <mgba/internal/gb/serialize.h> -mLOG_DEFINE_CATEGORY(GB_IO, "GB I/O"); +mLOG_DEFINE_CATEGORY(GB_IO, "GB I/O", "gb.io"); const char* const GBIORegisterNames[] = { [REG_JOYP] = "JOYP",
@@ -6,11 +6,12 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <mgba/internal/gb/mbc.h> #include <mgba/core/interface.h> +#include <mgba/internal/lr35902/lr35902.h> #include <mgba/internal/gb/gb.h> #include <mgba/internal/gb/memory.h> #include <mgba-util/vfs.h> -mLOG_DEFINE_CATEGORY(GB_MBC, "GB MBC"); +mLOG_DEFINE_CATEGORY(GB_MBC, "GB MBC", "gb.mbc"); static void _GBMBCNone(struct GB* gb, uint16_t address, uint8_t value) { UNUSED(gb);@@ -28,18 +29,21 @@ static void _GBMBC6(struct GB*, uint16_t address, uint8_t value);
static void _GBMBC7(struct GB*, uint16_t address, uint8_t value); static void _GBHuC3(struct GB*, uint16_t address, uint8_t value); -void GBMBCSwitchBank(struct GBMemory* memory, int bank) { +void GBMBCSwitchBank(struct GB* gb, int bank) { size_t bankStart = bank * GB_SIZE_CART_BANK0; - if (bankStart + GB_SIZE_CART_BANK0 > memory->romSize) { + if (bankStart + GB_SIZE_CART_BANK0 > gb->memory.romSize) { mLOG(GB_MBC, GAME_ERROR, "Attempting to switch to an invalid ROM bank: %0X", bank); - bankStart &= (memory->romSize - 1); + bankStart &= (gb->memory.romSize - 1); bank = bankStart / GB_SIZE_CART_BANK0; if (!bank) { ++bank; } } - memory->romBank = &memory->rom[bankStart]; - memory->currentBank = bank; + gb->memory.romBank = &gb->memory.rom[bankStart]; + gb->memory.currentBank = bank; + if (gb->cpu->pc < GB_BASE_VRAM) { + gb->cpu->memory.setActiveRegion(gb->cpu, gb->cpu->pc); + } } void GBMBCSwitchSramBank(struct GB* gb, int bank) {@@ -249,12 +253,12 @@ case 0x1:
if (!bank) { ++bank; } - GBMBCSwitchBank(memory, bank | (memory->currentBank & 0x60)); + GBMBCSwitchBank(gb, bank | (memory->currentBank & 0x60)); break; case 0x2: bank &= 3; if (!memory->mbcState.mbc1.mode) { - GBMBCSwitchBank(memory, (bank << 5) | (memory->currentBank & 0x1F)); + GBMBCSwitchBank(gb, (bank << 5) | (memory->currentBank & 0x1F)); } else { GBMBCSwitchSramBank(gb, bank); }@@ -262,7 +266,7 @@ break;
case 0x3: memory->mbcState.mbc1.mode = value & 1; if (memory->mbcState.mbc1.mode) { - GBMBCSwitchBank(memory, memory->currentBank & 0x1F); + GBMBCSwitchBank(gb, memory->currentBank & 0x1F); } else { GBMBCSwitchSramBank(gb, 0); }@@ -297,7 +301,7 @@ case 0x1:
if (!bank) { ++bank; } - GBMBCSwitchBank(memory, bank); + GBMBCSwitchBank(gb, bank); break; default: // TODO@@ -328,7 +332,7 @@ case 0x1:
if (!bank) { ++bank; } - GBMBCSwitchBank(memory, bank); + GBMBCSwitchBank(gb, bank); break; case 0x2: if (value < 4) {@@ -372,11 +376,11 @@ }
break; case 0x2: bank = (memory->currentBank & 0x100) | value; - GBMBCSwitchBank(memory, bank); + GBMBCSwitchBank(gb, bank); break; case 0x3: bank = (memory->currentBank & 0xFF) | ((value & 1) << 8); - GBMBCSwitchBank(memory, bank); + GBMBCSwitchBank(gb, bank); break; case 0x4: case 0x5:@@ -402,11 +406,10 @@ UNUSED(value);
} void _GBMBC7(struct GB* gb, uint16_t address, uint8_t value) { - struct GBMemory* memory = &gb->memory; int bank = value & 0x7F; switch (address >> 13) { case 0x1: - GBMBCSwitchBank(memory, bank); + GBMBCSwitchBank(gb, bank); break; case 0x2: if (value < 0x10) {@@ -616,7 +619,7 @@ break;
} break; case 0x1: - GBMBCSwitchBank(memory, bank); + GBMBCSwitchBank(gb, bank); break; case 0x2: GBMBCSwitchSramBank(gb, bank);
@@ -14,7 +14,7 @@ #include <mgba/internal/lr35902/lr35902.h>
#include <mgba-util/memory.h> -mLOG_DEFINE_CATEGORY(GB_MEM, "GB Memory"); +mLOG_DEFINE_CATEGORY(GB_MEM, "GB Memory", "gb.memory"); static void _pristineCow(struct GB* gba);@@ -614,7 +614,7 @@ LOAD_16LE(memory->currentBank, 0, &state->memory.currentBank);
memory->wramCurrentBank = state->memory.wramCurrentBank; memory->sramCurrentBank = state->memory.sramCurrentBank; - GBMBCSwitchBank(memory, memory->currentBank); + GBMBCSwitchBank(gb, memory->currentBank); GBMemorySwitchWramBank(memory, memory->wramCurrentBank); GBMBCSwitchSramBank(gb, memory->sramCurrentBank);@@ -630,12 +630,10 @@ memcpy(memory->rtcRegs, state->memory.rtcRegs, sizeof(state->memory.rtcRegs));
uint32_t when; LOAD_32LE(when, 0, &state->memory.dmaNext); - mTimingDeschedule(&gb->timing, &memory->dmaEvent); if (memory->dmaRemaining) { mTimingSchedule(&gb->timing, &memory->dmaEvent, when); } LOAD_32LE(when, 0, &state->memory.hdmaNext); - mTimingDeschedule(&gb->timing, &memory->hdmaEvent); if (memory->hdmaRemaining) { mTimingSchedule(&gb->timing, &memory->hdmaEvent, when); }@@ -651,14 +649,15 @@ memory->activeRtcReg = GBSerializedMemoryFlagsGetActiveRtcReg(flags);
} void _pristineCow(struct GB* gb) { - if (gb->memory.rom != gb->pristineRom) { + if (!gb->isPristine) { return; } - gb->memory.rom = anonymousMemoryMap(GB_SIZE_CART_MAX); - memcpy(gb->memory.rom, gb->pristineRom, gb->memory.romSize); - memset(((uint8_t*) gb->memory.rom) + gb->memory.romSize, 0xFF, GB_SIZE_CART_MAX - gb->memory.romSize); - if (gb->pristineRom == gb->memory.romBase) { - gb->memory.romBase = gb->memory.rom; + void* newRom = anonymousMemoryMap(GB_SIZE_CART_MAX); + memcpy(newRom, gb->memory.rom, gb->memory.romSize); + memset(((uint8_t*) newRom) + gb->memory.romSize, 0xFF, GB_SIZE_CART_MAX - gb->memory.romSize); + if (gb->memory.rom == gb->memory.romBase) { + gb->memory.romBase = newRom; } - GBMBCSwitchBank(&gb->memory, gb->memory.currentBank); + gb->memory.rom = newRom; + GBMBCSwitchBank(gb, gb->memory.currentBank); }
@@ -9,7 +9,7 @@ #include <mgba/internal/gb/io.h>
#include <mgba/internal/gb/timer.h> #include <mgba/internal/lr35902/lr35902.h> -mLOG_DEFINE_CATEGORY(GB_STATE, "GB Savestate"); +mLOG_DEFINE_CATEGORY(GB_STATE, "GB Savestate", "gb.serialize"); const uint32_t GB_SAVESTATE_MAGIC = 0x00400000; const uint32_t GB_SAVESTATE_VERSION = 0x00000001;@@ -144,6 +144,7 @@ }
if (error) { return false; } + gb->timing.root = NULL; gb->cpu->a = state->cpu.a; gb->cpu->f.packed = state->cpu.f;@@ -170,14 +171,13 @@ gb->audio.timingFactor = gb->doubleSpeed + 1;
uint32_t when; LOAD_32LE(when, 0, &state->cpu.eiPending); - mTimingDeschedule(&gb->timing, &gb->eiPending); if (GBSerializedCpuFlagsIsEiPending(flags)) { mTimingSchedule(&gb->timing, &gb->eiPending, when); } LOAD_32LE(gb->cpu->cycles, 0, &state->cpu.cycles); LOAD_32LE(gb->cpu->nextEvent, 0, &state->cpu.nextEvent); - LOAD_32LE(gb->timing.masterCycles, 0, &state->masterCycles); + gb->timing.root = NULL; gb->model = state->model;
@@ -9,7 +9,7 @@ #include <mgba/internal/gb/gb.h>
#include <mgba/internal/gb/io.h> #include <mgba/internal/gb/serialize.h> -mLOG_DEFINE_CATEGORY(GB_SIO, "GB Serial I/O"); +mLOG_DEFINE_CATEGORY(GB_SIO, "GB Serial I/O", "gb.sio"); const int GBSIOCyclesPerTransfer[2] = { 512,
@@ -109,13 +109,11 @@ LOAD_32LE(timer->timaPeriod, 0, &state->timer.timaPeriod);
uint32_t when; LOAD_32LE(when, 0, &state->timer.nextEvent); - mTimingDeschedule(&timer->p->timing, &timer->event); mTimingSchedule(&timer->p->timing, &timer->event, when); GBSerializedTimerFlags flags; LOAD_32LE(flags, 0, &state->timer.flags); - mTimingDeschedule(&timer->p->timing, &timer->irq); if (GBSerializedTimerFlagsIsIrqPending(flags)) { LOAD_32LE(when, 0, &state->timer.nextIRQ); mTimingSchedule(&timer->p->timing, &timer->irq, when);
@@ -129,9 +129,12 @@ video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
} video->p->memory.io[REG_IF] |= (1 << GB_IRQ_VBLANK); - struct mCoreCallbacks* callbacks = video->p->coreCallbacks; - if (callbacks && callbacks->videoFrameEnded) { - callbacks->videoFrameEnded(callbacks->context); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&video->p->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&video->p->coreCallbacks, c); + if (callbacks->videoFrameEnded) { + callbacks->videoFrameEnded(callbacks->context); + } } } if (!GBRegisterSTATIsHblankIRQ(video->stat) && GBRegisterSTATIsLYCIRQ(video->stat) && lyc == video->ly) {@@ -244,9 +247,12 @@ video->renderer->getPixels(video->renderer, &stride, (const void**) &pixels);
video->p->stream->postVideoFrame(video->p->stream, pixels, stride); } - struct mCoreCallbacks* callbacks = video->p->coreCallbacks; - if (callbacks && callbacks->videoFrameStarted) { - callbacks->videoFrameStarted(callbacks->context); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&video->p->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&video->p->coreCallbacks, c); + if (callbacks->videoFrameStarted) { + callbacks->videoFrameStarted(callbacks->context); + } } if (!GBRegisterLCDCIsEnable(video->p->memory.io[REG_LCDC])) {@@ -550,12 +556,10 @@ break;
} uint32_t when; - mTimingDeschedule(&video->p->timing, &video->modeEvent); if (!GBSerializedVideoFlagsIsNotModeEventScheduled(flags)) { LOAD_32LE(when, 0, &state->video.nextMode); mTimingSchedule(&video->p->timing, &video->modeEvent, when); } - mTimingDeschedule(&video->p->timing, &video->frameEvent); if (!GBSerializedVideoFlagsIsNotFrameEventScheduled(flags)) { LOAD_32LE(when, 0, &state->video.nextFrame); mTimingSchedule(&video->p->timing, &video->frameEvent, when);
@@ -18,7 +18,7 @@ #ifdef _3DS
#define blip_add_delta blip_add_delta_fast #endif -mLOG_DEFINE_CATEGORY(GBA_AUDIO, "GBA Audio"); +mLOG_DEFINE_CATEGORY(GBA_AUDIO, "GBA Audio", "gba.audio"); const unsigned GBA_AUDIO_SAMPLES = 2048; const unsigned GBA_AUDIO_FIFO_SIZE = 8 * sizeof(int32_t);@@ -344,7 +344,6 @@ }
uint32_t when; LOAD_32(when, 0, &state->audio.nextSample); - mTimingDeschedule(&audio->p->timing, &audio->sampleEvent); mTimingSchedule(&audio->p->timing, &audio->sampleEvent, when); }
@@ -14,7 +14,7 @@
const uint32_t GBA_BIOS_CHECKSUM = 0xBAAE187F; const uint32_t GBA_DS_BIOS_CHECKSUM = 0xBAAE1880; -mLOG_DEFINE_CATEGORY(GBA_BIOS, "GBA BIOS"); +mLOG_DEFINE_CATEGORY(GBA_BIOS, "GBA BIOS", "gba.bios"); static void _unLz77(struct GBA* gba, int width); static void _unHuffman(struct GBA* gba);
@@ -62,6 +62,8 @@ // TODO: Restore cheats
memset(gbacore->components, 0, sizeof(gbacore->components)); ARMSetComponents(cpu, &gba->d, CPU_COMPONENT_MAX, gbacore->components); ARMInit(cpu); + mRTCGenericSourceInit(&core->rtc, core); + gba->rtcSource = &core->rtc.d; GBAVideoSoftwareRendererCreate(&gbacore->renderer); gbacore->renderer.outputBuffer = NULL;@@ -194,9 +196,14 @@ struct GBA* gba = core->board;
return gba->audio.samples; } -static void _GBACoreSetCoreCallbacks(struct mCore* core, struct mCoreCallbacks* coreCallbacks) { +static void _GBACoreAddCoreCallbacks(struct mCore* core, struct mCoreCallbacks* coreCallbacks) { + struct GBA* gba = core->board; + *mCoreCallbacksListAppend(&gba->coreCallbacks) = *coreCallbacks; +} + +static void _GBACoreClearCoreCallbacks(struct mCore* core) { struct GBA* gba = core->board; - gba->coreCallbacks = coreCallbacks; + mCoreCallbacksListClear(&gba->coreCallbacks); } static void _GBACoreSetAVStream(struct mCore* core, struct mAVStream* stream) {@@ -331,7 +338,7 @@ }
#endif ARMReset(core->cpu); - if (core->opts.skipBios && gba->pristineRom) { + if (core->opts.skipBios && gba->isPristine) { GBASkipBIOS(core->board); } }@@ -413,11 +420,6 @@ }
static void _GBACoreGetGameCode(const struct mCore* core, char* title) { GBAGetGameCode(core->board, title); -} - -static void _GBACoreSetRTC(struct mCore* core, struct mRTCSource* rtc) { - struct GBA* gba = core->board; - gba->rtcSource = rtc; } static void _GBACoreSetRotation(struct mCore* core, struct mRotationSource* rotation) {@@ -608,7 +610,8 @@ core->putPixels = _GBACorePutPixels;
core->getAudioChannel = _GBACoreGetAudioChannel; core->setAudioBufferSize = _GBACoreSetAudioBufferSize; core->getAudioBufferSize = _GBACoreGetAudioBufferSize; - core->setCoreCallbacks = _GBACoreSetCoreCallbacks; + core->addCoreCallbacks = _GBACoreAddCoreCallbacks; + core->clearCoreCallbacks = _GBACoreClearCoreCallbacks; core->setAVStream = _GBACoreSetAVStream; core->isROM = GBAIsROM; core->loadROM = _GBACoreLoadROM;@@ -635,7 +638,6 @@ core->frameCycles = _GBACoreFrameCycles;
core->frequency = _GBACoreFrequency; core->getGameTitle = _GBACoreGetGameTitle; core->getGameCode = _GBACoreGetGameCode; - core->setRTC = _GBACoreSetRTC; core->setRotation = _GBACoreSetRotation; core->setRumble = _GBACoreSetRumble; core->busRead8 = _GBACoreBusRead8;
@@ -100,7 +100,7 @@ }
struct GBACLIDebugger* gbaDebugger = (struct GBACLIDebugger*) debugger->system; - mCoreLoadState(gbaDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT); + mCoreLoadState(gbaDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT | SAVESTATE_RTC); } // TODO: Put back rewind@@ -119,5 +119,5 @@ }
struct GBACLIDebugger* gbaDebugger = (struct GBACLIDebugger*) debugger->system; - mCoreSaveState(gbaDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT); + mCoreSaveState(gbaDebugger->core, dv->intValue, SAVESTATE_SCREENSHOT | SAVESTATE_RTC); }
@@ -21,8 +21,8 @@ #include <mgba-util/math.h>
#include <mgba-util/memory.h> #include <mgba-util/vfs.h> -mLOG_DEFINE_CATEGORY(GBA, "GBA"); -mLOG_DEFINE_CATEGORY(GBA_DEBUG, "GBA Debug"); +mLOG_DEFINE_CATEGORY(GBA, "GBA", "gba"); +mLOG_DEFINE_CATEGORY(GBA_DEBUG, "GBA Debug", "gba.debug"); const uint32_t GBA_COMPONENT_MAGIC = 0x1000000;@@ -91,7 +91,7 @@ gba->stream = NULL;
gba->keyCallback = NULL; gba->stopCallback = NULL; gba->stopCallback = NULL; - gba->coreCallbacks = NULL; + mCoreCallbacksListInit(&gba->coreCallbacks, 0); gba->biosChecksum = GBAChecksum(gba->memory.bios, SIZE_BIOS);@@ -104,7 +104,7 @@ gba->allowOpposingDirections = true;
gba->performingDMA = false; - gba->pristineRom = 0; + gba->isPristine = false; gba->pristineRomSize = 0; gba->yankedRomSize = 0;@@ -112,22 +112,22 @@ mTimingInit(&gba->timing, &gba->cpu->cycles, &gba->cpu->nextEvent);
} void GBAUnloadROM(struct GBA* gba) { - if (gba->memory.rom && gba->pristineRom != gba->memory.rom) { + if (gba->memory.rom && !gba->isPristine) { if (gba->yankedRomSize) { gba->yankedRomSize = 0; } mappedMemoryFree(gba->memory.rom, SIZE_CART0); } - gba->memory.rom = 0; if (gba->romVf) { #ifndef _3DS - gba->romVf->unmap(gba->romVf, gba->pristineRom, gba->pristineRomSize); + gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->pristineRomSize); #endif gba->romVf->close(gba->romVf); - gba->romVf = 0; + gba->romVf = NULL; } - gba->pristineRom = 0; + gba->memory.rom = NULL; + gba->isPristine = false; GBASavedataDeinit(&gba->memory.savedata); if (gba->memory.savedata.realVf) {@@ -152,6 +152,7 @@ GBAAudioDeinit(&gba->audio);
GBASIODeinit(&gba->sio); gba->rr = 0; mTimingDeinit(&gba->timing); + mCoreCallbacksListDeinit(&gba->coreCallbacks); } void GBAInterruptHandlerInit(struct ARMInterruptHandler* irqh) {@@ -291,23 +292,23 @@ vf->seek(vf, 0, SEEK_SET);
if (gba->pristineRomSize > SIZE_WORKING_RAM) { gba->pristineRomSize = SIZE_WORKING_RAM; } + gba->isPristine = true; #ifdef _3DS - gba->pristineRom = 0; if (gba->pristineRomSize <= romBufferSize) { - gba->pristineRom = romBuffer; + gba->memory.wram = romBuffer; vf->read(vf, romBuffer, gba->pristineRomSize); } #else - gba->pristineRom = vf->map(vf, gba->pristineRomSize, MAP_READ); + gba->memory.wram = vf->map(vf, gba->pristineRomSize, MAP_READ); #endif - if (!gba->pristineRom) { + if (!gba->memory.wram) { mLOG(GBA, WARN, "Couldn't map ROM"); return false; } gba->yankedRomSize = 0; gba->memory.romSize = 0; gba->memory.romMask = 0; - gba->romCrc32 = doCrc32(gba->pristineRom, gba->pristineRomSize); + gba->romCrc32 = doCrc32(gba->memory.wram, gba->pristineRomSize); return true; }@@ -322,21 +323,20 @@ vf->seek(vf, 0, SEEK_SET);
if (gba->pristineRomSize > SIZE_CART0) { gba->pristineRomSize = SIZE_CART0; } + gba->isPristine = true; #ifdef _3DS - gba->pristineRom = 0; if (gba->pristineRomSize <= romBufferSize) { - gba->pristineRom = romBuffer; + gba->memory.rom = romBuffer; vf->read(vf, romBuffer, gba->pristineRomSize); } #else - gba->pristineRom = vf->map(vf, gba->pristineRomSize, MAP_READ); + gba->memory.rom = vf->map(vf, gba->pristineRomSize, MAP_READ); #endif - if (!gba->pristineRom) { + if (!gba->memory.rom) { mLOG(GBA, WARN, "Couldn't map ROM"); return false; } gba->yankedRomSize = 0; - gba->memory.rom = gba->pristineRom; gba->memory.romSize = gba->pristineRomSize; gba->memory.romMask = toPow2(gba->memory.romSize) - 1; gba->memory.mirroring = false;@@ -389,12 +389,21 @@ size_t patchedSize = patch->outputSize(patch, gba->memory.romSize);
if (!patchedSize || patchedSize > SIZE_CART0) { return; } - gba->memory.rom = anonymousMemoryMap(SIZE_CART0); - if (!patch->applyPatch(patch, gba->pristineRom, gba->pristineRomSize, gba->memory.rom, patchedSize)) { - mappedMemoryFree(gba->memory.rom, patchedSize); - gba->memory.rom = gba->pristineRom; + void* newRom = anonymousMemoryMap(SIZE_CART0); + if (!patch->applyPatch(patch, gba->memory.rom, gba->pristineRomSize, newRom, patchedSize)) { + mappedMemoryFree(newRom, SIZE_CART0); return; } + if (gba->romVf) { +#ifndef _3DS + gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->pristineRomSize); +#endif + gba->romVf->close(gba->romVf); + gba->romVf = NULL; + } + gba->isPristine = false; + gba->memory.rom = newRom; + gba->memory.hw.gpioBase = &((uint16_t*) gba->memory.rom)[GPIO_REG_DATA >> 1]; gba->memory.romSize = patchedSize; gba->memory.romMask = SIZE_CART0 - 1; gba->romCrc32 = doCrc32(gba->memory.rom, gba->memory.romSize);@@ -539,8 +548,8 @@ if (gba->memory.rom) {
memcpy(out, &((struct GBACartridge*) gba->memory.rom)->title, 12); return; } - if (gba->pristineRom) { - memcpy(out, &((struct GBACartridge*) gba->pristineRom)->title, 12); + if (gba->isPristine && gba->memory.wram) { + memcpy(out, &((struct GBACartridge*) gba->memory.wram)->title, 12); return; } strncpy(out, "(BIOS)", 12);@@ -566,6 +575,10 @@ struct GBA* gba = (struct GBA*) cpu->master;
if (!gba->yankedRomSize) { // TODO: More sensible category? mLOG(GBA, WARN, "Illegal opcode: %08x", opcode); + } + if (cpu->executionMode == MODE_THUMB && (opcode & 0xFFC0) == 0xE800) { + mLOG(GBA, DEBUG, "Hit Wii U VC opcode: %08x", opcode); + return; } #ifdef USE_DEBUGGERS if (gba->debugger) {@@ -623,9 +636,12 @@
void GBAFrameStarted(struct GBA* gba) { UNUSED(gba); - struct mCoreCallbacks* callbacks = gba->coreCallbacks; - if (callbacks && callbacks->videoFrameStarted) { - callbacks->videoFrameStarted(callbacks->context); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c); + if (callbacks->videoFrameStarted) { + callbacks->videoFrameStarted(callbacks->context); + } } }@@ -656,9 +672,12 @@ if (gba->memory.hw.devices & (HW_GB_PLAYER | HW_GB_PLAYER_DETECTION)) {
GBAHardwarePlayerUpdate(gba); } - struct mCoreCallbacks* callbacks = gba->coreCallbacks; - if (callbacks && callbacks->videoFrameEnded) { - callbacks->videoFrameEnded(callbacks->context); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c); + if (callbacks->videoFrameEnded) { + callbacks->videoFrameEnded(callbacks->context); + } } }
@@ -11,7 +11,7 @@ #include <mgba/internal/gba/serialize.h>
#include <mgba-util/formatting.h> #include <mgba-util/hash.h> -mLOG_DEFINE_CATEGORY(GBA_HW, "GBA Pak Hardware"); +mLOG_DEFINE_CATEGORY(GBA_HW, "GBA Pak Hardware", "gba.hardware"); const int GBA_LUX_LEVELS[10] = { 5, 11, 18, 27, 42, 62, 84, 109, 139, 183 };@@ -554,6 +554,7 @@ if (gbp->p->p->rumble) {
gbp->p->p->rumble->setRumble(gbp->p->p->rumble, (rx & mask) == 0x22); } } + mTimingDeschedule(&gbp->p->p->timing, &gbp->p->gbpNextEvent); mTimingSchedule(&gbp->p->p->timing, &gbp->p->gbpNextEvent, 2048); } value &= 0x78FB;
@@ -11,7 +11,7 @@ #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"); +mLOG_DEFINE_CATEGORY(GBA_IO, "GBA I/O", "gba.io"); const char* const GBAIORegisterNames[] = { // Video@@ -251,8 +251,8 @@ 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // Audio - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,@@ -292,9 +292,9 @@ 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Audio - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 1, 0, 1, 0, + 1, 1, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, // DMA@@ -960,7 +960,6 @@ LOAD_32(when, 0, &state->timers[i].lastEvent);
gba->timers[i].lastEvent = when + mTimingCurrentTime(&gba->timing); } LOAD_32(when, 0, &state->timers[i].nextEvent); - mTimingDeschedule(&gba->timing, &gba->timers[i].event); if (GBATimerFlagsIsEnable(gba->timers[i].flags)) { mTimingSchedule(&gba->timing, &gba->timers[i].event, when); }
@@ -19,7 +19,7 @@ #include <mgba-util/vfs.h>
#define IDLE_LOOP_THRESHOLD 10000 -mLOG_DEFINE_CATEGORY(GBA_MEM, "GBA Memory"); +mLOG_DEFINE_CATEGORY(GBA_MEM, "GBA Memory", "gba.memory"); static void _pristineCow(struct GBA* gba); static uint32_t _deadbeef[1] = { 0xE710B710 }; // Illegal instruction on both ARM and Thumb@@ -98,13 +98,12 @@ }
} void GBAMemoryReset(struct GBA* gba) { - if (gba->memory.wram) { - mappedMemoryFree(gba->memory.wram, SIZE_WORKING_RAM); - } - gba->memory.wram = anonymousMemoryMap(SIZE_WORKING_RAM); - if (gba->pristineRom && !gba->memory.rom) { - // Multiboot - memcpy(gba->memory.wram, gba->pristineRom, gba->pristineRomSize); + if (gba->memory.rom || gba->memory.fullBios) { + // Not multiboot + if (gba->memory.wram) { + mappedMemoryFree(gba->memory.wram, SIZE_WORKING_RAM); + } + gba->memory.wram = anonymousMemoryMap(SIZE_WORKING_RAM); } if (gba->memory.iwram) {@@ -300,9 +299,15 @@ cpu->memory.activeRegion = _deadbeef;
cpu->memory.activeMask = 0; if (gba->yankedRomSize || !gba->hardCrash) { mLOG(GBA_MEM, GAME_ERROR, "Jumped to invalid address: %08X", address); - } else if (gba->coreCallbacks && gba->coreCallbacks->coreCrashed) { + } else if (mCoreCallbacksListSize(&gba->coreCallbacks)) { mLOG(GBA_MEM, GAME_ERROR, "Jumped to invalid address: %08X", address); - gba->coreCallbacks->coreCrashed(gba->coreCallbacks->context); + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c); + if (callbacks->coreCrashed) { + callbacks->coreCrashed(callbacks->context); + } + } } else { mLOG(GBA_MEM, FATAL, "Jumped to invalid address: %08X", address); }@@ -1537,10 +1542,19 @@ memcpy(memory->iwram, state->iwram, SIZE_WORKING_IRAM);
} void _pristineCow(struct GBA* gba) { - if (gba->memory.rom != gba->pristineRom) { + if (!gba->isPristine) { return; } - gba->memory.rom = anonymousMemoryMap(SIZE_CART0); - memcpy(gba->memory.rom, gba->pristineRom, gba->memory.romSize); - memset(((uint8_t*) gba->memory.rom) + gba->memory.romSize, 0xFF, SIZE_CART0 - gba->memory.romSize); + void* newRom = anonymousMemoryMap(SIZE_CART0); + memcpy(newRom, gba->memory.rom, gba->memory.romSize); + memset(((uint8_t*) newRom) + gba->memory.romSize, 0xFF, SIZE_CART0 - gba->memory.romSize); + if (gba->romVf) { +#ifndef _3DS + gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->memory.romSize); +#endif + gba->romVf->close(gba->romVf); + gba->romVf = NULL; + } + gba->memory.rom = newRom; + gba->memory.hw.gpioBase = &((uint16_t*) gba->memory.rom)[GPIO_REG_DATA >> 1]; }
@@ -381,7 +381,6 @@ if (flags & FLAG_OBJWIN) {
SPRITE_NORMAL_LOOP(256, OBJWIN); } else if (mosaicH > 1) { if (objwinSlowPath) { - objwinPalette = &objwinPalette[GBAObjAttributesCGetPalette(sprite->c) << 8]; SPRITE_MOSAIC_LOOP(256, NORMAL_OBJWIN); } else { SPRITE_MOSAIC_LOOP(256, NORMAL);
@@ -104,6 +104,7 @@ GBAVideoSoftwareRendererWritePalette(renderer, i, entry);
} softwareRenderer->objExtPalette = NULL; softwareRenderer->objExtVariantPalette = NULL; + softwareRenderer->blendDirty = false; _updatePalettes(softwareRenderer); softwareRenderer->blda = 0;@@ -270,11 +271,14 @@ }
value &= 0x1F1F; break; case REG_BLDY: - softwareRenderer->bldy = value & 0x1F; - if (softwareRenderer->bldy > 0x10) { - softwareRenderer->bldy = 0x10; + value &= 0x1F; + if (value > 0x10) { + value = 0x10; } - _updatePalettes(softwareRenderer); + if (softwareRenderer->bldy != value) { + softwareRenderer->bldy = value; + softwareRenderer->blendDirty = true; + } break; case REG_WIN0H: softwareRenderer->winN[0].h.end = value;@@ -509,6 +513,10 @@
GBAVideoSoftwareRendererPreprocessBuffer(softwareRenderer, y); int spriteLayers = GBAVideoSoftwareRendererPreprocessSpriteLayer(softwareRenderer, y); softwareRenderer->d.vramOBJ[0] = objVramBase; + if (softwareRenderer->blendDirty) { + _updatePalettes(softwareRenderer); + softwareRenderer->blendDirty = false; + } int w; unsigned priority;@@ -688,7 +696,7 @@ renderer->target2Obj = GBARegisterBLDCNTGetTarget2Obj(value);
renderer->target2Bd = GBARegisterBLDCNTGetTarget2Bd(value); if (oldEffect != renderer->blendEffect) { - _updatePalettes(renderer); + renderer->blendDirty = true; } }
@@ -9,7 +9,7 @@ #include <mgba/core/log.h>
#include <mgba/core/serialize.h> #include <mgba-util/vfs.h> -mLOG_DEFINE_CATEGORY(GBA_RR, "GBA RR"); +mLOG_DEFINE_CATEGORY(GBA_RR, "GBA RR", "gba.rr"); void GBARRInitRecord(struct GBA* gba) { if (!gba || !gba->rr) {
@@ -26,7 +26,7 @@ // This needs real testing, and is only an estimation currently
#define EEPROM_SETTLE_CYCLES 115000 #define CLEANUP_THRESHOLD 15 -mLOG_DEFINE_CATEGORY(GBA_SAVE, "GBA Savedata"); +mLOG_DEFINE_CATEGORY(GBA_SAVE, "GBA Savedata", "gba.savedata"); static void _flashSwitchBank(struct GBASavedata* savedata, int bank); static void _flashErase(struct GBASavedata* savedata);
@@ -17,7 +17,7 @@
const uint32_t GBA_SAVESTATE_MAGIC = 0x01000000; const uint32_t GBA_SAVESTATE_VERSION = 0x00000002; -mLOG_DEFINE_CATEGORY(GBA_STATE, "GBA Savestate"); +mLOG_DEFINE_CATEGORY(GBA_STATE, "GBA Savestate", "gba.serialize"); struct GBABundledState { struct GBASerializedState* state;@@ -146,7 +146,7 @@ }
if (error) { return false; } - LOAD_32(gba->timing.masterCycles, 0, &state->masterCycles); + gba->timing.root = NULL; size_t i; for (i = 0; i < 16; ++i) { LOAD_32(gba->cpu->gprs[i], i * sizeof(gba->cpu->gprs[0]), state->cpu.gprs);
@@ -8,7 +8,7 @@
#include <mgba/internal/gba/gba.h> #include <mgba/internal/gba/io.h> -mLOG_DEFINE_CATEGORY(GBA_SIO, "GBA Serial I/O"); +mLOG_DEFINE_CATEGORY(GBA_SIO, "GBA Serial I/O", "gba.sio"); const int GBASIOCyclesPerTransfer[4][MAX_GBAS] = { { 38326, 73003, 107680, 142356 },
@@ -155,9 +155,6 @@ timer->oldReload = timer->reload;
timer->lastEvent = timing->masterCycles + cpu->cycles; } else if (wasEnabled && !GBATimerFlagsIsEnable(timer->flags)) { mTimingDeschedule(timing, &timer->event); - if (!GBATimerFlagsIsCountUp(timer->flags)) { - *io = timer->oldReload + ((cpu->cycles - timer->lastEvent) >> oldPrescale); - } } else if (GBATimerFlagsIsEnable(timer->flags) && GBATimerFlagsGetPrescaleBits(timer->flags) != oldPrescale && !GBATimerFlagsIsCountUp(timer->flags)) { mTimingDeschedule(timing, &timer->event); mTimingSchedule(timing, &timer->event, timer->overflowInterval - timer->lastEvent);
@@ -15,7 +15,7 @@ #include <mgba/internal/gba/serialize.h>
#include <mgba-util/memory.h> -mLOG_DEFINE_CATEGORY(GBA_VIDEO, "GBA Video"); +mLOG_DEFINE_CATEGORY(GBA_VIDEO, "GBA Video", "gba.video"); static void GBAVideoDummyRendererInit(struct GBAVideoRenderer* renderer); static void GBAVideoDummyRendererReset(struct GBAVideoRenderer* renderer);@@ -338,7 +338,6 @@ video->event.callback = _startHdraw;
} else { video->event.callback = _startHblank; } - mTimingDeschedule(&video->p->timing, &video->event); mTimingSchedule(&video->p->timing, &video->event, when); LOAD_16(video->vcount, REG_VCOUNT, state->io);
@@ -52,7 +52,7 @@ info->op2.reg = LR35902_REG_L)
#define DEFINE_LD_DECODER_LR35902_MEM(NAME, REG) \ DEFINE_DECODER_LR35902(LD ## NAME ## _ ## REG, info->mnemonic = LR35902_MN_LD; \ - info->op1.reg = LR35902_REG_ ## A; \ + info->op1.reg = LR35902_REG_ ## NAME; \ info->op2.reg = LR35902_REG_ ## REG; \ info->op2.flags = LR35902_OP_FLAG_MEMORY;)
@@ -12,7 +12,7 @@ #include <mgba-util/vector.h>
#include <mgba-util/vfs.h> mLOG_DECLARE_CATEGORY(OPENGL); -mLOG_DEFINE_CATEGORY(OPENGL, "OpenGL"); +mLOG_DEFINE_CATEGORY(OPENGL, "OpenGL", "video.ogl"); #define MAX_PASSES 8
@@ -7,6 +7,8 @@ #include "AssetView.h"
#include <QTimer> +#include <mgba/core/tile-cache.h> + using namespace QGBA; AssetView::AssetView(GameController* controller, QWidget* parent)@@ -24,7 +26,7 @@ connect(m_controller, SIGNAL(gameStopped(mCoreThread*)), &m_updateTimer, SLOT(stop()));
} void AssetView::updateTiles(bool force) { - if (!m_controller->thread() || !m_controller->thread()->core) { + if (!m_controller->isLoaded()) { return; }@@ -51,3 +53,47 @@
void AssetView::showEvent(QShowEvent*) { updateTiles(true); } + +void AssetView::compositeTile(unsigned tileId, void* buffer, size_t stride, size_t x, size_t y, int depth) { + const uint8_t* tile = mTileCacheGetRawTile(m_tileCache.get(), tileId); + uint8_t* pixels = static_cast<uint8_t*>(buffer); + size_t base = stride * y + x; + switch (depth) { + case 2: + for (size_t i = 0; i < 8; ++i) { + uint8_t tileDataLower = tile[i * 2]; + uint8_t tileDataUpper = tile[i * 2 + 1]; + uint8_t pixel; + pixel = ((tileDataUpper & 128) >> 6) | ((tileDataLower & 128) >> 7); + pixels[base + i * stride] = pixel; + pixel = ((tileDataUpper & 64) >> 5) | ((tileDataLower & 64) >> 6); + pixels[base + i * stride + 1] = pixel; + pixel = ((tileDataUpper & 32) >> 4) | ((tileDataLower & 32) >> 5); + pixels[base + i * stride + 2] = pixel; + pixel = ((tileDataUpper & 16) >> 3) | ((tileDataLower & 16) >> 4); + pixels[base + i * stride + 3] = pixel; + pixel = ((tileDataUpper & 8) >> 2) | ((tileDataLower & 8) >> 3); + pixels[base + i * stride + 4] = pixel; + pixel = ((tileDataUpper & 4) >> 1) | ((tileDataLower & 4) >> 2); + pixels[base + i * stride + 5] = pixel; + pixel = (tileDataUpper & 2) | ((tileDataLower & 2) >> 1); + pixels[base + i * stride + 6] = pixel; + pixel = ((tileDataUpper & 1) << 1) | (tileDataLower & 1); + pixels[base + i * stride + 7] = pixel; + } + break; + case 4: + for (size_t j = 0; j < 8; ++j) { + for (size_t i = 0; i < 4; ++i) { + pixels[base + j * stride + i * 2] = tile[j * 4 + i] & 0xF; + pixels[base + j * stride + i * 2 + 1] = tile[j * 4 + i] >> 4; + } + } + break; + case 8: + for (size_t i = 0; i < 8; ++i) { + memcpy(&pixels[base + i * stride], &tile[i * 8], 8); + } + break; + } +}
@@ -18,6 +18,8 @@
public: AssetView(GameController* controller, QWidget* parent = nullptr); + void compositeTile(unsigned tileId, void* image, size_t stride, size_t x, size_t y, int depth = 8); + protected slots: void updateTiles(bool force = false);
@@ -46,19 +46,19 @@ connect(m_ui.add, &QPushButton::clicked, [this]() {
enterCheat(GBA_CHEAT_AUTODETECT); }); - add = new QPushButton("Add GameShark"); + add = new QPushButton(tr("Add GameShark")); m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2); connect(add, &QPushButton::clicked, [this]() { enterCheat(GBA_CHEAT_GAMESHARK); }); - add = new QPushButton("Add Pro Action Replay"); + add = new QPushButton(tr("Add Pro Action Replay")); m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2); connect(add, &QPushButton::clicked, [this]() { enterCheat(GBA_CHEAT_PRO_ACTION_REPLAY); }); - add = new QPushButton("Add CodeBreaker"); + add = new QPushButton(tr("Add CodeBreaker")); m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2); connect(add, &QPushButton::clicked, [this]() { enterCheat(GBA_CHEAT_CODEBREAKER);@@ -71,13 +71,13 @@ connect(m_ui.add, &QPushButton::clicked, [this]() {
enterCheat(GB_CHEAT_AUTODETECT); }); - add = new QPushButton("Add GameShark"); + add = new QPushButton(tr("Add GameShark")); m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2); connect(add, &QPushButton::clicked, [this]() { enterCheat(GB_CHEAT_GAMESHARK); }); - add = new QPushButton("Add GameGenie"); + add = new QPushButton(tr("Add GameGenie")); m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2); connect(add, &QPushButton::clicked, [this]() { enterCheat(GB_CHEAT_GAME_GENIE);
@@ -110,6 +110,7 @@ m_opts.volume = 0x100;
m_opts.logLevel = mLOG_WARN | mLOG_ERROR | mLOG_FATAL; m_opts.rewindEnable = false; m_opts.rewindBufferCapacity = 300; + m_opts.rewindSave = true; m_opts.useBios = true; m_opts.suspendScreensaver = true; m_opts.lockAspectRatio = true;
@@ -29,11 +29,10 @@ using namespace QGBA;
static GBAApp* g_app = nullptr; -mLOG_DEFINE_CATEGORY(QT, "Qt"); +mLOG_DEFINE_CATEGORY(QT, "Qt", "platform.qt"); GBAApp::GBAApp(int& argc, char* argv[]) : QApplication(argc, argv) - , m_windows{} , m_db(nullptr) { g_app = this;@@ -80,10 +79,10 @@ if (!m_configController.getQtOption("audioDriver").isNull()) {
AudioProcessor::setDriver(static_cast<AudioProcessor::Driver>(m_configController.getQtOption("audioDriver").toInt())); } Window* w = new Window(&m_configController); - connect(w, &Window::destroyed, [this]() { - m_windows[0] = nullptr; + connect(w, &Window::destroyed, [this, w]() { + m_windows.removeAll(w); }); - m_windows[0] = w; + m_windows.append(w); if (loaded) { w->argumentsPassed(&args);@@ -121,15 +120,15 @@ return QApplication::event(event);
} Window* GBAApp::newWindow() { - if (m_multiplayer.attached() >= MAX_GBAS) { + if (m_windows.count() >= MAX_GBAS) { return nullptr; } Window* w = new Window(&m_configController, m_multiplayer.attached()); int windowId = m_multiplayer.attached(); - connect(w, &Window::destroyed, [this, windowId]() { - m_windows[windowId] = nullptr; + connect(w, &Window::destroyed, [this, w]() { + m_windows.removeAll(w); }); - m_windows[windowId] = w; + m_windows.append(w); w->setAttribute(Qt::WA_DeleteOnClose); w->loadConfig(); w->show();@@ -142,27 +141,27 @@ GBAApp* GBAApp::app() {
return g_app; } -void GBAApp::pauseAll(QList<int>* paused) { - for (int i = 0; i < MAX_GBAS; ++i) { - if (!m_windows[i] || !m_windows[i]->controller()->isLoaded() || m_windows[i]->controller()->isPaused()) { +void GBAApp::pauseAll(QList<Window*>* paused) { + for (auto& window : m_windows) { + if (!window->controller()->isLoaded() || window->controller()->isPaused()) { continue; } - m_windows[i]->controller()->setPaused(true); - paused->append(i); + window->controller()->setPaused(true); + paused->append(window); } } -void GBAApp::continueAll(const QList<int>* paused) { - for (int i : *paused) { - m_windows[i]->controller()->setPaused(false); +void GBAApp::continueAll(const QList<Window*>& paused) { + for (auto& window : paused) { + window->controller()->setPaused(false); } } QString GBAApp::getOpenFileName(QWidget* owner, const QString& title, const QString& filter) { - QList<int> paused; + QList<Window*> paused; pauseAll(&paused); QString filename = QFileDialog::getOpenFileName(owner, title, m_configController.getOption("lastDirectory"), filter); - continueAll(&paused); + continueAll(paused); if (!filename.isEmpty()) { m_configController.setOption("lastDirectory", QFileInfo(filename).dir().path()); }@@ -170,10 +169,10 @@ return filename;
} QString GBAApp::getSaveFileName(QWidget* owner, const QString& title, const QString& filter) { - QList<int> paused; + QList<Window*> paused; pauseAll(&paused); QString filename = QFileDialog::getSaveFileName(owner, title, m_configController.getOption("lastDirectory"), filter); - continueAll(&paused); + continueAll(paused); if (!filename.isEmpty()) { m_configController.setOption("lastDirectory", QFileInfo(filename).dir().path()); }@@ -181,10 +180,10 @@ return filename;
} QString GBAApp::getOpenDirectoryName(QWidget* owner, const QString& title) { - QList<int> paused; + QList<Window*> paused; pauseAll(&paused); QString filename = QFileDialog::getExistingDirectory(owner, title, m_configController.getOption("lastDirectory")); - continueAll(&paused); + continueAll(paused); if (!filename.isEmpty()) { m_configController.setOption("lastDirectory", QFileInfo(filename).dir().path()); }@@ -249,14 +248,14 @@ {
} int GBAApp::FileDialog::exec() { - QList<int> paused; + QList<Window*> paused; m_app->pauseAll(&paused); bool didAccept = QFileDialog::exec() == QDialog::Accepted; QStringList filenames = selectedFiles(); if (!filenames.isEmpty()) { m_app->m_configController.setOption("lastDirectory", QFileInfo(filenames[0]).dir().path()); } - m_app->continueAll(&paused); + m_app->continueAll(paused); return didAccept; }
@@ -39,7 +39,6 @@ NoIntroDB* m_db;
}; #endif - class GBAApp : public QApplication { Q_OBJECT@@ -78,11 +77,11 @@ };
Window* newWindowInternal(); - void pauseAll(QList<int>* paused); - void continueAll(const QList<int>* paused); + void pauseAll(QList<Window*>* paused); + void continueAll(const QList<Window*>& paused); ConfigController m_configController; - Window* m_windows[MAX_GBAS]; + QList<Window*> m_windows; MultiplayerController m_multiplayer; NoIntroDB* m_db;
@@ -23,7 +23,6 @@ #include <mgba/core/serialize.h>
#include <mgba/core/tile-cache.h> #ifdef M_CORE_GBA #include <mgba/gba/interface.h> -#include <mgba/internal/gba/bios.h> #include <mgba/internal/gba/gba.h> #include <mgba/gba/core.h> #include <mgba/internal/gba/renderers/tile-cache.h>@@ -70,8 +69,8 @@ , m_stream(nullptr)
, m_stateSlot(1) , m_backupLoadState(nullptr) , m_backupSaveState(nullptr) - , m_saveStateFlags(SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA | SAVESTATE_CHEATS) - , m_loadStateFlags(SAVESTATE_SCREENSHOT) + , m_saveStateFlags(SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA | SAVESTATE_CHEATS | SAVESTATE_RTC) + , m_loadStateFlags(SAVESTATE_SCREENSHOT | SAVESTATE_RTC) , m_override(nullptr) { #ifdef M_CORE_GBA@@ -90,8 +89,6 @@ #endif
m_threadContext.startCallback = [](mCoreThread* context) { GameController* controller = static_cast<GameController*>(context->userData); - mRTCGenericSourceInit(&controller->m_rtc, context->core); - context->core->setRTC(context->core, &controller->m_rtc.d); context->core->setRotation(context->core, controller->m_inputController->rotationSource()); context->core->setRumble(context->core, controller->m_inputController->rumble());@@ -241,13 +238,21 @@ mCoreThread* context = logContext->p;
static const char* savestateMessage = "State %i loaded"; static const char* savestateFailedMessage = "State %i failed to load"; + static int biosCat = -1; + static int statusCat = -1; if (!context) { return; } GameController* controller = static_cast<GameController*>(context->userData); QString message; + if (biosCat < 0) { + biosCat = mLogCategoryById("gba.bios"); + } + if (statusCat < 0) { + statusCat = mLogCategoryById("core.status"); + } #ifdef M_CORE_GBA - if (level == mLOG_STUB && category == _mLOG_CAT_GBA_BIOS()) { + if (level == mLOG_STUB && category == biosCat) { va_list argc; va_copy(argc, args); int immediate = va_arg(argc, int);@@ -255,7 +260,7 @@ va_end(argc);
QMetaObject::invokeMethod(controller, "unimplementedBiosCall", Q_ARG(int, immediate)); } else #endif - if (category == _mLOG_CAT_STATUS()) { + if (category == statusCat) { // Slot 0 is reserved for suspend points if (strncmp(savestateMessage, format, strlen(savestateMessage)) == 0) { va_list argc;@@ -731,7 +736,7 @@ setPaused(false);
} } -void GameController::setRewind(bool enable, int capacity) { +void GameController::setRewind(bool enable, int capacity, bool rewindSave) { if (m_gameOpen) { Interrupter interrupter(this); if (m_threadContext.core->opts.rewindEnable && m_threadContext.core->opts.rewindBufferCapacity > 0) {@@ -739,8 +744,10 @@ mCoreRewindContextDeinit(&m_threadContext.rewind);
} m_threadContext.core->opts.rewindEnable = enable; m_threadContext.core->opts.rewindBufferCapacity = capacity; + m_threadContext.core->opts.rewindSave = rewindSave; if (enable && capacity > 0) { mCoreRewindContextInit(&m_threadContext.rewind, capacity); + m_threadContext.rewind.stateFlags = rewindSave ? SAVESTATE_SAVEDATA : 0; } } }@@ -1194,17 +1201,26 @@ setLuminanceValue(value);
} void GameController::setRealTime() { - m_rtc.override = RTC_NO_OVERRIDE; + if (!isLoaded()) { + return; + } + m_threadContext.core->rtc.override = RTC_NO_OVERRIDE; } void GameController::setFixedTime(const QDateTime& time) { - m_rtc.override = RTC_FIXED; - m_rtc.value = time.toMSecsSinceEpoch() / 1000; + if (!isLoaded()) { + return; + } + m_threadContext.core->rtc.override = RTC_FIXED; + m_threadContext.core->rtc.value = time.toMSecsSinceEpoch(); } void GameController::setFakeEpoch(const QDateTime& time) { - m_rtc.override = RTC_FAKE_EPOCH; - m_rtc.value = time.toMSecsSinceEpoch() / 1000; + if (!isLoaded()) { + return; + } + m_threadContext.core->rtc.override = RTC_FAKE_EPOCH; + m_threadContext.core->rtc.value = time.toMSecsSinceEpoch(); } void GameController::updateKeys() {
@@ -127,7 +127,7 @@ void closeGame();
void setPaused(bool paused); void reset(); void frameAdvance(); - void setRewind(bool enable, int capacity); + void setRewind(bool enable, int capacity, bool rewindSave); void rewind(int states = 0); void startRewinding(); void stopRewinding();@@ -247,8 +247,6 @@ uint8_t value;
} m_lux; uint8_t m_luxValue; int m_luxLevel; - - mRTCGenericSource m_rtc; }; }
@@ -89,7 +89,12 @@ m_library = s_handles[path];
m_library->ref(); } else { m_library = new LibraryHandle(mLibraryLoad(path.toUtf8().constData()), path); - s_handles[path] = m_library; + if (m_library->library) { + s_handles[path] = m_library; + } else { + delete m_library; + m_library = new LibraryHandle(mLibraryCreateEmpty()); + } } } else { m_library = new LibraryHandle(mLibraryCreateEmpty());@@ -280,7 +285,9 @@
LibraryModel::LibraryHandle::~LibraryHandle() { m_loaderThread.quit(); m_loaderThread.wait(); - mLibraryDestroy(library); + if (library) { + mLibraryDestroy(library); + } } void LibraryModel::LibraryHandle::ref() {
@@ -10,11 +10,17 @@
#include <QFontDatabase> #include <QTimer> +#include "LogController.h" +#include "VFileDevice.h" + +#ifdef M_CORE_GBA #include <mgba/internal/gba/gba.h> +#endif #ifdef M_CORE_GB #include <mgba/internal/gb/gb.h> #include <mgba/internal/gb/io.h> #endif +#include <mgba-util/png-io.h> using namespace QGBA;@@ -45,6 +51,7 @@ connect(m_ui.objId, SIGNAL(valueChanged(int)), this, SLOT(selectObj(int)));
connect(m_ui.magnification, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), [this]() { updateTiles(true); }); + connect(m_ui.exportButton, SIGNAL(clicked()), this, SLOT(exportObj())); } void ObjView::selectObj(int obj) {@@ -68,64 +75,63 @@ unsigned size = GBAObjAttributesBGetSize(obj->b);
unsigned width = GBAVideoObjSizes[shape * 4 + size][0]; unsigned height = GBAVideoObjSizes[shape * 4 + size][1]; unsigned tile = GBAObjAttributesCGetTile(obj->c); - ObjInfo newInfo{ - tile, - width / 8, - height / 8, - width / 8 - }; m_ui.tiles->setTileCount(width * height / 64); m_ui.tiles->setMinimumSize(QSize(width, height) * m_ui.magnification->value()); m_ui.tiles->resize(QSize(width, height) * m_ui.magnification->value()); unsigned palette = GBAObjAttributesCGetPalette(obj->c); - GBARegisterDISPCNT dispcnt = gba->memory.io[0]; // FIXME: Register name can't be imported due to namespacing issues - if (!GBARegisterDISPCNTIsObjCharacterMapping(dispcnt)) { - newInfo.stride = 0x20 >> (GBAObjAttributesAGet256Color(obj->a)); - }; - if (newInfo != m_objInfo) { - force = true; - } - m_objInfo = newInfo; - int i = 0; + unsigned tileBase = tile; + unsigned paletteSet; + unsigned bits; if (GBAObjAttributesAIs256Color(obj->a)) { m_ui.palette->setText("256-color"); - mTileCacheSetPalette(m_tileCache.get(), 1); + paletteSet = 1; m_ui.tile->setPalette(0); m_ui.tile->setPaletteSet(1, 1024, 1536); - tile /= 2; - unsigned t = tile + i; - for (int y = 0; y < height / 8; ++y) { - for (int x = 0; x < width / 8; ++x, ++i, ++t) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache.get(), &m_tileStatus[32 * t], t + 1024, 1); - if (data) { - m_ui.tiles->setTile(i, data); - } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t + 1024, 1)); - } - } - t += newInfo.stride - width / 8; - } - tile += 1024; + palette = 1; + tile = tile / 2 + 1024; + bits = 8; } else { m_ui.palette->setText(QString::number(palette)); - mTileCacheSetPalette(m_tileCache.get(), 0); + paletteSet = 0; m_ui.tile->setPalette(palette); m_ui.tile->setPaletteSet(0, 2048, 3072); - unsigned t = tile + i; - for (int y = 0; y < height / 8; ++y) { - for (int x = 0; x < width / 8; ++x, ++i, ++t) { - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache.get(), &m_tileStatus[32 * t], t + 2048, palette + 16); - if (data) { - m_ui.tiles->setTile(i, data); - } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t + 2048, palette + 16)); - } - } - t += newInfo.stride - width / 8; - } + palette += 16; tile += 2048; + bits = 4; } + ObjInfo newInfo{ + tile, + width / 8, + height / 8, + width / 8, + palette, + paletteSet, + bits + }; + if (newInfo != m_objInfo) { + force = true; + } + GBARegisterDISPCNT dispcnt = gba->memory.io[0]; // FIXME: Register name can't be imported due to namespacing issues + if (!GBARegisterDISPCNTIsObjCharacterMapping(dispcnt)) { + newInfo.stride = 0x20 >> (GBAObjAttributesAGet256Color(obj->a)); + }; + m_objInfo = newInfo; m_tileOffset = tile; + mTileCacheSetPalette(m_tileCache.get(), paletteSet); + + int i = 0; + for (int y = 0; y < height / 8; ++y) { + for (int x = 0; x < width / 8; ++x, ++i, ++tile, ++tileBase) { + const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache.get(), &m_tileStatus[32 * tileBase], tile, palette); + if (data) { + m_ui.tiles->setTile(i, data); + } else if (force) { + m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), tile, palette)); + } + } + tile += newInfo.stride - width / 8; + tileBase += newInfo.stride - width / 8; + } m_ui.x->setText(QString::number(GBAObjAttributesBGetX(obj->b))); m_ui.y->setText(QString::number(GBAObjAttributesAGetY(obj->a)));@@ -175,20 +181,10 @@ if (GBRegisterLCDCIsObjSize(lcdc)) {
height = 16; } unsigned tile = obj->tile; - ObjInfo newInfo{ - tile, - 1, - height / 8, - 1 - }; - if (newInfo != m_objInfo) { - force = true; - } - m_objInfo = newInfo; m_ui.tiles->setTileCount(width * height / 64); m_ui.tiles->setMinimumSize(QSize(width, height) * m_ui.magnification->value()); m_ui.tiles->resize(QSize(width, height) * m_ui.magnification->value()); - int palette = 0; + unsigned palette = 0; if (gb->model >= GB_MODEL_CGB) { if (GBObjAttributesIsBank(obj->attr)) { tile += 512;@@ -197,21 +193,37 @@ palette = GBObjAttributesGetCGBPalette(obj->attr);
} else { palette = GBObjAttributesGetPalette(obj->attr); } + m_ui.palette->setText(QString::number(palette)); + palette += 8; + + ObjInfo newInfo{ + tile, + 1, + height / 8, + 1, + palette, + 0, + 2 + }; + if (newInfo != m_objInfo) { + force = true; + } + m_objInfo = newInfo; + m_tileOffset = tile; + int i = 0; - m_ui.palette->setText(QString::number(palette)); mTileCacheSetPalette(m_tileCache.get(), 0); - m_ui.tile->setPalette(palette + 8); + m_ui.tile->setPalette(palette); m_ui.tile->setPaletteSet(0, 512, 1024); for (int y = 0; y < height / 8; ++y, ++i) { unsigned t = tile + i; - const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache.get(), &m_tileStatus[16 * t], t, palette + 8); + const uint16_t* data = mTileCacheGetTileIfDirty(m_tileCache.get(), &m_tileStatus[16 * t], t, palette); if (data) { m_ui.tiles->setTile(i, data); } else if (force) { - m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t, palette + 8)); + m_ui.tiles->setTile(i, mTileCacheGetTile(m_tileCache.get(), t, palette)); } } - m_tileOffset = tile; m_ui.x->setText(QString::number(obj->x)); m_ui.y->setText(QString::number(obj->y));@@ -230,10 +242,56 @@ m_ui.mode->setText(tr("N/A"));
} #endif +void ObjView::exportObj() { + GameController::Interrupter interrupter(m_controller); + QFileDialog* dialog = GBAApp::app()->getSaveFileDialog(this, tr("Export sprite"), + tr("Portable Network Graphics (*.png)")); + if (!dialog->exec()) { + return; + } + QString filename = dialog->selectedFiles()[0]; + VFile* vf = VFileDevice::open(filename, O_WRONLY | O_CREAT | O_TRUNC); + if (!vf) { + LOG(QT, ERROR) << tr("Failed to open output PNG file: %1").arg(filename); + return; + } + + mTileCacheSetPalette(m_tileCache.get(), m_objInfo.paletteSet); + png_structp png = PNGWriteOpen(vf); + png_infop info = PNGWriteHeader8(png, m_objInfo.width * 8, m_objInfo.height * 8); + + const uint16_t* rawPalette = mTileCacheGetPalette(m_tileCache.get(), m_objInfo.paletteId); + unsigned colors = 1 << m_objInfo.bits; + uint32_t palette[256]; + for (unsigned c = 0; c < colors && c < 256; ++c) { + uint16_t color = rawPalette[c]; + palette[c] = M_R8(rawPalette[c]); + palette[c] |= M_G8(rawPalette[c]) << 8; + palette[c] |= M_B8(rawPalette[c]) << 16; + if (c) { + palette[c] |= 0xFF000000; + } + } + PNGWritePalette(png, info, palette, colors); + + uint8_t* buffer = new uint8_t[m_objInfo.width * m_objInfo.height * 8 * 8]; + unsigned t = m_objInfo.tile; + for (int y = 0; y < m_objInfo.height; ++y) { + for (int x = 0; x < m_objInfo.width; ++x, ++t) { + compositeTile(t, static_cast<void*>(buffer), m_objInfo.width * 8, x * 8, y * 8, m_objInfo.bits); + } + t += m_objInfo.stride - m_objInfo.width; + } + PNGWritePixels8(png, m_objInfo.width * 8, m_objInfo.height * 8, m_objInfo.width * 8, static_cast<void*>(buffer)); + PNGWriteClose(png, info); + delete[] buffer; +} bool ObjView::ObjInfo::operator!=(const ObjInfo& other) { return other.tile != tile || other.width != width || other.height != height || - other.stride != stride; + other.stride != stride || + other.paletteId != paletteId || + other.paletteSet != paletteSet; }
@@ -21,6 +21,9 @@
public: ObjView(GameController* controller, QWidget* parent = nullptr); +public slots: + void exportObj(); + private slots: void selectObj(int); void translateIndex(int);@@ -43,6 +46,9 @@ unsigned tile;
unsigned width; unsigned height; unsigned stride; + unsigned paletteId; + unsigned paletteSet; + unsigned bits; bool operator!=(const ObjInfo&); } m_objInfo;
@@ -7,7 +7,7 @@ <rect>
<x>0</x> <y>0</y> <width>454</width> - <height>375</height> + <height>385</height> </rect> </property> <property name="windowTitle">@@ -67,6 +67,13 @@ <item>
<widget class="QLabel" name="label_2"> <property name="text"> <string>Magnification</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="exportButton"> + <property name="text"> + <string>Export</string> </property> </widget> </item>
@@ -148,7 +148,7 @@ });
GBAKeyEditor* editor = new GBAKeyEditor(inputController, InputController::KEYBOARD, QString(), this); m_ui.stackedWidget->addWidget(editor); - m_ui.tabs->addItem("Keyboard"); + m_ui.tabs->addItem(tr("Keyboard")); connect(m_ui.buttonBox, SIGNAL(accepted()), editor, SLOT(save())); GBAKeyEditor* buttonEditor = nullptr;@@ -157,7 +157,7 @@ inputController->recalibrateAxes();
const char* profile = inputController->profileForType(SDL_BINDING_BUTTON); buttonEditor = new GBAKeyEditor(inputController, SDL_BINDING_BUTTON, profile); m_ui.stackedWidget->addWidget(buttonEditor); - m_ui.tabs->addItem("Controllers"); + m_ui.tabs->addItem(tr("Controllers")); connect(m_ui.buttonBox, SIGNAL(accepted()), buttonEditor, SLOT(save())); #endif@@ -176,7 +176,7 @@ ShortcutView* shortcutView = new ShortcutView();
shortcutView->setController(shortcutController); shortcutView->setInputController(inputController); m_ui.stackedWidget->addWidget(shortcutView); - m_ui.tabs->addItem("Shortcuts"); + m_ui.tabs->addItem(tr("Shortcuts")); } void SettingsView::selectBios(QLineEdit* bios) {@@ -206,6 +206,7 @@ saveSetting("volume", m_ui.volume);
saveSetting("mute", m_ui.mute); saveSetting("rewindEnable", m_ui.rewind); saveSetting("rewindBufferCapacity", m_ui.rewindCapacity); + saveSetting("rewindSave", m_ui.rewindSave); saveSetting("resampleVideo", m_ui.resampleVideo); saveSetting("allowOpposingDirections", m_ui.allowOpposingDirections); saveSetting("suspendScreensaver", m_ui.suspendScreensaver);@@ -234,13 +235,13 @@ saveSetting("idleOptimization", "detect");
break; } - int loadState = 0; + int loadState = SAVESTATE_RTC; loadState |= m_ui.loadStateScreenshot->isChecked() ? SAVESTATE_SCREENSHOT : 0; loadState |= m_ui.loadStateSave->isChecked() ? SAVESTATE_SAVEDATA : 0; loadState |= m_ui.loadStateCheats->isChecked() ? SAVESTATE_CHEATS : 0; saveSetting("loadStateExtdata", loadState); - int saveState = 0; + int saveState = SAVESTATE_RTC; saveState |= m_ui.saveStateScreenshot->isChecked() ? SAVESTATE_SCREENSHOT : 0; saveState |= m_ui.saveStateSave->isChecked() ? SAVESTATE_SAVEDATA : 0; saveState |= m_ui.saveStateCheats->isChecked() ? SAVESTATE_CHEATS : 0;@@ -287,6 +288,7 @@ loadSetting("volume", m_ui.volume);
loadSetting("mute", m_ui.mute); loadSetting("rewindEnable", m_ui.rewind); loadSetting("rewindBufferCapacity", m_ui.rewindCapacity); + loadSetting("rewindSave", m_ui.rewindSave); loadSetting("resampleVideo", m_ui.resampleVideo); loadSetting("allowOpposingDirections", m_ui.allowOpposingDirections); loadSetting("suspendScreensaver", m_ui.suspendScreensaver);@@ -319,7 +321,7 @@
bool ok; int loadState = loadSetting("loadStateExtdata").toInt(&ok); if (!ok) { - loadState = SAVESTATE_SCREENSHOT; + loadState = SAVESTATE_SCREENSHOT | SAVESTATE_RTC; } m_ui.loadStateScreenshot->setChecked(loadState & SAVESTATE_SCREENSHOT); m_ui.loadStateSave->setChecked(loadState & SAVESTATE_SAVEDATA);@@ -327,7 +329,7 @@ m_ui.loadStateCheats->setChecked(loadState & SAVESTATE_CHEATS);
int saveState = loadSetting("saveStateExtdata").toInt(&ok); if (!ok) { - saveState = SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA | SAVESTATE_CHEATS; + saveState = SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA | SAVESTATE_CHEATS | SAVESTATE_RTC; } m_ui.saveStateScreenshot->setChecked(saveState & SAVESTATE_SCREENSHOT); m_ui.saveStateSave->setChecked(saveState & SAVESTATE_SAVEDATA);
@@ -383,7 +383,7 @@ </item>
<item row="11" column="1"> <widget class="QCheckBox" name="resampleVideo"> <property name="text"> - <string>Resample video</string> + <string>Bilinear filtering</string> </property> </widget> </item>@@ -535,21 +535,21 @@ </widget>
</item> </layout> </item> - <item row="4" column="0" colspan="2"> + <item row="5" column="0" colspan="2"> <widget class="Line" name="line_3"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> - <item row="5" column="0"> + <item row="6" column="0"> <widget class="QLabel" name="label_15"> <property name="text"> <string>Idle loops:</string> </property> </widget> </item> - <item row="5" column="1"> + <item row="6" column="1"> <widget class="QComboBox" name="idleOptimization"> <item> <property name="text">@@ -568,21 +568,21 @@ </property>
</item> </widget> </item> - <item row="6" column="0" colspan="2"> + <item row="7" column="0" colspan="2"> <widget class="Line" name="line_2"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> - <item row="7" column="0"> + <item row="8" column="0"> <widget class="QLabel" name="label_24"> <property name="text"> <string>Savestate extra data:</string> </property> </widget> </item> - <item row="7" column="1"> + <item row="8" column="1"> <widget class="QCheckBox" name="saveStateScreenshot"> <property name="text"> <string>Screenshot</string>@@ -592,7 +592,7 @@ <bool>true</bool>
</property> </widget> </item> - <item row="8" column="1"> + <item row="9" column="1"> <widget class="QCheckBox" name="saveStateSave"> <property name="text"> <string>Save data</string>@@ -602,7 +602,7 @@ <bool>true</bool>
</property> </widget> </item> - <item row="9" column="1"> + <item row="10" column="1"> <widget class="QCheckBox" name="saveStateCheats"> <property name="text"> <string>Cheat codes</string>@@ -612,14 +612,14 @@ <bool>true</bool>
</property> </widget> </item> - <item row="11" column="0"> + <item row="12" column="0"> <widget class="QLabel" name="label_25"> <property name="text"> <string>Load extra data:</string> </property> </widget> </item> - <item row="11" column="1"> + <item row="12" column="1"> <widget class="QCheckBox" name="loadStateScreenshot"> <property name="text"> <string>Screenshot</string>@@ -629,24 +629,34 @@ <bool>true</bool>
</property> </widget> </item> - <item row="12" column="1"> + <item row="13" column="1"> <widget class="QCheckBox" name="loadStateSave"> <property name="text"> <string>Save data</string> </property> </widget> </item> - <item row="13" column="1"> + <item row="14" column="1"> <widget class="QCheckBox" name="loadStateCheats"> <property name="text"> <string>Cheat codes</string> </property> </widget> </item> - <item row="10" column="0" colspan="2"> + <item row="11" column="0" colspan="2"> <widget class="Line" name="line_9"> <property name="orientation"> <enum>Qt::Horizontal</enum> + </property> + </widget> + </item> + <item row="4" column="1"> + <widget class="QCheckBox" name="rewindSave"> + <property name="text"> + <string>Rewind affects save data</string> + </property> + <property name="checked"> + <bool>true</bool> </property> </widget> </item>
@@ -1275,7 +1275,7 @@ }, this);
m_config->updateOption("lockAspectRatio"); ConfigOption* resampleVideo = m_config->addOption("resampleVideo"); - resampleVideo->addBoolean(tr("Resample video"), avMenu); + resampleVideo->addBoolean(tr("Bilinear filtering"), avMenu); resampleVideo->connect([this](const QVariant& value) { m_display->filter(value.toBool()); }, this);@@ -1482,12 +1482,17 @@ }, this);
ConfigOption* rewindEnable = m_config->addOption("rewindEnable"); rewindEnable->connect([this](const QVariant& value) { - m_controller->setRewind(value.toBool(), m_config->getOption("rewindBufferCapacity").toInt()); + m_controller->setRewind(value.toBool(), m_config->getOption("rewindBufferCapacity").toInt(), m_config->getOption("rewindSave").toInt()); }, this); ConfigOption* rewindBufferCapacity = m_config->addOption("rewindBufferCapacity"); rewindBufferCapacity->connect([this](const QVariant& value) { - m_controller->setRewind(m_config->getOption("rewindEnable").toInt(), value.toInt()); + m_controller->setRewind(m_config->getOption("rewindEnable").toInt(), value.toInt(), m_config->getOption("rewindSave").toInt()); + }, this); + + ConfigOption* rewindSave = m_config->addOption("rewindSave"); + rewindBufferCapacity->connect([this](const QVariant& value) { + m_controller->setRewind(m_config->getOption("rewindEnable").toInt(), m_config->getOption("rewindBufferCapacity").toInt(), value.toBool()); }, this); ConfigOption* allowOpposingDirections = m_config->addOption("allowOpposingDirections");
@@ -0,0 +1,4327 @@
+<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="de_DE" sourcelanguage="en_US"> +<context> + <name>AboutScreen</name> + <message> + <location filename="../AboutScreen.ui" line="14"/> + <source>About</source> + <translation>Über</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><a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Foren / Support</a> • <a href="https://patreon.com/mgba">Spenden</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Quellcode</a></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="58"/> + <source>{projectName}</source> + <translation>{projectName}</translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="68"/> + <source>{projectName} would like to thank the following patrons from Patreon:</source> + <translation>{projectName} möchte den folgenden Unterstützern auf Patreon danken:</translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="86"/> + <source>© 2013 – 2016 Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 +Game Boy Advance is a registered trademark of Nintendo Co., Ltd.</source> + <translation>© 2013 – 2016 Jeffrey Pfau, lizenziert unter der Mozilla Public License, Version 2.0 +Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.</translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="190"/> + <source>{patrons}</source> + <translation>{patrons}</translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="106"/> + <source>{projectVersion}</source> + <translation>{projectVersion}</translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="155"/> + <source>{logo}</source> + <translation>{logo}</translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="177"/> + <source>{projectName} is an open-source Game Boy Advance emulator</source> + <translation>{projectName} ist ein quelloffener Game Boy Advance-Emulator</translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="41"/> + <source>Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt></source> + <translation>Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt></translation> + </message> +</context> +<context> + <name>ArchiveInspector</name> + <message> + <location filename="../ArchiveInspector.ui" line="14"/> + <source>Open in archive...</source> + <translation>In Archiv öffnen...</translation> + </message> + <message> + <location filename="../ArchiveInspector.ui" line="20"/> + <source>Loading...</source> + <translation>Laden...</translation> + </message> +</context> +<context> + <name>AssetTile</name> + <message> + <location filename="../AssetTile.ui" line="12"/> + <source>AssetTile</source> + <translation>AssetTile</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="33"/> + <source>Tile #</source> + <translation>Tile #</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="40"/> + <source>0</source> + <translation>0</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="54"/> + <source>Address</source> + <translation>Adresse</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="61"/> + <source>0x06000000</source> + <translation>0x06000000</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="100"/> + <source>Red</source> + <translation>Rot</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="107"/> + <source>Green</source> + <translation>Grün</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="114"/> + <source>Blue</source> + <translation>Blau</translation> + </message> + <message> + <location filename="../AssetTile.ui" line="128"/> + <location filename="../AssetTile.ui" line="135"/> + <location filename="../AssetTile.ui" line="142"/> + <source>0x00 (00)</source> + <translation>0x00 (00)</translation> + </message> +</context> +<context> + <name>CheatsView</name> + <message> + <location filename="../CheatsView.ui" line="14"/> + <source>Cheats</source> + <translation>Cheats</translation> + </message> + <message> + <location filename="../CheatsView.ui" line="20"/> + <source>Remove</source> + <translation>Entfernen</translation> + </message> + <message> + <location filename="../CheatsView.ui" line="34"/> + <source>Save</source> + <translation>Speichern</translation> + </message> + <message> + <location filename="../CheatsView.ui" line="41"/> + <source>Load</source> + <translation>Laden</translation> + </message> + <message> + <location filename="../CheatsView.ui" line="69"/> + <source>Add New Set</source> + <translation>Neues Set hinzufügen</translation> + </message> + <message> + <location filename="../CheatsView.ui" line="76"/> + <source>Add</source> + <translation>Hinzufügen</translation> + </message> +</context> +<context> + <name>DebuggerConsole</name> + <message> + <location filename="../DebuggerConsole.ui" line="14"/> + <source>Debugger</source> + <translation>Debugger</translation> + </message> + <message> + <location filename="../DebuggerConsole.ui" line="25"/> + <source>Enter command (try `help` for more info)</source> + <translation>Geben Sie ein Kommando ein (versuchen Sie 'help' für weitere Informationen)</translation> + </message> + <message> + <location filename="../DebuggerConsole.ui" line="32"/> + <source>Break</source> + <translation>Unterbrechen</translation> + </message> +</context> +<context> + <name>GIFView</name> + <message> + <location filename="../GIFView.ui" line="14"/> + <source>Record GIF</source> + <translation>GIF aufzeichnen</translation> + </message> + <message> + <location filename="../GIFView.ui" line="34"/> + <source>Start</source> + <translation>Start</translation> + </message> + <message> + <location filename="../GIFView.ui" line="50"/> + <source>Stop</source> + <translation>Stop</translation> + </message> + <message> + <location filename="../GIFView.ui" line="63"/> + <source>Select File</source> + <translation>Datei wählen</translation> + </message> + <message> + <location filename="../GIFView.ui" line="101"/> + <source>Frameskip</source> + <translation>Frameskip</translation> + </message> + <message> + <location filename="../GIFView.ui" line="115"/> + <source>Frame delay (ms)</source> + <translation>Bildverzögerung (ms)</translation> + </message> + <message> + <location filename="../GIFView.ui" line="122"/> + <source>Automatic</source> + <translation>Automatisch</translation> + </message> +</context> +<context> + <name>IOViewer</name> + <message> + <location filename="../IOViewer.ui" line="14"/> + <source>I/O Viewer</source> + <translation>I/O-Betrachter</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="26"/> + <source>0x0000</source> + <translation>0x0000</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="58"/> + <source>2</source> + <translation>2</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="82"/> + <source>5</source> + <translation>5</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="100"/> + <source>4</source> + <translation>4</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="118"/> + <source>7</source> + <translation>7</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="136"/> + <source>0</source> + <translation>0</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="157"/> + <source>9</source> + <translation>9</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="178"/> + <source>1</source> + <translation>1</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="196"/> + <source>3</source> + <translation>3</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="217"/> + <source>8</source> + <translation>8</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="241"/> + <source>C</source> + <translation>C</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="259"/> + <source>E</source> + <translation>E</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="283"/> + <source>6</source> + <translation>6</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="310"/> + <source>D</source> + <translation>D</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="328"/> + <source>F</source> + <translation>F</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="346"/> + <source>A</source> + <translation>A</translation> + </message> + <message> + <location filename="../IOViewer.ui" line="364"/> + <source>B</source> + <translation>B</translation> + </message> +</context> +<context> + <name>LibraryView</name> + <message> + <location filename="../LibraryView.ui" line="14"/> + <source>Library</source> + <translation>Bibliothek</translation> + </message> +</context> +<context> + <name>LoadSaveState</name> + <message> + <location filename="../LoadSaveState.ui" line="14"/> + <location filename="../LoadSaveState.ui" line="88"/> + <source>%1 State</source> + <translation>Savestate %1</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="41"/> + <location filename="../LoadSaveState.ui" line="63"/> + <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>Kein Savestate</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="50"/> + <source>1</source> + <translation>1</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="72"/> + <source>2</source> + <translation>2</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="116"/> + <source>3</source> + <translation>3</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="138"/> + <source>4</source> + <translation>4</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="160"/> + <source>5</source> + <translation>5</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="182"/> + <source>6</source> + <translation>6</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="204"/> + <source>7</source> + <translation>7</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="226"/> + <source>8</source> + <translation>8</translation> + </message> + <message> + <location filename="../LoadSaveState.ui" line="248"/> + <source>9</source> + <translation>9</translation> + </message> +</context> +<context> + <name>LogView</name> + <message> + <location filename="../LogView.ui" line="14"/> + <source>Logs</source> + <translation>Logs</translation> + </message> + <message> + <location filename="../LogView.ui" line="22"/> + <source>Enabled Levels</source> + <translation>Aktivierte Log-Level</translation> + </message> + <message> + <location filename="../LogView.ui" line="28"/> + <source>Debug</source> + <translation>Debug</translation> + </message> + <message> + <location filename="../LogView.ui" line="38"/> + <source>Stub</source> + <translation>Stub</translation> + </message> + <message> + <location filename="../LogView.ui" line="48"/> + <source>Info</source> + <translation>Info</translation> + </message> + <message> + <location filename="../LogView.ui" line="58"/> + <source>Warning</source> + <translation>Warnung</translation> + </message> + <message> + <location filename="../LogView.ui" line="68"/> + <source>Error</source> + <translation>Fehler</translation> + </message> + <message> + <location filename="../LogView.ui" line="78"/> + <source>Fatal</source> + <translation>Fatal</translation> + </message> + <message> + <location filename="../LogView.ui" line="95"/> + <source>Game Error</source> + <translation>Spiel-Fehler</translation> + </message> + <message> + <location filename="../LogView.ui" line="121"/> + <source>Clear</source> + <translation>Leeren</translation> + </message> + <message> + <location filename="../LogView.ui" line="130"/> + <source>Max Lines</source> + <translation>Max. Zeilen</translation> + </message> +</context> +<context> + <name>MemoryView</name> + <message> + <location filename="../MemoryView.ui" line="14"/> + <source>Memory</source> + <translation>Speicher</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="38"/> + <source>Inspect Address:</source> + <translation>Untersuche Adresse:</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="61"/> + <source>0x</source> + <translation>0x</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="81"/> + <source>Set Alignment:</source> + <translation>Ausrichtung festlegen:</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="101"/> + <source>1 Byte</source> + <translation>1 Byte</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="124"/> + <source>2 Bytes</source> + <translation>2 Bytes</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="144"/> + <source>4 Bytes</source> + <translation>4 Bytes</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="199"/> + <source>Signed Integer:</source> + <translation>Signed Integer:</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="217"/> + <source>String:</source> + <translation>String:</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="231"/> + <source>Load TBL</source> + <translation>TBL laden</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="244"/> + <source>Copy Selection</source> + <translation>Auswahl kopieren</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="251"/> + <source>Paste</source> + <translation>Einfügen</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="271"/> + <source>Save Selection</source> + <translation>Auswahl speichern</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="278"/> + <source>Load</source> + <translation>Laden</translation> + </message> + <message> + <location filename="../MemoryView.ui" line="181"/> + <source>Unsigned Integer:</source> + <translation>Unsigned Integer:</translation> + </message> +</context> +<context> + <name>ObjView</name> + <message> + <location filename="../ObjView.ui" line="14"/> + <source>Sprites</source> + <translation>Sprites</translation> + </message> + <message> + <location filename="../ObjView.ui" line="56"/> + <location filename="../ObjView.ui" line="506"/> + <source>×</source> + <translation>×</translation> + </message> + <message> + <location filename="../ObjView.ui" line="69"/> + <source>Magnification</source> + <translation>Vergrößerung</translation> + </message> + <message> + <location filename="../ObjView.ui" line="76"/> + <source>Export</source> + <translation>Exportieren</translation> + </message> + <message> + <location filename="../ObjView.ui" line="85"/> + <source>Attributes</source> + <translation>Eigenschaften</translation> + </message> + <message> + <location filename="../ObjView.ui" line="93"/> + <source>Transform</source> + <translation>Transform</translation> + </message> + <message> + <location filename="../ObjView.ui" line="113"/> + <source>Off</source> + <translation>Aus</translation> + </message> + <message> + <location filename="../ObjView.ui" line="124"/> + <source>Palette</source> + <translation>Palette</translation> + </message> + <message> + <location filename="../ObjView.ui" line="144"/> + <location filename="../ObjView.ui" line="374"/> + <location filename="../ObjView.ui" line="430"/> + <location filename="../ObjView.ui" line="456"/> + <source>0</source> + <translation>0</translation> + </message> + <message> + <location filename="../ObjView.ui" line="158"/> + <source>Double Size</source> + <translation>Doppelte Größe</translation> + </message> + <message> + <location filename="../ObjView.ui" line="184"/> + <location filename="../ObjView.ui" line="228"/> + <location filename="../ObjView.ui" line="241"/> + <location filename="../ObjView.ui" line="309"/> + <source>Return, Ctrl+R</source> + <translation>Eingabe, Strg+R</translation> + </message> + <message> + <location filename="../ObjView.ui" line="202"/> + <source>Flipped</source> + <translation>Gespiegelt</translation> + </message> + <message> + <location filename="../ObjView.ui" line="225"/> + <source>H</source> + <translation>H</translation> + </message> + <message> + <location filename="../ObjView.ui" line="238"/> + <source>V</source> + <translation>V</translation> + </message> + <message> + <location filename="../ObjView.ui" line="252"/> + <source>Mode</source> + <translation>Modus</translation> + </message> + <message> + <location filename="../ObjView.ui" line="272"/> + <source>Normal</source> + <translation>Normal</translation> + </message> + <message> + <location filename="../ObjView.ui" line="283"/> + <source>Mosaic</source> + <translation>Mosaic</translation> + </message> + <message> + <location filename="../ObjView.ui" line="320"/> + <source>Enabled</source> + <translation>Aktiviert</translation> + </message> + <message> + <location filename="../ObjView.ui" line="354"/> + <source>Priority</source> + <translation>Priorität</translation> + </message> + <message> + <location filename="../ObjView.ui" line="389"/> + <source>Tile</source> + <translation></translation> + </message> + <message> + <location filename="../ObjView.ui" line="396"/> + <source>Geometry</source> + <translation>Geometrie</translation> + </message> + <message> + <location filename="../ObjView.ui" line="404"/> + <source>Position</source> + <translation>Position</translation> + </message> + <message> + <location filename="../ObjView.ui" line="440"/> + <source>, </source> + <translation>, </translation> + </message> + <message> + <location filename="../ObjView.ui" line="470"/> + <source>Dimensions</source> + <translation>Abmessungen</translation> + </message> + <message> + <location filename="../ObjView.ui" line="496"/> + <location filename="../ObjView.ui" line="522"/> + <source>8</source> + <translation>8</translation> + </message> + <message> + <location filename="../ObjView.ui" line="552"/> + <source>Address</source> + <translation>Adresse</translation> + </message> + <message> + <location filename="../ObjView.ui" line="559"/> + <source>0x07000000</source> + <translation>0x07000000</translation> + </message> +</context> +<context> + <name>OverrideView</name> + <message> + <location filename="../OverrideView.ui" line="20"/> + <source>Game Overrides</source> + <translation>Spiel-Überschreibungen</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="30"/> + <source>Game Boy Advance</source> + <translation>Game Boy Advance</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="279"/> + <source>Autodetect</source> + <translation>Automatisch erkennen</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="55"/> + <source>Realtime clock</source> + <translation>Echtzeituhr</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="65"/> + <source>Gyroscope</source> + <translation>Gyroskop</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="75"/> + <source>Tilt</source> + <translation>Neigungssensor</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="85"/> + <source>Light sensor</source> + <translation>Lichtsensor</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="95"/> + <source>Rumble</source> + <translation>Rüttel-Effekt</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="113"/> + <source>Save type</source> + <translation>Speichertyp</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="126"/> + <location filename="../OverrideView.ui" line="284"/> + <source>None</source> + <translation>keiner</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="131"/> + <source>SRAM</source> + <translation>SRAM</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="136"/> + <source>Flash 512kb</source> + <translation>Flash 512kb</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="141"/> + <source>Flash 1Mb</source> + <translation>Flash 1Mb</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="146"/> + <source>EEPROM</source> + <translation>EEPROM</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="154"/> + <source>Idle loop</source> + <translation>Leerlaufprozess</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="195"/> + <source>Game Boy Player features</source> + <translation>Game Boy Player-Features</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="234"/> + <source>Game Boy</source> + <translation>Game Boy</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="240"/> + <source>Game Boy model</source> + <translation>Game Boy-Modell</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="253"/> + <source>Game Boy (DMG)</source> + <translation>Game Boy (DMG)</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="258"/> + <source>Game Boy Color (CGB)</source> + <translation>Game Boy Color (CGB)</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="263"/> + <source>Game Boy Advance (AGB)</source> + <translation>Game Boy Advance (AGB)</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="271"/> + <source>Memory bank controller</source> + <translation>Speicherbank-Controller</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="289"/> + <source>MBC1</source> + <translation>MBC1</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="294"/> + <source>MBC2</source> + <translation>MBC2</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="299"/> + <source>MBC3</source> + <translation>MBC3</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="304"/> + <source>MBC3 + RTC</source> + <translation>MBC3 + RTC</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="309"/> + <source>MBC5</source> + <translation>MBC5</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="314"/> + <source>MBC5 + Rumble</source> + <translation>MBC5 + Rumble</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="319"/> + <source>MBC7</source> + <translation>MBC7</translation> + </message> + <message> + <location filename="../OverrideView.ui" line="324"/> + <source>HuC-3</source> + <translation>HuC-3</translation> + </message> +</context> +<context> + <name>PaletteView</name> + <message> + <location filename="../PaletteView.ui" line="14"/> + <source>Palette</source> + <translation>Palette</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="44"/> + <source>Background</source> + <translation>Hintergrund</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="94"/> + <source>Objects</source> + <translation>Objekte</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="153"/> + <source>Selection</source> + <translation>Auswahl</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="184"/> + <source>Red</source> + <translation>Rot</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="191"/> + <source>Green</source> + <translation>Grün</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="198"/> + <source>Blue</source> + <translation>Blau</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>0x00 (00)</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="244"/> + <source>16-bit value</source> + <translation>16-Bit-Wert</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="251"/> + <source>Hex code</source> + <translation>Hex-Code</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="258"/> + <source>Palette index</source> + <translation>Paletten-Index</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="272"/> + <source>0x0000</source> + <translation>0x0000</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="282"/> + <source>#000000</source> + <translation>#000000</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="292"/> + <source>000</source> + <translation>000</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="322"/> + <source>Export BG</source> + <translation>BG exportieren</translation> + </message> + <message> + <location filename="../PaletteView.ui" line="342"/> + <source>Export OBJ</source> + <translation>OBJ exportieren</translation> + </message> +</context> +<context> + <name>QGBA::AssetTile</name> + <message> + <location filename="../AssetTile.cpp" line="107"/> + <source>%0%1%2</source> + <translation>%0%1%2</translation> + </message> + <message> + <location filename="../AssetTile.cpp" line="136"/> + <location filename="../AssetTile.cpp" line="137"/> + <location filename="../AssetTile.cpp" line="138"/> + <source>0x%0 (%1)</source> + <translation>0x%0 (%1)</translation> + </message> +</context> +<context> + <name>QGBA::CheatsModel</name> + <message> + <location filename="../CheatsModel.cpp" line="54"/> + <source>(untitled)</source> + <translation>(unbenannt)</translation> + </message> + <message> + <location filename="../CheatsModel.cpp" line="209"/> + <source>Failed to open cheats file: %1</source> + <translation>Fehler beim Öffnen der Cheat-Datei: %1</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>GameShark hinzufügen</translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="55"/> + <source>Add Pro Action Replay</source> + <translation>Pro Action Replay hinzufügen</translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="61"/> + <source>Add CodeBreaker</source> + <translation>CodeBreaker hinzufügen</translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="80"/> + <source>Add GameGenie</source> + <translation>GameGenie hinzufügen</translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="112"/> + <location filename="../CheatsView.cpp" line="119"/> + <source>Select cheats file</source> + <translation>Cheat-Datei auswählen</translation> + </message> +</context> +<context> + <name>QGBA::GBAKeyEditor</name> + <message> + <location filename="../GBAKeyEditor.cpp" line="68"/> + <source>Clear Button</source> + <translation>Button löschen</translation> + </message> + <message> + <location filename="../GBAKeyEditor.cpp" line="80"/> + <source>Clear Analog</source> + <translation>Analog löschen</translation> + </message> + <message> + <location filename="../GBAKeyEditor.cpp" line="91"/> + <source>Refresh</source> + <translation>Aktualisieren</translation> + </message> + <message> + <location filename="../GBAKeyEditor.cpp" line="101"/> + <source>Set all</source> + <translation>Alle belegen</translation> + </message> +</context> +<context> + <name>QGBA::GDBWindow</name> + <message> + <location filename="../GDBWindow.cpp" line="28"/> + <source>Server settings</source> + <translation>Server-Einstellungen</translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="34"/> + <source>Local port</source> + <translation>Lokaler Port</translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="36"/> + <source>Bind address</source> + <translation>Bind-Adresse</translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="55"/> + <source>Break</source> + <translation>Unterbrechen</translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="104"/> + <source>Stop</source> + <translation>Stop</translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="114"/> + <source>Start</source> + <translation>Start</translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="122"/> + <source>Crash</source> + <translation>Absturz</translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="122"/> + <source>Could not start GDB server</source> + <translation>Konnte GDB-Server nicht starten</translation> + </message> +</context> +<context> + <name>QGBA::GIFView</name> + <message> + <location filename="../GIFView.cpp" line="45"/> + <source>Failed to open output GIF file: %1</source> + <translation>Fehler beim Öffnen der Ausgabe-GIF-Datei: %1</translation> + </message> + <message> + <location filename="../GIFView.cpp" line="63"/> + <source>Select output file</source> + <translation>Ausgabedatei auswählen</translation> + </message> + <message> + <location filename="../GIFView.cpp" line="63"/> + <source>Graphics Interchange Format (*.gif)</source> + <translation>Graphics Interchange Format (*.gif)</translation> + </message> +</context> +<context> + <name>QGBA::GameController</name> + <message> + <location filename="../GameController.cpp" line="397"/> + <location filename="../GameController.cpp" line="572"/> + <source>Failed to open game file: %1</source> + <translation>Fehler beim Öffnen der Spieldatei: %1</translation> + </message> + <message> + <location filename="../GameController.cpp" line="544"/> + <source>Failed to open save file: %1</source> + <translation>Fehler beim Öffnen der Speicherdatei: %1</translation> + </message> + <message> + <location filename="../GameController.cpp" line="601"/> + <source>Failed to open snapshot file for reading: %1</source> + <translation>Konnte Snapshot-Datei %1 nicht zum Lesen öffnen</translation> + </message> + <message> + <location filename="../GameController.cpp" line="621"/> + <source>Failed to open snapshot file for writing: %1</source> + <translation>Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen</translation> + </message> + <message> + <location filename="../GameController.cpp" line="916"/> + <source>Failed to start audio processor</source> + <translation>Fehler beim Starten des Audio-Prozessors</translation> + </message> +</context> +<context> + <name>QGBA::IOViewer</name> + <message> + <location filename="../IOViewer.cpp" line="30"/> + <source>Background mode</source> + <translation>Hintergrund-Modus</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="31"/> + <source>Mode 0: 4 tile layers</source> + <translation>Mode 0: 4 Tile-Ebenen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="32"/> + <source>Mode 1: 2 tile layers + 1 rotated/scaled tile layer</source> + <translation>Mode 1: 2 Tile-Ebenen + 1 rotierte/skalierte Tile-Ebene</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="33"/> + <source>Mode 2: 2 rotated/scaled tile layers</source> + <translation>Mode 2: 2 rotierte/skalierte Tile-Ebenen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="34"/> + <source>Mode 3: Full 15-bit bitmap</source> + <translation>Mode 3: Volles 15-Bit-Bitmap</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="35"/> + <source>Mode 4: Full 8-bit bitmap</source> + <translation>Mode 4: Volles 8-Bit-Bitmap</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="36"/> + <source>Mode 5: Small 15-bit bitmap</source> + <translation>Mode 5: Kleines 15-Bit-Bitmap</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="40"/> + <source>CGB Mode</source> + <translation>CGB-Modus</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="41"/> + <source>Frame select</source> + <translation>Bildauswahl</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="42"/> + <source>Unlocked HBlank</source> + <translation>HBlank entsperrt</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="43"/> + <source>Linear OBJ tile mapping</source> + <translation>Lineares OBJ-Tile-Mapping</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="44"/> + <source>Force blank screen</source> + <translation>Leeren Bildschirm erzwingen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="45"/> + <source>Enable background 0</source> + <translation>Aktiviere Hintergrund 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="46"/> + <source>Enable background 1</source> + <translation>Aktiviere Hintergrund 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="47"/> + <source>Enable background 2</source> + <translation>Aktiviere Hintergrund 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="48"/> + <source>Enable background 3</source> + <translation>Aktiviere Hintergrund 3</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="49"/> + <source>Enable OBJ</source> + <translation>Aktiviere OBJ</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="50"/> + <source>Enable Window 0</source> + <translation>Aktiviere Fenster 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="51"/> + <source>Enable Window 1</source> + <translation>Aktiviere Fenster 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="52"/> + <source>Enable OBJ Window</source> + <translation>Aktiviere OBJ-Fenster</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="58"/> + <source>Currently in VBlank</source> + <translation>Aktuell in VBlank</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="59"/> + <source>Currently in HBlank</source> + <translation>Aktuell in HBlank</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="60"/> + <source>Currently in VCounter</source> + <translation>Aktuell in VCounter</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="61"/> + <source>Enable VBlank IRQ generation</source> + <translation>Aktiviere VBlank IRQ-Generierung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="62"/> + <source>Enable HBlank IRQ generation</source> + <translation>Aktiviere HBlank IRQ-Generierung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="63"/> + <source>Enable VCounter IRQ generation</source> + <translation>Aktiviere VCounter IRQ-Generierung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="64"/> + <source>VCounter scanline</source> + <translation>VCounter-Rasterzeile</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="68"/> + <source>Current scanline</source> + <translation>Aktuelle Rasterzeile</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>Priorität</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>Tile-Daten-Basis (* 16kB)</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>Aktiviere Mosaic</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>Aktiviere 256 Farben</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>Tile-Map-Basis (* 2kB)</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>Hintergrund-Abmessungen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="95"/> + <location filename="../IOViewer.cpp" line="105"/> + <source>Overflow wraps</source> + <translation type="unfinished">Umbrüche</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>Horizontaler Versatz</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>Vertikaler Versatz</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">Ganzzahl-Anteil</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">Ganzzahl-Anteil (unten)</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">Ganzzahl-Anteil (oben)</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="218"/> + <location filename="../IOViewer.cpp" line="223"/> + <source>End x</source> + <translation>x-Endwert</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="219"/> + <location filename="../IOViewer.cpp" line="224"/> + <source>Start x</source> + <translation>x-Startwert</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="228"/> + <location filename="../IOViewer.cpp" line="233"/> + <source>End y</source> + <translation>y-Endwert</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="229"/> + <location filename="../IOViewer.cpp" line="234"/> + <source>Start y</source> + <translation>y-Startwert</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="238"/> + <source>Window 0 enable BG 0</source> + <translation>Fenster 0: aktiviere BG 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="239"/> + <source>Window 0 enable BG 1</source> + <translation>Fenster 0: aktiviere BG 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="240"/> + <source>Window 0 enable BG 2</source> + <translation>Fenster 0: aktiviere BG2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="241"/> + <source>Window 0 enable BG 3</source> + <translation>Fenster 0: aktiviere BG 3</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="242"/> + <source>Window 0 enable OBJ</source> + <translation>Fenster 0: aktiviere OBJ</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="243"/> + <source>Window 0 enable blend</source> + <translation>Fenster 0: aktiviere Überblendung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="244"/> + <source>Window 1 enable BG 0</source> + <translation>Fenster 1: aktiviere BG 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="245"/> + <source>Window 1 enable BG 1</source> + <translation>Fenster 1: aktiviere BG 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="246"/> + <source>Window 1 enable BG 2</source> + <translation>Fenster 1: aktiviere BG 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="247"/> + <source>Window 1 enable BG 3</source> + <translation>Fenster 1: aktiviere BG 3</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="248"/> + <source>Window 1 enable OBJ</source> + <translation>Fenster 1: Aktiviere OBJ</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="249"/> + <source>Window 1 enable blend</source> + <translation>Fenster 1: aktivieren Überblendung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="253"/> + <source>Outside window enable BG 0</source> + <translation type="unfinished">Äußeres Fenster: aktiviere BG 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="254"/> + <source>Outside window enable BG 1</source> + <translation type="unfinished">Äußeres Fenster: aktiviere BG 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="255"/> + <source>Outside window enable BG 2</source> + <translation type="unfinished">Äußeres Fenster: aktiviere BG 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="256"/> + <source>Outside window enable BG 3</source> + <translation type="unfinished">Äußeres Fenster: aktiviere BG 3</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="257"/> + <source>Outside window enable OBJ</source> + <translation type="unfinished">Äußeres Fenster: aktiviere OBJ</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="258"/> + <source>Outside window enable blend</source> + <translation type="unfinished">Äußeres Fenster: aktiviere Überblendung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="259"/> + <source>OBJ window enable BG 0</source> + <translation>OBJ-Fenster: aktiviere BG 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="260"/> + <source>OBJ window enable BG 1</source> + <translation>OBJ-Fenster: aktiviere BG 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="261"/> + <source>OBJ window enable BG 2</source> + <translation>OBJ-Fenster: aktiviere BG 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="262"/> + <source>OBJ window enable BG 3</source> + <translation>OBJ-Fenster: aktiviere BG 3</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="263"/> + <source>OBJ window enable OBJ</source> + <translation>OBJ-Fenster: aktiviere OBJ</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="264"/> + <source>OBJ window enable blend</source> + <translation>OBJ-Fenster: aktiviere Überblendung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="268"/> + <source>Background mosaic size vertical</source> + <translation>Vertikale Größe der Hintergrund-Pixelierung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="269"/> + <source>Background mosaic size horizontal</source> + <translation>Horizontale Größe der Hintergrund-Pixelierung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="270"/> + <source>Object mosaic size vertical</source> + <translation>Vertikale Größe der Objekt-Pixelierung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="271"/> + <source>Object mosaic size horizontal</source> + <translation>Horizontale Größe der Objekt-Pixelierung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="277"/> + <source>BG 0 target 1</source> + <translation>BG 0 Ziel 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="278"/> + <source>BG 1 target 1</source> + <translation>BG 1 Ziel 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="279"/> + <source>BG 2 target 1</source> + <translation>BG 2 Ziel 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="280"/> + <source>BG 3 target 1</source> + <translation>BG 3 Ziel 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="281"/> + <source>OBJ target 1</source> + <translation>OBJ Ziel 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="282"/> + <source>Backdrop target 1</source> + <translation>Hintergrund Ziel 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="283"/> + <source>Blend mode</source> + <translation>Überblend-Modus</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="284"/> + <source>Disabled</source> + <translation>Deaktiviert</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="285"/> + <source>Additive blending</source> + <translation>Additive Überblendung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="286"/> + <source>Brighten</source> + <translation>Aufhellen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="287"/> + <source>Darken</source> + <translation>Abdunkeln</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="289"/> + <source>BG 0 target 2</source> + <translation>BG 0 Ziel 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="290"/> + <source>BG 1 target 2</source> + <translation>BG 1 Ziel 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="291"/> + <source>BG 2 target 2</source> + <translation>BG 2 Ziel 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="292"/> + <source>BG 3 target 2</source> + <translation>BG 3 Ziel 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="293"/> + <source>OBJ target 2</source> + <translation>OBJ Ziel 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="294"/> + <source>Backdrop target 2</source> + <translation>Hintergrund Ziel 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="298"/> + <source>Blend A (target 1)</source> + <translation>A Überblenden (Ziel 1)</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="299"/> + <source>Blend B (target 2)</source> + <translation>B Überblenden (Ziel 2)</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="303"/> + <source>Blend Y</source> + <translation>Y Überblenden</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>Sound-Länge</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>Hüllkurve erhöhen</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>Initiale Lautstärke</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>Sound-Frequenz</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>Reset</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>Aktive Wave-Table</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="359"/> + <source>Enable channel 3</source> + <translation>Aktiviere Kanal 3</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="364"/> + <source>Volume</source> + <translation>Lautstärke</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="365"/> + <source>0%</source> + <translation>0%</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="366"/> + <location filename="../IOViewer.cpp" line="423"/> + <source>100%</source> + <translation>100%</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="367"/> + <location filename="../IOViewer.cpp" line="422"/> + <source>50%</source> + <translation>50%</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="368"/> + <location filename="../IOViewer.cpp" line="421"/> + <source>25%</source> + <translation>25%</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>75%</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="394"/> + <source>Clock divider</source> + <translation>Frequenzteiler</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>15</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="397"/> + <source>7</source> + <translation>7</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>PSG-Lautstärke rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="408"/> + <source>PSG volume left</source> + <translation>PSG-Lautstärke links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="409"/> + <source>Enable channel 1 right</source> + <translation>Aktiviere Kanal 1 rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="410"/> + <source>Enable channel 2 right</source> + <translation>Aktiviere Kanal 2 rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="411"/> + <source>Enable channel 3 right</source> + <translation>Aktiviere Kanal 3 rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="412"/> + <source>Enable channel 4 right</source> + <translation>Aktiviere Kanal 4 rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="413"/> + <source>Enable channel 1 left</source> + <translation>Aktiviere Kanal 1 links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="414"/> + <source>Enable channel 2 left</source> + <translation>Aktiviere Kanal 2 links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="415"/> + <source>Enable channel 3 left</source> + <translation>Aktiviere Kanal 3 links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="416"/> + <source>Enable channel 4 left</source> + <translation>Aktiviere Kanal 4 links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="420"/> + <source>PSG master volume</source> + <translation>PSG-Master-Lauststärke</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>Aktiviere Kanal A rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="429"/> + <source>Enable channel A left</source> + <translation>Aktiviere Kanal A links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="430"/> + <source>Channel A timer</source> + <translation>Kanal A-Zeitgeber</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="431"/> + <location filename="../IOViewer.cpp" line="438"/> + <source>0</source> + <translation>0</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>1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="434"/> + <source>Channel A reset</source> + <translation>Kanal A zurücksetzen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="435"/> + <source>Enable channel B right</source> + <translation>Aktiviere Kanal B rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="436"/> + <source>Enable channel B left</source> + <translation>Aktiviere Kanal B links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="437"/> + <source>Channel B timer</source> + <translation>Kanal B-Zeitgeber</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="441"/> + <source>Channel B reset</source> + <translation>Kanal B zurücksetzen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="445"/> + <source>Active channel 1</source> + <translation>Kanal 1 aktiv</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="446"/> + <source>Active channel 2</source> + <translation>Kanal 2 aktiv</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="447"/> + <source>Active channel 3</source> + <translation>Kanal 3 aktiv</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="448"/> + <source>Active channel 4</source> + <translation>Kanal 4 aktiv</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="449"/> + <source>Enable audio</source> + <translation>Audio aktivieren</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>Auflösung</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>Sample</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>Adresse (unten)</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>Adresse (oben)</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>Wort-Anzahl</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>Zielversatz</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>Erhöhen</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>Verringern</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>Fest</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>Erhöhen und neu laden</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>Quellversatz</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>Wiederholen</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>32-Bit</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>Unmittelbar</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>VBlank</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>HBlank</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>IRQ</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>Aktivieren</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>Audio FIFO</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="715"/> + <source>Video Capture</source> + <translation>Videoaufzeichnung</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="717"/> + <source>DRQ</source> + <translation>DRQ</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>Wert</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>Skalierung</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>1/64</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>1/256</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>1/1024</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>Kaskade</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="858"/> + <location filename="../IOViewer.cpp" line="871"/> + <source>A</source> + <translation>A</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="859"/> + <location filename="../IOViewer.cpp" line="872"/> + <source>B</source> + <translation>B</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="860"/> + <location filename="../IOViewer.cpp" line="873"/> + <source>Select</source> + <translation>Select</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="861"/> + <location filename="../IOViewer.cpp" line="874"/> + <source>Start</source> + <translation>Start</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="862"/> + <location filename="../IOViewer.cpp" line="875"/> + <source>Right</source> + <translation>Rechts</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="863"/> + <location filename="../IOViewer.cpp" line="876"/> + <source>Left</source> + <translation>Links</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="864"/> + <location filename="../IOViewer.cpp" line="877"/> + <source>Up</source> + <translation>Oben</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="865"/> + <location filename="../IOViewer.cpp" line="878"/> + <source>Down</source> + <translation>Unten</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="866"/> + <location filename="../IOViewer.cpp" line="879"/> + <source>R</source> + <translation>R</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="867"/> + <location filename="../IOViewer.cpp" line="880"/> + <source>L</source> + <translation>L</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="882"/> + <source>Condition</source> + <translation>Zustand</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="886"/> + <source>SC</source> + <translation>SC</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="887"/> + <source>SD</source> + <translation>SD</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="888"/> + <source>SI</source> + <translation>SI</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="889"/> + <source>SO</source> + <translation>SO</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="941"/> + <location filename="../IOViewer.cpp" line="958"/> + <source>VCounter</source> + <translation>VCounter</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="942"/> + <location filename="../IOViewer.cpp" line="959"/> + <source>Timer 0</source> + <translation>Zähler 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="943"/> + <location filename="../IOViewer.cpp" line="960"/> + <source>Timer 1</source> + <translation>Zähler 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="944"/> + <location filename="../IOViewer.cpp" line="961"/> + <source>Timer 2</source> + <translation>Zähler 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="945"/> + <location filename="../IOViewer.cpp" line="962"/> + <source>Timer 3</source> + <translation>Zähler 3</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="946"/> + <location filename="../IOViewer.cpp" line="963"/> + <source>SIO</source> + <translation>SIO</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="947"/> + <location filename="../IOViewer.cpp" line="964"/> + <source>DMA 0</source> + <translation>DMA 0</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="948"/> + <location filename="../IOViewer.cpp" line="965"/> + <source>DMA 1</source> + <translation>DMA 1</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="949"/> + <location filename="../IOViewer.cpp" line="966"/> + <source>DMA 2</source> + <translation>DMA 2</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="950"/> + <location filename="../IOViewer.cpp" line="967"/> + <source>DMA 3</source> + <translation>DMA 3</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>Spielmodul</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="973"/> + <source>SRAM wait</source> + <translation>Warten auf SRAM</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>4</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>3</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>2</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>8</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="979"/> + <source>Cart 0 non-sequential</source> + <translation>Modul 0 nicht-sequenziell</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="985"/> + <source>Cart 0 sequential</source> + <translation>Modul 0 sequenziell</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="989"/> + <source>Cart 1 non-sequential</source> + <translation>Modul 1 nicht-sequenziell</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="995"/> + <source>Cart 1 sequential</source> + <translation>Modul 1 sequenziell</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="999"/> + <source>Cart 2 non-sequential</source> + <translation>Modul 2 nicht-sequenziell</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1005"/> + <source>Cart 2 sequential</source> + <translation>Modul 2 sequenziell</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>Deaktivieren</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1011"/> + <source>4.19MHz</source> + <translation>4.19MHz</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1012"/> + <source>8.38MHz</source> + <translation>8.38MHz</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1013"/> + <source>16.78MHz</source> + <translation>16.78MHz</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1015"/> + <source>Gamepak prefetch</source> + <translation>Spielmodul vorladen</translation> + </message> + <message> + <location filename="../IOViewer.cpp" line="1021"/> + <source>Enable IRQs</source> + <translation>Aktiviere IRQs</translation> + </message> +</context> +<context> + <name>QGBA::KeyEditor</name> + <message> + <location filename="../KeyEditor.cpp" line="37"/> + <location filename="../KeyEditor.cpp" line="211"/> + <source>---</source> + <translation>---</translation> + </message> +</context> +<context> + <name>QGBA::LibraryModel</name> + <message> + <location filename="../LibraryModel.cpp" line="24"/> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="33"/> + <source>Filename</source> + <translation>Dateiname</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="39"/> + <source>Size</source> + <translation>Größe</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="56"/> + <source>Platform</source> + <translation>Plattform</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="62"/> + <source>GBA</source> + <translation>GBA</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="66"/> + <source>GB</source> + <translation>GB</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="69"/> + <source>?</source> + <translation>?</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="74"/> + <source>Location</source> + <translation>Ort</translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="80"/> + <source>CRC32</source> + <translation>CRC32</translation> + </message> +</context> +<context> + <name>QGBA::LoadSaveState</name> + <message> + <location filename="../LoadSaveState.cpp" line="68"/> + <source>Load State</source> + <translation>Savestate laden</translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="68"/> + <source>Save State</source> + <translation>Savestate speichern</translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="177"/> + <source>Empty</source> + <translation>Leer</translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="186"/> + <source>Corrupted</source> + <translation>Defekt</translation> + </message> + <message> + <location filename="../LoadSaveState.cpp" line="209"/> + <source>Slot %1</source> + <translation>Speicherplatz %1</translation> + </message> +</context> +<context> + <name>QGBA::LogController</name> + <message> + <location filename="../LogController.cpp" line="57"/> + <source>DEBUG</source> + <translation>DEBUG</translation> + </message> + <message> + <location filename="../LogController.cpp" line="59"/> + <source>STUB</source> + <translation>STUB</translation> + </message> + <message> + <location filename="../LogController.cpp" line="61"/> + <source>INFO</source> + <translation>INFO</translation> + </message> + <message> + <location filename="../LogController.cpp" line="63"/> + <source>WARN</source> + <translation>WARN</translation> + </message> + <message> + <location filename="../LogController.cpp" line="65"/> + <source>ERROR</source> + <translation>ERROR</translation> + </message> + <message> + <location filename="../LogController.cpp" line="67"/> + <source>FATAL</source> + <translation>FATAL</translation> + </message> + <message> + <location filename="../LogController.cpp" line="69"/> + <source>GAME ERROR</source> + <translation>GAME ERROR</translation> + </message> +</context> +<context> + <name>QGBA::MemoryModel</name> + <message> + <location filename="../MemoryModel.cpp" line="50"/> + <source>Copy selection</source> + <translation>Auswahl kopieren</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="55"/> + <source>Save selection</source> + <translation>Auswahl speichern</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="60"/> + <source>Paste</source> + <translation>Einfügen</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="65"/> + <source>Load</source> + <translation>Laden</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="97"/> + <location filename="../MemoryModel.cpp" line="162"/> + <source>All</source> + <translation>Alle</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="142"/> + <source>Load TBL</source> + <translation>TBL laden</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="202"/> + <source>Save selected memory</source> + <translation>Ausgewählten Speicher abspeichern</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="208"/> + <source>Failed to open output file: %1</source> + <translation>Fehler beim Öffnen der Ausgabedatei: %1</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="216"/> + <source>Load memory</source> + <translation>Lade Speicher</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="222"/> + <source>Failed to open input file: %1</source> + <translation>Fehler beim Laden der Eingabedatei: %1</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="338"/> + <source>TBL</source> + <translation>TBL</translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="338"/> + <source>ISO-8859-1</source> + <translation>ISO-8859-1</translation> + </message> +</context> +<context> + <name>QGBA::ObjView</name> + <message> + <location filename="../ObjView.cpp" line="141"/> + <location filename="../ObjView.cpp" line="233"/> + <source>0x%0</source> + <translation>0x%0</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="152"/> + <source>Off</source> + <translation>Aus</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="157"/> + <source>Normal</source> + <translation>Normal</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="160"/> + <source>Trans</source> + <translation>Trans</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="163"/> + <source>OBJWIN</source> + <translation>OBJWIN</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="166"/> + <source>Invalid</source> + <translation>Ungültig</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="240"/> + <location filename="../ObjView.cpp" line="241"/> + <source>N/A</source> + <translation>N/A</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="247"/> + <source>Export sprite</source> + <translation>Sprite exportieren</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="248"/> + <source>Portable Network Graphics (*.png)</source> + <translation>Portable Network Graphics (*.png)</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="255"/> + <source>Failed to open output PNG file: %1</source> + <translation>Fehler beim Öffnen der Ausgabe-PNG-Datei: %1</translation> + </message> +</context> +<context> + <name>QGBA::PaletteView</name> + <message> + <location filename="../PaletteView.cpp" line="120"/> + <source>#%0</source> + <translation>#%0</translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="121"/> + <source>0x%0</source> + <translation>0x%0</translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="122"/> + <source>%0</source> + <translation>%0</translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="123"/> + <location filename="../PaletteView.cpp" line="124"/> + <location filename="../PaletteView.cpp" line="125"/> + <source>0x%0 (%1)</source> + <translation>0x%0 (%1)</translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="137"/> + <source>Export palette</source> + <translation>Palette exportieren</translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="138"/> + <source>Windows PAL (*.pal);;Adobe Color Table (*.act)</source> + <translation>Windows PAL (*.pal);;Adobe Color Table (*.act)</translation> + </message> + <message> + <location filename="../PaletteView.cpp" line="145"/> + <source>Failed to open output palette file: %1</source> + <translation>Fehler beim Öffnen der Ausgabe-Palettendatei: %1</translation> + </message> +</context> +<context> + <name>QGBA::ROMInfo</name> + <message> + <location filename="../ROMInfo.cpp" line="48"/> + <location filename="../ROMInfo.cpp" line="69"/> + <location filename="../ROMInfo.cpp" line="80"/> + <location filename="../ROMInfo.cpp" line="89"/> + <location filename="../ROMInfo.cpp" line="90"/> + <source>(unknown)</source> + <translation>(unbekannt)</translation> + </message> + <message> + <location filename="../ROMInfo.cpp" line="57"/> + <location filename="../ROMInfo.cpp" line="64"/> + <source> bytes</source> + <translation>Bytes</translation> + </message> + <message> + <location filename="../ROMInfo.cpp" line="83"/> + <source>(no database present)</source> + <translation>(keine Datenbank vorhanden)</translation> + </message> +</context> +<context> + <name>QGBA::SettingsView</name> + <message> + <location filename="../SettingsView.cpp" line="96"/> + <source>Qt Multimedia</source> + <translation>Qt Multimedia</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="103"/> + <source>SDL</source> + <translation>SDL</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="111"/> + <source>Software (Qt)</source> + <translation>Software (Qt)</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="117"/> + <source>OpenGL</source> + <translation>OpenGL</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="124"/> + <source>OpenGL (force version 1.x)</source> + <translation>OpenGL (erzwinge Version 1.x)</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="142"/> + <source>Keyboard</source> + <translation>Tastatur</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="151"/> + <source>Controllers</source> + <translation>Gamepads</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="170"/> + <source>Shortcuts</source> + <translation>Tastenkürzel</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="174"/> + <source>Select BIOS</source> + <translation>BIOS auswählen</translation> + </message> +</context> +<context> + <name>QGBA::ShaderSelector</name> + <message> + <location filename="../ShaderSelector.cpp" line="50"/> + <source>No shader active</source> + <translation>Kein Shader aktiv</translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="63"/> + <source>Load shader</source> + <translation>Shader laden</translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="63"/> + <source>%1 Shader (%.shader)</source> + <translation>%1 Shader (%.shader)</translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="102"/> + <source>No shader loaded</source> + <translation>Kein Shader geladen</translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="110"/> + <source>by %1</source> + <translation>von %1</translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="121"/> + <source>Preprocessing</source> + <translation>Vorbehandlung</translation> + </message> + <message> + <location filename="../ShaderSelector.cpp" line="128"/> + <source>Pass %1</source> + <translation>Durchlauf %1</translation> + </message> +</context> +<context> + <name>QGBA::ShortcutController</name> + <message> + <location filename="../ShortcutController.cpp" line="67"/> + <source>Action</source> + <translation>Aktion</translation> + </message> + <message> + <location filename="../ShortcutController.cpp" line="69"/> + <source>Keyboard</source> + <translation>Tastatur</translation> + </message> + <message> + <location filename="../ShortcutController.cpp" line="71"/> + <source>Gamepad</source> + <translation>Gamepad</translation> + </message> +</context> +<context> + <name>QGBA::VideoView</name> + <message> + <location filename="../VideoView.cpp" line="208"/> + <source>Failed to open output video file: %1</source> + <translation>Fehler beim Öffnen der Ausgabe-Videodatei: %1</translation> + </message> + <message> + <location filename="../VideoView.cpp" line="226"/> + <source>Native (%0x%1)</source> + <translation>Nativ (%0x%1)</translation> + </message> + <message> + <location filename="../VideoView.cpp" line="241"/> + <source>Select output file</source> + <translation>Ausgabedatei auswählen</translation> + </message> +</context> +<context> + <name>QGBA::Window</name> + <message> + <location filename="../Window.cpp" line="340"/> + <source>Game Boy Advance ROMs (%1)</source> + <translation>Game Boy Advance-ROMs (%1)</translation> + </message> + <message> + <location filename="../Window.cpp" line="356"/> + <source>Game Boy ROMs (%1)</source> + <translation>Game Boy-ROMs (%1)</translation> + </message> + <message> + <location filename="../Window.cpp" line="360"/> + <source>All ROMs (%1)</source> + <translation>Alle ROMs (%1)</translation> + </message> + <message> + <location filename="../Window.cpp" line="375"/> + <source>Archives (%1)</source> + <translation>Archive (%1)</translation> + </message> + <message> + <location filename="../Window.cpp" line="380"/> + <location filename="../Window.cpp" line="388"/> + <location filename="../Window.cpp" line="415"/> + <source>Select ROM</source> + <translation>ROM auswählen</translation> + </message> + <message> + <location filename="../Window.cpp" line="423"/> + <source>Game Boy Advance save files (%1)</source> + <translation>Game Boy Advance-Speicherdateien (%1)</translation> + </message> + <message> + <location filename="../Window.cpp" line="424"/> + <location filename="../Window.cpp" line="457"/> + <location filename="../Window.cpp" line="464"/> + <source>Select save</source> + <translation>Speicherdatei wählen</translation> + </message> + <message> + <location filename="../Window.cpp" line="444"/> + <source>Select patch</source> + <translation>Patch wählen</translation> + </message> + <message> + <location filename="../Window.cpp" line="444"/> + <source>Patches (*.ips *.ups *.bps)</source> + <translation>Patches (*.ips *.ups *.bps)</translation> + </message> + <message> + <location filename="../Window.cpp" line="457"/> + <location filename="../Window.cpp" line="464"/> + <source>GameShark saves (*.sps *.xps)</source> + <translation>GameShark-Speicherdaten (*.sps *.xps)</translation> + </message> + <message> + <location filename="../Window.cpp" line="782"/> + <source>Crash</source> + <translation>Absturz</translation> + </message> + <message> + <location filename="../Window.cpp" line="783"/> + <source>The game has crashed with the following error: + +%1</source> + <translation>Das Spiel ist mit der folgenden Fehlermeldung abgestürzt: + +%1</translation> + </message> + <message> + <location filename="../Window.cpp" line="790"/> + <source>Couldn't Load</source> + <translation>Konnte nicht geladen werden</translation> + </message> + <message> + <location filename="../Window.cpp" line="791"/> + <source>Could not load game. Are you sure it's in the correct format?</source> + <translation>Konnte das Spiel nicht laden. Sind Sie sicher, dass es im korrekten Format vorliegt?</translation> + </message> + <message> + <location filename="../Window.cpp" line="804"/> + <source>Unimplemented BIOS call</source> + <translation>Nichtimplementierter BIOS-Aufruf</translation> + </message> + <message> + <location filename="../Window.cpp" line="805"/> + <source>This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience.</source> + <translation>Dieses Spiel verwendet einen BIOS-Aufruf, der nicht implementiert ist. Bitte verwenden Sie für die beste Spielerfahrung das offizielle BIOS.</translation> + </message> + <message> + <location filename="../Window.cpp" line="812"/> + <source>Really make portable?</source> + <translation>Portablen Modus wirklich aktivieren?</translation> + </message> + <message> + <location filename="../Window.cpp" line="813"/> + <source>This will make the emulator load its configuration from the same directory as the executable. Do you want to continue?</source> + <translation>Diese Einstellung wird den Emulator so konfigurieren, dass er seine Konfiguration aus dem gleichen Verzeichnis wie die Programmdatei lädt. Möchten Sie fortfahren?</translation> + </message> + <message> + <location filename="../Window.cpp" line="821"/> + <source>Restart needed</source> + <translation>Neustart benötigt</translation> + </message> + <message> + <location filename="../Window.cpp" line="822"/> + <source>Some changes will not take effect until the emulator is restarted.</source> + <translation>Einige Änderungen werden erst übernommen, wenn der Emulator neu gestartet wurde.</translation> + </message> + <message> + <location filename="../Window.cpp" line="869"/> + <source> - Player %1 of %2</source> + <translation> - Spieler %1 von %2</translation> + </message> + <message> + <location filename="../Window.cpp" line="880"/> + <source>%1 - %2</source> + <translation>%1 - %2</translation> + </message> + <message> + <location filename="../Window.cpp" line="882"/> + <source>%1 - %2 - %3</source> + <translation>%1 - %2 - %3</translation> + </message> + <message> + <location filename="../Window.cpp" line="884"/> + <source>%1 - %2 (%3 fps) - %4</source> + <translation>%1 - %2 (%3 Bilder/Sekunde) - %4</translation> + </message> + <message> + <location filename="../Window.cpp" line="916"/> + <source>&File</source> + <translation>&Datei</translation> + </message> + <message> + <location filename="../Window.cpp" line="919"/> + <source>Load &ROM...</source> + <translation>&ROM laden...</translation> + </message> + <message> + <location filename="../Window.cpp" line="922"/> + <source>Load ROM in archive...</source> + <translation>ROM aus Archiv laden...</translation> + </message> + <message> + <location filename="../Window.cpp" line="928"/> + <source>Load temporary save...</source> + <translation>Temporäre Speicherdatei laden...</translation> + </message> + <message> + <location filename="../Window.cpp" line="933"/> + <source>Load &patch...</source> + <translation>&Patch laden...</translation> + </message> + <message> + <location filename="../Window.cpp" line="935"/> + <source>Boot BIOS</source> + <translation>BIOS booten</translation> + </message> + <message> + <location filename="../Window.cpp" line="942"/> + <source>Replace ROM...</source> + <translation>ROM ersetzen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="944"/> + <source>ROM &info...</source> + <translation>ROM-&Informationen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="949"/> + <source>Recent</source> + <translation>Zuletzt verwendet</translation> + </message> + <message> + <location filename="../Window.cpp" line="953"/> + <source>Make portable</source> + <translation>Portablen Modus aktivieren</translation> + </message> + <message> + <location filename="../Window.cpp" line="957"/> + <source>&Load state</source> + <translation>Savestate &laden</translation> + </message> + <message> + <location filename="../Window.cpp" line="958"/> + <source>F10</source> + <translation>F10</translation> + </message> + <message> + <location filename="../Window.cpp" line="964"/> + <source>&Save state</source> + <translation>Savestate &speichern</translation> + </message> + <message> + <location filename="../Window.cpp" line="965"/> + <source>Shift+F10</source> + <translation>Umschalt+F10</translation> + </message> + <message> + <location filename="../Window.cpp" line="971"/> + <source>Quick load</source> + <translation>Schnell laden</translation> + </message> + <message> + <location filename="../Window.cpp" line="972"/> + <source>Quick save</source> + <translation>Schnell speichern</translation> + </message> + <message> + <location filename="../Window.cpp" line="976"/> + <source>Load recent</source> + <translation>Lade zuletzt gespeicherten Savestate</translation> + </message> + <message> + <location filename="../Window.cpp" line="982"/> + <source>Save recent</source> + <translation>Speichere aktuellen Stand</translation> + </message> + <message> + <location filename="../Window.cpp" line="991"/> + <source>Undo load state</source> + <translation>Laden des Savestate rückgängig machen</translation> + </message> + <message> + <location filename="../Window.cpp" line="992"/> + <source>F11</source> + <translation>F11</translation> + </message> + <message> + <location filename="../Window.cpp" line="998"/> + <source>Undo save state</source> + <translation>Speichern des Savestate rückgängig machen</translation> + </message> + <message> + <location filename="../Window.cpp" line="999"/> + <source>Shift+F11</source> + <translation>Umschalt+F11</translation> + </message> + <message> + <location filename="../Window.cpp" line="1010"/> + <location filename="../Window.cpp" line="1017"/> + <source>State &%1</source> + <translation>Savestate &%1</translation> + </message> + <message> + <location filename="../Window.cpp" line="1011"/> + <source>F%1</source> + <translation>F%1</translation> + </message> + <message> + <location filename="../Window.cpp" line="1018"/> + <source>Shift+F%1</source> + <translation>Umschalt+F%1</translation> + </message> + <message> + <location filename="../Window.cpp" line="1027"/> + <source>Import GameShark Save</source> + <translation>Importiere GameShark-Speicherstand</translation> + </message> + <message> + <location filename="../Window.cpp" line="1033"/> + <source>Export GameShark Save</source> + <translation>Exportiere GameShark-Speicherstand</translation> + </message> + <message> + <location filename="../Window.cpp" line="1041"/> + <source>New multiplayer window</source> + <translation>Neues Multiplayer-Fenster</translation> + </message> + <message> + <location filename="../Window.cpp" line="1051"/> + <source>About</source> + <translation>Über</translation> + </message> + <message> + <location filename="../Window.cpp" line="1056"/> + <source>E&xit</source> + <translation>&Beenden</translation> + </message> + <message> + <location filename="../Window.cpp" line="1059"/> + <source>&Emulation</source> + <translation>&Emulation</translation> + </message> + <message> + <location filename="../Window.cpp" line="1061"/> + <source>&Reset</source> + <translation>Zu&rücksetzen</translation> + </message> + <message> + <location filename="../Window.cpp" line="1062"/> + <source>Ctrl+R</source> + <translation>Strg+R</translation> + </message> + <message> + <location filename="../Window.cpp" line="1067"/> + <source>Sh&utdown</source> + <translation>B&eenden</translation> + </message> + <message> + <location filename="../Window.cpp" line="1073"/> + <source>Yank game pak</source> + <translation>Spielmodul herausziehen</translation> + </message> + <message> + <location filename="../Window.cpp" line="1081"/> + <source>&Pause</source> + <translation>&Pause</translation> + </message> + <message> + <location filename="../Window.cpp" line="1084"/> + <source>Ctrl+P</source> + <translation>Strg+P</translation> + </message> + <message> + <location filename="../Window.cpp" line="1093"/> + <source>&Next frame</source> + <translation>&Nächstes Bild</translation> + </message> + <message> + <location filename="../Window.cpp" line="1094"/> + <source>Ctrl+N</source> + <translation>Strg+N</translation> + </message> + <message> + <location filename="../Window.cpp" line="1105"/> + <source>Fast forward (held)</source> + <translation>Schneller Vorlauf (gehalten)</translation> + </message> + <message> + <location filename="../Window.cpp" line="1107"/> + <source>&Fast forward</source> + <translation>Schneller &Vorlauf</translation> + </message> + <message> + <location filename="../Window.cpp" line="1110"/> + <source>Shift+Tab</source> + <translation>Umschalt+Tab</translation> + </message> + <message> + <location filename="../Window.cpp" line="1114"/> + <source>Fast forward speed</source> + <translation>Vorlauf-Geschwindigkeit</translation> + </message> + <message> + <location filename="../Window.cpp" line="1119"/> + <source>Unbounded</source> + <translation>Unbegrenzt</translation> + </message> + <message> + <location filename="../Window.cpp" line="1123"/> + <source>%0x</source> + <translation>%0x</translation> + </message> + <message> + <location filename="../Window.cpp" line="1131"/> + <source>Rewind (held)</source> + <translation>Zurückspulen (gehalten)</translation> + </message> + <message> + <location filename="../Window.cpp" line="1133"/> + <source>Re&wind</source> + <translation>Zur&ückspulen</translation> + </message> + <message> + <location filename="../Window.cpp" line="1134"/> + <source>~</source> + <translation>~</translation> + </message> + <message> + <location filename="../Window.cpp" line="1140"/> + <source>Step backwards</source> + <translation>Schrittweiser Rücklauf</translation> + </message> + <message> + <location filename="../Window.cpp" line="1141"/> + <source>Ctrl+B</source> + <translation>Strg+B</translation> + </message> + <message> + <location filename="../Window.cpp" line="1150"/> + <source>Sync to &video</source> + <translation>Mit &Video synchronisieren</translation> + </message> + <message> + <location filename="../Window.cpp" line="1157"/> + <source>Sync to &audio</source> + <translation>Mit &Audio synchronisieren</translation> + </message> + <message> + <location filename="../Window.cpp" line="1165"/> + <source>Solar sensor</source> + <translation>Solar-Sensor</translation> + </message> + <message> + <location filename="../Window.cpp" line="1167"/> + <source>Increase solar level</source> + <translation>Sonnen-Level erhöhen</translation> + </message> + <message> + <location filename="../Window.cpp" line="1171"/> + <source>Decrease solar level</source> + <translation>Sonnen-Level verringern</translation> + </message> + <message> + <location filename="../Window.cpp" line="1175"/> + <source>Brightest solar level</source> + <translation>Hellster Sonnen-Level</translation> + </message> + <message> + <location filename="../Window.cpp" line="1179"/> + <source>Darkest solar level</source> + <translation>Dunkelster Sonnen-Level</translation> + </message> + <message> + <location filename="../Window.cpp" line="1185"/> + <source>Brightness %1</source> + <translation>Helligkeit %1</translation> + </message> + <message> + <location filename="../Window.cpp" line="1192"/> + <source>Audio/&Video</source> + <translation>Audio/&Video</translation> + </message> + <message> + <location filename="../Window.cpp" line="1194"/> + <source>Frame size</source> + <translation>Bildgröße</translation> + </message> + <message> + <location filename="../Window.cpp" line="1197"/> + <source>%1x</source> + <translation>%1x</translation> + </message> + <message> + <location filename="../Window.cpp" line="1225"/> + <source>Toggle fullscreen</source> + <translation>Vollbildmodus umschalten</translation> + </message> + <message> + <location filename="../Window.cpp" line="1228"/> + <source>Lock aspect ratio</source> + <translation>Seitenverhältnis sperren</translation> + </message> + <message> + <location filename="../Window.cpp" line="1241"/> + <source>Frame&skip</source> + <translation>Frame&skip</translation> + </message> + <message> + <location filename="../Window.cpp" line="1251"/> + <source>Shader options...</source> + <translation>Shader-Optionen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1261"/> + <source>Mute</source> + <translation>Stummschalten</translation> + </message> + <message> + <location filename="../Window.cpp" line="1267"/> + <source>FPS target</source> + <translation>Bildwiederholrate</translation> + </message> + <message> + <location filename="../Window.cpp" line="1272"/> + <source>15</source> + <translation>15</translation> + </message> + <message> + <location filename="../Window.cpp" line="1273"/> + <source>30</source> + <translation>30</translation> + </message> + <message> + <location filename="../Window.cpp" line="1274"/> + <source>45</source> + <translation>45</translation> + </message> + <message> + <location filename="../Window.cpp" line="1275"/> + <source>Native (59.7)</source> + <translation>Nativ (59.7)</translation> + </message> + <message> + <location filename="../Window.cpp" line="1276"/> + <source>60</source> + <translation>60</translation> + </message> + <message> + <location filename="../Window.cpp" line="1277"/> + <source>90</source> + <translation>90</translation> + </message> + <message> + <location filename="../Window.cpp" line="1278"/> + <source>120</source> + <translation>120</translation> + </message> + <message> + <location filename="../Window.cpp" line="1279"/> + <source>240</source> + <translation>240</translation> + </message> + <message> + <location filename="../Window.cpp" line="1287"/> + <source>Take &screenshot</source> + <translation>&Screenshot erstellen</translation> + </message> + <message> + <location filename="../Window.cpp" line="1288"/> + <source>F12</source> + <translation>F12</translation> + </message> + <message> + <location filename="../Window.cpp" line="1295"/> + <source>Record output...</source> + <translation>Ausgabe aufzeichen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1302"/> + <source>Record GIF...</source> + <translation>GIF aufzeichen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1308"/> + <source>Video layers</source> + <translation>Video-Ebenen</translation> + </message> + <message> + <location filename="../Window.cpp" line="1312"/> + <source>Background %0</source> + <translation>Hintergrund %0</translation> + </message> + <message> + <location filename="../Window.cpp" line="1319"/> + <source>OBJ (sprites)</source> + <translation>OBJ (Sprites)</translation> + </message> + <message> + <location filename="../Window.cpp" line="1325"/> + <source>Audio channels</source> + <translation>Audio-Kanäle</translation> + </message> + <message> + <location filename="../Window.cpp" line="1329"/> + <source>Channel %0</source> + <translation>Kanal %0</translation> + </message> + <message> + <location filename="../Window.cpp" line="1336"/> + <source>Channel A</source> + <translation>Kanal A</translation> + </message> + <message> + <location filename="../Window.cpp" line="1342"/> + <source>Channel B</source> + <translation>Kanal B</translation> + </message> + <message> + <location filename="../Window.cpp" line="1348"/> + <source>&Tools</source> + <translation>&Werkzeuge</translation> + </message> + <message> + <location filename="../Window.cpp" line="1350"/> + <source>View &logs...</source> + <translation>&Logs ansehen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1354"/> + <source>Game &overrides...</source> + <translation>Spiel-&Überschreibungen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1358"/> + <source>Game &Pak sensors...</source> + <translation>Game &Pak-Sensoren...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1362"/> + <source>&Cheats...</source> + <translation>&Cheats...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1374"/> + <source>Open debugger console...</source> + <translation>Debugger-Konsole äffnen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1380"/> + <source>Start &GDB server...</source> + <translation>&GDB-Server starten...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1368"/> + <source>Settings...</source> + <translation>Einstellungen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="406"/> + <source>Select folder</source> + <translation>Ordner auswählen</translation> + </message> + <message> + <location filename="../Window.cpp" line="924"/> + <source>Add folder to library...</source> + <translation>Ordner zur Bibliothek hinzufügen...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1235"/> + <source>Bilinear filtering</source> + <translation>Bilineare Filterung</translation> + </message> + <message> + <location filename="../Window.cpp" line="1387"/> + <source>View &palette...</source> + <translation>&Palette betrachten...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1392"/> + <source>View &sprites...</source> + <translation>&Sprites betrachten...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1397"/> + <source>View &tiles...</source> + <translation>&Tiles betrachten...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1402"/> + <source>View memory...</source> + <translation>Speicher betrachten...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1408"/> + <source>View &I/O registers...</source> + <translation>&I/O-Register betrachten...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1470"/> + <source>Exit fullscreen</source> + <translation>Vollbildmodus beenden</translation> + </message> + <message> + <location filename="../Window.cpp" line="1475"/> + <source>Autofire</source> + <translation>Autofeuer</translation> + </message> + <message> + <location filename="../Window.cpp" line="1482"/> + <source>Autofire A</source> + <translation>Autofeuer A</translation> + </message> + <message> + <location filename="../Window.cpp" line="1488"/> + <source>Autofire B</source> + <translation>Autofeuer B</translation> + </message> + <message> + <location filename="../Window.cpp" line="1494"/> + <source>Autofire L</source> + <translation>Autofeuer L</translation> + </message> + <message> + <location filename="../Window.cpp" line="1500"/> + <source>Autofire R</source> + <translation>Autofeuer R</translation> + </message> + <message> + <location filename="../Window.cpp" line="1506"/> + <source>Autofire Start</source> + <translation>Autofeuer Start</translation> + </message> + <message> + <location filename="../Window.cpp" line="1512"/> + <source>Autofire Select</source> + <translation>Autofeuer Select</translation> + </message> + <message> + <location filename="../Window.cpp" line="1518"/> + <source>Autofire Up</source> + <translation>Autofeuer nach oben</translation> + </message> + <message> + <location filename="../Window.cpp" line="1524"/> + <source>Autofire Right</source> + <translation>Autofeuer rechts</translation> + </message> + <message> + <location filename="../Window.cpp" line="1530"/> + <source>Autofire Down</source> + <translation>Autofeuer nach unten</translation> + </message> + <message> + <location filename="../Window.cpp" line="1536"/> + <source>Autofire Left</source> + <translation>Autofeuer links</translation> + </message> +</context> +<context> + <name>ROMInfo</name> + <message> + <location filename="../ROMInfo.ui" line="14"/> + <source>ROM Info</source> + <translation>ROM-Info</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="26"/> + <source>Game name:</source> + <translation>Spiel-Name:</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="33"/> + <source>{NAME}</source> + <translation>{NAME}</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="46"/> + <source>Internal name:</source> + <translation>Interner Name:</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="53"/> + <source>{TITLE}</source> + <translation>{TITLE}</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="63"/> + <source>Game ID:</source> + <translation>Spiele-ID:</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="70"/> + <source>{ID}</source> + <translation>{ID}</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="80"/> + <source>File size:</source> + <translation>Dateigröße:</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="87"/> + <source>{SIZE}</source> + <translation>{SIZE}</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="97"/> + <source>CRC32:</source> + <translation>CRC32:</translation> + </message> + <message> + <location filename="../ROMInfo.ui" line="104"/> + <source>{CRC}</source> + <translation>{CRC}</translation> + </message> +</context> +<context> + <name>SensorView</name> + <message> + <location filename="../SensorView.ui" line="20"/> + <source>Sensors</source> + <translation>Sensoren</translation> + </message> + <message> + <location filename="../SensorView.ui" line="31"/> + <source>Realtime clock</source> + <translation>Echtzeituhr</translation> + </message> + <message> + <location filename="../SensorView.ui" line="37"/> + <source>Fixed time</source> + <translation>Feste Zeit</translation> + </message> + <message> + <location filename="../SensorView.ui" line="47"/> + <source>System time</source> + <translation>Systemzeit</translation> + </message> + <message> + <location filename="../SensorView.ui" line="60"/> + <source>Start time at</source> + <translation>Starte Zeit ab</translation> + </message> + <message> + <location filename="../SensorView.ui" line="70"/> + <source>Now</source> + <translation>Jetzt</translation> + </message> + <message> + <location filename="../SensorView.ui" line="97"/> + <source>MM/dd/yy hh:mm:ss AP</source> + <translation>dd/mm/yy hh:mm:ss</translation> + </message> + <message> + <location filename="../SensorView.ui" line="110"/> + <source>Light sensor</source> + <translation>Lichtsensor</translation> + </message> + <message> + <location filename="../SensorView.ui" line="116"/> + <source>Brightness</source> + <translation>Helligkeit</translation> + </message> + <message> + <location filename="../SensorView.ui" line="153"/> + <source>Tilt sensor</source> + <translation>Neigungssensor</translation> + </message> + <message> + <location filename="../SensorView.ui" line="161"/> + <location filename="../SensorView.ui" line="250"/> + <source>Set Y</source> + <translation>Setze Y</translation> + </message> + <message> + <location filename="../SensorView.ui" line="171"/> + <location filename="../SensorView.ui" line="260"/> + <source>Set X</source> + <translation>Setze X</translation> + </message> + <message> + <location filename="../SensorView.ui" line="242"/> + <source>Gyroscope</source> + <translation>Gyroskop</translation> + </message> + <message> + <location filename="../SensorView.ui" line="270"/> + <source>Sensitivity</source> + <translation>Empfindlichkeit</translation> + </message> +</context> +<context> + <name>SettingsView</name> + <message> + <location filename="../SettingsView.ui" line="20"/> + <source>Settings</source> + <translation>Einstellungen</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="45"/> + <source>Audio/Video</source> + <translation>Audio/Video</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="50"/> + <source>Interface</source> + <translation>Benutzeroberfläche</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="55"/> + <source>Emulation</source> + <translation>Emulation</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="65"/> + <source>Paths</source> + <translation>Verzeichnisse</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="90"/> + <source>Audio driver:</source> + <translation>Audio-Treiber:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="107"/> + <source>Audio buffer:</source> + <translation>Audio-Puffer:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="119"/> + <location filename="../SettingsView.ui" line="141"/> + <source>1536</source> + <translation>1536</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="126"/> + <source>512</source> + <translation>512</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="131"/> + <source>768</source> + <translation>768</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="136"/> + <source>1024</source> + <translation>1024</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="146"/> + <source>2048</source> + <translation>2048</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="151"/> + <source>3072</source> + <translation>3072</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="156"/> + <source>4096</source> + <translation>4096</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="164"/> + <source>samples</source> + <translation>Samples</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="173"/> + <source>Sample rate:</source> + <translation>Sample-Rate:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="185"/> + <location filename="../SettingsView.ui" line="202"/> + <source>44100</source> + <translation>44100</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="192"/> + <source>22050</source> + <translation>22050</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="197"/> + <source>32000</source> + <translation>32000</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="207"/> + <source>48000</source> + <translation>48000</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="215"/> + <source>Hz</source> + <translation>Hz</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="224"/> + <source>Volume:</source> + <translation>Lautstärke:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="255"/> + <source>Mute</source> + <translation>Stummschalten</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="271"/> + <source>Display driver:</source> + <translation>Anzeige-Treiber:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="288"/> + <source>Frameskip:</source> + <translation>Frameskip:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="297"/> + <source>Skip every</source> + <translation>Alle</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="307"/> + <location filename="../SettingsView.ui" line="532"/> + <source>frames</source> + <translation>Bilder</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="316"/> + <source>FPS target:</source> + <translation>Bildwiederholrate:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="338"/> + <source>frames per second</source> + <translation>Bilder pro Sekunde</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="354"/> + <source>Sync:</source> + <translation>Synchronisierung:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="363"/> + <source>Video</source> + <translation>Video</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="370"/> + <source>Audio</source> + <translation>Audio</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="379"/> + <source>Lock aspect ratio</source> + <translation>Seitenverhältnis sperren</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="421"/> + <source>Library:</source> + <translation>Bibliothek:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="428"/> + <source>Show when no game open</source> + <translation>Anzeigen, wenn kein Spiel geöffnet ist</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="445"/> + <source>Clear cache</source> + <translation>Cache leeren</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="459"/> + <source>Fast forward speed:</source> + <translation>Vorlauf-Geschwindigkeit:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="656"/> + <source>Rewind affects save data</source> + <translation>Rücklauf beeinflusst +Speicherdaten</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="689"/> + <location filename="../SettingsView.ui" line="727"/> + <location filename="../SettingsView.ui" line="762"/> + <location filename="../SettingsView.ui" line="803"/> + <location filename="../SettingsView.ui" line="851"/> + <location filename="../SettingsView.ui" line="899"/> + <location filename="../SettingsView.ui" line="947"/> + <source>Browse</source> + <translation>Durchsuchen</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="698"/> + <source>Use BIOS file if found</source> + <translation>BIOS-Datei verwenden, wenn vorhanden</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="708"/> + <source>Skip BIOS intro</source> + <translation>BIOS-Intro überspringen</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="471"/> + <source>×</source> + <translation>×</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="490"/> + <source>Unbounded</source> + <translation>unbegrenzt</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="404"/> + <source>Suspend screensaver</source> + <translation>Bildschirmschoner deaktivieren</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="60"/> + <source>BIOS</source> + <translation>BIOS</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="414"/> + <source>Pause when inactive</source> + <translation>Pause, wenn inaktiv</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="556"/> + <source>Run all</source> + <translation>Alle ausführen</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="561"/> + <source>Remove known</source> + <translation>Bekannte entfernen</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="566"/> + <source>Detect and remove</source> + <translation>Erkennen und entfernen</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="397"/> + <source>Allow opposing input directions</source> + <translation>Gegensätzliche Eingaberichtungen erlauben</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="588"/> + <location filename="../SettingsView.ui" line="625"/> + <source>Screenshot</source> + <translation>Screenshot</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="598"/> + <location filename="../SettingsView.ui" line="635"/> + <source>Save data</source> + <translation>Speicherdaten</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="608"/> + <location filename="../SettingsView.ui" line="642"/> + <source>Cheat codes</source> + <translation>Cheat-Codes</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="509"/> + <source>Enable rewind</source> + <translation>Rücklauf aktivieren</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="386"/> + <source>Bilinear filtering</source> + <translation>Bilineare Filterung</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="516"/> + <source>Rewind history:</source> + <translation>Rücklauf-Verlauf:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="548"/> + <source>Idle loops:</source> + <translation>Leerlaufprozesse:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="581"/> + <source>Savestate extra data:</source> + <translation>Zusätzliche Savestate-Daten:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="618"/> + <source>Load extra data:</source> + <translation>Lade zusätzliche Daten:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="670"/> + <source>GB BIOS file:</source> + <translation>BIOS-Datei für GB:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="736"/> + <source>GBA BIOS file:</source> + <translation>BIOS-Datei für GBA:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="743"/> + <source>GBC BIOS file:</source> + <translation>BIOS-Datei für GBC:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="778"/> + <source>Save games</source> + <translation>Spielstände</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="812"/> + <location filename="../SettingsView.ui" line="860"/> + <location filename="../SettingsView.ui" line="908"/> + <location filename="../SettingsView.ui" line="956"/> + <source>Same directory as the ROM</source> + <translation>Gleiches Verzeichnis wie ROM</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="826"/> + <source>Save states</source> + <translation>Savestates</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="874"/> + <source>Screenshots</source> + <translation>Screenshots</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="922"/> + <source>Patches</source> + <translation>Patches</translation> + </message> +</context> +<context> + <name>ShaderSelector</name> + <message> + <location filename="../ShaderSelector.ui" line="14"/> + <source>Shaders</source> + <translation>Shader</translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="28"/> + <source>Active Shader:</source> + <translation>Aktiver Shader:</translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="35"/> + <source>Name</source> + <translation>Name</translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="45"/> + <source>Author</source> + <translation>Autor</translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="62"/> + <source>Description</source> + <translation>Beschreibung</translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="88"/> + <source>Unload Shader</source> + <translation>Shader entladen</translation> + </message> + <message> + <location filename="../ShaderSelector.ui" line="95"/> + <source>Load New Shader</source> + <translation>Neuen Shader laden</translation> + </message> +</context> +<context> + <name>ShortcutView</name> + <message> + <location filename="../ShortcutView.ui" line="14"/> + <source>Edit Shortcuts</source> + <translation>Tastenkürzel bearbeiten</translation> + </message> + <message> + <location filename="../ShortcutView.ui" line="29"/> + <source>Keyboard</source> + <translation>Tastatur</translation> + </message> + <message> + <location filename="../ShortcutView.ui" line="39"/> + <source>Gamepad</source> + <translation>Gamepad</translation> + </message> + <message> + <location filename="../ShortcutView.ui" line="46"/> + <source>Clear</source> + <translation>Löschen</translation> + </message> +</context> +<context> + <name>TileView</name> + <message> + <location filename="../TileView.ui" line="14"/> + <source>Tiles</source> + <translation>Tiles</translation> + </message> + <message> + <location filename="../TileView.ui" line="20"/> + <source>256 colors</source> + <translation>256 Farben</translation> + </message> + <message> + <location filename="../TileView.ui" line="70"/> + <source>×</source> + <translation>×</translation> + </message> + <message> + <location filename="../TileView.ui" line="83"/> + <source>Magnification</source> + <translation>Vergrößerung</translation> + </message> +</context> +<context> + <name>VideoView</name> + <message> + <location filename="../VideoView.ui" line="20"/> + <source>Record Video</source> + <translation>Video aufzeichen</translation> + </message> + <message> + <location filename="../VideoView.ui" line="40"/> + <source>Start</source> + <translation>Start</translation> + </message> + <message> + <location filename="../VideoView.ui" line="56"/> + <source>Stop</source> + <translation>Stop</translation> + </message> + <message> + <location filename="../VideoView.ui" line="69"/> + <source>Select File</source> + <translation>Datei wählen</translation> + </message> + <message> + <location filename="../VideoView.ui" line="101"/> + <source>Presets</source> + <translation>Vorgaben</translation> + </message> + <message> + <location filename="../VideoView.ui" line="109"/> + <source>High Quality</source> + <translation>Hohe Qualität</translation> + </message> + <message> + <location filename="../VideoView.ui" line="119"/> + <source>YouTube</source> + <translation>YouTube</translation> + </message> + <message> + <location filename="../VideoView.ui" line="129"/> + <location filename="../VideoView.ui" line="237"/> + <source>WebM</source> + <translation>WebM</translation> + </message> + <message> + <location filename="../VideoView.ui" line="139"/> + <source>Lossless</source> + <translation>Verlustfrei</translation> + </message> + <message> + <location filename="../VideoView.ui" line="156"/> + <source>1080p</source> + <translation>1080p</translation> + </message> + <message> + <location filename="../VideoView.ui" line="166"/> + <source>720p</source> + <translation>720p</translation> + </message> + <message> + <location filename="../VideoView.ui" line="176"/> + <source>480p</source> + <translation>480p</translation> + </message> + <message> + <location filename="../VideoView.ui" line="189"/> + <source>Native</source> + <translation>Nativ</translation> + </message> + <message> + <location filename="../VideoView.ui" line="222"/> + <source>Format</source> + <translation>Format</translation> + </message> + <message> + <location filename="../VideoView.ui" line="232"/> + <source>MKV</source> + <translation>MKV</translation> + </message> + <message> + <location filename="../VideoView.ui" line="242"/> + <source>AVI</source> + <translation>AVI</translation> + </message> + <message> + <location filename="../VideoView.ui" line="247"/> + <source>MP4</source> + <translation>MP4</translation> + </message> + <message> + <location filename="../VideoView.ui" line="259"/> + <source>PNG</source> + <translation>PNG</translation> + </message> + <message> + <location filename="../VideoView.ui" line="264"/> + <source>h.264</source> + <translation>h.264</translation> + </message> + <message> + <location filename="../VideoView.ui" line="269"/> + <source>VP8</source> + <translation>VP8</translation> + </message> + <message> + <location filename="../VideoView.ui" line="274"/> + <source>Xvid</source> + <translation>Xvid</translation> + </message> + <message> + <location filename="../VideoView.ui" line="279"/> + <source>FFV1</source> + <translation>FFV1</translation> + </message> + <message> + <location filename="../VideoView.ui" line="291"/> + <source>FLAC</source> + <translation>FLAC</translation> + </message> + <message> + <location filename="../VideoView.ui" line="296"/> + <source>Opus</source> + <translation>Opus</translation> + </message> + <message> + <location filename="../VideoView.ui" line="301"/> + <source>Vorbis</source> + <translation>Vorbis</translation> + </message> + <message> + <location filename="../VideoView.ui" line="306"/> + <source>MP3</source> + <translation>MP3</translation> + </message> + <message> + <location filename="../VideoView.ui" line="311"/> + <source>AAC</source> + <translation>AAC</translation> + </message> + <message> + <location filename="../VideoView.ui" line="316"/> + <source>Uncompressed</source> + <translation>Unkomprimiert</translation> + </message> + <message> + <location filename="../VideoView.ui" line="327"/> + <source> Bitrate (kbps)</source> + <translation> Bitrate (kbps)</translation> + </message> + <message> + <location filename="../VideoView.ui" line="333"/> + <source>VBR </source> + <translation>VBR </translation> + </message> + <message> + <location filename="../VideoView.ui" line="381"/> + <source>ABR</source> + <translation>ABR</translation> + </message> + <message> + <location filename="../VideoView.ui" line="397"/> + <source>Dimensions</source> + <translation>Abmessungen</translation> + </message> + <message> + <location filename="../VideoView.ui" line="403"/> + <source>:</source> + <translation>:</translation> + </message> + <message> + <location filename="../VideoView.ui" line="413"/> + <source>×</source> + <translation>×</translation> + </message> + <message> + <location filename="../VideoView.ui" line="463"/> + <source>Lock aspect ratio</source> + <translation>Seitenverhältnis sperren</translation> + </message> + <message> + <location filename="../VideoView.ui" line="478"/> + <source>Show advanced</source> + <translation>Erweiterte Optionen anzeigen</translation> + </message> +</context> +</TS>
@@ -6,53 +6,54 @@ <name>AboutScreen</name>
<message> <location filename="../AboutScreen.ui" line="14"/> <source>About</source> - <translation type="unfinished"></translation> + <translation>Acerca de</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> + <translation><a href="http://mgba.io/">Sitio web</a> • <a href="https://forums.mgba.io/">Foros / Soporte</a> • <a href="https://patreon.com/mgba">Donar</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Código fuente</a></translation> </message> <message> <location filename="../AboutScreen.ui" line="58"/> <source>{projectName}</source> - <translation type="unfinished"></translation> + <translation>{projectName}</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> + <translation>{projectName} desea agradecer a los siguientes mecenas de Patreon:</translation> </message> <message> <location filename="../AboutScreen.ui" line="86"/> <source>© 2013 – 2016 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> + <translation>© 2013 - 2016 Jeffrey Pfau, licenciado bajo la Licencia Pública de Mozilla, versión 2.0 +Game Boy Advance es una marca registrada de Nintendo Co., Ltd.</translation> </message> <message> <location filename="../AboutScreen.ui" line="190"/> <source>{patrons}</source> - <translation type="unfinished"></translation> + <translation>{patrons}</translation> </message> <message> <location filename="../AboutScreen.ui" line="106"/> <source>{projectVersion}</source> - <translation type="unfinished"></translation> + <translation>{projectVersion}</translation> </message> <message> <location filename="../AboutScreen.ui" line="155"/> <source>{logo}</source> - <translation type="unfinished"></translation> + <translation>{logo}</translation> </message> <message> <location filename="../AboutScreen.ui" line="177"/> <source>{projectName} is an open-source Game Boy Advance emulator</source> - <translation type="unfinished"></translation> + <translation>{projectName} es un emulador de Game Boy Advance de código abierto</translation> </message> <message> <location filename="../AboutScreen.ui" line="41"/> <source>Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt></source> - <translation type="unfinished"></translation> + <translation>Rama Git: <tt>{gitBranch}</tt><br/>Revisión: <tt>{gitCommit}</tt></translation> </message> </context> <context>@@ -60,12 +61,12 @@ <name>ArchiveInspector</name>
<message> <location filename="../ArchiveInspector.ui" line="14"/> <source>Open in archive...</source> - <translation type="unfinished"></translation> + <translation>Abrir dentro de archivo ...</translation> </message> <message> <location filename="../ArchiveInspector.ui" line="20"/> <source>Loading...</source> - <translation type="unfinished"></translation> + <translation>Cargando...</translation> </message> </context> <context>@@ -73,49 +74,49 @@ <name>AssetTile</name>
<message> <location filename="../AssetTile.ui" line="12"/> <source>AssetTile</source> - <translation type="unfinished"></translation> + <translation>AssetTile</translation> </message> <message> <location filename="../AssetTile.ui" line="33"/> <source>Tile #</source> - <translation type="unfinished"></translation> + <translation>Tile Nº</translation> </message> <message> <location filename="../AssetTile.ui" line="40"/> <source>0</source> - <translation type="unfinished"></translation> + <translation>0</translation> </message> <message> <location filename="../AssetTile.ui" line="54"/> <source>Address</source> - <translation type="unfinished"></translation> + <translation>Dirección</translation> </message> <message> <location filename="../AssetTile.ui" line="61"/> <source>0x06000000</source> - <translation type="unfinished"></translation> + <translation>0x06000000</translation> </message> <message> <location filename="../AssetTile.ui" line="100"/> <source>Red</source> - <translation type="unfinished"></translation> + <translation>Rojo</translation> </message> <message> <location filename="../AssetTile.ui" line="107"/> <source>Green</source> - <translation type="unfinished"></translation> + <translation>Verde</translation> </message> <message> <location filename="../AssetTile.ui" line="114"/> <source>Blue</source> - <translation type="unfinished"></translation> + <translation>Azul</translation> </message> <message> <location filename="../AssetTile.ui" line="128"/> <location filename="../AssetTile.ui" line="135"/> <location filename="../AssetTile.ui" line="142"/> <source>0x00 (00)</source> - <translation type="unfinished"></translation> + <translation>0x00 (00)</translation> </message> </context> <context>@@ -123,32 +124,32 @@ <name>CheatsView</name>
<message> <location filename="../CheatsView.ui" line="14"/> <source>Cheats</source> - <translation type="unfinished"></translation> + <translation>Trucos</translation> </message> <message> <location filename="../CheatsView.ui" line="20"/> <source>Remove</source> - <translation type="unfinished"></translation> + <translation>Eliminar</translation> </message> <message> <location filename="../CheatsView.ui" line="34"/> <source>Save</source> - <translation type="unfinished"></translation> + <translation>Guardar</translation> </message> <message> <location filename="../CheatsView.ui" line="41"/> <source>Load</source> - <translation type="unfinished"></translation> + <translation>Cargar</translation> </message> <message> <location filename="../CheatsView.ui" line="69"/> <source>Add New Set</source> - <translation type="unfinished"></translation> + <translation>Agregar nuevo conjunto</translation> </message> <message> <location filename="../CheatsView.ui" line="76"/> <source>Add</source> - <translation type="unfinished"></translation> + <translation>Agregar</translation> </message> </context> <context>@@ -156,17 +157,17 @@ <name>DebuggerConsole</name>
<message> <location filename="../DebuggerConsole.ui" line="14"/> <source>Debugger</source> - <translation type="unfinished"></translation> + <translation>Depurador</translation> </message> <message> <location filename="../DebuggerConsole.ui" line="25"/> <source>Enter command (try `help` for more info)</source> - <translation type="unfinished"></translation> + <translation>Ingresa un comando (prueba con 'help' para más información)</translation> </message> <message> <location filename="../DebuggerConsole.ui" line="32"/> <source>Break</source> - <translation type="unfinished"></translation> + <translation>Entrar en depuración</translation> </message> </context> <context>@@ -174,37 +175,37 @@ <name>GIFView</name>
<message> <location filename="../GIFView.ui" line="14"/> <source>Record GIF</source> - <translation type="unfinished"></translation> + <translation>Grabar GIF</translation> </message> <message> <location filename="../GIFView.ui" line="34"/> <source>Start</source> - <translation type="unfinished"></translation> + <translation>Iniciar</translation> </message> <message> <location filename="../GIFView.ui" line="50"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Detener</translation> </message> <message> <location filename="../GIFView.ui" line="63"/> <source>Select File</source> - <translation type="unfinished"></translation> + <translation>Elegir archivo</translation> </message> <message> <location filename="../GIFView.ui" line="101"/> <source>Frameskip</source> - <translation type="unfinished"></translation> + <translation>Salto de cuadros</translation> </message> <message> <location filename="../GIFView.ui" line="115"/> <source>Frame delay (ms)</source> - <translation type="unfinished"></translation> + <translation>Retraso entre cuadros (ms)</translation> </message> <message> <location filename="../GIFView.ui" line="122"/> <source>Automatic</source> - <translation type="unfinished"></translation> + <translation>Automático</translation> </message> </context> <context>@@ -212,92 +213,92 @@ <name>IOViewer</name>
<message> <location filename="../IOViewer.ui" line="14"/> <source>I/O Viewer</source> - <translation type="unfinished"></translation> + <translation>Visor de E/S</translation> </message> <message> <location filename="../IOViewer.ui" line="26"/> <source>0x0000</source> - <translation type="unfinished"></translation> + <translation>0x0000</translation> </message> <message> <location filename="../IOViewer.ui" line="58"/> <source>2</source> - <translation type="unfinished"></translation> + <translation>2</translation> </message> <message> <location filename="../IOViewer.ui" line="82"/> <source>5</source> - <translation type="unfinished"></translation> + <translation>5</translation> </message> <message> <location filename="../IOViewer.ui" line="100"/> <source>4</source> - <translation type="unfinished"></translation> + <translation>4</translation> </message> <message> <location filename="../IOViewer.ui" line="118"/> <source>7</source> - <translation type="unfinished"></translation> + <translation>7</translation> </message> <message> <location filename="../IOViewer.ui" line="136"/> <source>0</source> - <translation type="unfinished"></translation> + <translation>0</translation> </message> <message> <location filename="../IOViewer.ui" line="157"/> <source>9</source> - <translation type="unfinished"></translation> + <translation>9</translation> </message> <message> <location filename="../IOViewer.ui" line="178"/> <source>1</source> - <translation type="unfinished"></translation> + <translation>1</translation> </message> <message> <location filename="../IOViewer.ui" line="196"/> <source>3</source> - <translation type="unfinished"></translation> + <translation>3</translation> </message> <message> <location filename="../IOViewer.ui" line="217"/> <source>8</source> - <translation type="unfinished"></translation> + <translation>8</translation> </message> <message> <location filename="../IOViewer.ui" line="241"/> <source>C</source> - <translation type="unfinished"></translation> + <translation>C</translation> </message> <message> <location filename="../IOViewer.ui" line="259"/> <source>E</source> - <translation type="unfinished"></translation> + <translation>E</translation> </message> <message> <location filename="../IOViewer.ui" line="283"/> <source>6</source> - <translation type="unfinished"></translation> + <translation>6</translation> </message> <message> <location filename="../IOViewer.ui" line="310"/> <source>D</source> - <translation type="unfinished"></translation> + <translation>D</translation> </message> <message> <location filename="../IOViewer.ui" line="328"/> <source>F</source> - <translation type="unfinished"></translation> + <translation>F</translation> </message> <message> <location filename="../IOViewer.ui" line="346"/> <source>A</source> - <translation type="unfinished"></translation> + <translation>A</translation> </message> <message> <location filename="../IOViewer.ui" line="364"/> <source>B</source> - <translation type="unfinished"></translation> + <translation>B</translation> </message> </context> <context>@@ -305,7 +306,7 @@ <name>LibraryView</name>
<message> <location filename="../LibraryView.ui" line="14"/> <source>Library</source> - <translation type="unfinished"></translation> + <translation>Biblioteca</translation> </message> </context> <context>@@ -314,7 +315,7 @@ <message>
<location filename="../LoadSaveState.ui" line="14"/> <location filename="../LoadSaveState.ui" line="88"/> <source>%1 State</source> - <translation type="unfinished"></translation> + <translation>%1 captura de estado</translation> </message> <message> <location filename="../LoadSaveState.ui" line="41"/>@@ -327,52 +328,52 @@ <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> + <translation>Sin captura</translation> </message> <message> <location filename="../LoadSaveState.ui" line="50"/> <source>1</source> - <translation type="unfinished"></translation> + <translation>1</translation> </message> <message> <location filename="../LoadSaveState.ui" line="72"/> <source>2</source> - <translation type="unfinished"></translation> + <translation>2</translation> </message> <message> <location filename="../LoadSaveState.ui" line="116"/> <source>3</source> - <translation type="unfinished"></translation> + <translation>3</translation> </message> <message> <location filename="../LoadSaveState.ui" line="138"/> <source>4</source> - <translation type="unfinished"></translation> + <translation>4</translation> </message> <message> <location filename="../LoadSaveState.ui" line="160"/> <source>5</source> - <translation type="unfinished"></translation> + <translation>5</translation> </message> <message> <location filename="../LoadSaveState.ui" line="182"/> <source>6</source> - <translation type="unfinished"></translation> + <translation>6</translation> </message> <message> <location filename="../LoadSaveState.ui" line="204"/> <source>7</source> - <translation type="unfinished"></translation> + <translation>7</translation> </message> <message> <location filename="../LoadSaveState.ui" line="226"/> <source>8</source> - <translation type="unfinished"></translation> + <translation>8</translation> </message> <message> <location filename="../LoadSaveState.ui" line="248"/> <source>9</source> - <translation type="unfinished"></translation> + <translation>9</translation> </message> </context> <context>@@ -380,57 +381,57 @@ <name>LogView</name>
<message> <location filename="../LogView.ui" line="14"/> <source>Logs</source> - <translation type="unfinished"></translation> + <translation>Registros</translation> </message> <message> <location filename="../LogView.ui" line="22"/> <source>Enabled Levels</source> - <translation type="unfinished"></translation> + <translation>Niveles habilitados</translation> </message> <message> <location filename="../LogView.ui" line="28"/> <source>Debug</source> - <translation type="unfinished"></translation> + <translation>Depuración</translation> </message> <message> <location filename="../LogView.ui" line="38"/> <source>Stub</source> - <translation type="unfinished"></translation> + <translation>Auxiliar</translation> </message> <message> <location filename="../LogView.ui" line="48"/> <source>Info</source> - <translation type="unfinished"></translation> + <translation>Información</translation> </message> <message> <location filename="../LogView.ui" line="58"/> <source>Warning</source> - <translation type="unfinished"></translation> + <translation>Advertencia</translation> </message> <message> <location filename="../LogView.ui" line="68"/> <source>Error</source> - <translation type="unfinished"></translation> + <translation>Error</translation> </message> <message> <location filename="../LogView.ui" line="78"/> <source>Fatal</source> - <translation type="unfinished"></translation> + <translation>Fatal</translation> </message> <message> <location filename="../LogView.ui" line="95"/> <source>Game Error</source> - <translation type="unfinished"></translation> + <translation>Error del juego</translation> </message> <message> <location filename="../LogView.ui" line="121"/> <source>Clear</source> - <translation type="unfinished"></translation> + <translation>Limpiar</translation> </message> <message> <location filename="../LogView.ui" line="130"/> <source>Max Lines</source> - <translation type="unfinished"></translation> + <translation>Máximo de líneas</translation> </message> </context> <context>@@ -438,77 +439,77 @@ <name>MemoryView</name>
<message> <location filename="../MemoryView.ui" line="14"/> <source>Memory</source> - <translation type="unfinished"></translation> + <translation>Memoría</translation> </message> <message> <location filename="../MemoryView.ui" line="38"/> <source>Inspect Address:</source> - <translation type="unfinished"></translation> + <translation>Inspeccionar dirección:</translation> </message> <message> <location filename="../MemoryView.ui" line="61"/> <source>0x</source> - <translation type="unfinished"></translation> + <translation>0x</translation> </message> <message> <location filename="../MemoryView.ui" line="81"/> <source>Set Alignment:</source> - <translation type="unfinished"></translation> + <translation>Alinear en:</translation> </message> <message> <location filename="../MemoryView.ui" line="101"/> <source>1 Byte</source> - <translation type="unfinished"></translation> + <translation>1 byte</translation> </message> <message> <location filename="../MemoryView.ui" line="124"/> <source>2 Bytes</source> - <translation type="unfinished"></translation> + <translation>2 bytes</translation> </message> <message> <location filename="../MemoryView.ui" line="144"/> <source>4 Bytes</source> - <translation type="unfinished"></translation> + <translation>4 bytes</translation> </message> <message> <location filename="../MemoryView.ui" line="199"/> <source>Signed Integer:</source> - <translation type="unfinished"></translation> + <translation>Entero con signo:</translation> </message> <message> <location filename="../MemoryView.ui" line="217"/> <source>String:</source> - <translation type="unfinished"></translation> + <translation>Cadena:</translation> </message> <message> <location filename="../MemoryView.ui" line="231"/> <source>Load TBL</source> - <translation type="unfinished"></translation> + <translation>Cargar TBL</translation> </message> <message> <location filename="../MemoryView.ui" line="244"/> <source>Copy Selection</source> - <translation type="unfinished"></translation> + <translation>Copiar selección</translation> </message> <message> <location filename="../MemoryView.ui" line="251"/> <source>Paste</source> - <translation type="unfinished"></translation> + <translation>Pegar</translation> </message> <message> <location filename="../MemoryView.ui" line="271"/> <source>Save Selection</source> - <translation type="unfinished"></translation> + <translation>Guardar selección</translation> </message> <message> <location filename="../MemoryView.ui" line="278"/> <source>Load</source> - <translation type="unfinished"></translation> + <translation>Cargar</translation> </message> <message> <location filename="../MemoryView.ui" line="181"/> <source>Unsigned Integer:</source> - <translation type="unfinished"></translation> + <translation>Entero sin signo:</translation> </message> </context> <context>@@ -516,140 +517,145 @@ <name>ObjView</name>
<message> <location filename="../ObjView.ui" line="14"/> <source>Sprites</source> - <translation type="unfinished"></translation> + <translation>Sprites</translation> </message> <message> <location filename="../ObjView.ui" line="56"/> - <location filename="../ObjView.ui" line="499"/> + <location filename="../ObjView.ui" line="506"/> <source>×</source> - <translation type="unfinished"></translation> + <translation>×</translation> </message> <message> <location filename="../ObjView.ui" line="69"/> <source>Magnification</source> + <translation>Magnificación</translation> + </message> + <message> + <location filename="../ObjView.ui" line="76"/> + <source>Export</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ObjView.ui" line="78"/> + <location filename="../ObjView.ui" line="85"/> <source>Attributes</source> - <translation type="unfinished"></translation> + <translation>Atributos</translation> </message> <message> - <location filename="../ObjView.ui" line="86"/> + <location filename="../ObjView.ui" line="93"/> <source>Transform</source> - <translation type="unfinished"></translation> + <translation>Transformación</translation> </message> <message> - <location filename="../ObjView.ui" line="106"/> + <location filename="../ObjView.ui" line="113"/> <source>Off</source> - <translation type="unfinished"></translation> + <translation>No</translation> </message> <message> - <location filename="../ObjView.ui" line="117"/> + <location filename="../ObjView.ui" line="124"/> <source>Palette</source> - <translation type="unfinished"></translation> + <translation>Paleta</translation> </message> <message> - <location filename="../ObjView.ui" line="137"/> - <location filename="../ObjView.ui" line="367"/> - <location filename="../ObjView.ui" line="423"/> - <location filename="../ObjView.ui" line="449"/> + <location filename="../ObjView.ui" line="144"/> + <location filename="../ObjView.ui" line="374"/> + <location filename="../ObjView.ui" line="430"/> + <location filename="../ObjView.ui" line="456"/> <source>0</source> - <translation type="unfinished"></translation> + <translation>0</translation> </message> <message> - <location filename="../ObjView.ui" line="151"/> + <location filename="../ObjView.ui" line="158"/> <source>Double Size</source> - <translation type="unfinished"></translation> + <translation>Doble tamaño</translation> </message> <message> - <location filename="../ObjView.ui" line="177"/> - <location filename="../ObjView.ui" line="221"/> - <location filename="../ObjView.ui" line="234"/> - <location filename="../ObjView.ui" line="302"/> + <location filename="../ObjView.ui" line="184"/> + <location filename="../ObjView.ui" line="228"/> + <location filename="../ObjView.ui" line="241"/> + <location filename="../ObjView.ui" line="309"/> <source>Return, Ctrl+R</source> - <translation type="unfinished"></translation> + <translation>Volver, Ctrl+R</translation> </message> <message> - <location filename="../ObjView.ui" line="195"/> + <location filename="../ObjView.ui" line="202"/> <source>Flipped</source> - <translation type="unfinished"></translation> + <translation>Volteo</translation> </message> <message> - <location filename="../ObjView.ui" line="218"/> + <location filename="../ObjView.ui" line="225"/> <source>H</source> - <translation type="unfinished"></translation> + <translation>H</translation> </message> <message> - <location filename="../ObjView.ui" line="231"/> + <location filename="../ObjView.ui" line="238"/> <source>V</source> - <translation type="unfinished"></translation> + <translation>V</translation> </message> <message> - <location filename="../ObjView.ui" line="245"/> + <location filename="../ObjView.ui" line="252"/> <source>Mode</source> - <translation type="unfinished"></translation> + <translation>Modo</translation> </message> <message> - <location filename="../ObjView.ui" line="265"/> + <location filename="../ObjView.ui" line="272"/> <source>Normal</source> - <translation type="unfinished"></translation> + <translation>Normal</translation> </message> <message> - <location filename="../ObjView.ui" line="276"/> + <location filename="../ObjView.ui" line="283"/> <source>Mosaic</source> - <translation type="unfinished"></translation> + <translation>Mosaico</translation> </message> <message> - <location filename="../ObjView.ui" line="313"/> + <location filename="../ObjView.ui" line="320"/> <source>Enabled</source> - <translation type="unfinished"></translation> + <translation>Habilitado</translation> </message> <message> - <location filename="../ObjView.ui" line="347"/> + <location filename="../ObjView.ui" line="354"/> <source>Priority</source> - <translation type="unfinished"></translation> + <translation>Prioridad</translation> </message> <message> - <location filename="../ObjView.ui" line="382"/> + <location filename="../ObjView.ui" line="389"/> <source>Tile</source> - <translation type="unfinished"></translation> + <translation>Tile</translation> </message> <message> - <location filename="../ObjView.ui" line="389"/> + <location filename="../ObjView.ui" line="396"/> <source>Geometry</source> - <translation type="unfinished"></translation> + <translation>Geometría</translation> </message> <message> - <location filename="../ObjView.ui" line="397"/> + <location filename="../ObjView.ui" line="404"/> <source>Position</source> - <translation type="unfinished"></translation> + <translation>Posición</translation> </message> <message> - <location filename="../ObjView.ui" line="433"/> + <location filename="../ObjView.ui" line="440"/> <source>, </source> - <translation type="unfinished"></translation> + <translation>, </translation> </message> <message> - <location filename="../ObjView.ui" line="463"/> + <location filename="../ObjView.ui" line="470"/> <source>Dimensions</source> - <translation type="unfinished"></translation> + <translation>Dimensiones</translation> </message> <message> - <location filename="../ObjView.ui" line="489"/> - <location filename="../ObjView.ui" line="515"/> + <location filename="../ObjView.ui" line="496"/> + <location filename="../ObjView.ui" line="522"/> <source>8</source> - <translation type="unfinished"></translation> + <translation>8</translation> </message> <message> - <location filename="../ObjView.ui" line="545"/> + <location filename="../ObjView.ui" line="552"/> <source>Address</source> - <translation type="unfinished"></translation> + <translation>Dirección</translation> </message> <message> - <location filename="../ObjView.ui" line="552"/> + <location filename="../ObjView.ui" line="559"/> <source>0x07000000</source> - <translation type="unfinished"></translation> + <translation>0x07000000</translation> </message> </context> <context>@@ -657,12 +663,12 @@ <name>OverrideView</name>
<message> <location filename="../OverrideView.ui" line="20"/> <source>Game Overrides</source> - <translation type="unfinished"></translation> + <translation>Valores específicos por juego</translation> </message> <message> <location filename="../OverrideView.ui" line="30"/> <source>Game Boy Advance</source> - <translation type="unfinished"></translation> + <translation>Game Boy Advance</translation> </message> <message> <location filename="../OverrideView.ui" line="42"/>@@ -670,143 +676,143 @@ <location filename="../OverrideView.ui" line="121"/>
<location filename="../OverrideView.ui" line="248"/> <location filename="../OverrideView.ui" line="279"/> <source>Autodetect</source> - <translation type="unfinished"></translation> + <translation>Detección automática</translation> </message> <message> <location filename="../OverrideView.ui" line="55"/> <source>Realtime clock</source> - <translation type="unfinished"></translation> + <translation>Reloj de tiempo real</translation> </message> <message> <location filename="../OverrideView.ui" line="65"/> <source>Gyroscope</source> - <translation type="unfinished"></translation> + <translation>Giroscopio</translation> </message> <message> <location filename="../OverrideView.ui" line="75"/> <source>Tilt</source> - <translation type="unfinished"></translation> + <translation>Inclinación</translation> </message> <message> <location filename="../OverrideView.ui" line="85"/> <source>Light sensor</source> - <translation type="unfinished"></translation> + <translation>Sensor de luz</translation> </message> <message> <location filename="../OverrideView.ui" line="95"/> <source>Rumble</source> - <translation type="unfinished"></translation> + <translation>Vibración</translation> </message> <message> <location filename="../OverrideView.ui" line="113"/> <source>Save type</source> - <translation type="unfinished"></translation> + <translation>Tipo de guardado</translation> </message> <message> <location filename="../OverrideView.ui" line="126"/> <location filename="../OverrideView.ui" line="284"/> <source>None</source> - <translation type="unfinished"></translation> + <translation>Ninguno</translation> </message> <message> <location filename="../OverrideView.ui" line="131"/> <source>SRAM</source> - <translation type="unfinished"></translation> + <translation>SRAM</translation> </message> <message> <location filename="../OverrideView.ui" line="136"/> <source>Flash 512kb</source> - <translation type="unfinished"></translation> + <translation>Flash 512kb</translation> </message> <message> <location filename="../OverrideView.ui" line="141"/> <source>Flash 1Mb</source> - <translation type="unfinished"></translation> + <translation>Flash 1Mb</translation> </message> <message> <location filename="../OverrideView.ui" line="146"/> <source>EEPROM</source> - <translation type="unfinished"></translation> + <translation>EEPROM</translation> </message> <message> <location filename="../OverrideView.ui" line="154"/> <source>Idle loop</source> - <translation type="unfinished"></translation> + <translation>Bucle inactivo</translation> </message> <message> <location filename="../OverrideView.ui" line="195"/> <source>Game Boy Player features</source> - <translation type="unfinished"></translation> + <translation>Habilitar Game Boy Player</translation> </message> <message> <location filename="../OverrideView.ui" line="234"/> <source>Game Boy</source> - <translation type="unfinished"></translation> + <translation>Game Boy</translation> </message> <message> <location filename="../OverrideView.ui" line="240"/> <source>Game Boy model</source> - <translation type="unfinished"></translation> + <translation>Modelo de Game Boy</translation> </message> <message> <location filename="../OverrideView.ui" line="253"/> <source>Game Boy (DMG)</source> - <translation type="unfinished"></translation> + <translation>Game Boy (DMG)</translation> </message> <message> <location filename="../OverrideView.ui" line="258"/> <source>Game Boy Color (CGB)</source> - <translation type="unfinished"></translation> + <translation>Game Boy Color (CGB)</translation> </message> <message> <location filename="../OverrideView.ui" line="263"/> <source>Game Boy Advance (AGB)</source> - <translation type="unfinished"></translation> + <translation>Game Boy Advance (AGB)</translation> </message> <message> <location filename="../OverrideView.ui" line="271"/> <source>Memory bank controller</source> - <translation type="unfinished"></translation> + <translation>Controlador de banco de memoria</translation> </message> <message> <location filename="../OverrideView.ui" line="289"/> <source>MBC1</source> - <translation type="unfinished"></translation> + <translation>MBC1</translation> </message> <message> <location filename="../OverrideView.ui" line="294"/> <source>MBC2</source> - <translation type="unfinished"></translation> + <translation>MBC2</translation> </message> <message> <location filename="../OverrideView.ui" line="299"/> <source>MBC3</source> - <translation type="unfinished"></translation> + <translation>MBC3</translation> </message> <message> <location filename="../OverrideView.ui" line="304"/> <source>MBC3 + RTC</source> - <translation type="unfinished"></translation> + <translation>MBC3 + Reloj</translation> </message> <message> <location filename="../OverrideView.ui" line="309"/> <source>MBC5</source> - <translation type="unfinished"></translation> + <translation>MBC5</translation> </message> <message> <location filename="../OverrideView.ui" line="314"/> <source>MBC5 + Rumble</source> - <translation type="unfinished"></translation> + <translation>MBC5 + Vibración</translation> </message> <message> <location filename="../OverrideView.ui" line="319"/> <source>MBC7</source> - <translation type="unfinished"></translation> + <translation>MBC7</translation> </message> <message> <location filename="../OverrideView.ui" line="324"/> <source>HuC-3</source> - <translation type="unfinished"></translation> + <translation>HuC-3</translation> </message> </context> <context>@@ -814,84 +820,84 @@ <name>PaletteView</name>
<message> <location filename="../PaletteView.ui" line="14"/> <source>Palette</source> - <translation type="unfinished"></translation> + <translation>Paleta</translation> </message> <message> <location filename="../PaletteView.ui" line="44"/> <source>Background</source> - <translation type="unfinished"></translation> + <translation>Fondo (BG)</translation> </message> <message> <location filename="../PaletteView.ui" line="94"/> <source>Objects</source> - <translation type="unfinished"></translation> + <translation>Objetos (OBJ)</translation> </message> <message> <location filename="../PaletteView.ui" line="153"/> <source>Selection</source> - <translation type="unfinished"></translation> + <translation>Selección</translation> </message> <message> <location filename="../PaletteView.ui" line="184"/> <source>Red</source> - <translation type="unfinished"></translation> + <translation>Rojo</translation> </message> <message> <location filename="../PaletteView.ui" line="191"/> <source>Green</source> - <translation type="unfinished"></translation> + <translation>Verde</translation> </message> <message> <location filename="../PaletteView.ui" line="198"/> <source>Blue</source> - <translation type="unfinished"></translation> + <translation>Azul</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> + <translation>0x00 (00)</translation> </message> <message> <location filename="../PaletteView.ui" line="244"/> <source>16-bit value</source> - <translation type="unfinished"></translation> + <translation>Valor en 16 bits</translation> </message> <message> <location filename="../PaletteView.ui" line="251"/> <source>Hex code</source> - <translation type="unfinished"></translation> + <translation>Código hexadecimal</translation> </message> <message> <location filename="../PaletteView.ui" line="258"/> <source>Palette index</source> - <translation type="unfinished"></translation> + <translation>Índice en paleta</translation> </message> <message> <location filename="../PaletteView.ui" line="272"/> <source>0x0000</source> - <translation type="unfinished"></translation> + <translation>0x0000</translation> </message> <message> <location filename="../PaletteView.ui" line="282"/> <source>#000000</source> - <translation type="unfinished"></translation> + <translation>#000000</translation> </message> <message> <location filename="../PaletteView.ui" line="292"/> <source>000</source> - <translation type="unfinished"></translation> + <translation>000</translation> </message> <message> <location filename="../PaletteView.ui" line="322"/> <source>Export BG</source> - <translation type="unfinished"></translation> + <translation>Exportar BG</translation> </message> <message> <location filename="../PaletteView.ui" line="342"/> <source>Export OBJ</source> - <translation type="unfinished"></translation> + <translation>Exportar OBJ</translation> </message> </context> <context>@@ -899,14 +905,14 @@ <name>QGBA::AssetTile</name>
<message> <location filename="../AssetTile.cpp" line="107"/> <source>%0%1%2</source> - <translation type="unfinished"></translation> + <translation>%0%1%2</translation> </message> <message> <location filename="../AssetTile.cpp" line="136"/> <location filename="../AssetTile.cpp" line="137"/> <location filename="../AssetTile.cpp" line="138"/> <source>0x%0 (%1)</source> - <translation type="unfinished"></translation> + <translation>0x%0 (%1)</translation> </message> </context> <context>@@ -914,21 +920,42 @@ <name>QGBA::CheatsModel</name>
<message> <location filename="../CheatsModel.cpp" line="54"/> <source>(untitled)</source> - <translation type="unfinished"></translation> + <translation>(sin título)</translation> </message> <message> <location filename="../CheatsModel.cpp" line="209"/> <source>Failed to open cheats file: %1</source> - <translation type="unfinished"></translation> + <translation>Ocurrió un error al cargar el archivo de trucos: %1</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>Agregar GameShark</translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="55"/> + <source>Add Pro Action Replay</source> + <translation>Agregar Pro Action Replay</translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="61"/> + <source>Add CodeBreaker</source> + <translation>Agregar CodeBreaker</translation> + </message> + <message> + <location filename="../CheatsView.cpp" line="80"/> + <source>Add GameGenie</source> + <translation>Agregar GameGenie</translation> + </message> + <message> <location filename="../CheatsView.cpp" line="112"/> <location filename="../CheatsView.cpp" line="119"/> <source>Select cheats file</source> - <translation type="unfinished"></translation> + <translation>Elegir archivo de trucos</translation> </message> </context> <context>@@ -936,22 +963,22 @@ <name>QGBA::GBAKeyEditor</name>
<message> <location filename="../GBAKeyEditor.cpp" line="68"/> <source>Clear Button</source> - <translation type="unfinished"></translation> + <translation>Limpiar botones</translation> </message> <message> <location filename="../GBAKeyEditor.cpp" line="80"/> <source>Clear Analog</source> - <translation type="unfinished"></translation> + <translation>Limpiar análogos</translation> </message> <message> <location filename="../GBAKeyEditor.cpp" line="91"/> <source>Refresh</source> - <translation type="unfinished"></translation> + <translation>Actualizar</translation> </message> <message> <location filename="../GBAKeyEditor.cpp" line="101"/> <source>Set all</source> - <translation type="unfinished"></translation> + <translation>Configurar todo</translation> </message> </context> <context>@@ -959,42 +986,42 @@ <name>QGBA::GDBWindow</name>
<message> <location filename="../GDBWindow.cpp" line="28"/> <source>Server settings</source> - <translation type="unfinished"></translation> + <translation>Ajustes del servidor</translation> </message> <message> <location filename="../GDBWindow.cpp" line="34"/> <source>Local port</source> - <translation type="unfinished"></translation> + <translation>Puerto local</translation> </message> <message> <location filename="../GDBWindow.cpp" line="36"/> <source>Bind address</source> - <translation type="unfinished"></translation> + <translation>Dirección de enlace</translation> </message> <message> <location filename="../GDBWindow.cpp" line="55"/> <source>Break</source> - <translation type="unfinished"></translation> + <translation>Entrar en depuración</translation> </message> <message> <location filename="../GDBWindow.cpp" line="104"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Detener</translation> </message> <message> <location filename="../GDBWindow.cpp" line="114"/> <source>Start</source> - <translation type="unfinished"></translation> + <translation>Iniciar</translation> </message> <message> <location filename="../GDBWindow.cpp" line="122"/> <source>Crash</source> - <translation type="unfinished"></translation> + <translation>Error</translation> </message> <message> <location filename="../GDBWindow.cpp" line="122"/> <source>Could not start GDB server</source> - <translation type="unfinished"></translation> + <translation>No se pudo iniciar el servidor GDB</translation> </message> </context> <context>@@ -1002,17 +1029,17 @@ <name>QGBA::GIFView</name>
<message> <location filename="../GIFView.cpp" line="45"/> <source>Failed to open output GIF file: %1</source> - <translation type="unfinished"></translation> + <translation>Error al abrir el archivo de salida GIF: %1</translation> </message> <message> <location filename="../GIFView.cpp" line="63"/> <source>Select output file</source> - <translation type="unfinished"></translation> + <translation>Elegir archivo de salida</translation> </message> <message> <location filename="../GIFView.cpp" line="63"/> <source>Graphics Interchange Format (*.gif)</source> - <translation type="unfinished"></translation> + <translation>Formato de intercambio de gráficos (*.gif)</translation> </message> </context> <context>@@ -1021,27 +1048,27 @@ <message>
<location filename="../GameController.cpp" line="397"/> <location filename="../GameController.cpp" line="572"/> <source>Failed to open game file: %1</source> - <translation type="unfinished"></translation> + <translation>Error al abrir el archivo del juego: %1</translation> </message> <message> <location filename="../GameController.cpp" line="544"/> <source>Failed to open save file: %1</source> - <translation type="unfinished"></translation> + <translation>Error al abrir el archivo de guardado: %1</translation> </message> <message> <location filename="../GameController.cpp" line="601"/> <source>Failed to open snapshot file for reading: %1</source> - <translation type="unfinished"></translation> + <translation>Error al leer el archivo de captura: %1</translation> </message> <message> <location filename="../GameController.cpp" line="621"/> <source>Failed to open snapshot file for writing: %1</source> - <translation type="unfinished"></translation> + <translation>Error al escribir al archivo de captura: %1</translation> </message> <message> - <location filename="../GameController.cpp" line="914"/> + <location filename="../GameController.cpp" line="916"/> <source>Failed to start audio processor</source> - <translation type="unfinished"></translation> + <translation>Error al iniciar el procesador de audio</translation> </message> </context> <context>@@ -1049,142 +1076,142 @@ <name>QGBA::IOViewer</name>
<message> <location filename="../IOViewer.cpp" line="30"/> <source>Background mode</source> - <translation type="unfinished"></translation> + <translation>Modo de fondo (BG)</translation> </message> <message> <location filename="../IOViewer.cpp" line="31"/> <source>Mode 0: 4 tile layers</source> - <translation type="unfinished"></translation> + <translation>Modo 0: 4 capas de tiles</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> + <translation>Modo 1: 2 capas de tiles + 1 capa de tiles rotados/escalados</translation> </message> <message> <location filename="../IOViewer.cpp" line="33"/> <source>Mode 2: 2 rotated/scaled tile layers</source> - <translation type="unfinished"></translation> + <translation>Modo 2: 2 capas de tiles rotados/escalados</translation> </message> <message> <location filename="../IOViewer.cpp" line="34"/> <source>Mode 3: Full 15-bit bitmap</source> - <translation type="unfinished"></translation> + <translation>Modo 3: mapa de bits de 15 bits</translation> </message> <message> <location filename="../IOViewer.cpp" line="35"/> <source>Mode 4: Full 8-bit bitmap</source> - <translation type="unfinished"></translation> + <translation>Modo 4: mapa de bits de 8 bits</translation> </message> <message> <location filename="../IOViewer.cpp" line="36"/> <source>Mode 5: Small 15-bit bitmap</source> - <translation type="unfinished"></translation> + <translation>Modo 5: mapa de bits pequeño de 15 bits</translation> </message> <message> <location filename="../IOViewer.cpp" line="40"/> <source>CGB Mode</source> - <translation type="unfinished"></translation> + <translation>Modo CGB</translation> </message> <message> <location filename="../IOViewer.cpp" line="41"/> <source>Frame select</source> - <translation type="unfinished"></translation> + <translation>Selección de cuadros</translation> </message> <message> <location filename="../IOViewer.cpp" line="42"/> <source>Unlocked HBlank</source> - <translation type="unfinished"></translation> + <translation>HBlank sin bloqueo</translation> </message> <message> <location filename="../IOViewer.cpp" line="43"/> <source>Linear OBJ tile mapping</source> - <translation type="unfinished"></translation> + <translation>Asignación de tiles OBJ lineal</translation> </message> <message> <location filename="../IOViewer.cpp" line="44"/> <source>Force blank screen</source> - <translation type="unfinished"></translation> + <translation>Forzar pantalla en blanco</translation> </message> <message> <location filename="../IOViewer.cpp" line="45"/> <source>Enable background 0</source> - <translation type="unfinished"></translation> + <translation>Habilitar fondo 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="46"/> <source>Enable background 1</source> - <translation type="unfinished"></translation> + <translation>Habilitar fondo 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="47"/> <source>Enable background 2</source> - <translation type="unfinished"></translation> + <translation>Habilitar fondo 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="48"/> <source>Enable background 3</source> - <translation type="unfinished"></translation> + <translation>Habilitar fondo 3</translation> </message> <message> <location filename="../IOViewer.cpp" line="49"/> <source>Enable OBJ</source> - <translation type="unfinished"></translation> + <translation>Habilitar OBJ</translation> </message> <message> <location filename="../IOViewer.cpp" line="50"/> <source>Enable Window 0</source> - <translation type="unfinished"></translation> + <translation>Habilitar Window 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="51"/> <source>Enable Window 1</source> - <translation type="unfinished"></translation> + <translation>Habilitar Window 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="52"/> <source>Enable OBJ Window</source> - <translation type="unfinished"></translation> + <translation>Habilitar Window OBJ</translation> </message> <message> <location filename="../IOViewer.cpp" line="58"/> <source>Currently in VBlank</source> - <translation type="unfinished"></translation> + <translation>En VBlank actualmente</translation> </message> <message> <location filename="../IOViewer.cpp" line="59"/> <source>Currently in HBlank</source> - <translation type="unfinished"></translation> + <translation>En HBlank actualmente</translation> </message> <message> <location filename="../IOViewer.cpp" line="60"/> <source>Currently in VCounter</source> - <translation type="unfinished"></translation> + <translation>En VCounter actualmente</translation> </message> <message> <location filename="../IOViewer.cpp" line="61"/> <source>Enable VBlank IRQ generation</source> - <translation type="unfinished"></translation> + <translation>Generar IRQ por cada VBlank</translation> </message> <message> <location filename="../IOViewer.cpp" line="62"/> <source>Enable HBlank IRQ generation</source> - <translation type="unfinished"></translation> + <translation>Generar IRQ por cada HBlank</translation> </message> <message> <location filename="../IOViewer.cpp" line="63"/> <source>Enable VCounter IRQ generation</source> - <translation type="unfinished"></translation> + <translation>Generar IRQ por cada VCounter</translation> </message> <message> <location filename="../IOViewer.cpp" line="64"/> <source>VCounter scanline</source> - <translation type="unfinished"></translation> + <translation>Línea de exploración VCounter</translation> </message> <message> <location filename="../IOViewer.cpp" line="68"/> <source>Current scanline</source> - <translation type="unfinished"></translation> + <translation>Línea de exploración actual</translation> </message> <message> <location filename="../IOViewer.cpp" line="72"/>@@ -1192,7 +1219,7 @@ <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> + <translation>Prioridad</translation> </message> <message> <location filename="../IOViewer.cpp" line="73"/>@@ -1200,7 +1227,7 @@ <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> + <translation>Base de los tiles (* 16kB)</translation> </message> <message> <location filename="../IOViewer.cpp" line="74"/>@@ -1208,7 +1235,7 @@ <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> + <translation>Mosaico (pixelar)</translation> </message> <message> <location filename="../IOViewer.cpp" line="75"/>@@ -1216,7 +1243,7 @@ <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> + <translation>256 colores</translation> </message> <message> <location filename="../IOViewer.cpp" line="76"/>@@ -1224,7 +1251,7 @@ <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> + <translation>Base de asignación de tiles (* 2kB)</translation> </message> <message> <location filename="../IOViewer.cpp" line="77"/>@@ -1232,13 +1259,13 @@ <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> + <translation>Dimensiones del fondo</translation> </message> <message> <location filename="../IOViewer.cpp" line="95"/> <location filename="../IOViewer.cpp" line="105"/> <source>Overflow wraps</source> - <translation type="unfinished"></translation> + <translation>Envolver al desbordar</translation> </message> <message> <location filename="../IOViewer.cpp" line="110"/>@@ -1246,7 +1273,7 @@ <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> + <translation>Compensación horizontal</translation> </message> <message> <location filename="../IOViewer.cpp" line="114"/>@@ -1254,7 +1281,7 @@ <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> + <translation>Compensación vertical</translation> </message> <message> <location filename="../IOViewer.cpp" line="142"/>@@ -1270,7 +1297,7 @@ <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> + <translation>Parte fraccionaria</translation> </message> <message> <location filename="../IOViewer.cpp" line="143"/>@@ -1282,7 +1309,7 @@ <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> + <translation>Parte entera</translation> </message> <message> <location filename="../IOViewer.cpp" line="163"/>@@ -1290,7 +1317,7 @@ <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> + <translation>Parte entera (inferior)</translation> </message> <message> <location filename="../IOViewer.cpp" line="167"/>@@ -1298,286 +1325,286 @@ <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> + <translation>Parte entera (superior)</translation> </message> <message> <location filename="../IOViewer.cpp" line="218"/> <location filename="../IOViewer.cpp" line="223"/> <source>End x</source> - <translation type="unfinished"></translation> + <translation>Fin x</translation> </message> <message> <location filename="../IOViewer.cpp" line="219"/> <location filename="../IOViewer.cpp" line="224"/> <source>Start x</source> - <translation type="unfinished"></translation> + <translation>Inicio x</translation> </message> <message> <location filename="../IOViewer.cpp" line="228"/> <location filename="../IOViewer.cpp" line="233"/> <source>End y</source> - <translation type="unfinished"></translation> + <translation>Fin y</translation> </message> <message> <location filename="../IOViewer.cpp" line="229"/> <location filename="../IOViewer.cpp" line="234"/> <source>Start y</source> - <translation type="unfinished"></translation> + <translation>Inicio y</translation> </message> <message> <location filename="../IOViewer.cpp" line="238"/> <source>Window 0 enable BG 0</source> - <translation type="unfinished"></translation> + <translation>Window 0 BG 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="239"/> <source>Window 0 enable BG 1</source> - <translation type="unfinished"></translation> + <translation>Window 0 BG 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="240"/> <source>Window 0 enable BG 2</source> - <translation type="unfinished"></translation> + <translation>Window 0 BG 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="241"/> <source>Window 0 enable BG 3</source> - <translation type="unfinished"></translation> + <translation>Window 0 BG 3</translation> </message> <message> <location filename="../IOViewer.cpp" line="242"/> <source>Window 0 enable OBJ</source> - <translation type="unfinished"></translation> + <translation>Window 0 OBJ</translation> </message> <message> <location filename="../IOViewer.cpp" line="243"/> <source>Window 0 enable blend</source> - <translation type="unfinished"></translation> + <translation>Window 0 mezcla</translation> </message> <message> <location filename="../IOViewer.cpp" line="244"/> <source>Window 1 enable BG 0</source> - <translation type="unfinished"></translation> + <translation>Window 1 BG 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="245"/> <source>Window 1 enable BG 1</source> - <translation type="unfinished"></translation> + <translation>Window 1 BG 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="246"/> <source>Window 1 enable BG 2</source> - <translation type="unfinished"></translation> + <translation>Window 1 BG 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="247"/> <source>Window 1 enable BG 3</source> - <translation type="unfinished"></translation> + <translation>Window 1 BG 3</translation> </message> <message> <location filename="../IOViewer.cpp" line="248"/> <source>Window 1 enable OBJ</source> - <translation type="unfinished"></translation> + <translation>Window 1 OBJ</translation> </message> <message> <location filename="../IOViewer.cpp" line="249"/> <source>Window 1 enable blend</source> - <translation type="unfinished"></translation> + <translation>Window 1 mezcla</translation> </message> <message> <location filename="../IOViewer.cpp" line="253"/> <source>Outside window enable BG 0</source> - <translation type="unfinished"></translation> + <translation>Outside window BG 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="254"/> <source>Outside window enable BG 1</source> - <translation type="unfinished"></translation> + <translation>Outside window BG 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="255"/> <source>Outside window enable BG 2</source> - <translation type="unfinished"></translation> + <translation>Outside window BG 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="256"/> <source>Outside window enable BG 3</source> - <translation type="unfinished"></translation> + <translation>Outside window BG 3</translation> </message> <message> <location filename="../IOViewer.cpp" line="257"/> <source>Outside window enable OBJ</source> - <translation type="unfinished"></translation> + <translation>Outside window OBJ</translation> </message> <message> <location filename="../IOViewer.cpp" line="258"/> <source>Outside window enable blend</source> - <translation type="unfinished"></translation> + <translation>Outside window mezcla</translation> </message> <message> <location filename="../IOViewer.cpp" line="259"/> <source>OBJ window enable BG 0</source> - <translation type="unfinished"></translation> + <translation>OBJ window BG 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="260"/> <source>OBJ window enable BG 1</source> - <translation type="unfinished"></translation> + <translation>OBJ window BG 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="261"/> <source>OBJ window enable BG 2</source> - <translation type="unfinished"></translation> + <translation>OBJ window BG 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="262"/> <source>OBJ window enable BG 3</source> - <translation type="unfinished"></translation> + <translation>OBJ window BG 3</translation> </message> <message> <location filename="../IOViewer.cpp" line="263"/> <source>OBJ window enable OBJ</source> - <translation type="unfinished"></translation> + <translation>OBJ window OBJ</translation> </message> <message> <location filename="../IOViewer.cpp" line="264"/> <source>OBJ window enable blend</source> - <translation type="unfinished"></translation> + <translation>OBJ window mezcla</translation> </message> <message> <location filename="../IOViewer.cpp" line="268"/> <source>Background mosaic size vertical</source> - <translation type="unfinished"></translation> + <translation>Tamaño mosaico fondo vertical</translation> </message> <message> <location filename="../IOViewer.cpp" line="269"/> <source>Background mosaic size horizontal</source> - <translation type="unfinished"></translation> + <translation>Tamaño mosaico fondo horizontal</translation> </message> <message> <location filename="../IOViewer.cpp" line="270"/> <source>Object mosaic size vertical</source> - <translation type="unfinished"></translation> + <translation>Tamaño mosaico objeto vertical</translation> </message> <message> <location filename="../IOViewer.cpp" line="271"/> <source>Object mosaic size horizontal</source> - <translation type="unfinished"></translation> + <translation>Tamaño mosaico objeto horizontal</translation> </message> <message> <location filename="../IOViewer.cpp" line="277"/> <source>BG 0 target 1</source> - <translation type="unfinished"></translation> + <translation>BG 0 target 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="278"/> <source>BG 1 target 1</source> - <translation type="unfinished"></translation> + <translation>BG 1 target 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="279"/> <source>BG 2 target 1</source> - <translation type="unfinished"></translation> + <translation>BG 2 target 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="280"/> <source>BG 3 target 1</source> - <translation type="unfinished"></translation> + <translation>BG 3 target 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="281"/> <source>OBJ target 1</source> - <translation type="unfinished"></translation> + <translation>OBJ target 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="282"/> <source>Backdrop target 1</source> - <translation type="unfinished"></translation> + <translation>Backdrop target 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="283"/> <source>Blend mode</source> - <translation type="unfinished"></translation> + <translation>Modo mezcla</translation> </message> <message> <location filename="../IOViewer.cpp" line="284"/> <source>Disabled</source> - <translation type="unfinished"></translation> + <translation>Desactivado</translation> </message> <message> <location filename="../IOViewer.cpp" line="285"/> <source>Additive blending</source> - <translation type="unfinished"></translation> + <translation>Mezcla aditiva</translation> </message> <message> <location filename="../IOViewer.cpp" line="286"/> <source>Brighten</source> - <translation type="unfinished"></translation> + <translation>Aclarar</translation> </message> <message> <location filename="../IOViewer.cpp" line="287"/> <source>Darken</source> - <translation type="unfinished"></translation> + <translation>Oscurecer</translation> </message> <message> <location filename="../IOViewer.cpp" line="289"/> <source>BG 0 target 2</source> - <translation type="unfinished"></translation> + <translation>BG 0 target 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="290"/> <source>BG 1 target 2</source> - <translation type="unfinished"></translation> + <translation>BG 1 target 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="291"/> <source>BG 2 target 2</source> - <translation type="unfinished"></translation> + <translation>BG 2 target 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="292"/> <source>BG 3 target 2</source> - <translation type="unfinished"></translation> + <translation>BG 3 target 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="293"/> <source>OBJ target 2</source> - <translation type="unfinished"></translation> + <translation>OBJ target 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="294"/> <source>Backdrop target 2</source> - <translation type="unfinished"></translation> + <translation>Backdrop target 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="298"/> <source>Blend A (target 1)</source> - <translation type="unfinished"></translation> + <translation>Mezcla A (target 1)</translation> </message> <message> <location filename="../IOViewer.cpp" line="299"/> <source>Blend B (target 2)</source> - <translation type="unfinished"></translation> + <translation>Mezcla B (target 2)</translation> </message> <message> <location filename="../IOViewer.cpp" line="303"/> <source>Blend Y</source> - <translation type="unfinished"></translation> + <translation>Mezcla Y</translation> </message> <message> <location filename="../IOViewer.cpp" line="317"/> <source>Sweep shifts</source> - <translation type="unfinished"></translation> + <translation>Cambio en barrido</translation> </message> <message> <location filename="../IOViewer.cpp" line="318"/> <source>Sweep subtract</source> - <translation type="unfinished"></translation> + <translation>Sustracción en barrido</translation> </message> <message> <location filename="../IOViewer.cpp" line="319"/> <source>Sweep time (in 1/128s)</source> - <translation type="unfinished"></translation> + <translation>Tiempo de barrido (en 1/128seg)</translation> </message> <message> <location filename="../IOViewer.cpp" line="323"/>@@ -1585,41 +1612,41 @@ <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> + <translation>Longitud del sonido</translation> </message> <message> <location filename="../IOViewer.cpp" line="324"/> <location filename="../IOViewer.cpp" line="340"/> <source>Duty cycle</source> - <translation type="unfinished"></translation> + <translation>Ciclo de trabajo</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> + <translation>Tiempo paso envolvente</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> + <translation>Aumento envolvente</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> + <translation>Volumen inicial</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> + <translation>Frecuencia del sonido</translation> </message> <message> <location filename="../IOViewer.cpp" line="332"/>@@ -1627,7 +1654,7 @@ <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> + <translation>Cronometrado</translation> </message> <message> <location filename="../IOViewer.cpp" line="333"/>@@ -1635,50 +1662,50 @@ <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> + <translation>Reinicializar</translation> </message> <message> <location filename="../IOViewer.cpp" line="357"/> <source>Double-size wave table</source> - <translation type="unfinished"></translation> + <translation>Tabla de ondas de doble tamaño</translation> </message> <message> <location filename="../IOViewer.cpp" line="358"/> <source>Active wave table</source> - <translation type="unfinished"></translation> + <translation>Tabla de ondas activa</translation> </message> <message> <location filename="../IOViewer.cpp" line="359"/> <source>Enable channel 3</source> - <translation type="unfinished"></translation> + <translation>Canal 3 activo</translation> </message> <message> <location filename="../IOViewer.cpp" line="364"/> <source>Volume</source> - <translation type="unfinished"></translation> + <translation>Volumen</translation> </message> <message> <location filename="../IOViewer.cpp" line="365"/> <source>0%</source> - <translation type="unfinished"></translation> + <translation>0%</translation> </message> <message> <location filename="../IOViewer.cpp" line="366"/> <location filename="../IOViewer.cpp" line="423"/> <source>100%</source> - <translation type="unfinished"></translation> + <translation>100%</translation> </message> <message> <location filename="../IOViewer.cpp" line="367"/> <location filename="../IOViewer.cpp" line="422"/> <source>50%</source> - <translation type="unfinished"></translation> + <translation>50%</translation> </message> <message> <location filename="../IOViewer.cpp" line="368"/> <location filename="../IOViewer.cpp" line="421"/> <source>25%</source> - <translation type="unfinished"></translation> + <translation>25%</translation> </message> <message> <location filename="../IOViewer.cpp" line="369"/>@@ -1686,118 +1713,118 @@ <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> + <translation>75%</translation> </message> <message> <location filename="../IOViewer.cpp" line="394"/> <source>Clock divider</source> - <translation type="unfinished"></translation> + <translation>Divisor de reloj</translation> </message> <message> <location filename="../IOViewer.cpp" line="395"/> <source>Register stages</source> - <translation type="unfinished"></translation> + <translation>Etapas de registros</translation> </message> <message> <location filename="../IOViewer.cpp" line="396"/> <source>15</source> - <translation type="unfinished"></translation> + <translation>15</translation> </message> <message> <location filename="../IOViewer.cpp" line="397"/> <source>7</source> - <translation type="unfinished"></translation> + <translation>7</translation> </message> <message> <location filename="../IOViewer.cpp" line="399"/> <source>Shifter frequency</source> - <translation type="unfinished"></translation> + <translation>Frecuencia de cambio</translation> </message> <message> <location filename="../IOViewer.cpp" line="407"/> <source>PSG volume right</source> - <translation type="unfinished"></translation> + <translation>Volumen pulso derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="408"/> <source>PSG volume left</source> - <translation type="unfinished"></translation> + <translation>Volumen pulso izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="409"/> <source>Enable channel 1 right</source> - <translation type="unfinished"></translation> + <translation>Canal 1 derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="410"/> <source>Enable channel 2 right</source> - <translation type="unfinished"></translation> + <translation>Canal 2 derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="411"/> <source>Enable channel 3 right</source> - <translation type="unfinished"></translation> + <translation>Canal 3 derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="412"/> <source>Enable channel 4 right</source> - <translation type="unfinished"></translation> + <translation>Canal 4 derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="413"/> <source>Enable channel 1 left</source> - <translation type="unfinished"></translation> + <translation>Canal 1 izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="414"/> <source>Enable channel 2 left</source> - <translation type="unfinished"></translation> + <translation>Canal 2 izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="415"/> <source>Enable channel 3 left</source> - <translation type="unfinished"></translation> + <translation>Canal 3 izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="416"/> <source>Enable channel 4 left</source> - <translation type="unfinished"></translation> + <translation>Canal 4 izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="420"/> <source>PSG master volume</source> - <translation type="unfinished"></translation> + <translation>Volumen maestro pulso</translation> </message> <message> <location filename="../IOViewer.cpp" line="426"/> <source>Loud channel A</source> - <translation type="unfinished"></translation> + <translation>Canal A fuerte</translation> </message> <message> <location filename="../IOViewer.cpp" line="427"/> <source>Loud channel B</source> - <translation type="unfinished"></translation> + <translation>Canal B fuerte</translation> </message> <message> <location filename="../IOViewer.cpp" line="428"/> <source>Enable channel A right</source> - <translation type="unfinished"></translation> + <translation>Canal A derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="429"/> <source>Enable channel A left</source> - <translation type="unfinished"></translation> + <translation>Canal A izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="430"/> <source>Channel A timer</source> - <translation type="unfinished"></translation> + <translation>Temporizador canal A</translation> </message> <message> <location filename="../IOViewer.cpp" line="431"/> <location filename="../IOViewer.cpp" line="438"/> <source>0</source> - <translation type="unfinished"></translation> + <translation>0</translation> </message> <message> <location filename="../IOViewer.cpp" line="432"/>@@ -1810,67 +1837,67 @@ <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> + <translation>1</translation> </message> <message> <location filename="../IOViewer.cpp" line="434"/> <source>Channel A reset</source> - <translation type="unfinished"></translation> + <translation>Reinic. canal A</translation> </message> <message> <location filename="../IOViewer.cpp" line="435"/> <source>Enable channel B right</source> - <translation type="unfinished"></translation> + <translation>Canal B derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="436"/> <source>Enable channel B left</source> - <translation type="unfinished"></translation> + <translation>Canal B izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="437"/> <source>Channel B timer</source> - <translation type="unfinished"></translation> + <translation>Temporizador canal B</translation> </message> <message> <location filename="../IOViewer.cpp" line="441"/> <source>Channel B reset</source> - <translation type="unfinished"></translation> + <translation>Reinic. canal B</translation> </message> <message> <location filename="../IOViewer.cpp" line="445"/> <source>Active channel 1</source> - <translation type="unfinished"></translation> + <translation>Canal 1 activo</translation> </message> <message> <location filename="../IOViewer.cpp" line="446"/> <source>Active channel 2</source> - <translation type="unfinished"></translation> + <translation>Canal 2 activo</translation> </message> <message> <location filename="../IOViewer.cpp" line="447"/> <source>Active channel 3</source> - <translation type="unfinished"></translation> + <translation>Canal 3 activo</translation> </message> <message> <location filename="../IOViewer.cpp" line="448"/> <source>Active channel 4</source> - <translation type="unfinished"></translation> + <translation>Canal 4 activo</translation> </message> <message> <location filename="../IOViewer.cpp" line="449"/> <source>Enable audio</source> - <translation type="unfinished"></translation> + <translation>Habilitar audio</translation> </message> <message> <location filename="../IOViewer.cpp" line="455"/> <source>Bias</source> - <translation type="unfinished"></translation> + <translation>Polarización</translation> </message> <message> <location filename="../IOViewer.cpp" line="456"/> <source>Resolution</source> - <translation type="unfinished"></translation> + <translation>Resolución</translation> </message> <message> <location filename="../IOViewer.cpp" line="466"/>@@ -1914,7 +1941,7 @@ <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> + <translation>Muestra</translation> </message> <message> <location filename="../IOViewer.cpp" line="550"/>@@ -1926,7 +1953,7 @@ <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> + <translation>Dirección (inferior)</translation> </message> <message> <location filename="../IOViewer.cpp" line="554"/>@@ -1938,7 +1965,7 @@ <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> + <translation>Dirección (superior)</translation> </message> <message> <location filename="../IOViewer.cpp" line="566"/>@@ -1946,7 +1973,7 @@ <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> + <translation>Contador de word</translation> </message> <message> <location filename="../IOViewer.cpp" line="570"/>@@ -1954,7 +1981,7 @@ <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> + <translation>Compensación de destino</translation> </message> <message> <location filename="../IOViewer.cpp" line="571"/>@@ -1966,7 +1993,7 @@ <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> + <translation>Incremento</translation> </message> <message> <location filename="../IOViewer.cpp" line="572"/>@@ -1978,7 +2005,7 @@ <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> + <translation>Decremento</translation> </message> <message> <location filename="../IOViewer.cpp" line="573"/>@@ -1990,7 +2017,7 @@ <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> + <translation>Fijo</translation> </message> <message> <location filename="../IOViewer.cpp" line="574"/>@@ -1998,7 +2025,7 @@ <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> + <translation>Incremento y recarga</translation> </message> <message> <location filename="../IOViewer.cpp" line="576"/>@@ -2006,7 +2033,7 @@ <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> + <translation>Compensación de origen</translation> </message> <message> <location filename="../IOViewer.cpp" line="582"/>@@ -2014,7 +2041,7 @@ <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> + <translation>Repetir</translation> </message> <message> <location filename="../IOViewer.cpp" line="583"/>@@ -2022,7 +2049,7 @@ <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> + <translation>32 bits</translation> </message> <message> <location filename="../IOViewer.cpp" line="584"/>@@ -2030,7 +2057,7 @@ <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> + <translation>Inicio de temporizador</translation> </message> <message> <location filename="../IOViewer.cpp" line="585"/>@@ -2038,7 +2065,7 @@ <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> + <translation>Inmediato</translation> </message> <message> <location filename="../IOViewer.cpp" line="586"/>@@ -2048,7 +2075,7 @@ <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> + <translation>VBlank</translation> </message> <message> <location filename="../IOViewer.cpp" line="587"/>@@ -2058,7 +2085,7 @@ <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> + <translation>HBlank</translation> </message> <message> <location filename="../IOViewer.cpp" line="590"/>@@ -2071,7 +2098,7 @@ <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> + <translation>IRQ</translation> </message> <message> <location filename="../IOViewer.cpp" line="591"/>@@ -2083,24 +2110,24 @@ <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> + <translation>Habilitar</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> + <translation>FIFO de audio</translation> </message> <message> <location filename="../IOViewer.cpp" line="715"/> <source>Video Capture</source> - <translation type="unfinished"></translation> + <translation>Captura de video</translation> </message> <message> <location filename="../IOViewer.cpp" line="717"/> <source>DRQ</source> - <translation type="unfinished"></translation> + <translation>DRQ</translation> </message> <message> <location filename="../IOViewer.cpp" line="763"/>@@ -2108,7 +2135,7 @@ <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> + <translation>Valor</translation> </message> <message> <location filename="../IOViewer.cpp" line="767"/>@@ -2116,7 +2143,7 @@ <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> + <translation>Escala</translation> </message> <message> <location filename="../IOViewer.cpp" line="769"/>@@ -2124,7 +2151,7 @@ <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> + <translation>1/64</translation> </message> <message> <location filename="../IOViewer.cpp" line="770"/>@@ -2132,7 +2159,7 @@ <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> + <translation>1/256</translation> </message> <message> <location filename="../IOViewer.cpp" line="771"/>@@ -2140,176 +2167,176 @@ <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> + <translation>1/1024</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> + <translation>Cacada</translation> </message> <message> <location filename="../IOViewer.cpp" line="858"/> <location filename="../IOViewer.cpp" line="871"/> <source>A</source> - <translation type="unfinished"></translation> + <translation>A</translation> </message> <message> <location filename="../IOViewer.cpp" line="859"/> <location filename="../IOViewer.cpp" line="872"/> <source>B</source> - <translation type="unfinished"></translation> + <translation>B</translation> </message> <message> <location filename="../IOViewer.cpp" line="860"/> <location filename="../IOViewer.cpp" line="873"/> <source>Select</source> - <translation type="unfinished"></translation> + <translation>Select</translation> </message> <message> <location filename="../IOViewer.cpp" line="861"/> <location filename="../IOViewer.cpp" line="874"/> <source>Start</source> - <translation type="unfinished"></translation> + <translation>Start</translation> </message> <message> <location filename="../IOViewer.cpp" line="862"/> <location filename="../IOViewer.cpp" line="875"/> <source>Right</source> - <translation type="unfinished"></translation> + <translation>Derecha</translation> </message> <message> <location filename="../IOViewer.cpp" line="863"/> <location filename="../IOViewer.cpp" line="876"/> <source>Left</source> - <translation type="unfinished"></translation> + <translation>Izquierda</translation> </message> <message> <location filename="../IOViewer.cpp" line="864"/> <location filename="../IOViewer.cpp" line="877"/> <source>Up</source> - <translation type="unfinished"></translation> + <translation>Arriba</translation> </message> <message> <location filename="../IOViewer.cpp" line="865"/> <location filename="../IOViewer.cpp" line="878"/> <source>Down</source> - <translation type="unfinished"></translation> + <translation>Abajo</translation> </message> <message> <location filename="../IOViewer.cpp" line="866"/> <location filename="../IOViewer.cpp" line="879"/> <source>R</source> - <translation type="unfinished"></translation> + <translation>R</translation> </message> <message> <location filename="../IOViewer.cpp" line="867"/> <location filename="../IOViewer.cpp" line="880"/> <source>L</source> - <translation type="unfinished"></translation> + <translation>L</translation> </message> <message> <location filename="../IOViewer.cpp" line="882"/> <source>Condition</source> - <translation type="unfinished"></translation> + <translation>Condición</translation> </message> <message> <location filename="../IOViewer.cpp" line="886"/> <source>SC</source> - <translation type="unfinished"></translation> + <translation>SC</translation> </message> <message> <location filename="../IOViewer.cpp" line="887"/> <source>SD</source> - <translation type="unfinished"></translation> + <translation>SD</translation> </message> <message> <location filename="../IOViewer.cpp" line="888"/> <source>SI</source> - <translation type="unfinished"></translation> + <translation>SI</translation> </message> <message> <location filename="../IOViewer.cpp" line="889"/> <source>SO</source> - <translation type="unfinished"></translation> + <translation>SO</translation> </message> <message> <location filename="../IOViewer.cpp" line="941"/> <location filename="../IOViewer.cpp" line="958"/> <source>VCounter</source> - <translation type="unfinished"></translation> + <translation>VCounter</translation> </message> <message> <location filename="../IOViewer.cpp" line="942"/> <location filename="../IOViewer.cpp" line="959"/> <source>Timer 0</source> - <translation type="unfinished"></translation> + <translation>Timer 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="943"/> <location filename="../IOViewer.cpp" line="960"/> <source>Timer 1</source> - <translation type="unfinished"></translation> + <translation>Timer 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="944"/> <location filename="../IOViewer.cpp" line="961"/> <source>Timer 2</source> - <translation type="unfinished"></translation> + <translation>Timer 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="945"/> <location filename="../IOViewer.cpp" line="962"/> <source>Timer 3</source> - <translation type="unfinished"></translation> + <translation>Timer 3</translation> </message> <message> <location filename="../IOViewer.cpp" line="946"/> <location filename="../IOViewer.cpp" line="963"/> <source>SIO</source> - <translation type="unfinished"></translation> + <translation>SIO</translation> </message> <message> <location filename="../IOViewer.cpp" line="947"/> <location filename="../IOViewer.cpp" line="964"/> <source>DMA 0</source> - <translation type="unfinished"></translation> + <translation>DMA 0</translation> </message> <message> <location filename="../IOViewer.cpp" line="948"/> <location filename="../IOViewer.cpp" line="965"/> <source>DMA 1</source> - <translation type="unfinished"></translation> + <translation>DMA 1</translation> </message> <message> <location filename="../IOViewer.cpp" line="949"/> <location filename="../IOViewer.cpp" line="966"/> <source>DMA 2</source> - <translation type="unfinished"></translation> + <translation>DMA 2</translation> </message> <message> <location filename="../IOViewer.cpp" line="950"/> <location filename="../IOViewer.cpp" line="967"/> <source>DMA 3</source> - <translation type="unfinished"></translation> + <translation>DMA 3</translation> </message> <message> <location filename="../IOViewer.cpp" line="951"/> <location filename="../IOViewer.cpp" line="968"/> <source>Keypad</source> - <translation type="unfinished"></translation> + <translation>Teclera</translation> </message> <message> <location filename="../IOViewer.cpp" line="952"/> <location filename="../IOViewer.cpp" line="969"/> <source>Gamepak</source> - <translation type="unfinished"></translation> + <translation>Gamepak</translation> </message> <message> <location filename="../IOViewer.cpp" line="973"/> <source>SRAM wait</source> - <translation type="unfinished"></translation> + <translation>Espera SRAM</translation> </message> <message> <location filename="../IOViewer.cpp" line="974"/>@@ -2318,7 +2345,7 @@ <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> + <translation>4</translation> </message> <message> <location filename="../IOViewer.cpp" line="975"/>@@ -2326,7 +2353,7 @@ <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> + <translation>3</translation> </message> <message> <location filename="../IOViewer.cpp" line="976"/>@@ -2335,7 +2362,7 @@ <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> + <translation>2</translation> </message> <message> <location filename="../IOViewer.cpp" line="977"/>@@ -2344,72 +2371,72 @@ <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> + <translation>8</translation> </message> <message> <location filename="../IOViewer.cpp" line="979"/> <source>Cart 0 non-sequential</source> - <translation type="unfinished"></translation> + <translation>Cart 0 no secuencial</translation> </message> <message> <location filename="../IOViewer.cpp" line="985"/> <source>Cart 0 sequential</source> - <translation type="unfinished"></translation> + <translation>Cart 0 secuencial</translation> </message> <message> <location filename="../IOViewer.cpp" line="989"/> <source>Cart 1 non-sequential</source> - <translation type="unfinished"></translation> + <translation>Cart 1 no secuencial</translation> </message> <message> <location filename="../IOViewer.cpp" line="995"/> <source>Cart 1 sequential</source> - <translation type="unfinished"></translation> + <translation>Cart 1 secuencial</translation> </message> <message> <location filename="../IOViewer.cpp" line="999"/> <source>Cart 2 non-sequential</source> - <translation type="unfinished"></translation> + <translation>Cart 2 no secuencial</translation> </message> <message> <location filename="../IOViewer.cpp" line="1005"/> <source>Cart 2 sequential</source> - <translation type="unfinished"></translation> + <translation>Cart 2 secuencial</translation> </message> <message> <location filename="../IOViewer.cpp" line="1009"/> <source>PHI terminal</source> - <translation type="unfinished"></translation> + <translation>PHI terminal</translation> </message> <message> <location filename="../IOViewer.cpp" line="1010"/> <source>Disable</source> - <translation type="unfinished"></translation> + <translation>Desactivar</translation> </message> <message> <location filename="../IOViewer.cpp" line="1011"/> <source>4.19MHz</source> - <translation type="unfinished"></translation> + <translation>4.19MHz</translation> </message> <message> <location filename="../IOViewer.cpp" line="1012"/> <source>8.38MHz</source> - <translation type="unfinished"></translation> + <translation>8.38MHz</translation> </message> <message> <location filename="../IOViewer.cpp" line="1013"/> <source>16.78MHz</source> - <translation type="unfinished"></translation> + <translation>16.78MHz</translation> </message> <message> <location filename="../IOViewer.cpp" line="1015"/> <source>Gamepak prefetch</source> - <translation type="unfinished"></translation> + <translation>Gamepak prefetch</translation> </message> <message> <location filename="../IOViewer.cpp" line="1021"/> <source>Enable IRQs</source> - <translation type="unfinished"></translation> + <translation>Habilitar IRQs</translation> </message> </context> <context>@@ -2418,7 +2445,7 @@ <message>
<location filename="../KeyEditor.cpp" line="37"/> <location filename="../KeyEditor.cpp" line="211"/> <source>---</source> - <translation type="unfinished"></translation> + <translation>---</translation> </message> </context> <context>@@ -2426,47 +2453,47 @@ <name>QGBA::LibraryModel</name>
<message> <location filename="../LibraryModel.cpp" line="24"/> <source>Name</source> - <translation type="unfinished"></translation> + <translation>Nombre</translation> </message> <message> <location filename="../LibraryModel.cpp" line="33"/> <source>Filename</source> - <translation type="unfinished"></translation> + <translation>Nombre de archivo</translation> </message> <message> <location filename="../LibraryModel.cpp" line="39"/> <source>Size</source> - <translation type="unfinished"></translation> + <translation>Tamaño</translation> </message> <message> <location filename="../LibraryModel.cpp" line="56"/> <source>Platform</source> - <translation type="unfinished"></translation> + <translation>Plataforma</translation> </message> <message> <location filename="../LibraryModel.cpp" line="62"/> <source>GBA</source> - <translation type="unfinished"></translation> + <translation>GBA</translation> </message> <message> <location filename="../LibraryModel.cpp" line="66"/> <source>GB</source> - <translation type="unfinished"></translation> + <translation>GB</translation> </message> <message> <location filename="../LibraryModel.cpp" line="69"/> <source>?</source> - <translation type="unfinished"></translation> + <translation>?</translation> </message> <message> <location filename="../LibraryModel.cpp" line="74"/> <source>Location</source> - <translation type="unfinished"></translation> + <translation>Ubicación</translation> </message> <message> <location filename="../LibraryModel.cpp" line="80"/> <source>CRC32</source> - <translation type="unfinished"></translation> + <translation>CRC32</translation> </message> </context> <context>@@ -2474,27 +2501,27 @@ <name>QGBA::LoadSaveState</name>
<message> <location filename="../LoadSaveState.cpp" line="68"/> <source>Load State</source> - <translation type="unfinished"></translation> + <translation>Cargar captura</translation> </message> <message> <location filename="../LoadSaveState.cpp" line="68"/> <source>Save State</source> - <translation type="unfinished"></translation> + <translation>Guardar captura</translation> </message> <message> <location filename="../LoadSaveState.cpp" line="177"/> <source>Empty</source> - <translation type="unfinished"></translation> + <translation>Vacío</translation> </message> <message> <location filename="../LoadSaveState.cpp" line="186"/> <source>Corrupted</source> - <translation type="unfinished"></translation> + <translation>Corrompido</translation> </message> <message> <location filename="../LoadSaveState.cpp" line="209"/> <source>Slot %1</source> - <translation type="unfinished"></translation> + <translation>Espacio %1</translation> </message> </context> <context>@@ -2502,37 +2529,37 @@ <name>QGBA::LogController</name>
<message> <location filename="../LogController.cpp" line="57"/> <source>DEBUG</source> - <translation type="unfinished"></translation> + <translation>DEPURACIÓN</translation> </message> <message> <location filename="../LogController.cpp" line="59"/> <source>STUB</source> - <translation type="unfinished"></translation> + <translation>AUXILIAR</translation> </message> <message> <location filename="../LogController.cpp" line="61"/> <source>INFO</source> - <translation type="unfinished"></translation> + <translation>INFORMACIÓN</translation> </message> <message> <location filename="../LogController.cpp" line="63"/> <source>WARN</source> - <translation type="unfinished"></translation> + <translation>ADVERTENCIA</translation> </message> <message> <location filename="../LogController.cpp" line="65"/> <source>ERROR</source> - <translation type="unfinished"></translation> + <translation>ERROR</translation> </message> <message> <location filename="../LogController.cpp" line="67"/> <source>FATAL</source> - <translation type="unfinished"></translation> + <translation>FATAL</translation> </message> <message> <location filename="../LogController.cpp" line="69"/> <source>GAME ERROR</source> - <translation type="unfinished"></translation> + <translation>ERROR DEL JUEGO</translation> </message> </context> <context>@@ -2540,102 +2567,117 @@ <name>QGBA::MemoryModel</name>
<message> <location filename="../MemoryModel.cpp" line="50"/> <source>Copy selection</source> - <translation type="unfinished"></translation> + <translation>Copiar selección</translation> </message> <message> <location filename="../MemoryModel.cpp" line="55"/> <source>Save selection</source> - <translation type="unfinished"></translation> + <translation>Guardar selección</translation> </message> <message> <location filename="../MemoryModel.cpp" line="60"/> <source>Paste</source> - <translation type="unfinished"></translation> + <translation>Pegar</translation> </message> <message> <location filename="../MemoryModel.cpp" line="65"/> <source>Load</source> - <translation type="unfinished"></translation> + <translation>Cargar</translation> </message> <message> <location filename="../MemoryModel.cpp" line="97"/> <location filename="../MemoryModel.cpp" line="162"/> <source>All</source> - <translation type="unfinished"></translation> + <translation>Todo</translation> </message> <message> <location filename="../MemoryModel.cpp" line="142"/> <source>Load TBL</source> - <translation type="unfinished"></translation> + <translation>Cargar TBL</translation> </message> <message> <location filename="../MemoryModel.cpp" line="202"/> <source>Save selected memory</source> - <translation type="unfinished"></translation> + <translation>Guardar memoria seleccionada</translation> </message> <message> <location filename="../MemoryModel.cpp" line="208"/> <source>Failed to open output file: %1</source> - <translation type="unfinished"></translation> + <translation>Error al abrir el archivo de salida: %1</translation> </message> <message> <location filename="../MemoryModel.cpp" line="216"/> <source>Load memory</source> - <translation type="unfinished"></translation> + <translation>Cargar memoria</translation> </message> <message> <location filename="../MemoryModel.cpp" line="222"/> <source>Failed to open input file: %1</source> - <translation type="unfinished"></translation> + <translation>Error al abrir el archivo de entrada: %1</translation> </message> <message> <location filename="../MemoryModel.cpp" line="338"/> <source>TBL</source> - <translation type="unfinished"></translation> + <translation>TBL</translation> </message> <message> <location filename="../MemoryModel.cpp" line="338"/> <source>ISO-8859-1</source> - <translation type="unfinished"></translation> + <translation>ISO-8859-1</translation> </message> </context> <context> <name>QGBA::ObjView</name> <message> - <location filename="../ObjView.cpp" line="135"/> - <location filename="../ObjView.cpp" line="221"/> + <location filename="../ObjView.cpp" line="141"/> + <location filename="../ObjView.cpp" line="233"/> <source>0x%0</source> - <translation type="unfinished"></translation> + <translation>0x%0</translation> </message> <message> - <location filename="../ObjView.cpp" line="146"/> + <location filename="../ObjView.cpp" line="152"/> <source>Off</source> - <translation type="unfinished"></translation> + <translation>No</translation> </message> <message> - <location filename="../ObjView.cpp" line="151"/> + <location filename="../ObjView.cpp" line="157"/> <source>Normal</source> - <translation type="unfinished"></translation> + <translation>Normal</translation> </message> <message> - <location filename="../ObjView.cpp" line="154"/> + <location filename="../ObjView.cpp" line="160"/> <source>Trans</source> - <translation type="unfinished"></translation> + <translation>Trans</translation> </message> <message> - <location filename="../ObjView.cpp" line="157"/> + <location filename="../ObjView.cpp" line="163"/> <source>OBJWIN</source> + <translation>OBJWIN</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="166"/> + <source>Invalid</source> + <translation>Inválido</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="240"/> + <location filename="../ObjView.cpp" line="241"/> + <source>N/A</source> + <translation>n/d</translation> + </message> + <message> + <location filename="../ObjView.cpp" line="247"/> + <source>Export sprite</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ObjView.cpp" line="160"/> - <source>Invalid</source> + <location filename="../ObjView.cpp" line="248"/> + <source>Portable Network Graphics (*.png)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ObjView.cpp" line="228"/> - <location filename="../ObjView.cpp" line="229"/> - <source>N/A</source> + <location filename="../ObjView.cpp" line="255"/> + <source>Failed to open output PNG file: %1</source> <translation type="unfinished"></translation> </message> </context>@@ -2644,39 +2686,39 @@ <name>QGBA::PaletteView</name>
<message> <location filename="../PaletteView.cpp" line="120"/> <source>#%0</source> - <translation type="unfinished"></translation> + <translation>#%0</translation> </message> <message> <location filename="../PaletteView.cpp" line="121"/> <source>0x%0</source> - <translation type="unfinished"></translation> + <translation>0x%0</translation> </message> <message> <location filename="../PaletteView.cpp" line="122"/> <source>%0</source> - <translation type="unfinished"></translation> + <translation>%0</translation> </message> <message> <location filename="../PaletteView.cpp" line="123"/> <location filename="../PaletteView.cpp" line="124"/> <location filename="../PaletteView.cpp" line="125"/> <source>0x%0 (%1)</source> - <translation type="unfinished"></translation> + <translation>0x%0 (%1)</translation> </message> <message> <location filename="../PaletteView.cpp" line="137"/> <source>Export palette</source> - <translation type="unfinished"></translation> + <translation>Exportar paleta</translation> </message> <message> <location filename="../PaletteView.cpp" line="138"/> <source>Windows PAL (*.pal);;Adobe Color Table (*.act)</source> - <translation type="unfinished"></translation> + <translation>Paleta de WIndows (*.pal);;Tabla de colores Adobe (*.act)</translation> </message> <message> <location filename="../PaletteView.cpp" line="145"/> <source>Failed to open output palette file: %1</source> - <translation type="unfinished"></translation> + <translation>Error al abrir el archivo de salida de paleta: %1</translation> </message> </context> <context>@@ -2688,18 +2730,18 @@ <location filename="../ROMInfo.cpp" line="80"/>
<location filename="../ROMInfo.cpp" line="89"/> <location filename="../ROMInfo.cpp" line="90"/> <source>(unknown)</source> - <translation type="unfinished"></translation> + <translation>(desconocido)</translation> </message> <message> <location filename="../ROMInfo.cpp" line="57"/> <location filename="../ROMInfo.cpp" line="64"/> <source> bytes</source> - <translation type="unfinished"></translation> + <translation> bytes</translation> </message> <message> <location filename="../ROMInfo.cpp" line="83"/> <source>(no database present)</source> - <translation type="unfinished"></translation> + <translation>(no se encuentra la base de datos)</translation> </message> </context> <context>@@ -2707,32 +2749,47 @@ <name>QGBA::SettingsView</name>
<message> <location filename="../SettingsView.cpp" line="96"/> <source>Qt Multimedia</source> - <translation type="unfinished"></translation> + <translation>Qt Multimedia</translation> </message> <message> <location filename="../SettingsView.cpp" line="103"/> <source>SDL</source> - <translation type="unfinished"></translation> + <translation>SDL</translation> </message> <message> <location filename="../SettingsView.cpp" line="111"/> <source>Software (Qt)</source> - <translation type="unfinished"></translation> + <translation>Software (Qt)</translation> </message> <message> <location filename="../SettingsView.cpp" line="117"/> <source>OpenGL</source> - <translation type="unfinished"></translation> + <translation>OpenGL</translation> </message> <message> <location filename="../SettingsView.cpp" line="124"/> <source>OpenGL (force version 1.x)</source> - <translation type="unfinished"></translation> + <translation>OpenGL (forzar versión 1.x)</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="142"/> + <source>Keyboard</source> + <translation>Teclado</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="151"/> + <source>Controllers</source> + <translation>Mandos</translation> + </message> + <message> + <location filename="../SettingsView.cpp" line="170"/> + <source>Shortcuts</source> + <translation>Accesos directos</translation> </message> <message> <location filename="../SettingsView.cpp" line="174"/> <source>Select BIOS</source> - <translation type="unfinished"></translation> + <translation>Elegir BIOS</translation> </message> </context> <context>@@ -2740,37 +2797,37 @@ <name>QGBA::ShaderSelector</name>
<message> <location filename="../ShaderSelector.cpp" line="50"/> <source>No shader active</source> - <translation type="unfinished"></translation> + <translation>No hay programa shader activo</translation> </message> <message> <location filename="../ShaderSelector.cpp" line="63"/> <source>Load shader</source> - <translation type="unfinished"></translation> + <translation>Cargar programa shader</translation> </message> <message> <location filename="../ShaderSelector.cpp" line="63"/> <source>%1 Shader (%.shader)</source> - <translation type="unfinished"></translation> + <translation>Programa shader de %1 (%.shader)</translation> </message> <message> <location filename="../ShaderSelector.cpp" line="102"/> <source>No shader loaded</source> - <translation type="unfinished"></translation> + <translation>No hay programa shader cargado</translation> </message> <message> <location filename="../ShaderSelector.cpp" line="110"/> <source>by %1</source> - <translation type="unfinished"></translation> + <translation>por %1</translation> </message> <message> <location filename="../ShaderSelector.cpp" line="121"/> <source>Preprocessing</source> - <translation type="unfinished"></translation> + <translation>preprocesamiento</translation> </message> <message> <location filename="../ShaderSelector.cpp" line="128"/> <source>Pass %1</source> - <translation type="unfinished"></translation> + <translation>Paso %1</translation> </message> </context> <context>@@ -2778,17 +2835,17 @@ <name>QGBA::ShortcutController</name>
<message> <location filename="../ShortcutController.cpp" line="67"/> <source>Action</source> - <translation type="unfinished"></translation> + <translation>Acción</translation> </message> <message> <location filename="../ShortcutController.cpp" line="69"/> <source>Keyboard</source> - <translation type="unfinished"></translation> + <translation>Teclado</translation> </message> <message> <location filename="../ShortcutController.cpp" line="71"/> <source>Gamepad</source> - <translation type="unfinished"></translation> + <translation>Mando</translation> </message> </context> <context>@@ -2796,17 +2853,17 @@ <name>QGBA::VideoView</name>
<message> <location filename="../VideoView.cpp" line="208"/> <source>Failed to open output video file: %1</source> - <translation type="unfinished"></translation> + <translation>Error al abrir el archivo de salida de video: %1</translation> </message> <message> <location filename="../VideoView.cpp" line="226"/> <source>Native (%0x%1)</source> - <translation type="unfinished"></translation> + <translation>Nativo (%0x%1)</translation> </message> <message> <location filename="../VideoView.cpp" line="241"/> <source>Select output file</source> - <translation type="unfinished"></translation> + <translation>Elegir archivo de salida</translation> </message> </context> <context>@@ -2814,700 +2871,706 @@ <name>QGBA::Window</name>
<message> <location filename="../Window.cpp" line="340"/> <source>Game Boy Advance ROMs (%1)</source> - <translation type="unfinished"></translation> + <translation>ROMs de Game Boy Advance (%1)</translation> </message> <message> <location filename="../Window.cpp" line="356"/> <source>Game Boy ROMs (%1)</source> - <translation type="unfinished"></translation> + <translation>ROMs de Game Boy (%1)</translation> </message> <message> <location filename="../Window.cpp" line="360"/> <source>All ROMs (%1)</source> - <translation type="unfinished"></translation> + <translation>Todas las ROMs (%1)</translation> </message> <message> <location filename="../Window.cpp" line="375"/> <source>Archives (%1)</source> - <translation type="unfinished"></translation> + <translation>Archivos (%1)</translation> </message> <message> <location filename="../Window.cpp" line="380"/> <location filename="../Window.cpp" line="388"/> <location filename="../Window.cpp" line="415"/> <source>Select ROM</source> - <translation type="unfinished"></translation> + <translation>Elegir ROM</translation> </message> <message> <location filename="../Window.cpp" line="423"/> <source>Game Boy Advance save files (%1)</source> - <translation type="unfinished"></translation> + <translation>Archivos de guardado de Game Boy Advance (%1)</translation> </message> <message> <location filename="../Window.cpp" line="424"/> <location filename="../Window.cpp" line="457"/> <location filename="../Window.cpp" line="464"/> <source>Select save</source> - <translation type="unfinished"></translation> + <translation>Elegir guardado</translation> </message> <message> <location filename="../Window.cpp" line="444"/> <source>Select patch</source> - <translation type="unfinished"></translation> + <translation>Elegir parche</translation> </message> <message> <location filename="../Window.cpp" line="444"/> <source>Patches (*.ips *.ups *.bps)</source> - <translation type="unfinished"></translation> + <translation>Parches (*.ips *.ups *.bps)</translation> </message> <message> <location filename="../Window.cpp" line="457"/> <location filename="../Window.cpp" line="464"/> <source>GameShark saves (*.sps *.xps)</source> - <translation type="unfinished"></translation> + <translation>Guardados de GameShark (*.sps *.xps)</translation> </message> <message> <location filename="../Window.cpp" line="782"/> <source>Crash</source> - <translation type="unfinished"></translation> + <translation>Error fatal</translation> </message> <message> <location filename="../Window.cpp" line="783"/> <source>The game has crashed with the following error: %1</source> - <translation type="unfinished"></translation> + <translation>El juego dejó de funcionar inesperadamente debido a este error: + +%1</translation> </message> <message> <location filename="../Window.cpp" line="790"/> <source>Couldn't Load</source> - <translation type="unfinished"></translation> + <translation>No se pudo cargar</translation> </message> <message> <location filename="../Window.cpp" line="791"/> <source>Could not load game. Are you sure it's in the correct format?</source> - <translation type="unfinished"></translation> + <translation>No se pudo cargar el juego. ¿Estás seguro de que está en el formato correcto?</translation> </message> <message> <location filename="../Window.cpp" line="804"/> <source>Unimplemented BIOS call</source> - <translation type="unfinished"></translation> + <translation>Llamada a BIOS no implementada</translation> </message> <message> <location filename="../Window.cpp" line="805"/> <source>This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience.</source> - <translation type="unfinished"></translation> + <translation>Este juego hizo una llamada al BIOS que no está implementada. Usa el BIOS oficial para obtener la mejor experiencia.</translation> </message> <message> <location filename="../Window.cpp" line="812"/> <source>Really make portable?</source> - <translation type="unfinished"></translation> + <translation>¿Realmente hacer "portable"?</translation> </message> <message> <location filename="../Window.cpp" line="813"/> <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> + <translation>Esto hará que el emulador cargue su configuración desde el mismo directorio que su ejecutable. ¿Quieres continuar?</translation> </message> <message> <location filename="../Window.cpp" line="821"/> <source>Restart needed</source> - <translation type="unfinished"></translation> + <translation>Reinicio necesario</translation> </message> <message> <location filename="../Window.cpp" line="822"/> <source>Some changes will not take effect until the emulator is restarted.</source> - <translation type="unfinished"></translation> + <translation>Algunos cambios no tendrán efecto hasta que se reinicie el emulador.</translation> </message> <message> <location filename="../Window.cpp" line="869"/> <source> - Player %1 of %2</source> - <translation type="unfinished"></translation> + <translation> - Jugador %1 de %2</translation> </message> <message> <location filename="../Window.cpp" line="880"/> <source>%1 - %2</source> - <translation type="unfinished"></translation> + <translation>%1 - %2</translation> </message> <message> <location filename="../Window.cpp" line="882"/> <source>%1 - %2 - %3</source> - <translation type="unfinished"></translation> + <translation>%1 - %2 - %3</translation> </message> <message> <location filename="../Window.cpp" line="884"/> <source>%1 - %2 (%3 fps) - %4</source> - <translation type="unfinished"></translation> + <translation>%1 - %2 (%3 fps) - %4</translation> </message> <message> <location filename="../Window.cpp" line="916"/> <source>&File</source> - <translation type="unfinished"></translation> + <translation>&Archivo</translation> </message> <message> <location filename="../Window.cpp" line="919"/> <source>Load &ROM...</source> - <translation type="unfinished"></translation> + <translation>Cargar &ROM...</translation> </message> <message> <location filename="../Window.cpp" line="922"/> <source>Load ROM in archive...</source> - <translation type="unfinished"></translation> + <translation>Cargar ROM dentro de archivo...</translation> </message> <message> <location filename="../Window.cpp" line="928"/> <source>Load temporary save...</source> - <translation type="unfinished"></translation> + <translation>Cargar guardado temporal...</translation> </message> <message> <location filename="../Window.cpp" line="933"/> <source>Load &patch...</source> - <translation type="unfinished"></translation> + <translation>Cargar &parche...</translation> </message> <message> <location filename="../Window.cpp" line="935"/> <source>Boot BIOS</source> - <translation type="unfinished"></translation> + <translation>Iniciar al BIOS</translation> </message> <message> <location filename="../Window.cpp" line="942"/> <source>Replace ROM...</source> - <translation type="unfinished"></translation> + <translation>Reemplazar ROM...</translation> </message> <message> <location filename="../Window.cpp" line="944"/> <source>ROM &info...</source> - <translation type="unfinished"></translation> + <translation>&Información de ROM...</translation> </message> <message> <location filename="../Window.cpp" line="949"/> <source>Recent</source> - <translation type="unfinished"></translation> + <translation>Reciente</translation> </message> <message> <location filename="../Window.cpp" line="953"/> <source>Make portable</source> - <translation type="unfinished"></translation> + <translation>Hacer "portable"</translation> </message> <message> <location filename="../Window.cpp" line="957"/> <source>&Load state</source> - <translation type="unfinished"></translation> + <translation>Cargar captura de estado (&L)</translation> </message> <message> <location filename="../Window.cpp" line="958"/> <source>F10</source> - <translation type="unfinished"></translation> + <translation>F10</translation> </message> <message> <location filename="../Window.cpp" line="964"/> <source>&Save state</source> - <translation type="unfinished"></translation> + <translation>Guardar captura de e&stado</translation> </message> <message> <location filename="../Window.cpp" line="965"/> <source>Shift+F10</source> - <translation type="unfinished"></translation> + <translatorcomment>DO NOT TRANSLATE</translatorcomment> + <translation>Shift+F10</translation> </message> <message> <location filename="../Window.cpp" line="971"/> <source>Quick load</source> - <translation type="unfinished"></translation> + <translation>Cargado rápido</translation> </message> <message> <location filename="../Window.cpp" line="972"/> <source>Quick save</source> - <translation type="unfinished"></translation> + <translation>Guardado rápido</translation> </message> <message> <location filename="../Window.cpp" line="976"/> <source>Load recent</source> - <translation type="unfinished"></translation> + <translation>Cargar reciente</translation> </message> <message> <location filename="../Window.cpp" line="982"/> <source>Save recent</source> - <translation type="unfinished"></translation> + <translation>Guardar reciente</translation> </message> <message> <location filename="../Window.cpp" line="991"/> <source>Undo load state</source> - <translation type="unfinished"></translation> + <translation>Deshacer cargar la captura de estado</translation> </message> <message> <location filename="../Window.cpp" line="992"/> <source>F11</source> - <translation type="unfinished"></translation> + <translatorcomment>DO NOT TRANSLATE</translatorcomment> + <translation>F11</translation> </message> <message> <location filename="../Window.cpp" line="998"/> <source>Undo save state</source> - <translation type="unfinished"></translation> + <translation>Deshacer guardar la captura de estado</translation> </message> <message> <location filename="../Window.cpp" line="999"/> <source>Shift+F11</source> - <translation type="unfinished"></translation> + <translatorcomment>DO NOT TRANSLATE</translatorcomment> + <translation>Shift+F11</translation> </message> <message> <location filename="../Window.cpp" line="1010"/> <location filename="../Window.cpp" line="1017"/> <source>State &%1</source> - <translation type="unfinished"></translation> + <translation>Captura de estado &%1</translation> </message> <message> <location filename="../Window.cpp" line="1011"/> <source>F%1</source> - <translation type="unfinished"></translation> + <translation>F%1</translation> </message> <message> <location filename="../Window.cpp" line="1018"/> <source>Shift+F%1</source> - <translation type="unfinished"></translation> + <translatorcomment>DO NOT TRANSLATE</translatorcomment> + <translation>Shift+F%1</translation> </message> <message> <location filename="../Window.cpp" line="1027"/> <source>Import GameShark Save</source> - <translation type="unfinished"></translation> + <translation>Importar guardado de GameShark</translation> </message> <message> <location filename="../Window.cpp" line="1033"/> <source>Export GameShark Save</source> - <translation type="unfinished"></translation> + <translation>Exportar guardado de GameShark</translation> </message> <message> <location filename="../Window.cpp" line="1041"/> <source>New multiplayer window</source> - <translation type="unfinished"></translation> + <translation>Nueva ventana multijugador</translation> </message> <message> <location filename="../Window.cpp" line="1051"/> <source>About</source> - <translation type="unfinished"></translation> + <translation>Acerca de</translation> </message> <message> <location filename="../Window.cpp" line="1056"/> <source>E&xit</source> - <translation type="unfinished"></translation> + <translation>Salir (&X)</translation> </message> <message> <location filename="../Window.cpp" line="1059"/> <source>&Emulation</source> - <translation type="unfinished"></translation> + <translation>&Emulación</translation> </message> <message> <location filename="../Window.cpp" line="1061"/> <source>&Reset</source> - <translation type="unfinished"></translation> + <translation>&Reinicializar</translation> </message> <message> <location filename="../Window.cpp" line="1062"/> <source>Ctrl+R</source> - <translation type="unfinished"></translation> + <translation>Ctrl+R</translation> </message> <message> <location filename="../Window.cpp" line="1067"/> <source>Sh&utdown</source> - <translation type="unfinished"></translation> + <translation>Apagar (&U)</translation> </message> <message> <location filename="../Window.cpp" line="1073"/> <source>Yank game pak</source> - <translation type="unfinished"></translation> + <translation>Arrancar el game pak de su ranura</translation> </message> <message> <location filename="../Window.cpp" line="1081"/> <source>&Pause</source> - <translation type="unfinished"></translation> + <translation>&Pausar</translation> </message> <message> <location filename="../Window.cpp" line="1084"/> <source>Ctrl+P</source> - <translation type="unfinished"></translation> + <translation>Ctrl+P</translation> </message> <message> <location filename="../Window.cpp" line="1093"/> <source>&Next frame</source> - <translation type="unfinished"></translation> + <translation>Saltar al próximo cuadro (&N)</translation> </message> <message> <location filename="../Window.cpp" line="1094"/> <source>Ctrl+N</source> - <translation type="unfinished"></translation> + <translation>Ctrl+N</translation> </message> <message> <location filename="../Window.cpp" line="1105"/> <source>Fast forward (held)</source> - <translation type="unfinished"></translation> + <translation>Avance rápido (mantener)</translation> </message> <message> <location filename="../Window.cpp" line="1107"/> <source>&Fast forward</source> - <translation type="unfinished"></translation> + <translation>Avance rápido (&F)</translation> </message> <message> <location filename="../Window.cpp" line="1110"/> <source>Shift+Tab</source> - <translation type="unfinished"></translation> + <translation>Shift+Tab</translation> </message> <message> <location filename="../Window.cpp" line="1114"/> <source>Fast forward speed</source> - <translation type="unfinished"></translation> + <translation>Velocidad de avance rápido</translation> </message> <message> <location filename="../Window.cpp" line="1119"/> <source>Unbounded</source> - <translation type="unfinished"></translation> + <translation>Ilimitado</translation> </message> <message> <location filename="../Window.cpp" line="1123"/> <source>%0x</source> - <translation type="unfinished"></translation> + <translation>%0x</translation> </message> <message> <location filename="../Window.cpp" line="1131"/> <source>Rewind (held)</source> - <translation type="unfinished"></translation> + <translation>Retroceder (mantener)</translation> </message> <message> <location filename="../Window.cpp" line="1133"/> <source>Re&wind</source> - <translation type="unfinished"></translation> + <translation>Retroceder (&W)</translation> </message> <message> <location filename="../Window.cpp" line="1134"/> <source>~</source> - <translation type="unfinished"></translation> + <translation>~</translation> </message> <message> <location filename="../Window.cpp" line="1140"/> <source>Step backwards</source> - <translation type="unfinished"></translation> + <translation>Paso hacia atrás</translation> </message> <message> <location filename="../Window.cpp" line="1141"/> <source>Ctrl+B</source> - <translation type="unfinished"></translation> + <translation>Ctrl+B</translation> </message> <message> <location filename="../Window.cpp" line="1150"/> <source>Sync to &video</source> - <translation type="unfinished"></translation> + <translation>Sincronizar a &video</translation> </message> <message> <location filename="../Window.cpp" line="1157"/> <source>Sync to &audio</source> - <translation type="unfinished"></translation> + <translation>Sincronizar a &audio</translation> </message> <message> <location filename="../Window.cpp" line="1165"/> <source>Solar sensor</source> - <translation type="unfinished"></translation> + <translation>Sensor solar</translation> </message> <message> <location filename="../Window.cpp" line="1167"/> <source>Increase solar level</source> - <translation type="unfinished"></translation> + <translation>Aumentar nivel solar</translation> </message> <message> <location filename="../Window.cpp" line="1171"/> <source>Decrease solar level</source> - <translation type="unfinished"></translation> + <translation>Disminuir nivel solar</translation> </message> <message> <location filename="../Window.cpp" line="1175"/> <source>Brightest solar level</source> - <translation type="unfinished"></translation> + <translation>Nivel solar más brillante</translation> </message> <message> <location filename="../Window.cpp" line="1179"/> <source>Darkest solar level</source> - <translation type="unfinished"></translation> + <translation>Nivel solar más oscuro</translation> </message> <message> <location filename="../Window.cpp" line="1185"/> <source>Brightness %1</source> - <translation type="unfinished"></translation> + <translation>Brillo %1</translation> </message> <message> <location filename="../Window.cpp" line="1192"/> <source>Audio/&Video</source> - <translation type="unfinished"></translation> + <translation>Audio/&Video</translation> </message> <message> <location filename="../Window.cpp" line="1194"/> <source>Frame size</source> - <translation type="unfinished"></translation> + <translation>Tamaño del cuadro</translation> </message> <message> <location filename="../Window.cpp" line="1197"/> <source>%1x</source> - <translation type="unfinished"></translation> + <translation>%1x</translation> </message> <message> <location filename="../Window.cpp" line="1225"/> <source>Toggle fullscreen</source> - <translation type="unfinished"></translation> + <translation>Pantalla completa</translation> </message> <message> <location filename="../Window.cpp" line="1228"/> <source>Lock aspect ratio</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Window.cpp" line="1235"/> - <source>Resample video</source> - <translation type="unfinished"></translation> + <translation>Bloquear relación de aspecto</translation> </message> <message> <location filename="../Window.cpp" line="1241"/> <source>Frame&skip</source> - <translation type="unfinished"></translation> + <translation>&Salto de cuadros</translation> </message> <message> <location filename="../Window.cpp" line="1251"/> <source>Shader options...</source> - <translation type="unfinished"></translation> + <translation>Opciones del programa shader...</translation> </message> <message> <location filename="../Window.cpp" line="1261"/> <source>Mute</source> - <translation type="unfinished"></translation> + <translation>Silenciar</translation> </message> <message> <location filename="../Window.cpp" line="1267"/> <source>FPS target</source> - <translation type="unfinished"></translation> + <translation>Objetivo de FPS</translation> </message> <message> <location filename="../Window.cpp" line="1272"/> <source>15</source> - <translation type="unfinished"></translation> + <translation>15</translation> </message> <message> <location filename="../Window.cpp" line="1273"/> <source>30</source> - <translation type="unfinished"></translation> + <translation>30</translation> </message> <message> <location filename="../Window.cpp" line="1274"/> <source>45</source> - <translation type="unfinished"></translation> + <translation>45</translation> </message> <message> <location filename="../Window.cpp" line="1275"/> <source>Native (59.7)</source> - <translation type="unfinished"></translation> + <translation>Nativo (59.7)</translation> </message> <message> <location filename="../Window.cpp" line="1276"/> <source>60</source> - <translation type="unfinished"></translation> + <translation>60</translation> </message> <message> <location filename="../Window.cpp" line="1277"/> <source>90</source> - <translation type="unfinished"></translation> + <translation>90</translation> </message> <message> <location filename="../Window.cpp" line="1278"/> <source>120</source> - <translation type="unfinished"></translation> + <translation>120</translation> </message> <message> <location filename="../Window.cpp" line="1279"/> <source>240</source> - <translation type="unfinished"></translation> + <translation>240</translation> </message> <message> <location filename="../Window.cpp" line="1287"/> <source>Take &screenshot</source> - <translation type="unfinished"></translation> + <translation>Tomar pantallazo (&S)</translation> </message> <message> <location filename="../Window.cpp" line="1288"/> <source>F12</source> - <translation type="unfinished"></translation> + <translation>F12</translation> </message> <message> <location filename="../Window.cpp" line="1295"/> <source>Record output...</source> - <translation type="unfinished"></translation> + <translation>Grabar salida...</translation> </message> <message> <location filename="../Window.cpp" line="1302"/> <source>Record GIF...</source> - <translation type="unfinished"></translation> + <translation>Grabar GIF...</translation> </message> <message> <location filename="../Window.cpp" line="1308"/> <source>Video layers</source> - <translation type="unfinished"></translation> + <translation>Capas de video</translation> </message> <message> <location filename="../Window.cpp" line="1312"/> <source>Background %0</source> - <translation type="unfinished"></translation> + <translation>Fondo %0</translation> </message> <message> <location filename="../Window.cpp" line="1319"/> <source>OBJ (sprites)</source> - <translation type="unfinished"></translation> + <translation>OBJ (sprites)</translation> </message> <message> <location filename="../Window.cpp" line="1325"/> <source>Audio channels</source> - <translation type="unfinished"></translation> + <translation>Canales de audio</translation> </message> <message> <location filename="../Window.cpp" line="1329"/> <source>Channel %0</source> - <translation type="unfinished"></translation> + <translation>Canal %0</translation> </message> <message> <location filename="../Window.cpp" line="1336"/> <source>Channel A</source> - <translation type="unfinished"></translation> + <translation>Canal A</translation> </message> <message> <location filename="../Window.cpp" line="1342"/> <source>Channel B</source> - <translation type="unfinished"></translation> + <translation>Canal B</translation> </message> <message> <location filename="../Window.cpp" line="1348"/> <source>&Tools</source> - <translation type="unfinished"></translation> + <translation>Herramien&tas</translation> </message> <message> <location filename="../Window.cpp" line="1350"/> <source>View &logs...</source> - <translation type="unfinished"></translation> + <translation>Ver registros... (&L)</translation> </message> <message> <location filename="../Window.cpp" line="1354"/> <source>Game &overrides...</source> - <translation type="unfinished"></translation> + <translation>Val&ores específicos por juego...</translation> </message> <message> <location filename="../Window.cpp" line="1358"/> <source>Game &Pak sensors...</source> - <translation type="unfinished"></translation> + <translation>Sensores en el Game &Pak...</translation> </message> <message> <location filename="../Window.cpp" line="1362"/> <source>&Cheats...</source> - <translation type="unfinished"></translation> + <translation>Tru&cos...</translation> </message> <message> <location filename="../Window.cpp" line="1374"/> <source>Open debugger console...</source> - <translation type="unfinished"></translation> + <translation>Abrir la consola de depuración...</translation> </message> <message> <location filename="../Window.cpp" line="1380"/> <source>Start &GDB server...</source> - <translation type="unfinished"></translation> + <translation>Iniciar servidor &GDB...</translation> </message> <message> <location filename="../Window.cpp" line="1368"/> <source>Settings...</source> - <translation type="unfinished"></translation> + <translation>Ajustes...</translation> </message> <message> <location filename="../Window.cpp" line="406"/> <source>Select folder</source> - <translation type="unfinished"></translation> + <translation>Elegir carpeta</translation> </message> <message> <location filename="../Window.cpp" line="924"/> <source>Add folder to library...</source> + <translation>Agregar carpeta a la biblioteca...</translation> + </message> + <message> + <location filename="../Window.cpp" line="1235"/> + <source>Bilinear filtering</source> <translation type="unfinished"></translation> </message> <message> <location filename="../Window.cpp" line="1387"/> <source>View &palette...</source> - <translation type="unfinished"></translation> + <translation>Ver &paleta...</translation> </message> <message> <location filename="../Window.cpp" line="1392"/> <source>View &sprites...</source> - <translation type="unfinished"></translation> + <translation>Ver &sprites...</translation> </message> <message> <location filename="../Window.cpp" line="1397"/> <source>View &tiles...</source> - <translation type="unfinished"></translation> + <translation>Ver &tiles...</translation> </message> <message> <location filename="../Window.cpp" line="1402"/> <source>View memory...</source> - <translation type="unfinished"></translation> + <translation>Ver memoria...</translation> </message> <message> <location filename="../Window.cpp" line="1408"/> <source>View &I/O registers...</source> - <translation type="unfinished"></translation> + <translation>Ver reg&istros E/S...</translation> </message> <message> - <location filename="../Window.cpp" line="1465"/> + <location filename="../Window.cpp" line="1470"/> <source>Exit fullscreen</source> - <translation type="unfinished"></translation> + <translation>Salir de pantalla completa</translation> </message> <message> - <location filename="../Window.cpp" line="1470"/> + <location filename="../Window.cpp" line="1475"/> <source>Autofire</source> - <translation type="unfinished"></translation> + <translation>Botones turbo</translation> </message> <message> - <location filename="../Window.cpp" line="1477"/> + <location filename="../Window.cpp" line="1482"/> <source>Autofire A</source> - <translation type="unfinished"></translation> + <translation>Turbo A</translation> </message> <message> - <location filename="../Window.cpp" line="1483"/> + <location filename="../Window.cpp" line="1488"/> <source>Autofire B</source> - <translation type="unfinished"></translation> + <translation>Turbo B</translation> </message> <message> - <location filename="../Window.cpp" line="1489"/> + <location filename="../Window.cpp" line="1494"/> <source>Autofire L</source> - <translation type="unfinished"></translation> + <translation>Turbo L</translation> </message> <message> - <location filename="../Window.cpp" line="1495"/> + <location filename="../Window.cpp" line="1500"/> <source>Autofire R</source> - <translation type="unfinished"></translation> + <translation>Turbo R</translation> </message> <message> - <location filename="../Window.cpp" line="1501"/> + <location filename="../Window.cpp" line="1506"/> <source>Autofire Start</source> - <translation type="unfinished"></translation> + <translation>Turbo Start</translation> </message> <message> - <location filename="../Window.cpp" line="1507"/> + <location filename="../Window.cpp" line="1512"/> <source>Autofire Select</source> - <translation type="unfinished"></translation> + <translation>Turbo Select</translation> </message> <message> - <location filename="../Window.cpp" line="1513"/> + <location filename="../Window.cpp" line="1518"/> <source>Autofire Up</source> - <translation type="unfinished"></translation> + <translation>Turbo Arriba</translation> </message> <message> - <location filename="../Window.cpp" line="1519"/> + <location filename="../Window.cpp" line="1524"/> <source>Autofire Right</source> - <translation type="unfinished"></translation> + <translation>Turbo Derecha</translation> </message> <message> - <location filename="../Window.cpp" line="1525"/> + <location filename="../Window.cpp" line="1530"/> <source>Autofire Down</source> - <translation type="unfinished"></translation> + <translation>Turbo Abajo</translation> </message> <message> - <location filename="../Window.cpp" line="1531"/> + <location filename="../Window.cpp" line="1536"/> <source>Autofire Left</source> - <translation type="unfinished"></translation> + <translation>Turbo Izquierda</translation> </message> </context> <context>@@ -3515,57 +3578,57 @@ <name>ROMInfo</name>
<message> <location filename="../ROMInfo.ui" line="14"/> <source>ROM Info</source> - <translation type="unfinished"></translation> + <translation>Información de la ROM</translation> </message> <message> <location filename="../ROMInfo.ui" line="26"/> <source>Game name:</source> - <translation type="unfinished"></translation> + <translation>Nombre del juego:</translation> </message> <message> <location filename="../ROMInfo.ui" line="33"/> <source>{NAME}</source> - <translation type="unfinished"></translation> + <translation>{NAME}</translation> </message> <message> <location filename="../ROMInfo.ui" line="46"/> <source>Internal name:</source> - <translation type="unfinished"></translation> + <translation>Nombre interno:</translation> </message> <message> <location filename="../ROMInfo.ui" line="53"/> <source>{TITLE}</source> - <translation type="unfinished"></translation> + <translation>{TITLE}</translation> </message> <message> <location filename="../ROMInfo.ui" line="63"/> <source>Game ID:</source> - <translation type="unfinished"></translation> + <translation>ID del juego:</translation> </message> <message> <location filename="../ROMInfo.ui" line="70"/> <source>{ID}</source> - <translation type="unfinished"></translation> + <translation>{ID}</translation> </message> <message> <location filename="../ROMInfo.ui" line="80"/> <source>File size:</source> - <translation type="unfinished"></translation> + <translation>Tamaño del archivo:</translation> </message> <message> <location filename="../ROMInfo.ui" line="87"/> <source>{SIZE}</source> - <translation type="unfinished"></translation> + <translation>{SIZE}</translation> </message> <message> <location filename="../ROMInfo.ui" line="97"/> <source>CRC32:</source> - <translation type="unfinished"></translation> + <translation>CRC32:</translation> </message> <message> <location filename="../ROMInfo.ui" line="104"/> <source>{CRC}</source> - <translation type="unfinished"></translation> + <translation>{CRC}</translation> </message> </context> <context>@@ -3573,74 +3636,74 @@ <name>SensorView</name>
<message> <location filename="../SensorView.ui" line="20"/> <source>Sensors</source> - <translation type="unfinished"></translation> + <translation>Sensores</translation> </message> <message> <location filename="../SensorView.ui" line="31"/> <source>Realtime clock</source> - <translation type="unfinished"></translation> + <translation>Reloj en tiempo real</translation> </message> <message> <location filename="../SensorView.ui" line="37"/> <source>Fixed time</source> - <translation type="unfinished"></translation> + <translation>Hora fija</translation> </message> <message> <location filename="../SensorView.ui" line="47"/> <source>System time</source> - <translation type="unfinished"></translation> + <translation>Hora del sistema</translation> </message> <message> <location filename="../SensorView.ui" line="60"/> <source>Start time at</source> - <translation type="unfinished"></translation> + <translation>Contar desde el</translation> </message> <message> <location filename="../SensorView.ui" line="70"/> <source>Now</source> - <translation type="unfinished"></translation> + <translation>Ahora</translation> </message> <message> <location filename="../SensorView.ui" line="97"/> <source>MM/dd/yy hh:mm:ss AP</source> - <translation type="unfinished"></translation> + <translation>dd/MM/yy HH:mm:ss</translation> </message> <message> <location filename="../SensorView.ui" line="110"/> <source>Light sensor</source> - <translation type="unfinished"></translation> + <translation>Sensor de luz</translation> </message> <message> <location filename="../SensorView.ui" line="116"/> <source>Brightness</source> - <translation type="unfinished"></translation> + <translation>Brillo</translation> </message> <message> <location filename="../SensorView.ui" line="153"/> <source>Tilt sensor</source> - <translation type="unfinished"></translation> + <translation>Sensor de inclinación</translation> </message> <message> <location filename="../SensorView.ui" line="161"/> <location filename="../SensorView.ui" line="250"/> <source>Set Y</source> - <translation type="unfinished"></translation> + <translation>Config. Y</translation> </message> <message> <location filename="../SensorView.ui" line="171"/> <location filename="../SensorView.ui" line="260"/> <source>Set X</source> - <translation type="unfinished"></translation> + <translation>Config. X</translation> </message> <message> <location filename="../SensorView.ui" line="242"/> <source>Gyroscope</source> - <translation type="unfinished"></translation> + <translation>Giroscopio</translation> </message> <message> <location filename="../SensorView.ui" line="270"/> <source>Sensitivity</source> - <translation type="unfinished"></translation> + <translation>Sensibilidad</translation> </message> </context> <context>@@ -3648,347 +3711,352 @@ <name>SettingsView</name>
<message> <location filename="../SettingsView.ui" line="20"/> <source>Settings</source> - <translation type="unfinished"></translation> + <translation>Ajustes</translation> </message> <message> <location filename="../SettingsView.ui" line="45"/> <source>Audio/Video</source> - <translation type="unfinished"></translation> + <translation>Audio/Video</translation> </message> <message> <location filename="../SettingsView.ui" line="50"/> <source>Interface</source> - <translation type="unfinished"></translation> + <translation>Interfaz</translation> </message> <message> <location filename="../SettingsView.ui" line="55"/> <source>Emulation</source> - <translation type="unfinished"></translation> + <translation>Emulación</translation> </message> <message> <location filename="../SettingsView.ui" line="65"/> <source>Paths</source> - <translation type="unfinished"></translation> + <translation>Rutas</translation> </message> <message> <location filename="../SettingsView.ui" line="90"/> <source>Audio driver:</source> - <translation type="unfinished"></translation> + <translation>Controlador de audio:</translation> </message> <message> <location filename="../SettingsView.ui" line="107"/> <source>Audio buffer:</source> - <translation type="unfinished"></translation> + <translation>Búfer de audio:</translation> </message> <message> <location filename="../SettingsView.ui" line="119"/> <location filename="../SettingsView.ui" line="141"/> <source>1536</source> - <translation type="unfinished"></translation> + <translation>1536</translation> </message> <message> <location filename="../SettingsView.ui" line="126"/> <source>512</source> - <translation type="unfinished"></translation> + <translation>512</translation> </message> <message> <location filename="../SettingsView.ui" line="131"/> <source>768</source> - <translation type="unfinished"></translation> + <translation>768</translation> </message> <message> <location filename="../SettingsView.ui" line="136"/> <source>1024</source> - <translation type="unfinished"></translation> + <translation>1024</translation> </message> <message> <location filename="../SettingsView.ui" line="146"/> <source>2048</source> - <translation type="unfinished"></translation> + <translation>2048</translation> </message> <message> <location filename="../SettingsView.ui" line="151"/> <source>3072</source> - <translation type="unfinished"></translation> + <translation>3072</translation> </message> <message> <location filename="../SettingsView.ui" line="156"/> <source>4096</source> - <translation type="unfinished"></translation> + <translation>4096</translation> </message> <message> <location filename="../SettingsView.ui" line="164"/> <source>samples</source> - <translation type="unfinished"></translation> + <translation>muestras</translation> </message> <message> <location filename="../SettingsView.ui" line="173"/> <source>Sample rate:</source> - <translation type="unfinished"></translation> + <translation>Tasa de muestreo:</translation> </message> <message> <location filename="../SettingsView.ui" line="185"/> <location filename="../SettingsView.ui" line="202"/> <source>44100</source> - <translation type="unfinished"></translation> + <translation>44100</translation> </message> <message> <location filename="../SettingsView.ui" line="192"/> <source>22050</source> - <translation type="unfinished"></translation> + <translation>22050</translation> </message> <message> <location filename="../SettingsView.ui" line="197"/> <source>32000</source> - <translation type="unfinished"></translation> + <translation>32000</translation> </message> <message> <location filename="../SettingsView.ui" line="207"/> <source>48000</source> - <translation type="unfinished"></translation> + <translation>48000</translation> </message> <message> <location filename="../SettingsView.ui" line="215"/> <source>Hz</source> - <translation type="unfinished"></translation> + <translation>Hz</translation> </message> <message> <location filename="../SettingsView.ui" line="224"/> <source>Volume:</source> - <translation type="unfinished"></translation> + <translation>Volumen:</translation> </message> <message> <location filename="../SettingsView.ui" line="255"/> <source>Mute</source> - <translation type="unfinished"></translation> + <translation>Silenciar</translation> </message> <message> <location filename="../SettingsView.ui" line="271"/> <source>Display driver:</source> - <translation type="unfinished"></translation> + <translation>Controlador de video:</translation> </message> <message> <location filename="../SettingsView.ui" line="288"/> <source>Frameskip:</source> - <translation type="unfinished"></translation> + <translation>Salto de cuadros:</translation> </message> <message> <location filename="../SettingsView.ui" line="297"/> <source>Skip every</source> - <translation type="unfinished"></translation> + <translation>Saltar cada</translation> </message> <message> <location filename="../SettingsView.ui" line="307"/> <location filename="../SettingsView.ui" line="532"/> <source>frames</source> - <translation type="unfinished"></translation> + <translation>cuadros</translation> </message> <message> <location filename="../SettingsView.ui" line="316"/> <source>FPS target:</source> - <translation type="unfinished"></translation> + <translation>Objetivo de FPS:</translation> </message> <message> <location filename="../SettingsView.ui" line="338"/> <source>frames per second</source> - <translation type="unfinished"></translation> + <translation>cuadros por segundo</translation> </message> <message> <location filename="../SettingsView.ui" line="354"/> <source>Sync:</source> - <translation type="unfinished"></translation> + <translation>SIncronizar a:</translation> </message> <message> <location filename="../SettingsView.ui" line="363"/> <source>Video</source> - <translation type="unfinished"></translation> + <translation>Video</translation> </message> <message> <location filename="../SettingsView.ui" line="370"/> <source>Audio</source> - <translation type="unfinished"></translation> + <translation>Audio</translation> </message> <message> <location filename="../SettingsView.ui" line="379"/> <source>Lock aspect ratio</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../SettingsView.ui" line="386"/> - <source>Resample video</source> - <translation type="unfinished"></translation> + <translation>Bloquear relación de aspecto</translation> </message> <message> <location filename="../SettingsView.ui" line="421"/> <source>Library:</source> - <translation type="unfinished"></translation> + <translation>Biblioteca:</translation> </message> <message> <location filename="../SettingsView.ui" line="428"/> <source>Show when no game open</source> - <translation type="unfinished"></translation> + <translation>Mostrar al no haber juego abierto</translation> </message> <message> <location filename="../SettingsView.ui" line="445"/> <source>Clear cache</source> - <translation type="unfinished"></translation> + <translation>Limpiar caché</translation> </message> <message> <location filename="../SettingsView.ui" line="459"/> <source>Fast forward speed:</source> - <translation type="unfinished"></translation> + <translation>Velocidad de avance rápido:</translation> </message> <message> - <location filename="../SettingsView.ui" line="679"/> - <location filename="../SettingsView.ui" line="717"/> - <location filename="../SettingsView.ui" line="752"/> - <location filename="../SettingsView.ui" line="793"/> - <location filename="../SettingsView.ui" line="841"/> - <location filename="../SettingsView.ui" line="889"/> - <location filename="../SettingsView.ui" line="937"/> + <location filename="../SettingsView.ui" line="689"/> + <location filename="../SettingsView.ui" line="727"/> + <location filename="../SettingsView.ui" line="762"/> + <location filename="../SettingsView.ui" line="803"/> + <location filename="../SettingsView.ui" line="851"/> + <location filename="../SettingsView.ui" line="899"/> + <location filename="../SettingsView.ui" line="947"/> <source>Browse</source> - <translation type="unfinished"></translation> + <translation>Examinar</translation> </message> <message> - <location filename="../SettingsView.ui" line="688"/> + <location filename="../SettingsView.ui" line="698"/> <source>Use BIOS file if found</source> - <translation type="unfinished"></translation> + <translation>Usar archivo BIOS si hay</translation> </message> <message> - <location filename="../SettingsView.ui" line="698"/> + <location filename="../SettingsView.ui" line="708"/> <source>Skip BIOS intro</source> - <translation type="unfinished"></translation> + <translation>Saltar pantalla de inicio de la BIOS</translation> </message> <message> <location filename="../SettingsView.ui" line="471"/> <source>×</source> - <translation type="unfinished"></translation> + <translation>×</translation> </message> <message> <location filename="../SettingsView.ui" line="490"/> <source>Unbounded</source> - <translation type="unfinished"></translation> + <translation>Ilimitado</translation> </message> <message> <location filename="../SettingsView.ui" line="404"/> <source>Suspend screensaver</source> - <translation type="unfinished"></translation> + <translation>No permitir protector de pantalla</translation> </message> <message> <location filename="../SettingsView.ui" line="60"/> <source>BIOS</source> - <translation type="unfinished"></translation> + <translation>BIOS</translation> </message> <message> <location filename="../SettingsView.ui" line="414"/> <source>Pause when inactive</source> - <translation type="unfinished"></translation> + <translation>Pausar al estar inactivo</translation> </message> <message> <location filename="../SettingsView.ui" line="556"/> <source>Run all</source> - <translation type="unfinished"></translation> + <translation>Ejecutar todos</translation> </message> <message> <location filename="../SettingsView.ui" line="561"/> <source>Remove known</source> - <translation type="unfinished"></translation> + <translation>Eliminar los conocidos</translation> </message> <message> <location filename="../SettingsView.ui" line="566"/> <source>Detect and remove</source> - <translation type="unfinished"></translation> + <translation>Detectar y eliminar</translation> </message> <message> <location filename="../SettingsView.ui" line="397"/> <source>Allow opposing input directions</source> - <translation type="unfinished"></translation> + <translation>Permitir direcciones opuestas</translation> </message> <message> <location filename="../SettingsView.ui" line="588"/> <location filename="../SettingsView.ui" line="625"/> <source>Screenshot</source> - <translation type="unfinished"></translation> + <translation>Pantallazo</translation> </message> <message> <location filename="../SettingsView.ui" line="598"/> <location filename="../SettingsView.ui" line="635"/> <source>Save data</source> - <translation type="unfinished"></translation> + <translation>Datos de guardado</translation> </message> <message> <location filename="../SettingsView.ui" line="608"/> <location filename="../SettingsView.ui" line="642"/> <source>Cheat codes</source> - <translation type="unfinished"></translation> + <translation>Trucos</translation> </message> <message> <location filename="../SettingsView.ui" line="509"/> <source>Enable rewind</source> + <translation>Habilitar retroceso</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="386"/> + <source>Bilinear filtering</source> <translation type="unfinished"></translation> </message> <message> <location filename="../SettingsView.ui" line="516"/> <source>Rewind history:</source> - <translation type="unfinished"></translation> + <translation>Historial de retroceso:</translation> </message> <message> <location filename="../SettingsView.ui" line="548"/> <source>Idle loops:</source> - <translation type="unfinished"></translation> + <translation>Bucles inactivos:</translation> </message> <message> <location filename="../SettingsView.ui" line="581"/> <source>Savestate extra data:</source> - <translation type="unfinished"></translation> + <translation>Datos extras en capturas de estado:</translation> </message> <message> <location filename="../SettingsView.ui" line="618"/> <source>Load extra data:</source> + <translation>Cargar datos extra:</translation> + </message> + <message> + <location filename="../SettingsView.ui" line="656"/> + <source>Rewind affects save data</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="660"/> + <location filename="../SettingsView.ui" line="670"/> <source>GB BIOS file:</source> - <translation type="unfinished"></translation> + <translation>Archivo de BIOS GB:</translation> </message> <message> - <location filename="../SettingsView.ui" line="726"/> + <location filename="../SettingsView.ui" line="736"/> <source>GBA BIOS file:</source> - <translation type="unfinished"></translation> + <translation>Archivo de BIOS GBA:</translation> </message> <message> - <location filename="../SettingsView.ui" line="733"/> + <location filename="../SettingsView.ui" line="743"/> <source>GBC BIOS file:</source> - <translation type="unfinished"></translation> + <translation>Archivo de BIOS GBC:</translation> </message> <message> - <location filename="../SettingsView.ui" line="768"/> + <location filename="../SettingsView.ui" line="778"/> <source>Save games</source> - <translation type="unfinished"></translation> + <translation>Guardados de juego</translation> </message> <message> - <location filename="../SettingsView.ui" line="802"/> - <location filename="../SettingsView.ui" line="850"/> - <location filename="../SettingsView.ui" line="898"/> - <location filename="../SettingsView.ui" line="946"/> + <location filename="../SettingsView.ui" line="812"/> + <location filename="../SettingsView.ui" line="860"/> + <location filename="../SettingsView.ui" line="908"/> + <location filename="../SettingsView.ui" line="956"/> <source>Same directory as the ROM</source> - <translation type="unfinished"></translation> + <translation>Mismo directorio de la ROM</translation> </message> <message> - <location filename="../SettingsView.ui" line="816"/> + <location filename="../SettingsView.ui" line="826"/> <source>Save states</source> - <translation type="unfinished"></translation> + <translation>Capturas de estado</translation> </message> <message> - <location filename="../SettingsView.ui" line="864"/> + <location filename="../SettingsView.ui" line="874"/> <source>Screenshots</source> - <translation type="unfinished"></translation> + <translation>Pantallazos</translation> </message> <message> - <location filename="../SettingsView.ui" line="912"/> + <location filename="../SettingsView.ui" line="922"/> <source>Patches</source> - <translation type="unfinished"></translation> + <translation>Parches</translation> </message> </context> <context>@@ -3996,37 +4064,37 @@ <name>ShaderSelector</name>
<message> <location filename="../ShaderSelector.ui" line="14"/> <source>Shaders</source> - <translation type="unfinished"></translation> + <translation>Programas shader</translation> </message> <message> <location filename="../ShaderSelector.ui" line="28"/> <source>Active Shader:</source> - <translation type="unfinished"></translation> + <translation>Programa shader activo:</translation> </message> <message> <location filename="../ShaderSelector.ui" line="35"/> <source>Name</source> - <translation type="unfinished"></translation> + <translation>Nombre</translation> </message> <message> <location filename="../ShaderSelector.ui" line="45"/> <source>Author</source> - <translation type="unfinished"></translation> + <translation>Autor</translation> </message> <message> <location filename="../ShaderSelector.ui" line="62"/> <source>Description</source> - <translation type="unfinished"></translation> + <translation>Descripción</translation> </message> <message> <location filename="../ShaderSelector.ui" line="88"/> <source>Unload Shader</source> - <translation type="unfinished"></translation> + <translation>Cerrar programa shader</translation> </message> <message> <location filename="../ShaderSelector.ui" line="95"/> <source>Load New Shader</source> - <translation type="unfinished"></translation> + <translation>Cargar nuevo p. shader</translation> </message> </context> <context>@@ -4034,22 +4102,22 @@ <name>ShortcutView</name>
<message> <location filename="../ShortcutView.ui" line="14"/> <source>Edit Shortcuts</source> - <translation type="unfinished"></translation> + <translation>Editar accesos directos de teclado</translation> </message> <message> <location filename="../ShortcutView.ui" line="29"/> <source>Keyboard</source> - <translation type="unfinished"></translation> + <translation>Teclado</translation> </message> <message> <location filename="../ShortcutView.ui" line="39"/> <source>Gamepad</source> - <translation type="unfinished"></translation> + <translation>Mando</translation> </message> <message> <location filename="../ShortcutView.ui" line="46"/> <source>Clear</source> - <translation type="unfinished"></translation> + <translation>Limpiar</translation> </message> </context> <context>@@ -4057,22 +4125,22 @@ <name>TileView</name>
<message> <location filename="../TileView.ui" line="14"/> <source>Tiles</source> - <translation type="unfinished"></translation> + <translation>Tiles</translation> </message> <message> <location filename="../TileView.ui" line="20"/> <source>256 colors</source> - <translation type="unfinished"></translation> + <translation>256 colores</translation> </message> <message> <location filename="../TileView.ui" line="70"/> <source>×</source> - <translation type="unfinished"></translation> + <translation>×</translation> </message> <message> <location filename="../TileView.ui" line="83"/> <source>Magnification</source> - <translation type="unfinished"></translation> + <translation>Magnificación</translation> </message> </context> <context>@@ -4080,183 +4148,183 @@ <name>VideoView</name>
<message> <location filename="../VideoView.ui" line="20"/> <source>Record Video</source> - <translation type="unfinished"></translation> + <translation>Grabar video</translation> </message> <message> <location filename="../VideoView.ui" line="40"/> <source>Start</source> - <translation type="unfinished"></translation> + <translation>Iniciar</translation> </message> <message> <location filename="../VideoView.ui" line="56"/> <source>Stop</source> - <translation type="unfinished"></translation> + <translation>Detener</translation> </message> <message> <location filename="../VideoView.ui" line="69"/> <source>Select File</source> - <translation type="unfinished"></translation> + <translation>Elegir archivo</translation> </message> <message> <location filename="../VideoView.ui" line="101"/> <source>Presets</source> - <translation type="unfinished"></translation> + <translation>Ajustes predeterminados</translation> </message> <message> <location filename="../VideoView.ui" line="109"/> <source>High Quality</source> - <translation type="unfinished"></translation> + <translation>Alta calidad</translation> </message> <message> <location filename="../VideoView.ui" line="119"/> <source>YouTube</source> - <translation type="unfinished"></translation> + <translation>YouTube</translation> </message> <message> <location filename="../VideoView.ui" line="129"/> <location filename="../VideoView.ui" line="237"/> <source>WebM</source> - <translation type="unfinished"></translation> + <translation>WebM</translation> </message> <message> <location filename="../VideoView.ui" line="139"/> <source>Lossless</source> - <translation type="unfinished"></translation> + <translation>Sin pérdidas</translation> </message> <message> <location filename="../VideoView.ui" line="156"/> <source>1080p</source> - <translation type="unfinished"></translation> + <translation>1080p</translation> </message> <message> <location filename="../VideoView.ui" line="166"/> <source>720p</source> - <translation type="unfinished"></translation> + <translation>720p</translation> </message> <message> <location filename="../VideoView.ui" line="176"/> <source>480p</source> - <translation type="unfinished"></translation> + <translation>480p</translation> </message> <message> <location filename="../VideoView.ui" line="189"/> <source>Native</source> - <translation type="unfinished"></translation> + <translation>Nativo</translation> </message> <message> <location filename="../VideoView.ui" line="222"/> <source>Format</source> - <translation type="unfinished"></translation> + <translation>Formato</translation> </message> <message> <location filename="../VideoView.ui" line="232"/> <source>MKV</source> - <translation type="unfinished"></translation> + <translation>MKV</translation> </message> <message> <location filename="../VideoView.ui" line="242"/> <source>AVI</source> - <translation type="unfinished"></translation> + <translation>AVI</translation> </message> <message> <location filename="../VideoView.ui" line="247"/> <source>MP4</source> - <translation type="unfinished"></translation> + <translation>MP4</translation> </message> <message> <location filename="../VideoView.ui" line="259"/> <source>PNG</source> - <translation type="unfinished"></translation> + <translation>PNG</translation> </message> <message> <location filename="../VideoView.ui" line="264"/> <source>h.264</source> - <translation type="unfinished"></translation> + <translation>h.264</translation> </message> <message> <location filename="../VideoView.ui" line="269"/> <source>VP8</source> - <translation type="unfinished"></translation> + <translation></translation> </message> <message> <location filename="../VideoView.ui" line="274"/> <source>Xvid</source> - <translation type="unfinished"></translation> + <translation>Xvid</translation> </message> <message> <location filename="../VideoView.ui" line="279"/> <source>FFV1</source> - <translation type="unfinished"></translation> + <translation>FFV1</translation> </message> <message> <location filename="../VideoView.ui" line="291"/> <source>FLAC</source> - <translation type="unfinished"></translation> + <translation>FLAC</translation> </message> <message> <location filename="../VideoView.ui" line="296"/> <source>Opus</source> - <translation type="unfinished"></translation> + <translation>Opus</translation> </message> <message> <location filename="../VideoView.ui" line="301"/> <source>Vorbis</source> - <translation type="unfinished"></translation> + <translation>Vorbis</translation> </message> <message> <location filename="../VideoView.ui" line="306"/> <source>MP3</source> - <translation type="unfinished"></translation> + <translation>MP3</translation> </message> <message> <location filename="../VideoView.ui" line="311"/> <source>AAC</source> - <translation type="unfinished"></translation> + <translation>AAC</translation> </message> <message> <location filename="../VideoView.ui" line="316"/> <source>Uncompressed</source> - <translation type="unfinished"></translation> + <translation>Sin comprimir</translation> </message> <message> <location filename="../VideoView.ui" line="327"/> <source> Bitrate (kbps)</source> - <translation type="unfinished"></translation> + <translation>Tasa de bits (kbps)</translation> </message> <message> <location filename="../VideoView.ui" line="333"/> <source>VBR </source> - <translation type="unfinished"></translation> + <translation>VBR </translation> </message> <message> <location filename="../VideoView.ui" line="381"/> <source>ABR</source> - <translation type="unfinished"></translation> + <translation>ABR</translation> </message> <message> <location filename="../VideoView.ui" line="397"/> <source>Dimensions</source> - <translation type="unfinished"></translation> + <translation>Dimensiones</translation> </message> <message> <location filename="../VideoView.ui" line="403"/> <source>:</source> - <translation type="unfinished"></translation> + <translation>:</translation> </message> <message> <location filename="../VideoView.ui" line="413"/> <source>×</source> - <translation type="unfinished"></translation> + <translation>×</translation> </message> <message> <location filename="../VideoView.ui" line="463"/> <source>Lock aspect ratio</source> - <translation type="unfinished"></translation> + <translation>Bloquear relación de aspecto</translation> </message> <message> <location filename="../VideoView.ui" line="478"/> <source>Show advanced</source> - <translation type="unfinished"></translation> + <translation>Mostrar ajustes avanzados</translation> </message> </context> </TS>
@@ -43,6 +43,7 @@ struct mCoreOptions opts = {
.useBios = true, .rewindEnable = true, .rewindBufferCapacity = 600, + .rewindSave = true, .audioBuffers = 1024, .videoSync = false, .audioSync = true,
@@ -14,7 +14,7 @@ #include <mgba/core/blip_buf.h>
#define BUFFER_SIZE (GBA_AUDIO_SAMPLES >> 2) -mLOG_DEFINE_CATEGORY(SDL_AUDIO, "SDL Audio"); +mLOG_DEFINE_CATEGORY(SDL_AUDIO, "SDL Audio", "platform.sdl.audio"); static void _mSDLAudioCallback(void* context, Uint8* data, int len);
@@ -25,7 +25,7 @@ #define GYRO_STEPS 100
#define RUMBLE_PWM 16 #define RUMBLE_STEPS 2 -mLOG_DEFINE_CATEGORY(SDL_EVENTS, "SDL Events"); +mLOG_DEFINE_CATEGORY(SDL_EVENTS, "SDL Events", "platform.sdl.events"); DEFINE_VECTOR(SDL_JoystickList, struct SDL_JoystickCombo);
@@ -18,6 +18,11 @@ void (*handler)(const char* section, void* data);
void* data; }; +struct ConfigurationHandlerData { + void (*handler)(const char* key, const char* value, void* data); + void* data; +}; + static void _tableDeinit(void* table) { TableDeinit(table); free(table);@@ -61,6 +66,11 @@ static void _sectionEnumHandler(const char* key, void* section, void* user) {
struct ConfigurationSectionHandlerData* data = user; UNUSED(section); data->handler(key, data->data); +} + +static void _enumHandler(const char* key, void* value, void* user) { + struct ConfigurationHandlerData* data = user; + data->handler(key, value, data->data); } void ConfigurationInit(struct Configuration* configuration) {@@ -199,3 +209,14 @@ void ConfigurationEnumerateSections(const struct Configuration* configuration, void (*handler)(const char* sectionName, void* user), void* user) {
struct ConfigurationSectionHandlerData handlerData = { handler, user }; HashTableEnumerate(&configuration->sections, _sectionEnumHandler, &handlerData); } + +void ConfigurationEnumerate(const struct Configuration* configuration, const char* section, void (*handler)(const char* key, const char* value, void* user), void* user) { + struct ConfigurationHandlerData handlerData = { handler, user }; + const struct Table* currentSection = &configuration->root; + if (section) { + currentSection = HashTableLookup(&configuration->sections, section); + } + if (currentSection) { + HashTableEnumerate(currentSection, _enumHandler, &handlerData); + } +}
@@ -87,6 +87,9 @@ while (true) {
if (patch->vf->read(patch->vf, &byte, 1) != 1) { return false; } + if (offset >= outSize) { + return false; + } buf[offset] ^= byte; ++offset; if (!byte) {
@@ -51,6 +51,40 @@ png_write_info(png, info);
return info; } +png_infop PNGWriteHeader8(png_structp png, unsigned width, unsigned height) { + png_infop info = png_create_info_struct(png); + if (!info) { + return 0; + } + if (setjmp(png_jmpbuf(png))) { + return 0; + } + png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + return info; +} + +bool PNGWritePalette(png_structp png, png_infop info, const uint32_t* palette, unsigned entries) { + if (!palette || !entries) { + return false; + } + if (setjmp(png_jmpbuf(png))) { + return false; + } + png_color colors[256]; + png_byte trans[256]; + unsigned i; + for (i = 0; i < entries && i < 256; ++i) { + colors[i].red = palette[i]; + colors[i].green = palette[i] >> 8; + colors[i].blue = palette[i] >> 16; + trans[i] = palette[i] >> 24; + } + png_set_PLTE(png, info, colors, entries); + png_set_tRNS(png, info, trans, entries, NULL); + png_write_info(png, info); + return true; +} + bool PNGWritePixels(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels) { png_bytep row = malloc(sizeof(png_byte) * width * 3); if (!row) {@@ -91,6 +125,19 @@ }
png_write_row(png, row); } free(row); + return true; +} + +bool PNGWritePixels8(png_structp png, unsigned width, unsigned height, unsigned stride, const void* pixels) { + UNUSED(width); + const png_byte* pixelData = pixels; + if (setjmp(png_jmpbuf(png))) { + return false; + } + unsigned i; + for (i = 0; i < height; ++i) { + png_write_row(png, &pixelData[stride * i]); + } return true; }
@@ -48,6 +48,15 @@ }
return strcmp(&s1[len - endLen], end) == 0; } +bool startswith(const char* restrict s1, const char* restrict start) { + size_t len = strlen(s1); + size_t startLen = strlen(start); + if (len < startLen) { + return false; + } + return strncmp(s1, start, startLen) == 0; +} + uint32_t utf16Char(const uint16_t** unicode, size_t* length) { if (*length < 2) { *length = 0;
@@ -96,6 +96,7 @@ continue
if os.access(newPath, os.F_OK): if verbose: print('Skipping copying {}, already done.'.format(oldPath)) + newPath = None elif os.path.abspath(oldPath) != os.path.abspath(newPath): if verbose: print('Copying {} to {}...'.format(oldPath, newPath))@@ -111,7 +112,8 @@ print('Found Qt path at {}.'.format(qtPath))
args = [installNameTool] for path, oldExecPath, newExecPath in toUpdate: if path != bin: - updateMachO(path, execPath, root) + if path: + updateMachO(path, execPath, root) if verbose: print('Updating Mach-O load from {} to {}...'.format(oldExecPath, newExecPath)) args.extend(['-change', oldExecPath, newExecPath])