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
- Qt: Add export button for tile view (closes mgba.io/i/1507)
- Qt: Add recent game list clearing (closes mgba.io/i/1380)
- GB: Yanking gamepak now supported
Emulation fixes:
- GBA: All IRQs have 7 cycle delay (fixes mgba.io/i/539, mgba.io/i/1208)
- 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 Memory: Better emulate 0xFEA0 region on DMG, MGB and AGB
- GB Printer: Reset printer buffer index after printing
- GB Video: Fix mode 0 window edge case (fixes mgba.io/i/1519)
Other fixes:
- Qt: Fix some Qt display driver race conditions
- 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)
- Qt: Only show emulator restart warning once per settings saving
- 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:
- GBA Savedata: EEPROM performance fixes
- 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;
size_t pristineRomSize;
size_t yankedRomSize;
enum GBMemoryBankControllerType yankedMbc;
uint32_t romCrc32;
struct VFile* romVf;
struct VFile* biosVf;
@ -109,6 +110,7 @@ struct GB {
uint8_t sgbPacket[16];
uint8_t sgbControllers;
uint8_t sgbCurrentController;
bool sgbIncrement;
struct mCoreCallbacksList coreCallbacks;
struct mAVStream* stream;
@ -162,6 +164,7 @@ bool GBLoadROM(struct GB* gb, struct VFile* vf);
bool GBLoadSave(struct GB* gb, struct VFile* vf);
void GBUnloadROM(struct GB* gb);
void GBSynthesizeROM(struct VFile* vf);
void GBYankROM(struct GB* gb);
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, CurrentController, 7, 2);
DECL_BITS(GBSerializedSGBFlags, ReqControllers, 9, 2);
DECL_BIT(GBSerializedSGBFlags, Increment, 11);
#pragma pack(push, 1)
struct GBSerializedState {

View File

@ -127,6 +127,19 @@ bool GBLoadROM(struct GB* gb, struct VFile* vf) {
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) {
if (gb->sramVf) {
gb->sramVf->unmap(gb->sramVf, gb->memory.sram, gb->sramSize);
@ -430,13 +443,15 @@ void GBReset(struct LR35902Core* cpu) {
if (gb->yankedRomSize) {
gb->memory.romSize = gb->yankedRomSize;
gb->memory.mbcType = gb->yankedMbc;
gb->yankedRomSize = 0;
}
gb->sgbBit = -1;
gb->sgbControllers = 0;
gb->sgbCurrentController = 3;
gb->sgbCurrentController = 0;
gb->currentSgbBits = 0;
gb->sgbIncrement = false;
memset(gb->sgbPacket, 0, sizeof(gb->sgbPacket));
mTimingClear(&gb->timing);

View File

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

View File

@ -16,6 +16,8 @@
mLOG_DEFINE_CATEGORY(GB_MEM, "GB Memory", "gb.memory");
static const uint8_t _yankBuffer[] = { 0xFF };
enum GBBus {
GB_BUS_CPU,
GB_BUS_MAIN,
@ -69,6 +71,14 @@ static void GBSetActiveRegion(struct LR35902Core* cpu, uint16_t address) {
cpu->memory.activeRegion = memory->romBase;
cpu->memory.activeRegionEnd = GB_BASE_CART_BANK1;
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;
case GB_REGION_CART_BANK1:
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;
}
}
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;
default:
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 + 2:
case GB_REGION_CART_BANK0 + 3:
if (address >= memory->romSize) {
return 0xFF;
}
return memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)];
case GB_REGION_CART_BANK1 + 2:
case GB_REGION_CART_BANK1 + 3:
@ -252,6 +273,9 @@ uint8_t GBLoad8(struct LR35902Core* cpu, uint16_t address) {
// Fall through
case GB_REGION_CART_BANK1:
case GB_REGION_CART_BANK1 + 1:
if (address >= memory->romSize) {
return 0xFF;
}
return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)];
case GB_REGION_VRAM:
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)) {
return;
}
if (!renderer->hasWindow && renderer->lastX == GB_VIDEO_HORIZONTAL_PIXELS) {
return;
}
if (renderer->lastY >= oldWy) {
if (!after) {
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 = GBSerializedSGBFlagsSetBufferIndex(flags, gb->video.sgbBufferIndex);
flags = GBSerializedSGBFlagsSetReqControllers(flags, gb->sgbControllers);
flags = GBSerializedSGBFlagsSetIncrement(flags, gb->sgbIncrement);
flags = GBSerializedSGBFlagsSetCurrentController(flags, gb->sgbCurrentController);
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->sgbControllers = GBSerializedSGBFlagsGetReqControllers(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->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:
break;
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->sgbCurrentController &= video->p->sgbControllers;
return;

View File

@ -633,13 +633,16 @@ void CoreController::replaceGame(const QString& path) {
}
void CoreController::yankPak() {
#ifdef M_CORE_GBA
if (platform() != PLATFORM_GBA) {
return;
}
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

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

File diff suppressed because it is too large Load Diff