Merge branch 'master' (early part) into medusa

This commit is contained in:
Vicki Pfau 2019-09-28 15:55:27 -07:00
commit bb78133b21
19 changed files with 780 additions and 553 deletions

View File

@ -40,6 +40,7 @@ Features:
- Support for unlicensed Wisdom Tree Game Boy mapper - Support for unlicensed Wisdom Tree Game Boy mapper
- Qt: Add export button for tile view (closes mgba.io/i/1507) - Qt: Add export button for tile view (closes mgba.io/i/1507)
- Qt: Add recent game list clearing (closes mgba.io/i/1380) - Qt: Add recent game list clearing (closes mgba.io/i/1380)
- GB: Yanking gamepak now supported
Emulation fixes: Emulation fixes:
- GBA: All IRQs have 7 cycle delay (fixes mgba.io/i/539, mgba.io/i/1208) - GBA: All IRQs have 7 cycle delay (fixes mgba.io/i/539, mgba.io/i/1208)
- GBA: Reset now reloads multiboot ROMs - GBA: Reset now reloads multiboot ROMs
@ -58,6 +59,7 @@ Emulation fixes:
- GB: Fix savedata initialization (fixes mgba.io/i/1473, mgba.io/i/1478) - GB: Fix savedata initialization (fixes mgba.io/i/1473, mgba.io/i/1478)
- GB Memory: Better emulate 0xFEA0 region on DMG, MGB and AGB - GB Memory: Better emulate 0xFEA0 region on DMG, MGB and AGB
- GB Printer: Reset printer buffer index after printing - GB Printer: Reset printer buffer index after printing
- GB Video: Fix mode 0 window edge case (fixes mgba.io/i/1519)
Other fixes: Other fixes:
- Qt: Fix some Qt display driver race conditions - Qt: Fix some Qt display driver race conditions
- Core: Improved lockstep driver reliability (Le Hoang Quyen) - Core: Improved lockstep driver reliability (Le Hoang Quyen)
@ -75,7 +77,7 @@ Other fixes:
- GBA Cheats: Fix value incrementing in CB slide codes (fixes mgba.io/i/1501) - GBA Cheats: Fix value incrementing in CB slide codes (fixes mgba.io/i/1501)
- Qt: Only show emulator restart warning once per settings saving - Qt: Only show emulator restart warning once per settings saving
- Qt: Improve cheat view UX - Qt: Improve cheat view UX
- GB: Fix SGB controller selection initialization (fixes mgba.io/i/1104) - GB: Fix SGB controller incrementing (fixes mgba.io/i/1104)
Misc: Misc:
- GBA Savedata: EEPROM performance fixes - GBA Savedata: EEPROM performance fixes
- GBA Savedata: Automatically map 1Mbit Flash files as 1Mbit Flash - GBA Savedata: Automatically map 1Mbit Flash files as 1Mbit Flash

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

View File

@ -94,6 +94,7 @@ struct GB {
bool isPristine; bool isPristine;
size_t pristineRomSize; size_t pristineRomSize;
size_t yankedRomSize; size_t yankedRomSize;
enum GBMemoryBankControllerType yankedMbc;
uint32_t romCrc32; uint32_t romCrc32;
struct VFile* romVf; struct VFile* romVf;
struct VFile* biosVf; struct VFile* biosVf;
@ -109,6 +110,7 @@ struct GB {
uint8_t sgbPacket[16]; uint8_t sgbPacket[16];
uint8_t sgbControllers; uint8_t sgbControllers;
uint8_t sgbCurrentController; uint8_t sgbCurrentController;
bool sgbIncrement;
struct mCoreCallbacksList coreCallbacks; struct mCoreCallbacksList coreCallbacks;
struct mAVStream* stream; struct mAVStream* stream;
@ -162,6 +164,7 @@ bool GBLoadROM(struct GB* gb, struct VFile* vf);
bool GBLoadSave(struct GB* gb, struct VFile* vf); bool GBLoadSave(struct GB* gb, struct VFile* vf);
void GBUnloadROM(struct GB* gb); void GBUnloadROM(struct GB* gb);
void GBSynthesizeROM(struct VFile* vf); void GBSynthesizeROM(struct VFile* vf);
void GBYankROM(struct GB* gb);
void GBLoadBIOS(struct GB* gb, struct VFile* vf); void GBLoadBIOS(struct GB* gb, struct VFile* vf);

View File

@ -263,6 +263,7 @@ DECL_BITS(GBSerializedSGBFlags, RenderMode, 2, 2);
DECL_BITS(GBSerializedSGBFlags, BufferIndex, 4, 3); DECL_BITS(GBSerializedSGBFlags, BufferIndex, 4, 3);
DECL_BITS(GBSerializedSGBFlags, CurrentController, 7, 2); DECL_BITS(GBSerializedSGBFlags, CurrentController, 7, 2);
DECL_BITS(GBSerializedSGBFlags, ReqControllers, 9, 2); DECL_BITS(GBSerializedSGBFlags, ReqControllers, 9, 2);
DECL_BIT(GBSerializedSGBFlags, Increment, 11);
#pragma pack(push, 1) #pragma pack(push, 1)
struct GBSerializedState { struct GBSerializedState {

View File

@ -127,6 +127,19 @@ bool GBLoadROM(struct GB* gb, struct VFile* vf) {
return true; return true;
} }
void GBYankROM(struct GB* gb) {
gb->yankedRomSize = gb->memory.romSize;
gb->yankedMbc = gb->memory.mbcType;
gb->memory.romSize = 0;
gb->memory.mbcType = GB_MBC_NONE;
gb->memory.sramAccess = false;
if (gb->cpu) {
struct LR35902Core* cpu = gb->cpu;
cpu->memory.setActiveRegion(cpu, cpu->pc);
}
}
static void GBSramDeinit(struct GB* gb) { static void GBSramDeinit(struct GB* gb) {
if (gb->sramVf) { if (gb->sramVf) {
gb->sramVf->unmap(gb->sramVf, gb->memory.sram, gb->sramSize); gb->sramVf->unmap(gb->sramVf, gb->memory.sram, gb->sramSize);
@ -430,13 +443,15 @@ void GBReset(struct LR35902Core* cpu) {
if (gb->yankedRomSize) { if (gb->yankedRomSize) {
gb->memory.romSize = gb->yankedRomSize; gb->memory.romSize = gb->yankedRomSize;
gb->memory.mbcType = gb->yankedMbc;
gb->yankedRomSize = 0; gb->yankedRomSize = 0;
} }
gb->sgbBit = -1; gb->sgbBit = -1;
gb->sgbControllers = 0; gb->sgbControllers = 0;
gb->sgbCurrentController = 3; gb->sgbCurrentController = 0;
gb->currentSgbBits = 0; gb->currentSgbBits = 0;
gb->sgbIncrement = false;
memset(gb->sgbPacket, 0, sizeof(gb->sgbPacket)); memset(gb->sgbPacket, 0, sizeof(gb->sgbPacket));
mTimingClear(&gb->timing); mTimingClear(&gb->timing);

View File

@ -115,23 +115,21 @@ static void _writeSGBBits(struct GB* gb, int bits) {
if (bits == gb->currentSgbBits) { if (bits == gb->currentSgbBits) {
return; return;
} }
gb->currentSgbBits = bits; switch (bits) {
if (gb->sgbBit > 128) { case 0:
switch (bits) { case 1:
case 1: if (gb->currentSgbBits & 2) {
gb->sgbBit |= 2; gb->sgbIncrement = !gb->sgbIncrement;
break;
case 2:
gb->sgbBit |= 4;
break;
case 3:
if (gb->sgbBit == 135) {
gb->sgbBit &= ~6;
gb->sgbCurrentController = (gb->sgbCurrentController + 1) & gb->sgbControllers;
}
break;
} }
break;
case 3:
if (gb->sgbIncrement) {
gb->sgbIncrement = false;
gb->sgbCurrentController = (gb->sgbCurrentController + 1) & gb->sgbControllers;
}
break;
} }
gb->currentSgbBits = bits;
if (gb->sgbBit == 128 && bits == 2) { if (gb->sgbBit == 128 && bits == 2) {
GBVideoWriteSGBPacket(&gb->video, gb->sgbPacket); GBVideoWriteSGBPacket(&gb->video, gb->sgbPacket);
++gb->sgbBit; ++gb->sgbBit;
@ -460,6 +458,9 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) {
value = gb->video.stat; value = gb->video.stat;
break; break;
case 0x50: case 0x50:
if (gb->memory.io[0x50] != 0xFF) {
break;
}
GBUnmapBIOS(gb); GBUnmapBIOS(gb);
if (gb->model >= GB_MODEL_CGB && gb->memory.io[REG_UNK4C] < 0x80) { if (gb->model >= GB_MODEL_CGB && gb->memory.io[REG_UNK4C] < 0x80) {
gb->model = GB_MODEL_DMG; gb->model = GB_MODEL_DMG;
@ -535,13 +536,13 @@ void GBIOWrite(struct GB* gb, unsigned address, uint8_t value) {
static uint8_t _readKeys(struct GB* gb) { static uint8_t _readKeys(struct GB* gb) {
uint8_t keys = *gb->keySource; uint8_t keys = *gb->keySource;
if (gb->sgbCurrentController & gb->sgbControllers) { if (gb->sgbCurrentController != 0) {
keys = 0; keys = 0;
} }
uint8_t joyp = gb->memory.io[REG_JOYP]; uint8_t joyp = gb->memory.io[REG_JOYP];
switch (joyp & 0x30) { switch (joyp & 0x30) {
case 0x30: case 0x30:
keys = gb->sgbCurrentController & gb->sgbControllers; keys = gb->sgbCurrentController;
break; break;
case 0x20: case 0x20:
keys >>= 4; keys >>= 4;

View File

@ -16,6 +16,8 @@
mLOG_DEFINE_CATEGORY(GB_MEM, "GB Memory", "gb.memory"); mLOG_DEFINE_CATEGORY(GB_MEM, "GB Memory", "gb.memory");
static const uint8_t _yankBuffer[] = { 0xFF };
enum GBBus { enum GBBus {
GB_BUS_CPU, GB_BUS_CPU,
GB_BUS_MAIN, GB_BUS_MAIN,
@ -69,6 +71,14 @@ static void GBSetActiveRegion(struct LR35902Core* cpu, uint16_t address) {
cpu->memory.activeRegion = memory->romBase; cpu->memory.activeRegion = memory->romBase;
cpu->memory.activeRegionEnd = GB_BASE_CART_BANK1; cpu->memory.activeRegionEnd = GB_BASE_CART_BANK1;
cpu->memory.activeMask = GB_SIZE_CART_BANK0 - 1; cpu->memory.activeMask = GB_SIZE_CART_BANK0 - 1;
if (gb->memory.romSize < GB_SIZE_CART_BANK0) {
if (address >= gb->memory.romSize) {
cpu->memory.activeRegion = _yankBuffer;
cpu->memory.activeMask = 0;
} else {
cpu->memory.activeRegionEnd = gb->memory.romSize;
}
}
break; break;
case GB_REGION_CART_BANK1: case GB_REGION_CART_BANK1:
case GB_REGION_CART_BANK1 + 1: case GB_REGION_CART_BANK1 + 1:
@ -89,6 +99,14 @@ static void GBSetActiveRegion(struct LR35902Core* cpu, uint16_t address) {
cpu->memory.activeRegionEnd = GB_BASE_CART_BANK1 + 0x2000; cpu->memory.activeRegionEnd = GB_BASE_CART_BANK1 + 0x2000;
} }
} }
if (gb->memory.romSize < GB_SIZE_CART_BANK0 * 2) {
if (address >= gb->memory.romSize) {
cpu->memory.activeRegion = _yankBuffer;
cpu->memory.activeMask = 0;
} else {
cpu->memory.activeRegionEnd = gb->memory.romSize;
}
}
break; break;
default: default:
cpu->memory.cpuLoad8 = GBLoad8; cpu->memory.cpuLoad8 = GBLoad8;
@ -243,6 +261,9 @@ uint8_t GBLoad8(struct LR35902Core* cpu, uint16_t address) {
case GB_REGION_CART_BANK0 + 1: case GB_REGION_CART_BANK0 + 1:
case GB_REGION_CART_BANK0 + 2: case GB_REGION_CART_BANK0 + 2:
case GB_REGION_CART_BANK0 + 3: case GB_REGION_CART_BANK0 + 3:
if (address >= memory->romSize) {
return 0xFF;
}
return memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)]; return memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)];
case GB_REGION_CART_BANK1 + 2: case GB_REGION_CART_BANK1 + 2:
case GB_REGION_CART_BANK1 + 3: case GB_REGION_CART_BANK1 + 3:
@ -252,6 +273,9 @@ uint8_t GBLoad8(struct LR35902Core* cpu, uint16_t address) {
// Fall through // Fall through
case GB_REGION_CART_BANK1: case GB_REGION_CART_BANK1:
case GB_REGION_CART_BANK1 + 1: case GB_REGION_CART_BANK1 + 1:
if (address >= memory->romSize) {
return 0xFF;
}
return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)]; return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)];
case GB_REGION_VRAM: case GB_REGION_VRAM:
case GB_REGION_VRAM + 1: case GB_REGION_VRAM + 1:

View File

@ -224,6 +224,9 @@ static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer*
if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || !(after || before)) { if (renderer->lastY >= GB_VIDEO_VERTICAL_PIXELS || !(after || before)) {
return; return;
} }
if (!renderer->hasWindow && renderer->lastX == GB_VIDEO_HORIZONTAL_PIXELS) {
return;
}
if (renderer->lastY >= oldWy) { if (renderer->lastY >= oldWy) {
if (!after) { if (!after) {
renderer->currentWy -= renderer->lastY; renderer->currentWy -= renderer->lastY;

View File

@ -225,6 +225,7 @@ void GBSGBSerialize(struct GB* gb, struct GBSerializedState* state) {
flags = GBSerializedSGBFlagsSetRenderMode(flags, gb->video.renderer->sgbRenderMode); flags = GBSerializedSGBFlagsSetRenderMode(flags, gb->video.renderer->sgbRenderMode);
flags = GBSerializedSGBFlagsSetBufferIndex(flags, gb->video.sgbBufferIndex); flags = GBSerializedSGBFlagsSetBufferIndex(flags, gb->video.sgbBufferIndex);
flags = GBSerializedSGBFlagsSetReqControllers(flags, gb->sgbControllers); flags = GBSerializedSGBFlagsSetReqControllers(flags, gb->sgbControllers);
flags = GBSerializedSGBFlagsSetIncrement(flags, gb->sgbIncrement);
flags = GBSerializedSGBFlagsSetCurrentController(flags, gb->sgbCurrentController); flags = GBSerializedSGBFlagsSetCurrentController(flags, gb->sgbCurrentController);
STORE_32LE(flags, 0, &state->sgb.flags); STORE_32LE(flags, 0, &state->sgb.flags);
@ -260,6 +261,12 @@ void GBSGBDeserialize(struct GB* gb, const struct GBSerializedState* state) {
gb->video.sgbBufferIndex = GBSerializedSGBFlagsGetBufferIndex(flags); gb->video.sgbBufferIndex = GBSerializedSGBFlagsGetBufferIndex(flags);
gb->sgbControllers = GBSerializedSGBFlagsGetReqControllers(flags); gb->sgbControllers = GBSerializedSGBFlagsGetReqControllers(flags);
gb->sgbCurrentController = GBSerializedSGBFlagsGetCurrentController(flags); gb->sgbCurrentController = GBSerializedSGBFlagsGetCurrentController(flags);
gb->sgbIncrement = GBSerializedSGBFlagsGetIncrement(flags);
// Old versions of mGBA stored the increment bits here
if (gb->sgbBit > 129 && gb->sgbBit & 2) {
gb->sgbIncrement = true;
}
memcpy(gb->video.sgbPacketBuffer, state->sgb.packet, sizeof(state->sgb.packet)); memcpy(gb->video.sgbPacketBuffer, state->sgb.packet, sizeof(state->sgb.packet));
memcpy(gb->sgbPacket, state->sgb.inProgressPacket, sizeof(state->sgb.inProgressPacket)); memcpy(gb->sgbPacket, state->sgb.inProgressPacket, sizeof(state->sgb.inProgressPacket));

View File

@ -701,6 +701,9 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) {
case SGB_ATTR_SET: case SGB_ATTR_SET:
break; break;
case SGB_MLT_REQ: case SGB_MLT_REQ:
if ((video->sgbPacketBuffer[1] & 0x3) == 2) { // XXX: This unmasked increment appears to be an SGB hardware bug
++video->p->sgbCurrentController;
}
video->p->sgbControllers = video->sgbPacketBuffer[1] & 0x3; video->p->sgbControllers = video->sgbPacketBuffer[1] & 0x3;
video->p->sgbCurrentController &= video->p->sgbControllers; video->p->sgbCurrentController &= video->p->sgbControllers;
return; return;

View File

@ -633,13 +633,16 @@ void CoreController::replaceGame(const QString& path) {
} }
void CoreController::yankPak() { void CoreController::yankPak() {
#ifdef M_CORE_GBA
if (platform() != PLATFORM_GBA) {
return;
}
Interrupter interrupter(this); Interrupter interrupter(this);
GBAYankROM(static_cast<GBA*>(m_threadContext.core->board));
#endif switch (platform()) {
case PLATFORM_GBA:
GBAYankROM(static_cast<GBA*>(m_threadContext.core->board));
break;
case PLATFORM_GB:
GBYankROM(static_cast<GB*>(m_threadContext.core->board));
break;
}
} }
#ifdef USE_PNG #ifdef USE_PNG

View File

@ -1352,12 +1352,12 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.</tran
<translation>Fehler beim Öffnen der Spieldatei: %1</translation> <translation>Fehler beim Öffnen der Spieldatei: %1</translation>
</message> </message>
<message> <message>
<location filename="../CoreController.cpp" line="686"/> <location filename="../CoreController.cpp" line="689"/>
<source>Failed to open snapshot file for reading: %1</source> <source>Failed to open snapshot file for reading: %1</source>
<translation>Konnte Snapshot-Datei %1 nicht zum Lesen öffnen</translation> <translation>Konnte Snapshot-Datei %1 nicht zum Lesen öffnen</translation>
</message> </message>
<message> <message>
<location filename="../CoreController.cpp" line="702"/> <location filename="../CoreController.cpp" line="705"/>
<source>Failed to open snapshot file for writing: %1</source> <source>Failed to open snapshot file for writing: %1</source>
<translation>Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen</translation> <translation>Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen</translation>
</message> </message>
@ -3801,222 +3801,222 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.</tran
<translation>Schli&amp;eßen</translation> <translation>Schli&amp;eßen</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1216"/> <location filename="../Window.cpp" line="1215"/>
<source>Yank game pak</source> <source>Yank game pak</source>
<translation>Spielmodul herausziehen</translation> <translation>Spielmodul herausziehen</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1223"/> <location filename="../Window.cpp" line="1221"/>
<source>&amp;Pause</source> <source>&amp;Pause</source>
<translation>&amp;Pause</translation> <translation>&amp;Pause</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1232"/> <location filename="../Window.cpp" line="1230"/>
<source>&amp;Next frame</source> <source>&amp;Next frame</source>
<translation>&amp;Nächstes Bild</translation> <translation>&amp;Nächstes Bild</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1238"/> <location filename="../Window.cpp" line="1236"/>
<source>Fast forward (held)</source> <source>Fast forward (held)</source>
<translation>Schneller Vorlauf (gehalten)</translation> <translation>Schneller Vorlauf (gehalten)</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1244"/> <location filename="../Window.cpp" line="1242"/>
<source>&amp;Fast forward</source> <source>&amp;Fast forward</source>
<translation>Schneller &amp;Vorlauf</translation> <translation>Schneller &amp;Vorlauf</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1248"/> <location filename="../Window.cpp" line="1246"/>
<source>Fast forward speed</source> <source>Fast forward speed</source>
<translation>Vorlauf-Geschwindigkeit</translation> <translation>Vorlauf-Geschwindigkeit</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1253"/> <location filename="../Window.cpp" line="1251"/>
<source>Unbounded</source> <source>Unbounded</source>
<translation>Unbegrenzt</translation> <translation>Unbegrenzt</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1257"/> <location filename="../Window.cpp" line="1255"/>
<source>%0x</source> <source>%0x</source>
<translation>%0x</translation> <translation>%0x</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1261"/> <location filename="../Window.cpp" line="1259"/>
<source>Rewind (held)</source> <source>Rewind (held)</source>
<translation>Zurückspulen (gehalten)</translation> <translation>Zurückspulen (gehalten)</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1268"/> <location filename="../Window.cpp" line="1266"/>
<source>Re&amp;wind</source> <source>Re&amp;wind</source>
<translation>Zur&amp;ückspulen</translation> <translation>Zur&amp;ückspulen</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1273"/> <location filename="../Window.cpp" line="1271"/>
<source>Step backwards</source> <source>Step backwards</source>
<translation>Schrittweiser Rücklauf</translation> <translation>Schrittweiser Rücklauf</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1279"/> <location filename="../Window.cpp" line="1277"/>
<source>Sync to &amp;video</source> <source>Sync to &amp;video</source>
<translation>Mit &amp;Video synchronisieren</translation> <translation>Mit &amp;Video synchronisieren</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1286"/> <location filename="../Window.cpp" line="1284"/>
<source>Sync to &amp;audio</source> <source>Sync to &amp;audio</source>
<translation>Mit &amp;Audio synchronisieren</translation> <translation>Mit &amp;Audio synchronisieren</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1294"/> <location filename="../Window.cpp" line="1292"/>
<source>Solar sensor</source> <source>Solar sensor</source>
<translation>Sonnen-Sensor</translation> <translation>Sonnen-Sensor</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1295"/> <location filename="../Window.cpp" line="1293"/>
<source>Increase solar level</source> <source>Increase solar level</source>
<translation>Sonnen-Level erhöhen</translation> <translation>Sonnen-Level erhöhen</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1296"/> <location filename="../Window.cpp" line="1294"/>
<source>Decrease solar level</source> <source>Decrease solar level</source>
<translation>Sonnen-Level verringern</translation> <translation>Sonnen-Level verringern</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1297"/> <location filename="../Window.cpp" line="1295"/>
<source>Brightest solar level</source> <source>Brightest solar level</source>
<translation>Hellster Sonnen-Level</translation> <translation>Hellster Sonnen-Level</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1300"/> <location filename="../Window.cpp" line="1298"/>
<source>Darkest solar level</source> <source>Darkest solar level</source>
<translation>Dunkelster Sonnen-Level</translation> <translation>Dunkelster Sonnen-Level</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1306"/> <location filename="../Window.cpp" line="1304"/>
<source>Brightness %1</source> <source>Brightness %1</source>
<translation>Helligkeit %1</translation> <translation>Helligkeit %1</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1321"/> <location filename="../Window.cpp" line="1319"/>
<source>BattleChip Gate...</source> <source>BattleChip Gate...</source>
<translation>BattleChip Gate...</translation> <translation>BattleChip Gate...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1325"/> <location filename="../Window.cpp" line="1323"/>
<source>Audio/&amp;Video</source> <source>Audio/&amp;Video</source>
<translation>Audio/&amp;Video</translation> <translation>Audio/&amp;Video</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1326"/> <location filename="../Window.cpp" line="1324"/>
<source>Frame size</source> <source>Frame size</source>
<translation>Bildgröße</translation> <translation>Bildgröße</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1353"/> <location filename="../Window.cpp" line="1351"/>
<source>Toggle fullscreen</source> <source>Toggle fullscreen</source>
<translation>Vollbildmodus umschalten</translation> <translation>Vollbildmodus umschalten</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1356"/> <location filename="../Window.cpp" line="1354"/>
<source>Lock aspect ratio</source> <source>Lock aspect ratio</source>
<translation>Seitenverhältnis korrigieren</translation> <translation>Seitenverhältnis korrigieren</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1368"/> <location filename="../Window.cpp" line="1366"/>
<source>Force integer scaling</source> <source>Force integer scaling</source>
<translation>Pixelgenaue Skalierung (Integer scaling)</translation> <translation>Pixelgenaue Skalierung (Integer scaling)</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1380"/> <location filename="../Window.cpp" line="1378"/>
<source>Interframe blending</source> <source>Interframe blending</source>
<translation>Interframe-Überblendung</translation> <translation>Interframe-Überblendung</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1397"/> <location filename="../Window.cpp" line="1395"/>
<source>Frame&amp;skip</source> <source>Frame&amp;skip</source>
<translation>Frame&amp;skip</translation> <translation>Frame&amp;skip</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1410"/> <location filename="../Window.cpp" line="1408"/>
<source>Mute</source> <source>Mute</source>
<translation>Stummschalten</translation> <translation>Stummschalten</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1417"/> <location filename="../Window.cpp" line="1415"/>
<source>FPS target</source> <source>FPS target</source>
<translation>Bildwiederholrate</translation> <translation>Bildwiederholrate</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1440"/> <location filename="../Window.cpp" line="1438"/>
<source>Take &amp;screenshot</source> <source>Take &amp;screenshot</source>
<translation>&amp;Screenshot erstellen</translation> <translation>&amp;Screenshot erstellen</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1442"/> <location filename="../Window.cpp" line="1440"/>
<source>F12</source> <source>F12</source>
<translation>F12</translation> <translation>F12</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1450"/> <location filename="../Window.cpp" line="1448"/>
<source>Record GIF...</source> <source>Record GIF...</source>
<translation>GIF aufzeichen...</translation> <translation>GIF aufzeichen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1723"/> <location filename="../Window.cpp" line="1721"/>
<source>Clear</source> <source>Clear</source>
<translation>Leeren</translation> <translation>Leeren</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1312"/> <location filename="../Window.cpp" line="1310"/>
<source>Game Boy Printer...</source> <source>Game Boy Printer...</source>
<translation>Game Boy Printer...</translation> <translation>Game Boy Printer...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1454"/> <location filename="../Window.cpp" line="1452"/>
<source>Video layers</source> <source>Video layers</source>
<translation>Video-Ebenen</translation> <translation>Video-Ebenen</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1455"/> <location filename="../Window.cpp" line="1453"/>
<source>Audio channels</source> <source>Audio channels</source>
<translation>Audio-Kanäle</translation> <translation>Audio-Kanäle</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1457"/> <location filename="../Window.cpp" line="1455"/>
<source>Adjust layer placement...</source> <source>Adjust layer placement...</source>
<translation>Lage der Bildebenen anpassen...</translation> <translation>Lage der Bildebenen anpassen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1459"/> <location filename="../Window.cpp" line="1457"/>
<source>&amp;Tools</source> <source>&amp;Tools</source>
<translation>&amp;Werkzeuge</translation> <translation>&amp;Werkzeuge</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1460"/> <location filename="../Window.cpp" line="1458"/>
<source>View &amp;logs...</source> <source>View &amp;logs...</source>
<translation>&amp;Logs ansehen...</translation> <translation>&amp;Logs ansehen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1462"/> <location filename="../Window.cpp" line="1460"/>
<source>Game &amp;overrides...</source> <source>Game &amp;overrides...</source>
<translation>Spiel-&amp;Überschreibungen...</translation> <translation>Spiel-&amp;Überschreibungen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1485"/> <location filename="../Window.cpp" line="1483"/>
<source>&amp;Cheats...</source> <source>&amp;Cheats...</source>
<translation>&amp;Cheats...</translation> <translation>&amp;Cheats...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1492"/> <location filename="../Window.cpp" line="1490"/>
<source>Open debugger console...</source> <source>Open debugger console...</source>
<translation>Debugger-Konsole öffnen...</translation> <translation>Debugger-Konsole öffnen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1494"/> <location filename="../Window.cpp" line="1492"/>
<source>Start &amp;GDB server...</source> <source>Start &amp;GDB server...</source>
<translation>&amp;GDB-Server starten...</translation> <translation>&amp;GDB-Server starten...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1488"/> <location filename="../Window.cpp" line="1486"/>
<source>Settings...</source> <source>Settings...</source>
<translation>Einstellungen...</translation> <translation>Einstellungen...</translation>
</message> </message>
@ -4051,57 +4051,57 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.</tran
<translation>Über...</translation> <translation>Über...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1328"/> <location filename="../Window.cpp" line="1326"/>
<source>%1×</source> <source>%1×</source>
<translation>%1x</translation> <translation>%1x</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1389"/> <location filename="../Window.cpp" line="1387"/>
<source>Bilinear filtering</source> <source>Bilinear filtering</source>
<translation>Bilineare Filterung</translation> <translation>Bilineare Filterung</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1425"/> <location filename="../Window.cpp" line="1423"/>
<source>Native (59.7275)</source> <source>Native (59.7275)</source>
<translation>Nativ (59.7275)</translation> <translation>Nativ (59.7275)</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1446"/> <location filename="../Window.cpp" line="1444"/>
<source>Record A/V...</source> <source>Record A/V...</source>
<translation>Audio/Video aufzeichnen...</translation> <translation>Audio/Video aufzeichnen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1474"/> <location filename="../Window.cpp" line="1472"/>
<source>Game Pak sensors...</source> <source>Game Pak sensors...</source>
<translation>Spielmodul-Sensoren...</translation> <translation>Spielmodul-Sensoren...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1500"/> <location filename="../Window.cpp" line="1498"/>
<source>View &amp;palette...</source> <source>View &amp;palette...</source>
<translation>&amp;Palette betrachten...</translation> <translation>&amp;Palette betrachten...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1501"/> <location filename="../Window.cpp" line="1499"/>
<source>View &amp;sprites...</source> <source>View &amp;sprites...</source>
<translation>&amp;Sprites betrachten...</translation> <translation>&amp;Sprites betrachten...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1502"/> <location filename="../Window.cpp" line="1500"/>
<source>View &amp;tiles...</source> <source>View &amp;tiles...</source>
<translation>&amp;Tiles betrachten...</translation> <translation>&amp;Tiles betrachten...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1503"/> <location filename="../Window.cpp" line="1501"/>
<source>View &amp;map...</source> <source>View &amp;map...</source>
<translation>&amp;Map betrachten...</translation> <translation>&amp;Map betrachten...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1506"/> <location filename="../Window.cpp" line="1504"/>
<source>&amp;Frame inspector...</source> <source>&amp;Frame inspector...</source>
<translation>&amp;Bildbetrachter...</translation> <translation>&amp;Bildbetrachter...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1524"/> <location filename="../Window.cpp" line="1522"/>
<source>View memory...</source> <source>View memory...</source>
<translation>Speicher betrachten...</translation> <translation>Speicher betrachten...</translation>
</message> </message>
@ -4111,87 +4111,87 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.</tran
<translation>&amp;I/O-Register betrachten...</translation> <translation>&amp;I/O-Register betrachten...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1525"/> <location filename="../Window.cpp" line="1523"/>
<source>Search memory...</source> <source>Search memory...</source>
<translation>Speicher durchsuchen...</translation> <translation>Speicher durchsuchen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1528"/> <location filename="../Window.cpp" line="1526"/>
<source>View &amp;I/O registers...</source> <source>View &amp;I/O registers...</source>
<translation>&amp;I/O-Register betrachten...</translation> <translation>&amp;I/O-Register betrachten...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1533"/> <location filename="../Window.cpp" line="1531"/>
<source>Record debug video log...</source> <source>Record debug video log...</source>
<translation>Video-Protokoll aufzeichnen...</translation> <translation>Video-Protokoll aufzeichnen...</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1534"/> <location filename="../Window.cpp" line="1532"/>
<source>Stop debug video log</source> <source>Stop debug video log</source>
<translation>Aufzeichnen des Video-Protokolls beenden</translation> <translation>Aufzeichnen des Video-Protokolls beenden</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1615"/> <location filename="../Window.cpp" line="1613"/>
<source>Exit fullscreen</source> <source>Exit fullscreen</source>
<translation>Vollbildmodus beenden</translation> <translation>Vollbildmodus beenden</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1617"/> <location filename="../Window.cpp" line="1615"/>
<source>GameShark Button (held)</source> <source>GameShark Button (held)</source>
<translation>GameShark-Taste (gehalten)</translation> <translation>GameShark-Taste (gehalten)</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1623"/> <location filename="../Window.cpp" line="1621"/>
<source>Autofire</source> <source>Autofire</source>
<translation>Autofeuer</translation> <translation>Autofeuer</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1624"/> <location filename="../Window.cpp" line="1622"/>
<source>Autofire A</source> <source>Autofire A</source>
<translation>Autofeuer A</translation> <translation>Autofeuer A</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1629"/> <location filename="../Window.cpp" line="1627"/>
<source>Autofire B</source> <source>Autofire B</source>
<translation>Autofeuer B</translation> <translation>Autofeuer B</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1634"/> <location filename="../Window.cpp" line="1632"/>
<source>Autofire L</source> <source>Autofire L</source>
<translation>Autofeuer L</translation> <translation>Autofeuer L</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1639"/> <location filename="../Window.cpp" line="1637"/>
<source>Autofire R</source> <source>Autofire R</source>
<translation>Autofeuer R</translation> <translation>Autofeuer R</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1644"/> <location filename="../Window.cpp" line="1642"/>
<source>Autofire Start</source> <source>Autofire Start</source>
<translation>Autofeuer Start</translation> <translation>Autofeuer Start</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1649"/> <location filename="../Window.cpp" line="1647"/>
<source>Autofire Select</source> <source>Autofire Select</source>
<translation>Autofeuer Select</translation> <translation>Autofeuer Select</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1654"/> <location filename="../Window.cpp" line="1652"/>
<source>Autofire Up</source> <source>Autofire Up</source>
<translation>Autofeuer nach oben</translation> <translation>Autofeuer nach oben</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1659"/> <location filename="../Window.cpp" line="1657"/>
<source>Autofire Right</source> <source>Autofire Right</source>
<translation>Autofeuer rechts</translation> <translation>Autofeuer rechts</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1664"/> <location filename="../Window.cpp" line="1662"/>
<source>Autofire Down</source> <source>Autofire Down</source>
<translation>Autofeuer nach unten</translation> <translation>Autofeuer nach unten</translation>
</message> </message>
<message> <message>
<location filename="../Window.cpp" line="1669"/> <location filename="../Window.cpp" line="1667"/>
<source>Autofire Left</source> <source>Autofire Left</source>
<translation>Autofeuer links</translation> <translation>Autofeuer links</translation>
</message> </message>
@ -4639,11 +4639,6 @@ Game Boy Advance ist ein eingetragenes Warenzeichen von Nintendo Co., Ltd.</tran
<source>High-resolution scale:</source> <source>High-resolution scale:</source>
<translation>Hochauflösende Skalierung:</translation> <translation>Hochauflösende Skalierung:</translation>
</message> </message>
<message>
<location filename="../SettingsView.ui" line="986"/>
<source>{size}</source>
<translation>{size}</translation>
</message>
<message> <message>
<location filename="../SettingsView.ui" line="1011"/> <location filename="../SettingsView.ui" line="1011"/>
<source>XQ GBA audio (experimental)</source> <source>XQ GBA audio (experimental)</source>
@ -4915,6 +4910,11 @@ wenn vorhanden</translation>
<source>Autofire interval:</source> <source>Autofire interval:</source>
<translation>Autofeuer-Intervall:</translation> <translation>Autofeuer-Intervall:</translation>
</message> </message>
<message>
<location filename="../SettingsView.ui" line="986"/>
<source>(240×160)</source>
<translation>(240×160)</translation>
</message>
<message> <message>
<location filename="../SettingsView.ui" line="1022"/> <location filename="../SettingsView.ui" line="1022"/>
<source>GB BIOS file:</source> <source>GB BIOS file:</source>

File diff suppressed because it is too large Load Diff