Merge branch 'master' into medusa
jump to
@@ -22,6 +22,7 @@ - Libretro: Fix saving in GB games (fixes mgba.io/i/486)
- 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) Misc: - SDL: Remove scancode key input - GBA Video: Clean up unused timers@@ -59,7 +60,6 @@ - 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 - - ARM: Overhaul PSR bit access 0.5.2: (2016-12-31) Bugfixes:
@@ -173,12 +173,6 @@ } \
ATTRIBUTE_UNUSED static inline TYPE TYPE ## Fill ## FIELD (TYPE src) { \ return FILL_BITS(src, (START), (START) + (SIZE)); \ } \ - ATTRIBUTE_UNUSED static inline TYPE TYPE ## OrUnsafe ## FIELD (TYPE src, TYPE bits) { \ - return (src | ((bits) << (START))); \ - } \ - ATTRIBUTE_UNUSED static inline TYPE TYPE ## Or ## FIELD (TYPE src, TYPE bits) { \ - return (src | (((bits) << (START)) & MAKE_MASK(START, (START) + (SIZE)))); \ - } \ ATTRIBUTE_UNUSED static inline TYPE TYPE ## Set ## FIELD (TYPE src, TYPE bits) { \ return INS_BITS(src, (START), (START) + (SIZE), bits); \ } \
@@ -68,15 +68,33 @@ };
struct ARMCore; -DECL_BITFIELD(ARMPSR, uint32_t); -DECL_BITS(ARMPSR, Priv, 0, 5); -DECL_BIT(ARMPSR, T, 5); -DECL_BIT(ARMPSR, F, 6); -DECL_BIT(ARMPSR, I, 7); -DECL_BIT(ARMPSR, V, 28); -DECL_BIT(ARMPSR, C, 29); -DECL_BIT(ARMPSR, Z, 30); -DECL_BIT(ARMPSR, N, 31); +union PSR { + struct { +#if defined(__POWERPC__) || defined(__PPC__) + unsigned n : 1; + unsigned z : 1; + unsigned c : 1; + unsigned v : 1; + unsigned unused : 20; + unsigned i : 1; + unsigned f : 1; + unsigned t : 1; + unsigned priv : 5; +#else + unsigned priv : 5; + unsigned t : 1; + unsigned f : 1; + unsigned i : 1; + unsigned unused : 20; + unsigned v : 1; + unsigned c : 1; + unsigned z : 1; + unsigned n : 1; +#endif + }; + + int32_t packed; +}; struct ARMMemory { uint32_t (*load32)(struct ARMCore*, uint32_t address, int* cycleCounter);@@ -199,8 +217,8 @@ };
struct ARMCore { int32_t gprs[16]; - ARMPSR cpsr; - ARMPSR spsr; + union PSR cpsr; + union PSR spsr; int32_t cycles; int32_t nextEvent;
@@ -10,20 +10,20 @@ #include "macros.h"
#include "arm.h" -#define ARM_COND_EQ (ARMPSRIsZ(cpu->cpsr)) -#define ARM_COND_NE (!ARMPSRIsZ(cpu->cpsr)) -#define ARM_COND_CS (ARMPSRIsC(cpu->cpsr)) -#define ARM_COND_CC (!ARMPSRIsC(cpu->cpsr)) -#define ARM_COND_MI (ARMPSRIsN(cpu->cpsr)) -#define ARM_COND_PL (!ARMPSRIsN(cpu->cpsr)) -#define ARM_COND_VS (ARMPSRIsV(cpu->cpsr)) -#define ARM_COND_VC (!ARMPSRIsV(cpu->cpsr)) -#define ARM_COND_HI (ARMPSRIsC(cpu->cpsr) && !ARMPSRIsZ(cpu->cpsr)) -#define ARM_COND_LS (!ARMPSRIsC(cpu->cpsr) || ARMPSRIsZ(cpu->cpsr)) -#define ARM_COND_GE (!ARMPSRIsN(cpu->cpsr) == !ARMPSRIsV(cpu->cpsr)) -#define ARM_COND_LT (!ARMPSRIsN(cpu->cpsr) != !ARMPSRIsV(cpu->cpsr)) -#define ARM_COND_GT (!ARMPSRIsZ(cpu->cpsr) && !ARMPSRIsN(cpu->cpsr) == !ARMPSRIsV(cpu->cpsr)) -#define ARM_COND_LE (ARMPSRIsZ(cpu->cpsr) || !ARMPSRIsN(cpu->cpsr) != !ARMPSRIsV(cpu->cpsr)) +#define ARM_COND_EQ (cpu->cpsr.z) +#define ARM_COND_NE (!cpu->cpsr.z) +#define ARM_COND_CS (cpu->cpsr.c) +#define ARM_COND_CC (!cpu->cpsr.c) +#define ARM_COND_MI (cpu->cpsr.n) +#define ARM_COND_PL (!cpu->cpsr.n) +#define ARM_COND_VS (cpu->cpsr.v) +#define ARM_COND_VC (!cpu->cpsr.v) +#define ARM_COND_HI (cpu->cpsr.c && !cpu->cpsr.z) +#define ARM_COND_LS (!cpu->cpsr.c || cpu->cpsr.z) +#define ARM_COND_GE (!cpu->cpsr.n == !cpu->cpsr.v) +#define ARM_COND_LT (!cpu->cpsr.n != !cpu->cpsr.v) +#define ARM_COND_GT (!cpu->cpsr.z && !cpu->cpsr.n == !cpu->cpsr.v) +#define ARM_COND_LE (cpu->cpsr.z || !cpu->cpsr.n != !cpu->cpsr.v) #define ARM_COND_AL 1 #define ARM_SIGN(I) ((I) >> 31)@@ -31,8 +31,7 @@ #define ARM_SXT_8(I) (((int8_t) (I) << 24) >> 24)
#define ARM_SXT_16(I) (((int16_t) (I) << 16) >> 16) #define ARM_UXT_64(I) (uint64_t)(uint32_t) (I) -#define ARM_CARRY_FROM(M, N, D) (UINT_MAX - (uint32_t) (M) < (uint32_t) (N)) -#define ARM_CARRY_FROM_CARRY(M, N, D, C) (((uint32_t) (M) >> 31) + ((uint32_t) (N) >> 31) > ((uint32_t) (D) >> 31)) +#define ARM_CARRY_FROM(M, N, D) (((uint32_t) (M) >> 31) + ((uint32_t) (N) >> 31) > ((uint32_t) (D) >> 31)) #define ARM_BORROW_FROM(M, N, D) (((uint32_t) (M)) >= ((uint32_t) (N))) #define ARM_BORROW_FROM_CARRY(M, N, D, C) (ARM_UXT_64(M) >= (ARM_UXT_64(N)) + (uint64_t) (C)) #define ARM_V_ADDITION(M, N, D) (!(ARM_SIGN((M) ^ (N))) && (ARM_SIGN((M) ^ (D))) && (ARM_SIGN((N) ^ (D))))@@ -84,23 +83,24 @@
cpu->executionMode = executionMode; switch (executionMode) { case MODE_ARM: - cpu->cpsr = ARMPSRClearT(cpu->cpsr); + cpu->cpsr.t = 0; break; case MODE_THUMB: - cpu->cpsr = ARMPSRFillT(cpu->cpsr); + cpu->cpsr.t = 1; } cpu->nextEvent = cpu->cycles; } static inline void _ARMReadCPSR(struct ARMCore* cpu) { - _ARMSetMode(cpu, ARMPSRGetT(cpu->cpsr)); - ARMSetPrivilegeMode(cpu, ARMPSRGetPriv(cpu->cpsr)); + _ARMSetMode(cpu, cpu->cpsr.t); + ARMSetPrivilegeMode(cpu, cpu->cpsr.priv); cpu->irqh.readCPSR(cpu); } static inline uint32_t _ARMPCAddress(struct ARMCore* cpu) { int instructionLength; - if (ARMPSRIsT(cpu->cpsr)) { + enum ExecutionMode mode = cpu->cpsr.t; + if (mode == MODE_ARM) { instructionLength = WORD_SIZE_ARM; } else { instructionLength = WORD_SIZE_THUMB;
@@ -11,7 +11,6 @@
CXX_GUARD_START #include <mgba/core/core.h> -#include <mgba/internal/arm/arm.h> #include <mgba/internal/gba/gba.h> #include <mgba/internal/gb/serialize.h>@@ -238,8 +237,8 @@ uint32_t id;
struct { int32_t gprs[16]; - ARMPSR cpsr; - ARMPSR spsr; + union PSR cpsr; + union PSR spsr; int32_t cycles; int32_t nextEvent;
@@ -40,8 +40,8 @@ cpu->bankedRegisters[oldBank][1] = cpu->gprs[ARM_LR];
cpu->gprs[ARM_SP] = cpu->bankedRegisters[newBank][0]; cpu->gprs[ARM_LR] = cpu->bankedRegisters[newBank][1]; - cpu->bankedSPSRs[oldBank] = cpu->spsr; - cpu->spsr = cpu->bankedSPSRs[newBank]; + cpu->bankedSPSRs[oldBank] = cpu->spsr.packed; + cpu->spsr.packed = cpu->bankedSPSRs[newBank]; } cpu->privilegeMode = mode; }@@ -132,8 +132,8 @@ cpu->bankedSPSRs[i] = 0;
} cpu->privilegeMode = MODE_SYSTEM; - cpu->cpsr = MODE_SYSTEM; - cpu->spsr = 0; + cpu->cpsr.packed = MODE_SYSTEM; + cpu->spsr.packed = 0; cpu->shifterOperand = 0; cpu->shifterCarryOut = 0;@@ -152,10 +152,10 @@ cpu->irqh.reset(cpu);
} void ARMRaiseIRQ(struct ARMCore* cpu) { - if (ARMPSRIsI(cpu->cpsr)) { + if (cpu->cpsr.i) { return; } - ARMPSR cpsr = cpu->cpsr; + union PSR cpsr = cpu->cpsr; int instructionWidth; if (cpu->executionMode == MODE_THUMB) { instructionWidth = WORD_SIZE_THUMB;@@ -163,7 +163,7 @@ } else {
instructionWidth = WORD_SIZE_ARM; } ARMSetPrivilegeMode(cpu, MODE_IRQ); - cpu->cpsr = ARMPSRSetPriv(cpu->cpsr, MODE_IRQ); + cpu->cpsr.priv = MODE_IRQ; cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - instructionWidth + WORD_SIZE_ARM; cpu->gprs[ARM_PC] = BASE_IRQ; if (ARMControlRegIsVE(cpu->cp15.r1.c0)) {@@ -173,12 +173,12 @@ int currentCycles = 0;
ARM_WRITE_PC; _ARMSetMode(cpu, MODE_ARM); cpu->spsr = cpsr; - cpu->cpsr = ARMPSRFillI(cpu->cpsr); + cpu->cpsr.i = 1; cpu->cycles += currentCycles; } void ARMRaiseSWI(struct ARMCore* cpu) { - ARMPSR cpsr = cpu->cpsr; + union PSR cpsr = cpu->cpsr; int instructionWidth; if (cpu->executionMode == MODE_THUMB) { instructionWidth = WORD_SIZE_THUMB;@@ -186,7 +186,7 @@ } else {
instructionWidth = WORD_SIZE_ARM; } ARMSetPrivilegeMode(cpu, MODE_SUPERVISOR); - cpu->cpsr = ARMPSRSetPriv(cpu->cpsr, MODE_SUPERVISOR); + cpu->cpsr.priv = MODE_SUPERVISOR; cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - instructionWidth; cpu->gprs[ARM_PC] = BASE_SWI; if (ARMControlRegIsVE(cpu->cp15.r1.c0)) {@@ -196,12 +196,12 @@ int currentCycles = 0;
ARM_WRITE_PC; _ARMSetMode(cpu, MODE_ARM); cpu->spsr = cpsr; - cpu->cpsr = ARMPSRFillI(cpu->cpsr); + cpu->cpsr.i = 1; cpu->cycles += currentCycles; } void ARMRaiseUndefined(struct ARMCore* cpu) { - ARMPSR cpsr = cpu->cpsr; + union PSR cpsr = cpu->cpsr; int instructionWidth; if (cpu->executionMode == MODE_THUMB) { instructionWidth = WORD_SIZE_THUMB;@@ -209,7 +209,7 @@ } else {
instructionWidth = WORD_SIZE_ARM; } ARMSetPrivilegeMode(cpu, MODE_UNDEFINED); - cpu->cpsr = ARMPSRSetPriv(cpu->cpsr, MODE_UNDEFINED); + cpu->cpsr.priv = MODE_UNDEFINED; cpu->gprs[ARM_LR] = cpu->gprs[ARM_PC] - instructionWidth; cpu->gprs[ARM_PC] = BASE_UNDEF; if (ARMControlRegIsVE(cpu->cp15.r1.c0)) {@@ -219,7 +219,7 @@ int currentCycles = 0;
ARM_WRITE_PC; _ARMSetMode(cpu, MODE_ARM); cpu->spsr = cpsr; - cpu->cpsr = ARMPSRFillI(cpu->cpsr); + cpu->cpsr.i = 1; cpu->cycles += currentCycles; }
@@ -37,15 +37,15 @@ { "w/r", _writeRegister, CLIDVParse, "Write a register" },
{ 0, 0, 0, 0 } }; -static inline void _printPSR(struct CLIDebuggerBackend* be, ARMPSR psr) { - be->printf(be, "%08X [%c%c%c%c%c%c%c]\n", psr, - ARMPSRIsN(psr) ? 'N' : '-', - ARMPSRIsZ(psr) ? 'Z' : '-', - ARMPSRIsC(psr) ? 'C' : '-', - ARMPSRIsV(psr) ? 'V' : '-', - ARMPSRIsI(psr) ? 'I' : '-', - ARMPSRIsF(psr) ? 'F' : '-', - ARMPSRIsT(psr) ? 'T' : '-'); +static inline void _printPSR(struct CLIDebuggerBackend* be, union PSR psr) { + be->printf(be, "%08X [%c%c%c%c%c%c%c]\n", psr.packed, + psr.n ? 'N' : '-', + psr.z ? 'Z' : '-', + psr.c ? 'C' : '-', + psr.v ? 'V' : '-', + psr.i ? 'I' : '-', + psr.f ? 'F' : '-', + psr.t ? 'T' : '-'); } static void _disassemble(struct CLIDebuggerSystem* debugger, struct CLIDebugVector* dv) {@@ -136,7 +136,7 @@ cpu->gprs[(r << 2) + 3]);
} _printPSR(be, cpu->cpsr); int instructionLength; - enum ExecutionMode mode = ARMPSRIsT(cpu->cpsr); + enum ExecutionMode mode = cpu->cpsr.t; if (mode == MODE_ARM) { instructionLength = WORD_SIZE_ARM; } else {@@ -196,11 +196,11 @@ if (strcmp(name, "pc") == 0) {
return cpu->gprs[ARM_PC]; } if (strcmp(name, "cpsr") == 0) { - return cpu->cpsr; + return cpu->cpsr.packed; } // TODO: test if mode has SPSR if (strcmp(name, "spsr") == 0) { - return cpu->spsr; + return cpu->spsr.packed; } if (name[0] == 'r' && name[1] >= '0' && name[1] <= '9') { int reg = atoi(&name[1]);
@@ -26,7 +26,7 @@
static void ARMDebuggerCheckBreakpoints(struct mDebuggerPlatform* d) { struct ARMDebugger* debugger = (struct ARMDebugger*) d; int instructionLength; - enum ExecutionMode mode = ARMPSRIsT(debugger->cpu->cpsr); + enum ExecutionMode mode = debugger->cpu->cpsr.t; if (mode == MODE_ARM) { instructionLength = WORD_SIZE_ARM; } else {
@@ -31,7 +31,7 @@ shiftVal += 4;
} if (!shift) { cpu->shifterOperand = shiftVal; - cpu->shifterCarryOut = ARMPSRGetC(cpu->cpsr); + cpu->shifterCarryOut = cpu->cpsr.c; } else if (shift < 32) { cpu->shifterOperand = shiftVal << shift; cpu->shifterCarryOut = (shiftVal >> (32 - shift)) & 1;@@ -46,7 +46,7 @@ } else {
int immediate = (opcode & 0x00000F80) >> 7; if (!immediate) { cpu->shifterOperand = cpu->gprs[rm]; - cpu->shifterCarryOut = ARMPSRGetC(cpu->cpsr); + cpu->shifterCarryOut = cpu->cpsr.c; } else { cpu->shifterOperand = cpu->gprs[rm] << immediate; cpu->shifterCarryOut = (cpu->gprs[rm] >> (32 - immediate)) & 1;@@ -70,7 +70,7 @@ shiftVal += 4;
} if (!shift) { cpu->shifterOperand = shiftVal; - cpu->shifterCarryOut = ARMPSRGetC(cpu->cpsr); + cpu->shifterCarryOut = cpu->cpsr.c; } else if (shift < 32) { cpu->shifterOperand = shiftVal >> shift; cpu->shifterCarryOut = (shiftVal >> (shift - 1)) & 1;@@ -109,7 +109,7 @@ shiftVal += 4;
} if (!shift) { cpu->shifterOperand = shiftVal; - cpu->shifterCarryOut = ARMPSRGetC(cpu->cpsr); + cpu->shifterCarryOut = cpu->cpsr.c; } else if (shift < 32) { cpu->shifterOperand = shiftVal >> shift; cpu->shifterCarryOut = (shiftVal >> (shift - 1)) & 1;@@ -149,7 +149,7 @@ }
int rotate = shift & 0x1F; if (!shift) { cpu->shifterOperand = shiftVal; - cpu->shifterCarryOut = ARMPSRGetC(cpu->cpsr); + cpu->shifterCarryOut = cpu->cpsr.c; } else if (rotate) { cpu->shifterOperand = ROR(shiftVal, rotate); cpu->shifterCarryOut = (shiftVal >> (rotate - 1)) & 1;@@ -164,7 +164,7 @@ cpu->shifterOperand = ROR(cpu->gprs[rm], immediate);
cpu->shifterCarryOut = (cpu->gprs[rm] >> (immediate - 1)) & 1; } else { // RRX - cpu->shifterOperand = (ARMPSRGetC(cpu->cpsr) << 31) | (((uint32_t) cpu->gprs[rm]) >> 1); + cpu->shifterOperand = (cpu->cpsr.c << 31) | (((uint32_t) cpu->gprs[rm]) >> 1); cpu->shifterCarryOut = cpu->gprs[rm] & 0x00000001; } }@@ -175,7 +175,7 @@ int rotate = (opcode & 0x00000F00) >> 7;
int immediate = opcode & 0x000000FF; if (!rotate) { cpu->shifterOperand = immediate; - cpu->shifterCarryOut = ARMPSRGetC(cpu->cpsr); + cpu->shifterCarryOut = cpu->cpsr.c; } else { cpu->shifterOperand = ROR(immediate, rotate); cpu->shifterCarryOut = ARM_SIGN(cpu->shifterOperand);@@ -186,76 +186,51 @@ // Instruction definitions
// Beware pre-processor antics #define ARM_ADDITION_S(M, N, D) \ - if (rd == ARM_PC && _ARMModeHasSPSR(ARMPSRGetPriv(cpu->cpsr))) { \ - cpu->cpsr = cpu->spsr; \ - _ARMReadCPSR(cpu); \ - } else { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, ARM_CARRY_FROM(M, N, D)); \ - cpsr = ARMPSROrUnsafeV(cpsr, ARM_V_ADDITION(M, N, D)); \ - cpu->cpsr = (cpu->cpsr & (0x0FFFFFFF)) | cpsr; \ - } - -#define ARM_ADDITION_CARRY_S(M, N, D, C) \ - if (rd == ARM_PC && _ARMModeHasSPSR(ARMPSRGetPriv(cpu->cpsr))) { \ + if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \ cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, ARM_CARRY_FROM_CARRY(M, N, D, C)); \ - cpsr = ARMPSROrUnsafeV(cpsr, ARM_V_ADDITION(M, N, D)); \ - cpu->cpsr = (cpu->cpsr & (0x0FFFFFFF)) | cpsr; \ + cpu->cpsr.n = ARM_SIGN(D); \ + cpu->cpsr.z = !(D); \ + cpu->cpsr.c = ARM_CARRY_FROM(M, N, D); \ + cpu->cpsr.v = ARM_V_ADDITION(M, N, D); \ } #define ARM_SUBTRACTION_S(M, N, D) \ - if (rd == ARM_PC && _ARMModeHasSPSR(ARMPSRGetPriv(cpu->cpsr))) { \ + if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \ cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, ARM_BORROW_FROM(M, N, D)); \ - cpsr = ARMPSROrUnsafeV(cpsr, ARM_V_SUBTRACTION(M, N, D)); \ - cpu->cpsr = (cpu->cpsr & (0x0FFFFFFF)) | cpsr; \ + cpu->cpsr.n = ARM_SIGN(D); \ + cpu->cpsr.z = !(D); \ + cpu->cpsr.c = ARM_BORROW_FROM(M, N, D); \ + cpu->cpsr.v = ARM_V_SUBTRACTION(M, N, D); \ } #define ARM_SUBTRACTION_CARRY_S(M, N, D, C) \ - if (rd == ARM_PC && _ARMModeHasSPSR(ARMPSRGetPriv(cpu->cpsr))) { \ + if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \ cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, ARM_BORROW_FROM_CARRY(M, N, D, C)); \ - cpsr = ARMPSROrUnsafeV(cpsr, ARM_V_SUBTRACTION(M, N, D)); \ - cpu->cpsr = (cpu->cpsr & (0x0FFFFFFF)) | cpsr; \ + cpu->cpsr.n = ARM_SIGN(D); \ + cpu->cpsr.z = !(D); \ + cpu->cpsr.c = ARM_BORROW_FROM_CARRY(M, N, D, C); \ + cpu->cpsr.v = ARM_V_SUBTRACTION(M, N, D); \ } #define ARM_NEUTRAL_S(M, N, D) \ - if (rd == ARM_PC && _ARMModeHasSPSR(ARMPSRGetPriv(cpu->cpsr))) { \ + if (rd == ARM_PC && _ARMModeHasSPSR(cpu->cpsr.priv)) { \ cpu->cpsr = cpu->spsr; \ _ARMReadCPSR(cpu); \ } else { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, cpu->shifterCarryOut); \ - cpu->cpsr = (cpu->cpsr & (0x1FFFFFFF)) | cpsr; \ + cpu->cpsr.n = ARM_SIGN(D); \ + cpu->cpsr.z = !(D); \ + cpu->cpsr.c = cpu->shifterCarryOut; \ } #define ARM_NEUTRAL_HI_S(DLO, DHI) \ - { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(DHI)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !((DHI) | (DLO))); \ - cpu->cpsr = (cpu->cpsr & (0x3FFFFFFF)) | cpsr; \ - } + cpu->cpsr.n = ARM_SIGN(DHI); \ + cpu->cpsr.z = !((DHI) | (DLO)); #define ADDR_MODE_2_I_TEST (opcode & 0x00000F80) #define ADDR_MODE_2_I ((opcode & 0x00000F80) >> 7)@@ -273,7 +248,7 @@
#define ADDR_MODE_2_LSL (cpu->gprs[rm] << ADDR_MODE_2_I) #define ADDR_MODE_2_LSR (ADDR_MODE_2_I_TEST ? ((uint32_t) cpu->gprs[rm]) >> ADDR_MODE_2_I : 0) #define ADDR_MODE_2_ASR (ADDR_MODE_2_I_TEST ? ((int32_t) cpu->gprs[rm]) >> ADDR_MODE_2_I : ((int32_t) cpu->gprs[rm]) >> 31) -#define ADDR_MODE_2_ROR (ADDR_MODE_2_I_TEST ? ROR(cpu->gprs[rm], ADDR_MODE_2_I) : (ARMPSRGetC(cpu->cpsr) << 31) | (((uint32_t) cpu->gprs[rm]) >> 1)) +#define ADDR_MODE_2_ROR (ADDR_MODE_2_I_TEST ? ROR(cpu->gprs[rm], ADDR_MODE_2_I) : (cpu->cpsr.c << 31) | (((uint32_t) cpu->gprs[rm]) >> 1)) #define ADDR_MODE_3_ADDRESS ADDR_MODE_2_ADDRESS #define ADDR_MODE_3_RN ADDR_MODE_2_RN@@ -479,9 +454,9 @@ DEFINE_ALU_INSTRUCTION_ARM(ADD, ARM_ADDITION_S(n, cpu->shifterOperand, cpu->gprs[rd]),
int32_t n = cpu->gprs[rn]; cpu->gprs[rd] = n + cpu->shifterOperand;) -DEFINE_ALU_INSTRUCTION_ARM(ADC, ARM_ADDITION_CARRY_S(n, cpu->shifterOperand, cpu->gprs[rd], ARMPSRGetC(cpu->cpsr)), +DEFINE_ALU_INSTRUCTION_ARM(ADC, ARM_ADDITION_S(n, cpu->shifterOperand, cpu->gprs[rd]), int32_t n = cpu->gprs[rn]; - cpu->gprs[rd] = n + cpu->shifterOperand + ARMPSRGetC(cpu->cpsr);) + cpu->gprs[rd] = n + cpu->shifterOperand + cpu->cpsr.c;) DEFINE_ALU_INSTRUCTION_ARM(AND, ARM_NEUTRAL_S(cpu->gprs[rn], cpu->shifterOperand, cpu->gprs[rd]), cpu->gprs[rd] = cpu->gprs[rn] & cpu->shifterOperand;)@@ -511,13 +486,13 @@ DEFINE_ALU_INSTRUCTION_ARM(RSB, ARM_SUBTRACTION_S(cpu->shifterOperand, n, cpu->gprs[rd]),
int32_t n = cpu->gprs[rn]; cpu->gprs[rd] = cpu->shifterOperand - n;) -DEFINE_ALU_INSTRUCTION_ARM(RSC, ARM_SUBTRACTION_CARRY_S(cpu->shifterOperand, n, cpu->gprs[rd], !ARMPSRIsC(cpu->cpsr)), +DEFINE_ALU_INSTRUCTION_ARM(RSC, ARM_SUBTRACTION_CARRY_S(cpu->shifterOperand, n, cpu->gprs[rd], !cpu->cpsr.c), int32_t n = cpu->gprs[rn]; - cpu->gprs[rd] = cpu->shifterOperand - n - !ARMPSRIsC(cpu->cpsr);) + cpu->gprs[rd] = cpu->shifterOperand - n - !cpu->cpsr.c;) -DEFINE_ALU_INSTRUCTION_ARM(SBC, ARM_SUBTRACTION_CARRY_S(n, cpu->shifterOperand, cpu->gprs[rd], !ARMPSRIsC(cpu->cpsr)), +DEFINE_ALU_INSTRUCTION_ARM(SBC, ARM_SUBTRACTION_CARRY_S(n, cpu->shifterOperand, cpu->gprs[rd], !cpu->cpsr.c), int32_t n = cpu->gprs[rn]; - cpu->gprs[rd] = n - cpu->shifterOperand - !ARMPSRIsC(cpu->cpsr);) + cpu->gprs[rd] = n - cpu->shifterOperand - !cpu->cpsr.c;) DEFINE_ALU_INSTRUCTION_ARM(SUB, ARM_SUBTRACTION_S(n, cpu->shifterOperand, cpu->gprs[rd]), int32_t n = cpu->gprs[rn];@@ -740,14 +715,14 @@ int f = opcode & 0x00080000;
int32_t operand = cpu->gprs[opcode & 0x0000000F]; int32_t mask = (c ? 0x000000FF : 0) | (f ? 0xFF000000 : 0); if (mask & PSR_USER_MASK) { - cpu->cpsr = (cpu->cpsr & ~PSR_USER_MASK) | (operand & PSR_USER_MASK); + cpu->cpsr.packed = (cpu->cpsr.packed & ~PSR_USER_MASK) | (operand & PSR_USER_MASK); } if (mask & PSR_STATE_MASK) { - cpu->cpsr = (cpu->cpsr & ~PSR_STATE_MASK) | (operand & PSR_STATE_MASK); + cpu->cpsr.packed = (cpu->cpsr.packed & ~PSR_STATE_MASK) | (operand & PSR_STATE_MASK); } if (cpu->privilegeMode != MODE_USER && (mask & PSR_PRIV_MASK)) { ARMSetPrivilegeMode(cpu, (enum PrivilegeMode) ((operand & 0x0000000F) | 0x00000010)); - cpu->cpsr = (cpu->cpsr & ~PSR_PRIV_MASK) | (operand & PSR_PRIV_MASK); + cpu->cpsr.packed = (cpu->cpsr.packed & ~PSR_PRIV_MASK) | (operand & PSR_PRIV_MASK); } _ARMReadCPSR(cpu); if (cpu->executionMode == MODE_THUMB) {@@ -764,15 +739,15 @@ int f = opcode & 0x00080000;
int32_t operand = cpu->gprs[opcode & 0x0000000F]; int32_t mask = (c ? 0x000000FF : 0) | (f ? 0xFF000000 : 0); mask &= PSR_USER_MASK | PSR_PRIV_MASK | PSR_STATE_MASK; - cpu->spsr = (cpu->spsr & ~mask) | (operand & mask) | 0x00000010;) + cpu->spsr.packed = (cpu->spsr.packed & ~mask) | (operand & mask) | 0x00000010;) DEFINE_INSTRUCTION_ARM(MRS, \ int rd = (opcode >> 12) & 0xF; \ - cpu->gprs[rd] = cpu->cpsr;) + cpu->gprs[rd] = cpu->cpsr.packed;) DEFINE_INSTRUCTION_ARM(MRSR, \ int rd = (opcode >> 12) & 0xF; \ - cpu->gprs[rd] = cpu->spsr;) + cpu->gprs[rd] = cpu->spsr.packed;) DEFINE_INSTRUCTION_ARM(MSRI, int c = opcode & 0x00010000;@@ -781,14 +756,14 @@ int rotate = (opcode & 0x00000F00) >> 7;
int32_t operand = ROR(opcode & 0x000000FF, rotate); int32_t mask = (c ? 0x000000FF : 0) | (f ? 0xFF000000 : 0); if (mask & PSR_USER_MASK) { - cpu->cpsr = (cpu->cpsr & ~PSR_USER_MASK) | (operand & PSR_USER_MASK); + cpu->cpsr.packed = (cpu->cpsr.packed & ~PSR_USER_MASK) | (operand & PSR_USER_MASK); } if (mask & PSR_STATE_MASK) { - cpu->cpsr = (cpu->cpsr & ~PSR_STATE_MASK) | (operand & PSR_STATE_MASK); + cpu->cpsr.packed = (cpu->cpsr.packed & ~PSR_STATE_MASK) | (operand & PSR_STATE_MASK); } if (cpu->privilegeMode != MODE_USER && (mask & PSR_PRIV_MASK)) { ARMSetPrivilegeMode(cpu, (enum PrivilegeMode) ((operand & 0x0000000F) | 0x00000010)); - cpu->cpsr = (cpu->cpsr & ~PSR_PRIV_MASK) | (operand & PSR_PRIV_MASK); + cpu->cpsr.packed = (cpu->cpsr.packed & ~PSR_PRIV_MASK) | (operand & PSR_PRIV_MASK); } _ARMReadCPSR(cpu); if (cpu->executionMode == MODE_THUMB) {@@ -806,7 +781,7 @@ int rotate = (opcode & 0x00000F00) >> 7;
int32_t operand = ROR(opcode & 0x000000FF, rotate); int32_t mask = (c ? 0x000000FF : 0) | (f ? 0xFF000000 : 0); mask &= PSR_USER_MASK | PSR_PRIV_MASK | PSR_STATE_MASK; - cpu->spsr = (cpu->spsr & ~mask) | (operand & mask) | 0x00000010;) + cpu->spsr.packed = (cpu->spsr.packed & ~mask) | (operand & mask) | 0x00000010;) DEFINE_INSTRUCTION_ARM(SWI, cpu->irqh.swi32(cpu, opcode & 0xFFFFFF))
@@ -12,42 +12,20 @@ // Instruction definitions
// Beware pre-processor insanity #define THUMB_ADDITION_S(M, N, D) \ - { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, ARM_CARRY_FROM(M, N, D)); \ - cpsr = ARMPSROrUnsafeV(cpsr, ARM_V_ADDITION(M, N, D)); \ - cpu->cpsr = (cpu->cpsr & (0x0FFFFFFF)) | cpsr; \ - } - -#define THUMB_ADDITION_CARRY_S(M, N, D, C) \ - { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, ARM_CARRY_FROM_CARRY(M, N, D, C)); \ - cpsr = ARMPSROrUnsafeV(cpsr, ARM_V_ADDITION(M, N, D)); \ - cpu->cpsr = (cpu->cpsr & (0x0FFFFFFF)) | cpsr; \ - } + cpu->cpsr.n = ARM_SIGN(D); \ + cpu->cpsr.z = !(D); \ + cpu->cpsr.c = ARM_CARRY_FROM(M, N, D); \ + cpu->cpsr.v = ARM_V_ADDITION(M, N, D); #define THUMB_SUBTRACTION_S(M, N, D) \ - { \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpsr = ARMPSROrUnsafeC(cpsr, ARM_BORROW_FROM(M, N, D)); \ - cpsr = ARMPSROrUnsafeV(cpsr, ARM_V_SUBTRACTION(M, N, D)); \ - cpu->cpsr = (cpu->cpsr & (0x0FFFFFFF)) | cpsr; \ - } + cpu->cpsr.n = ARM_SIGN(D); \ + cpu->cpsr.z = !(D); \ + cpu->cpsr.c = ARM_BORROW_FROM(M, N, D); \ + cpu->cpsr.v = ARM_V_SUBTRACTION(M, N, D); #define THUMB_NEUTRAL_S(M, N, D) \ -{ \ - ARMPSR cpsr = 0; \ - cpsr = ARMPSROrUnsafeN(cpsr, ARM_SIGN(D)); \ - cpsr = ARMPSROrUnsafeZ(cpsr, !(D)); \ - cpu->cpsr = (cpu->cpsr & (0x3FFFFFFF)) | cpsr; \ - } + cpu->cpsr.n = ARM_SIGN(D); \ + cpu->cpsr.z = !(D); #define THUMB_ADDITION(D, M, N) \ int n = N; \@@ -87,31 +65,31 @@ DEFINE_IMMEDIATE_5_INSTRUCTION_THUMB(LSL1,
if (!immediate) { cpu->gprs[rd] = cpu->gprs[rm]; } else { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, (cpu->gprs[rm] >> (32 - immediate)) & 1); + cpu->cpsr.c = (cpu->gprs[rm] >> (32 - immediate)) & 1; cpu->gprs[rd] = cpu->gprs[rm] << immediate; } THUMB_NEUTRAL_S( , , cpu->gprs[rd]);) DEFINE_IMMEDIATE_5_INSTRUCTION_THUMB(LSR1, if (!immediate) { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, ARM_SIGN(cpu->gprs[rm])); + cpu->cpsr.c = ARM_SIGN(cpu->gprs[rm]); cpu->gprs[rd] = 0; } else { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, (cpu->gprs[rm] >> (immediate - 1)) & 1); + cpu->cpsr.c = (cpu->gprs[rm] >> (immediate - 1)) & 1; cpu->gprs[rd] = ((uint32_t) cpu->gprs[rm]) >> immediate; } THUMB_NEUTRAL_S( , , cpu->gprs[rd]);) DEFINE_IMMEDIATE_5_INSTRUCTION_THUMB(ASR1, if (!immediate) { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, ARM_SIGN(cpu->gprs[rm])); - if (ARMPSRIsC(cpu->cpsr)) { + cpu->cpsr.c = ARM_SIGN(cpu->gprs[rm]); + if (cpu->cpsr.c) { cpu->gprs[rd] = 0xFFFFFFFF; } else { cpu->gprs[rd] = 0; } } else { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, (cpu->gprs[rm] >> (immediate - 1)) & 1); + cpu->cpsr.c = (cpu->gprs[rm] >> (immediate - 1)) & 1; cpu->gprs[rd] = cpu->gprs[rm] >> immediate; } THUMB_NEUTRAL_S( , , cpu->gprs[rd]);)@@ -166,13 +144,13 @@ DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(LSL2,
int rs = cpu->gprs[rn] & 0xFF; if (rs) { if (rs < 32) { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, (cpu->gprs[rd] >> (32 - rs)) & 1); + cpu->cpsr.c = (cpu->gprs[rd] >> (32 - rs)) & 1; cpu->gprs[rd] <<= rs; } else { if (rs > 32) { - cpu->cpsr = ARMPSRClearC(cpu->cpsr); + cpu->cpsr.c = 0; } else { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, cpu->gprs[rd] & 0x00000001); + cpu->cpsr.c = cpu->gprs[rd] & 0x00000001; } cpu->gprs[rd] = 0; }@@ -183,13 +161,13 @@ DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(LSR2,
int rs = cpu->gprs[rn] & 0xFF; if (rs) { if (rs < 32) { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, (cpu->gprs[rd] >> (rs - 1)) & 1); + cpu->cpsr.c = (cpu->gprs[rd] >> (rs - 1)) & 1; cpu->gprs[rd] = (uint32_t) cpu->gprs[rd] >> rs; } else { if (rs > 32) { - cpu->cpsr = ARMPSRClearC(cpu->cpsr); + cpu->cpsr.c = 0; } else { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, ARM_SIGN(cpu->gprs[rd])); + cpu->cpsr.c = ARM_SIGN(cpu->gprs[rd]); } cpu->gprs[rd] = 0; }@@ -200,11 +178,11 @@ DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(ASR2,
int rs = cpu->gprs[rn] & 0xFF; if (rs) { if (rs < 32) { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, (cpu->gprs[rd] >> (rs - 1)) & 1); + cpu->cpsr.c = (cpu->gprs[rd] >> (rs - 1)) & 1; cpu->gprs[rd] >>= rs; } else { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, ARM_SIGN(cpu->gprs[rd])); - if (ARMPSRIsC(cpu->cpsr)) { + cpu->cpsr.c = ARM_SIGN(cpu->gprs[rd]); + if (cpu->cpsr.c) { cpu->gprs[rd] = 0xFFFFFFFF; } else { cpu->gprs[rd] = 0;@@ -216,11 +194,11 @@
DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(ADC, int n = cpu->gprs[rn]; int d = cpu->gprs[rd]; - cpu->gprs[rd] = d + n + ARMPSRGetC(cpu->cpsr); - THUMB_ADDITION_CARRY_S(d, n, cpu->gprs[rd], ARMPSRGetC(cpu->cpsr));) + cpu->gprs[rd] = d + n + cpu->cpsr.c; + THUMB_ADDITION_S(d, n, cpu->gprs[rd]);) DEFINE_DATA_FORM_5_INSTRUCTION_THUMB(SBC, - int n = cpu->gprs[rn] + !ARMPSRIsC(cpu->cpsr); + int n = cpu->gprs[rn] + !cpu->cpsr.c; int d = cpu->gprs[rd]; cpu->gprs[rd] = d - n; THUMB_SUBTRACTION_S(d, n, cpu->gprs[rd]);)@@ -229,10 +207,10 @@ int rs = cpu->gprs[rn] & 0xFF;
if (rs) { int r4 = rs & 0x1F; if (r4 > 0) { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, (cpu->gprs[rd] >> (r4 - 1)) & 1); + cpu->cpsr.c = (cpu->gprs[rd] >> (r4 - 1)) & 1; cpu->gprs[rd] = ROR(cpu->gprs[rd], r4); } else { - cpu->cpsr = ARMPSRSetC(cpu->cpsr, ARM_SIGN(cpu->gprs[rd])); + cpu->cpsr.c = ARM_SIGN(cpu->gprs[rd]); } } THUMB_NEUTRAL_S( , , cpu->gprs[rd]);)
@@ -325,7 +325,7 @@ for (r = 0; r < ARM_PC; ++r) {
_int2hex32(cpu->gprs[r], &stub->outgoing[i]); i += 8; } - _int2hex32(cpu->gprs[ARM_PC] - (ARMPSRIsT(cpu->cpsr) ? WORD_SIZE_THUMB : WORD_SIZE_ARM), &stub->outgoing[i]); + _int2hex32(cpu->gprs[ARM_PC] - (cpu->cpsr.t ? WORD_SIZE_THUMB : WORD_SIZE_ARM), &stub->outgoing[i]); i += 8; stub->outgoing[i] = 0;@@ -359,7 +359,7 @@ THUMB_WRITE_PC;
} } } else if (reg == 0x19) { - cpu->cpsr = value; + cpu->cpsr.packed = value; } else { stub->outgoing[0] = '\0'; _sendMessage(stub);@@ -379,7 +379,7 @@ uint32_t value;
if (reg < 0x10) { value = cpu->gprs[reg]; } else if (reg == 0x19) { - value = cpu->cpsr; + value = cpu->cpsr.packed; } else { stub->outgoing[0] = '\0'; _sendMessage(stub);
@@ -261,7 +261,7 @@
static void DSProcessEvents(struct DSCommon* dscore) { struct ARMCore* cpu = dscore->cpu; struct DS* ds = dscore->p; - if (dscore->springIRQ && !ARMPSRGetI(cpu->cpsr)) { + if (dscore->springIRQ && !cpu->cpsr.i) { ARMRaiseIRQ(cpu); dscore->springIRQ = 0; }
@@ -25,11 +25,11 @@
static void _SoftReset(struct GBA* gba) { struct ARMCore* cpu = gba->cpu; ARMSetPrivilegeMode(cpu, MODE_IRQ); - cpu->spsr = 0; + cpu->spsr.packed = 0; cpu->gprs[ARM_LR] = 0; cpu->gprs[ARM_SP] = SP_BASE_IRQ; ARMSetPrivilegeMode(cpu, MODE_SUPERVISOR); - cpu->spsr = 0; + cpu->spsr.packed = 0; cpu->gprs[ARM_LR] = 0; cpu->gprs[ARM_SP] = SP_BASE_SUPERVISOR; ARMSetPrivilegeMode(cpu, MODE_SYSTEM);
@@ -227,7 +227,7 @@ if (cpu->executionMode == MODE_THUMB) {
gba->bus |= cpu->prefetch[1] << 16; } - if (gba->springIRQ && !ARMPSRIsI(cpu->cpsr)) { + if (gba->springIRQ && !cpu->cpsr.i) { ARMRaiseIRQ(cpu); gba->springIRQ = 0; }
@@ -160,39 +160,35 @@ }
} bool GBASavedataLoad(struct GBASavedata* savedata, struct VFile* in) { - if (savedata->vf) { + if (savedata->data) { + if (!in && savedata->type != SAVEDATA_FORCE_NONE) { + return false; + } + ssize_t size = GBASavedataSize(savedata); + in->seek(in, 0, SEEK_SET); + return in->read(in, savedata->data, size) == size; + } else if (savedata->vf) { off_t read = 0; uint8_t buffer[2048]; - memset(buffer, 0xFF, sizeof(buffer)); - savedata->vf->seek(savedata->vf, 0, SEEK_SET); - while (savedata->vf->seek(savedata->vf, 0, SEEK_CUR) < savedata->vf->size(savedata->vf)) { - savedata->vf->write(savedata->vf, buffer, sizeof(buffer)); - } savedata->vf->seek(savedata->vf, 0, SEEK_SET); if (in) { + in->seek(in, 0, SEEK_SET); do { read = in->read(in, buffer, sizeof(buffer)); read = savedata->vf->write(savedata->vf, buffer, read); } while (read == sizeof(buffer)); } - return read >= 0; - } else if (savedata->data) { - if (!in && savedata->type != SAVEDATA_FORCE_NONE) { - return false; + memset(buffer, 0xFF, sizeof(buffer)); + ssize_t fsize = savedata->vf->size(savedata->vf); + ssize_t pos = savedata->vf->seek(savedata->vf, 0, SEEK_CUR); + while (fsize - pos >= (ssize_t) sizeof(buffer)) { + savedata->vf->write(savedata->vf, buffer, sizeof(buffer)); + pos = savedata->vf->seek(savedata->vf, 0, SEEK_CUR); } - switch (savedata->type) { - case SAVEDATA_SRAM: - return in->read(in, savedata->data, SIZE_CART_SRAM) == SIZE_CART_SRAM; - case SAVEDATA_FLASH512: - return in->read(in, savedata->data, SIZE_CART_FLASH512) == SIZE_CART_FLASH512; - case SAVEDATA_FLASH1M: - return in->read(in, savedata->data, SIZE_CART_FLASH1M) == SIZE_CART_FLASH1M; - case SAVEDATA_EEPROM: - return in->read(in, savedata->data, SIZE_CART_EEPROM) == SIZE_CART_EEPROM; - case SAVEDATA_AUTODETECT: - case SAVEDATA_FORCE_NONE: - return true; + if (fsize - pos > 0) { + savedata->vf->write(savedata->vf, buffer, fsize - pos); } + return read >= 0; } return true; }@@ -560,8 +556,9 @@ void _flashSwitchBank(struct GBASavedata* savedata, int bank) {
mLOG(GBA_SAVE, DEBUG, "Performing flash bank switch to bank %i", bank); savedata->currentBank = &savedata->data[bank << 16]; if (bank > 0 && savedata->type == SAVEDATA_FLASH512) { + mLOG(GBA_SAVE, INFO, "Updating flash chip from 512kb to 1Mb"); savedata->type = SAVEDATA_FLASH1M; - if (savedata->vf) { + if (savedata->vf && savedata->vf->size(savedata->vf) == SIZE_CART_FLASH512) { savedata->vf->truncate(savedata->vf, SIZE_CART_FLASH1M); memset(&savedata->data[SIZE_CART_FLASH512], 0xFF, SIZE_CART_FLASH512); }
@@ -42,8 +42,8 @@ int i;
for (i = 0; i < 16; ++i) { STORE_32(gba->cpu->gprs[i], i * sizeof(state->cpu.gprs[0]), state->cpu.gprs); } - STORE_32(gba->cpu->cpsr, 0, &state->cpu.cpsr); - STORE_32(gba->cpu->spsr, 0, &state->cpu.spsr); + STORE_32(gba->cpu->cpsr.packed, 0, &state->cpu.cpsr.packed); + STORE_32(gba->cpu->spsr.packed, 0, &state->cpu.spsr.packed); STORE_32(gba->cpu->cycles, 0, &state->cpu.cycles); STORE_32(gba->cpu->nextEvent, 0, &state->cpu.nextEvent); for (i = 0; i < 6; ++i) {@@ -151,8 +151,8 @@ size_t i;
for (i = 0; i < 16; ++i) { LOAD_32(gba->cpu->gprs[i], i * sizeof(gba->cpu->gprs[0]), state->cpu.gprs); } - LOAD_32(gba->cpu->cpsr, 0, &state->cpu.cpsr); - LOAD_32(gba->cpu->spsr, 0, &state->cpu.spsr); + LOAD_32(gba->cpu->cpsr.packed, 0, &state->cpu.cpsr.packed); + LOAD_32(gba->cpu->spsr.packed, 0, &state->cpu.spsr.packed); LOAD_32(gba->cpu->cycles, 0, &state->cpu.cycles); LOAD_32(gba->cpu->nextEvent, 0, &state->cpu.nextEvent); for (i = 0; i < 6; ++i) {@@ -162,13 +162,13 @@ LOAD_32(gba->cpu->bankedRegisters[i][j], (i * 7 + j) * sizeof(gba->cpu->bankedRegisters[0][0]), state->cpu.bankedRegisters);
} LOAD_32(gba->cpu->bankedSPSRs[i], i * sizeof(gba->cpu->bankedSPSRs[0]), state->cpu.bankedSPSRs); } - gba->cpu->privilegeMode = ARMPSRGetPriv(gba->cpu->cpsr); + gba->cpu->privilegeMode = gba->cpu->cpsr.priv; gba->cpu->memory.setActiveRegion(gba->cpu, gba->cpu->gprs[ARM_PC]); if (state->biosPrefetch) { LOAD_32(gba->memory.biosPrefetch, 0, &state->biosPrefetch); } LOAD_32(gba->memory.lastPrefetchedPc, 0, &state->lastPrefetchedPc); - if (ARMPSRIsT(gba->cpu->cpsr)) { + if (gba->cpu->cpsr.t) { gba->cpu->executionMode = MODE_THUMB; if (state->cpuPrefetch[0] && state->cpuPrefetch[1]) { LOAD_32(gba->cpu->prefetch[0], 0, state->cpuPrefetch);
@@ -236,7 +236,7 @@ else()
qt5_add_translation(TRANSLATION_FILES ${TS_FILES}) endif() add_custom_command(OUTPUT ${TRANSLATION_QRC} - COMMAND ${CMAKE_COMMAND} -DTRANSLATION_QRC:FILEPATH="${TRANSLATION_QRC}" -DTRANSLATION_FILES="${TRANSLATION_FILES}" -P "${CMAKE_CURRENT_SOURCE_DIR}/ts.cmake" + COMMAND ${CMAKE_COMMAND} -DTRANSLATION_QRC:FILEPATH="${TRANSLATION_QRC}" -DQM_BASE="${CMAKE_CURRENT_BINARY_DIR}" -P "${CMAKE_CURRENT_SOURCE_DIR}/ts.cmake" DEPENDS ${TRANSLATION_FILES}) qt5_add_resources(TRANSLATION_RESOURCES ${TRANSLATION_QRC}) list(APPEND RESOURCES ${TRANSLATION_RESOURCES})
@@ -525,11 +525,11 @@ void GameController::loadBIOS(int platform, const QString& path) {
if (m_bios == path) { return; } - if (m_gameOpen && this->platform() == platform) { + if (!m_bios.isNull() && m_gameOpen && this->platform() == platform) { closeGame(); m_bios = path; openGame(); - } else if (!m_gameOpen) { + } else if (!m_gameOpen || m_bios.isNull()) { m_bios = path; } }
@@ -6,6 +6,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "GBAApp.h" #include "Window.h" +#include <QLibraryInfo> +#include <QTranslator> + +#include <mgba/core/version.h> + #ifdef QT_STATIC #include <QtPlugin> #ifdef _WIN32@@ -18,5 +23,16 @@ #endif
int main(int argc, char* argv[]) { QGBA::GBAApp application(argc, argv); + + QLocale locale = QLocale::system(); + + QTranslator qtTranslator; + qtTranslator.load(locale, "qt", "_", QLibraryInfo::location(QLibraryInfo::TranslationsPath)); + application.installTranslator(&qtTranslator); + + QTranslator langTranslator; + langTranslator.load(locale, binaryName, "-", ":/translations/"); + application.installTranslator(&langTranslator); + return application.exec(); }
@@ -1,5 +1,8 @@
+file(GLOB TRANSLATION_FILES "${QM_BASE}/*.qm") file(WRITE ${TRANSLATION_QRC} "<RCC>\n\t<qresource prefix=\"/translations/\">\n") +message(STATUS ${TRANSLATION_FILES}) foreach(TS ${TRANSLATION_FILES}) + message(STATUS ${TS}) get_filename_component(TS_BASE "${TS}" NAME) file(APPEND ${TRANSLATION_QRC} "\t\t<file>${TS_BASE}</file>\n") endforeach()
@@ -9,37 +9,48 @@ <source>About</source>
<translation type="unfinished"></translation> </message> <message> - <location filename="../AboutScreen.ui" line="30"/> + <location filename="../AboutScreen.ui" line="23"/> + <source><a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a></source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="58"/> <source>{projectName}</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../AboutScreen.ui" line="45"/> - <source>© 2013 – 2016 Jeffrey Pfau — Game Boy Advance is a registered trademark of Nintendo Co., Ltd.</source> + <location filename="../AboutScreen.ui" line="68"/> + <source>{projectName} would like to thank the following patrons from Patreon:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../AboutScreen.ui" line="64"/> - <source>{projectVersion}</source> + <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> </message> <message> - <location filename="../AboutScreen.ui" line="113"/> - <source>{logo}</source> + <location filename="../AboutScreen.ui" line="190"/> + <source>{patrons}</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../AboutScreen.ui" line="135"/> - <source>{projectName} is an open-source Game Boy Advance emulator</source> + <location filename="../AboutScreen.ui" line="106"/> + <source>{projectVersion}</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../AboutScreen.ui" line="148"/> - <source><a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a> • <a href="https://github.com/mgba-emu/mgba/blob/{gitBranch}/LICENSE">License</a></source> + <location filename="../AboutScreen.ui" line="155"/> + <source>{logo}</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../AboutScreen.ui" line="166"/> + <location filename="../AboutScreen.ui" line="177"/> + <source>{projectName} is an open-source Game Boy Advance emulator</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AboutScreen.ui" line="41"/> <source>Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt></source> <translation type="unfinished"></translation> </message>@@ -51,6 +62,61 @@ <location filename="../ArchiveInspector.ui" line="14"/>
<source>Open in archive...</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../ArchiveInspector.ui" line="20"/> + <source>Loading...</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>AssetTile</name> + <message> + <location filename="../AssetTile.ui" line="12"/> + <source>AssetTile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="33"/> + <source>Tile #</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="40"/> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="54"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="61"/> + <source>0x06000000</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="100"/> + <source>Red</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="107"/> + <source>Green</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../AssetTile.ui" line="114"/> + <source>Blue</source> + <translation type="unfinished"></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> + </message> </context> <context> <name>CheatsView</name>@@ -86,6 +152,24 @@ <translation type="unfinished"></translation>
</message> </context> <context> + <name>DebuggerConsole</name> + <message> + <location filename="../DebuggerConsole.ui" line="14"/> + <source>Debugger</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../DebuggerConsole.ui" line="25"/> + <source>Enter command (try `help` for more info)</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../DebuggerConsole.ui" line="32"/> + <source>Break</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>GIFView</name> <message> <location filename="../GIFView.ui" line="14"/>@@ -213,6 +297,14 @@ </message>
<message> <location filename="../IOViewer.ui" line="364"/> <source>B</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>LibraryView</name> + <message> + <location filename="../LibraryView.ui" line="14"/> + <source>Library</source> <translation type="unfinished"></translation> </message> </context>@@ -379,17 +471,188 @@ <source>4 Bytes</source>
<translation type="unfinished"></translation> </message> <message> - <location filename="../MemoryView.ui" line="180"/> + <location filename="../MemoryView.ui" line="199"/> <source>Signed Integer:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../MemoryView.ui" line="198"/> + <location filename="../MemoryView.ui" line="217"/> + <source>String:</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="231"/> + <source>Load TBL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="244"/> + <source>Copy Selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="251"/> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="271"/> + <source>Save Selection</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="278"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryView.ui" line="181"/> <source>Unsigned Integer:</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>ObjView</name> + <message> + <location filename="../ObjView.ui" line="14"/> + <source>Sprites</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="56"/> + <location filename="../ObjView.ui" line="499"/> + <source>×</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="69"/> + <source>Magnification</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="78"/> + <source>Attributes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="86"/> + <source>Transform</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="106"/> + <source>Off</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="117"/> + <source>Palette</source> + <translation type="unfinished"></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"/> + <source>0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="151"/> + <source>Double Size</source> + <translation type="unfinished"></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"/> + <source>Return, Ctrl+R</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="195"/> + <source>Flipped</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="218"/> + <source>H</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="231"/> + <source>V</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="245"/> + <source>Mode</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="265"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="276"/> + <source>Mosaic</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="313"/> + <source>Enabled</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="347"/> + <source>Priority</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="382"/> + <source>Tile</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="389"/> + <source>Geometry</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="397"/> + <source>Position</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="433"/> + <source>, </source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="463"/> + <source>Dimensions</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="489"/> + <location filename="../ObjView.ui" line="515"/> + <source>8</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="545"/> + <source>Address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.ui" line="552"/> + <source>0x07000000</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>OverrideView</name> <message> <location filename="../OverrideView.ui" line="20"/>@@ -632,14 +895,29 @@ <translation type="unfinished"></translation>
</message> </context> <context> + <name>QGBA::AssetTile</name> + <message> + <location filename="../AssetTile.cpp" line="107"/> + <source>%0%1%2</source> + <translation type="unfinished"></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> + </message> +</context> +<context> <name>QGBA::CheatsModel</name> <message> - <location filename="../CheatsModel.cpp" line="55"/> + <location filename="../CheatsModel.cpp" line="54"/> <source>(untitled)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../CheatsModel.cpp" line="210"/> + <location filename="../CheatsModel.cpp" line="209"/> <source>Failed to open cheats file: %1</source> <translation type="unfinished"></translation> </message>@@ -647,8 +925,8 @@ </context>
<context> <name>QGBA::CheatsView</name> <message> - <location filename="../CheatsView.cpp" line="114"/> - <location filename="../CheatsView.cpp" line="121"/> + <location filename="../CheatsView.cpp" line="112"/> + <location filename="../CheatsView.cpp" line="119"/> <source>Select cheats file</source> <translation type="unfinished"></translation> </message>@@ -656,40 +934,83 @@ </context>
<context> <name>QGBA::GBAKeyEditor</name> <message> - <location filename="../GBAKeyEditor.cpp" line="70"/> + <location filename="../GBAKeyEditor.cpp" line="68"/> <source>Clear Button</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GBAKeyEditor.cpp" line="81"/> + <location filename="../GBAKeyEditor.cpp" line="80"/> <source>Clear Analog</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GBAKeyEditor.cpp" line="92"/> + <location filename="../GBAKeyEditor.cpp" line="91"/> <source>Refresh</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GBAKeyEditor.cpp" line="102"/> + <location filename="../GBAKeyEditor.cpp" line="101"/> <source>Set all</source> <translation type="unfinished"></translation> </message> </context> <context> + <name>QGBA::GDBWindow</name> + <message> + <location filename="../GDBWindow.cpp" line="28"/> + <source>Server settings</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="34"/> + <source>Local port</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="36"/> + <source>Bind address</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="55"/> + <source>Break</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="104"/> + <source>Stop</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="114"/> + <source>Start</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="122"/> + <source>Crash</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../GDBWindow.cpp" line="122"/> + <source>Could not start GDB server</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> <name>QGBA::GIFView</name> <message> - <location filename="../GIFView.cpp" line="42"/> + <location filename="../GIFView.cpp" line="45"/> <source>Failed to open output GIF file: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GIFView.cpp" line="60"/> + <location filename="../GIFView.cpp" line="63"/> <source>Select output file</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GIFView.cpp" line="60"/> + <location filename="../GIFView.cpp" line="63"/> <source>Graphics Interchange Format (*.gif)</source> <translation type="unfinished"></translation> </message>@@ -697,28 +1018,28 @@ </context>
<context> <name>QGBA::GameController</name> <message> - <location filename="../GameController.cpp" line="325"/> - <location filename="../GameController.cpp" line="495"/> + <location filename="../GameController.cpp" line="397"/> + <location filename="../GameController.cpp" line="572"/> <source>Failed to open game file: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GameController.cpp" line="466"/> + <location filename="../GameController.cpp" line="544"/> <source>Failed to open save file: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GameController.cpp" line="524"/> + <location filename="../GameController.cpp" line="601"/> <source>Failed to open snapshot file for reading: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GameController.cpp" line="544"/> + <location filename="../GameController.cpp" line="621"/> <source>Failed to open snapshot file for writing: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../GameController.cpp" line="832"/> + <location filename="../GameController.cpp" line="914"/> <source>Failed to start audio processor</source> <translation type="unfinished"></translation> </message>@@ -2094,8 +2415,8 @@ </context>
<context> <name>QGBA::KeyEditor</name> <message> - <location filename="../KeyEditor.cpp" line="35"/> - <location filename="../KeyEditor.cpp" line="169"/> + <location filename="../KeyEditor.cpp" line="37"/> + <location filename="../KeyEditor.cpp" line="211"/> <source>---</source> <translation type="unfinished"></translation> </message>@@ -2103,40 +2424,75 @@ </context>
<context> <name>QGBA::LibraryModel</name> <message> - <location filename="../LibraryModel.cpp" line="59"/> + <location filename="../LibraryModel.cpp" line="24"/> + <source>Name</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="33"/> <source>Filename</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../LibraryModel.cpp" line="61"/> + <location filename="../LibraryModel.cpp" line="39"/> <source>Size</source> <translation type="unfinished"></translation> </message> + <message> + <location filename="../LibraryModel.cpp" line="56"/> + <source>Platform</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="62"/> + <source>GBA</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="66"/> + <source>GB</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="69"/> + <source>?</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="74"/> + <source>Location</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../LibraryModel.cpp" line="80"/> + <source>CRC32</source> + <translation type="unfinished"></translation> + </message> </context> <context> <name>QGBA::LoadSaveState</name> <message> - <location filename="../LoadSaveState.cpp" line="72"/> + <location filename="../LoadSaveState.cpp" line="68"/> <source>Load State</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../LoadSaveState.cpp" line="72"/> + <location filename="../LoadSaveState.cpp" line="68"/> <source>Save State</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../LoadSaveState.cpp" line="181"/> + <location filename="../LoadSaveState.cpp" line="177"/> <source>Empty</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../LoadSaveState.cpp" line="190"/> + <location filename="../LoadSaveState.cpp" line="186"/> <source>Corrupted</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../LoadSaveState.cpp" line="213"/> + <location filename="../LoadSaveState.cpp" line="209"/> <source>Slot %1</source> <translation type="unfinished"></translation> </message>@@ -2182,58 +2538,128 @@ </context>
<context> <name>QGBA::MemoryModel</name> <message> - <location filename="../MemoryModel.cpp" line="49"/> + <location filename="../MemoryModel.cpp" line="50"/> <source>Copy selection</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../MemoryModel.cpp" line="54"/> + <location filename="../MemoryModel.cpp" line="55"/> <source>Save selection</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../MemoryModel.cpp" line="86"/> - <location filename="../MemoryModel.cpp" line="133"/> + <location filename="../MemoryModel.cpp" line="60"/> + <source>Paste</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="65"/> + <source>Load</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="97"/> + <location filename="../MemoryModel.cpp" line="162"/> <source>All</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../MemoryModel.cpp" line="161"/> + <location filename="../MemoryModel.cpp" line="142"/> + <source>Load TBL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="202"/> <source>Save selected memory</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../MemoryModel.cpp" line="167"/> + <location filename="../MemoryModel.cpp" line="208"/> <source>Failed to open output file: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../MemoryModel.cpp" line="212"/> - <source>ASCII</source> + <location filename="../MemoryModel.cpp" line="216"/> + <source>Load memory</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="222"/> + <source>Failed to open input file: %1</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="338"/> + <source>TBL</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../MemoryModel.cpp" line="338"/> + <source>ISO-8859-1</source> + <translation type="unfinished"></translation> + </message> +</context> +<context> + <name>QGBA::ObjView</name> + <message> + <location filename="../ObjView.cpp" line="135"/> + <location filename="../ObjView.cpp" line="221"/> + <source>0x%0</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="146"/> + <source>Off</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="151"/> + <source>Normal</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="154"/> + <source>Trans</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="157"/> + <source>OBJWIN</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="160"/> + <source>Invalid</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../ObjView.cpp" line="228"/> + <location filename="../ObjView.cpp" line="229"/> + <source>N/A</source> <translation type="unfinished"></translation> </message> </context> <context> <name>QGBA::PaletteView</name> <message> - <location filename="../PaletteView.cpp" line="121"/> + <location filename="../PaletteView.cpp" line="120"/> <source>#%0</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../PaletteView.cpp" line="122"/> + <location filename="../PaletteView.cpp" line="121"/> <source>0x%0</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../PaletteView.cpp" line="123"/> + <location filename="../PaletteView.cpp" line="122"/> <source>%0</source> <translation type="unfinished"></translation> </message> <message> + <location filename="../PaletteView.cpp" line="123"/> <location filename="../PaletteView.cpp" line="124"/> <location filename="../PaletteView.cpp" line="125"/> - <location filename="../PaletteView.cpp" line="126"/> <source>0x%0 (%1)</source> <translation type="unfinished"></translation> </message>@@ -2248,7 +2674,7 @@ <source>Windows PAL (*.pal);;Adobe Color Table (*.act)</source>
<translation type="unfinished"></translation> </message> <message> - <location filename="../PaletteView.cpp" line="146"/> + <location filename="../PaletteView.cpp" line="145"/> <source>Failed to open output palette file: %1</source> <translation type="unfinished"></translation> </message>@@ -2256,22 +2682,22 @@ </context>
<context> <name>QGBA::ROMInfo</name> <message> - <location filename="../ROMInfo.cpp" line="46"/> - <location filename="../ROMInfo.cpp" line="67"/> - <location filename="../ROMInfo.cpp" line="77"/> - <location filename="../ROMInfo.cpp" line="83"/> - <location filename="../ROMInfo.cpp" line="84"/> + <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 type="unfinished"></translation> </message> <message> - <location filename="../ROMInfo.cpp" line="53"/> - <location filename="../ROMInfo.cpp" line="61"/> + <location filename="../ROMInfo.cpp" line="57"/> + <location filename="../ROMInfo.cpp" line="64"/> <source> bytes</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ROMInfo.cpp" line="80"/> + <location filename="../ROMInfo.cpp" line="83"/> <source>(no database present)</source> <translation type="unfinished"></translation> </message>@@ -2279,32 +2705,32 @@ </context>
<context> <name>QGBA::SettingsView</name> <message> - <location filename="../SettingsView.cpp" line="98"/> + <location filename="../SettingsView.cpp" line="96"/> <source>Qt Multimedia</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.cpp" line="105"/> + <location filename="../SettingsView.cpp" line="103"/> <source>SDL</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.cpp" line="113"/> + <location filename="../SettingsView.cpp" line="111"/> <source>Software (Qt)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.cpp" line="119"/> + <location filename="../SettingsView.cpp" line="117"/> <source>OpenGL</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.cpp" line="126"/> + <location filename="../SettingsView.cpp" line="124"/> <source>OpenGL (force version 1.x)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.cpp" line="162"/> + <location filename="../SettingsView.cpp" line="174"/> <source>Select BIOS</source> <translation type="unfinished"></translation> </message>@@ -2312,37 +2738,37 @@ </context>
<context> <name>QGBA::ShaderSelector</name> <message> - <location filename="../ShaderSelector.cpp" line="51"/> + <location filename="../ShaderSelector.cpp" line="50"/> <source>No shader active</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ShaderSelector.cpp" line="64"/> + <location filename="../ShaderSelector.cpp" line="63"/> <source>Load shader</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ShaderSelector.cpp" line="64"/> + <location filename="../ShaderSelector.cpp" line="63"/> <source>%1 Shader (%.shader)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ShaderSelector.cpp" line="103"/> + <location filename="../ShaderSelector.cpp" line="102"/> <source>No shader loaded</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ShaderSelector.cpp" line="111"/> + <location filename="../ShaderSelector.cpp" line="110"/> <source>by %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ShaderSelector.cpp" line="122"/> + <location filename="../ShaderSelector.cpp" line="121"/> <source>Preprocessing</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../ShaderSelector.cpp" line="129"/> + <location filename="../ShaderSelector.cpp" line="128"/> <source>Pass %1</source> <translation type="unfinished"></translation> </message>@@ -2362,32 +2788,23 @@ </message>
<message> <location filename="../ShortcutController.cpp" line="71"/> <source>Gamepad</source> - <translation type="unfinished"></translation> - </message> -</context> -<context> - <name>QGBA::TileView</name> - <message> - <location filename="../TileView.cpp" line="62"/> - <location filename="../TileView.cpp" line="69"/> - <source>0x%0</source> <translation type="unfinished"></translation> </message> </context> <context> <name>QGBA::VideoView</name> <message> - <location filename="../VideoView.cpp" line="214"/> + <location filename="../VideoView.cpp" line="208"/> <source>Failed to open output video file: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.cpp" line="232"/> + <location filename="../VideoView.cpp" line="226"/> <source>Native (%0x%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../VideoView.cpp" line="247"/> + <location filename="../VideoView.cpp" line="241"/> <source>Select output file</source> <translation type="unfinished"></translation> </message>@@ -2395,690 +2812,700 @@ </context>
<context> <name>QGBA::Window</name> <message> - <location filename="../Window.cpp" line="302"/> + <location filename="../Window.cpp" line="340"/> <source>Game Boy Advance ROMs (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="318"/> + <location filename="../Window.cpp" line="356"/> <source>Game Boy ROMs (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="322"/> + <location filename="../Window.cpp" line="360"/> <source>All ROMs (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="337"/> + <location filename="../Window.cpp" line="375"/> <source>Archives (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="342"/> - <location filename="../Window.cpp" line="349"/> - <location filename="../Window.cpp" line="366"/> + <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> </message> <message> - <location filename="../Window.cpp" line="374"/> + <location filename="../Window.cpp" line="423"/> <source>Game Boy Advance save files (%1)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="375"/> - <location filename="../Window.cpp" line="420"/> - <location filename="../Window.cpp" line="427"/> + <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> </message> <message> - <location filename="../Window.cpp" line="395"/> - <source>Select BIOS</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Window.cpp" line="407"/> + <location filename="../Window.cpp" line="444"/> <source>Select patch</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="407"/> + <location filename="../Window.cpp" line="444"/> <source>Patches (*.ips *.ups *.bps)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="420"/> - <location filename="../Window.cpp" line="427"/> + <location filename="../Window.cpp" line="457"/> + <location filename="../Window.cpp" line="464"/> <source>GameShark saves (*.sps *.xps)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="742"/> + <location filename="../Window.cpp" line="782"/> <source>Crash</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="743"/> + <location filename="../Window.cpp" line="783"/> <source>The game has crashed with the following error: %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="750"/> + <location filename="../Window.cpp" line="790"/> <source>Couldn't Load</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="751"/> + <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> </message> <message> - <location filename="../Window.cpp" line="764"/> + <location filename="../Window.cpp" line="804"/> <source>Unimplemented BIOS call</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="765"/> + <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> </message> <message> - <location filename="../Window.cpp" line="772"/> + <location filename="../Window.cpp" line="812"/> <source>Really make portable?</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="773"/> + <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> </message> <message> - <location filename="../Window.cpp" line="781"/> + <location filename="../Window.cpp" line="821"/> <source>Restart needed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="782"/> + <location filename="../Window.cpp" line="822"/> <source>Some changes will not take effect until the emulator is restarted.</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="846"/> + <location filename="../Window.cpp" line="869"/> <source> - Player %1 of %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="857"/> + <location filename="../Window.cpp" line="880"/> <source>%1 - %2</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="859"/> + <location filename="../Window.cpp" line="882"/> <source>%1 - %2 - %3</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="861"/> + <location filename="../Window.cpp" line="884"/> <source>%1 - %2 (%3 fps) - %4</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="893"/> + <location filename="../Window.cpp" line="916"/> <source>&File</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="896"/> + <location filename="../Window.cpp" line="919"/> <source>Load &ROM...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="898"/> + <location filename="../Window.cpp" line="922"/> <source>Load ROM in archive...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="901"/> - <source>Load &BIOS...</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../Window.cpp" line="903"/> + <location filename="../Window.cpp" line="928"/> <source>Load temporary save...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="908"/> + <location filename="../Window.cpp" line="933"/> <source>Load &patch...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="909"/> + <location filename="../Window.cpp" line="935"/> <source>Boot BIOS</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="911"/> + <location filename="../Window.cpp" line="942"/> <source>Replace ROM...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="913"/> + <location filename="../Window.cpp" line="944"/> <source>ROM &info...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="918"/> + <location filename="../Window.cpp" line="949"/> <source>Recent</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="922"/> + <location filename="../Window.cpp" line="953"/> <source>Make portable</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="926"/> + <location filename="../Window.cpp" line="957"/> <source>&Load state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="927"/> + <location filename="../Window.cpp" line="958"/> <source>F10</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="933"/> + <location filename="../Window.cpp" line="964"/> <source>&Save state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="934"/> + <location filename="../Window.cpp" line="965"/> <source>Shift+F10</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="940"/> + <location filename="../Window.cpp" line="971"/> <source>Quick load</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="941"/> + <location filename="../Window.cpp" line="972"/> <source>Quick save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="945"/> + <location filename="../Window.cpp" line="976"/> <source>Load recent</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="951"/> + <location filename="../Window.cpp" line="982"/> <source>Save recent</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="960"/> + <location filename="../Window.cpp" line="991"/> <source>Undo load state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="961"/> + <location filename="../Window.cpp" line="992"/> <source>F11</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="967"/> + <location filename="../Window.cpp" line="998"/> <source>Undo save state</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="968"/> + <location filename="../Window.cpp" line="999"/> <source>Shift+F11</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="979"/> - <location filename="../Window.cpp" line="986"/> + <location filename="../Window.cpp" line="1010"/> + <location filename="../Window.cpp" line="1017"/> <source>State &%1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="980"/> + <location filename="../Window.cpp" line="1011"/> <source>F%1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="987"/> + <location filename="../Window.cpp" line="1018"/> <source>Shift+F%1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="996"/> + <location filename="../Window.cpp" line="1027"/> <source>Import GameShark Save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1002"/> + <location filename="../Window.cpp" line="1033"/> <source>Export GameShark Save</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1010"/> + <location filename="../Window.cpp" line="1041"/> <source>New multiplayer window</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1020"/> + <location filename="../Window.cpp" line="1051"/> <source>About</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1025"/> + <location filename="../Window.cpp" line="1056"/> <source>E&xit</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1028"/> + <location filename="../Window.cpp" line="1059"/> <source>&Emulation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1030"/> + <location filename="../Window.cpp" line="1061"/> <source>&Reset</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1031"/> + <location filename="../Window.cpp" line="1062"/> <source>Ctrl+R</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1036"/> + <location filename="../Window.cpp" line="1067"/> <source>Sh&utdown</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1042"/> + <location filename="../Window.cpp" line="1073"/> <source>Yank game pak</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1050"/> + <location filename="../Window.cpp" line="1081"/> <source>&Pause</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1053"/> + <location filename="../Window.cpp" line="1084"/> <source>Ctrl+P</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1062"/> + <location filename="../Window.cpp" line="1093"/> <source>&Next frame</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1063"/> + <location filename="../Window.cpp" line="1094"/> <source>Ctrl+N</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1074"/> + <location filename="../Window.cpp" line="1105"/> <source>Fast forward (held)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1076"/> + <location filename="../Window.cpp" line="1107"/> <source>&Fast forward</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1079"/> + <location filename="../Window.cpp" line="1110"/> <source>Shift+Tab</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1083"/> + <location filename="../Window.cpp" line="1114"/> <source>Fast forward speed</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1088"/> + <location filename="../Window.cpp" line="1119"/> <source>Unbounded</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1092"/> + <location filename="../Window.cpp" line="1123"/> <source>%0x</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1100"/> + <location filename="../Window.cpp" line="1131"/> <source>Rewind (held)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1102"/> + <location filename="../Window.cpp" line="1133"/> <source>Re&wind</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1103"/> + <location filename="../Window.cpp" line="1134"/> <source>~</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1109"/> + <location filename="../Window.cpp" line="1140"/> <source>Step backwards</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1110"/> + <location filename="../Window.cpp" line="1141"/> <source>Ctrl+B</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1119"/> + <location filename="../Window.cpp" line="1150"/> <source>Sync to &video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1126"/> + <location filename="../Window.cpp" line="1157"/> <source>Sync to &audio</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1134"/> + <location filename="../Window.cpp" line="1165"/> <source>Solar sensor</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1136"/> + <location filename="../Window.cpp" line="1167"/> <source>Increase solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1140"/> + <location filename="../Window.cpp" line="1171"/> <source>Decrease solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1144"/> + <location filename="../Window.cpp" line="1175"/> <source>Brightest solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1148"/> + <location filename="../Window.cpp" line="1179"/> <source>Darkest solar level</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1154"/> + <location filename="../Window.cpp" line="1185"/> <source>Brightness %1</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1161"/> + <location filename="../Window.cpp" line="1192"/> <source>Audio/&Video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1163"/> + <location filename="../Window.cpp" line="1194"/> <source>Frame size</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1166"/> + <location filename="../Window.cpp" line="1197"/> <source>%1x</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1189"/> + <location filename="../Window.cpp" line="1225"/> <source>Toggle fullscreen</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1192"/> + <location filename="../Window.cpp" line="1228"/> <source>Lock aspect ratio</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1199"/> + <location filename="../Window.cpp" line="1235"/> <source>Resample video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1205"/> + <location filename="../Window.cpp" line="1241"/> <source>Frame&skip</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1215"/> + <location filename="../Window.cpp" line="1251"/> <source>Shader options...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1225"/> + <location filename="../Window.cpp" line="1261"/> <source>Mute</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1231"/> + <location filename="../Window.cpp" line="1267"/> <source>FPS target</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1236"/> + <location filename="../Window.cpp" line="1272"/> <source>15</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1237"/> + <location filename="../Window.cpp" line="1273"/> <source>30</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1238"/> + <location filename="../Window.cpp" line="1274"/> <source>45</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1239"/> + <location filename="../Window.cpp" line="1275"/> <source>Native (59.7)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1240"/> + <location filename="../Window.cpp" line="1276"/> <source>60</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1241"/> + <location filename="../Window.cpp" line="1277"/> <source>90</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1242"/> + <location filename="../Window.cpp" line="1278"/> <source>120</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1243"/> + <location filename="../Window.cpp" line="1279"/> <source>240</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1251"/> + <location filename="../Window.cpp" line="1287"/> <source>Take &screenshot</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1252"/> + <location filename="../Window.cpp" line="1288"/> <source>F12</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1259"/> + <location filename="../Window.cpp" line="1295"/> <source>Record output...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1266"/> + <location filename="../Window.cpp" line="1302"/> <source>Record GIF...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1272"/> + <location filename="../Window.cpp" line="1308"/> <source>Video layers</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1276"/> + <location filename="../Window.cpp" line="1312"/> <source>Background %0</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1283"/> + <location filename="../Window.cpp" line="1319"/> <source>OBJ (sprites)</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1289"/> + <location filename="../Window.cpp" line="1325"/> <source>Audio channels</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1293"/> + <location filename="../Window.cpp" line="1329"/> <source>Channel %0</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1300"/> + <location filename="../Window.cpp" line="1336"/> <source>Channel A</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1306"/> + <location filename="../Window.cpp" line="1342"/> <source>Channel B</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1312"/> + <location filename="../Window.cpp" line="1348"/> <source>&Tools</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1314"/> + <location filename="../Window.cpp" line="1350"/> <source>View &logs...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1319"/> + <location filename="../Window.cpp" line="1354"/> <source>Game &overrides...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1324"/> + <location filename="../Window.cpp" line="1358"/> <source>Game &Pak sensors...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1328"/> + <location filename="../Window.cpp" line="1362"/> <source>&Cheats...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1334"/> + <location filename="../Window.cpp" line="1374"/> + <source>Open debugger console...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1380"/> <source>Start &GDB server...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1341"/> + <location filename="../Window.cpp" line="1368"/> <source>Settings...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1346"/> + <location filename="../Window.cpp" line="406"/> + <source>Select folder</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="924"/> + <source>Add folder to library...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1387"/> <source>View &palette...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1352"/> + <location filename="../Window.cpp" line="1392"/> + <source>View &sprites...</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../Window.cpp" line="1397"/> <source>View &tiles...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1359"/> + <location filename="../Window.cpp" line="1402"/> <source>View memory...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1365"/> + <location filename="../Window.cpp" line="1408"/> <source>View &I/O registers...</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1422"/> + <location filename="../Window.cpp" line="1465"/> <source>Exit fullscreen</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1427"/> + <location filename="../Window.cpp" line="1470"/> <source>Autofire</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1434"/> + <location filename="../Window.cpp" line="1477"/> <source>Autofire A</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1440"/> + <location filename="../Window.cpp" line="1483"/> <source>Autofire B</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1446"/> + <location filename="../Window.cpp" line="1489"/> <source>Autofire L</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1452"/> + <location filename="../Window.cpp" line="1495"/> <source>Autofire R</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1458"/> + <location filename="../Window.cpp" line="1501"/> <source>Autofire Start</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1464"/> + <location filename="../Window.cpp" line="1507"/> <source>Autofire Select</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1470"/> + <location filename="../Window.cpp" line="1513"/> <source>Autofire Up</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1476"/> + <location filename="../Window.cpp" line="1519"/> <source>Autofire Right</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1482"/> + <location filename="../Window.cpp" line="1525"/> <source>Autofire Down</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../Window.cpp" line="1488"/> + <location filename="../Window.cpp" line="1531"/> <source>Autofire Left</source> <translation type="unfinished"></translation> </message>@@ -3224,310 +3651,342 @@ <source>Settings</source>
<translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="52"/> + <location filename="../SettingsView.ui" line="45"/> <source>Audio/Video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="57"/> - <source>Emulation</source> + <location filename="../SettingsView.ui" line="50"/> + <source>Interface</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="62"/> - <source>Savestates</source> + <location filename="../SettingsView.ui" line="55"/> + <source>Emulation</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="67"/> + <location filename="../SettingsView.ui" line="65"/> <source>Paths</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="85"/> + <location filename="../SettingsView.ui" line="90"/> <source>Audio driver:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="102"/> + <location filename="../SettingsView.ui" line="107"/> <source>Audio buffer:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="114"/> - <location filename="../SettingsView.ui" line="136"/> + <location filename="../SettingsView.ui" line="119"/> + <location filename="../SettingsView.ui" line="141"/> <source>1536</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="121"/> + <location filename="../SettingsView.ui" line="126"/> <source>512</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="126"/> + <location filename="../SettingsView.ui" line="131"/> <source>768</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="131"/> + <location filename="../SettingsView.ui" line="136"/> <source>1024</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="141"/> + <location filename="../SettingsView.ui" line="146"/> <source>2048</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="146"/> + <location filename="../SettingsView.ui" line="151"/> <source>3072</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="151"/> + <location filename="../SettingsView.ui" line="156"/> <source>4096</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="159"/> + <location filename="../SettingsView.ui" line="164"/> <source>samples</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="168"/> + <location filename="../SettingsView.ui" line="173"/> <source>Sample rate:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="180"/> - <location filename="../SettingsView.ui" line="197"/> + <location filename="../SettingsView.ui" line="185"/> + <location filename="../SettingsView.ui" line="202"/> <source>44100</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="187"/> + <location filename="../SettingsView.ui" line="192"/> <source>22050</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="192"/> + <location filename="../SettingsView.ui" line="197"/> <source>32000</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="202"/> + <location filename="../SettingsView.ui" line="207"/> <source>48000</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="210"/> + <location filename="../SettingsView.ui" line="215"/> <source>Hz</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="219"/> + <location filename="../SettingsView.ui" line="224"/> <source>Volume:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="250"/> + <location filename="../SettingsView.ui" line="255"/> <source>Mute</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="266"/> + <location filename="../SettingsView.ui" line="271"/> <source>Display driver:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="283"/> + <location filename="../SettingsView.ui" line="288"/> <source>Frameskip:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="292"/> + <location filename="../SettingsView.ui" line="297"/> <source>Skip every</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="302"/> - <location filename="../SettingsView.ui" line="655"/> + <location filename="../SettingsView.ui" line="307"/> + <location filename="../SettingsView.ui" line="532"/> <source>frames</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="311"/> + <location filename="../SettingsView.ui" line="316"/> <source>FPS target:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="333"/> + <location filename="../SettingsView.ui" line="338"/> <source>frames per second</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="349"/> + <location filename="../SettingsView.ui" line="354"/> <source>Sync:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="358"/> + <location filename="../SettingsView.ui" line="363"/> <source>Video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="365"/> + <location filename="../SettingsView.ui" line="370"/> <source>Audio</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="374"/> + <location filename="../SettingsView.ui" line="379"/> <source>Lock aspect ratio</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="381"/> + <location filename="../SettingsView.ui" line="386"/> <source>Resample video</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="395"/> - <source>BIOS file:</source> + <location filename="../SettingsView.ui" line="421"/> + <source>Library:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="414"/> - <location filename="../SettingsView.ui" line="696"/> - <location filename="../SettingsView.ui" line="744"/> - <location filename="../SettingsView.ui" line="792"/> - <location filename="../SettingsView.ui" line="840"/> - <source>Browse</source> + <location filename="../SettingsView.ui" line="428"/> + <source>Show when no game open</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="423"/> - <source>Use BIOS file if found</source> + <location filename="../SettingsView.ui" line="445"/> + <source>Clear cache</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="433"/> - <source>Skip BIOS intro</source> + <location filename="../SettingsView.ui" line="459"/> + <source>Fast forward speed:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="447"/> - <source>Fast forward speed</source> + <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"/> + <source>Browse</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="457"/> + <location filename="../SettingsView.ui" line="688"/> + <source>Use BIOS file if found</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="698"/> + <source>Skip BIOS intro</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="471"/> <source>×</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="476"/> + <location filename="../SettingsView.ui" line="490"/> <source>Unbounded</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="493"/> + <location filename="../SettingsView.ui" line="404"/> <source>Suspend screensaver</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="503"/> - <source>Pause when inactive</source> + <location filename="../SettingsView.ui" line="60"/> + <source>BIOS</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="510"/> - <source>Idle loops</source> + <location filename="../SettingsView.ui" line="414"/> + <source>Pause when inactive</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="518"/> + <location filename="../SettingsView.ui" line="556"/> <source>Run all</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="523"/> + <location filename="../SettingsView.ui" line="561"/> <source>Remove known</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="528"/> + <location filename="../SettingsView.ui" line="566"/> <source>Detect and remove</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="536"/> + <location filename="../SettingsView.ui" line="397"/> <source>Allow opposing input directions</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="550"/> - <source>Save extra data</source> + <location filename="../SettingsView.ui" line="588"/> + <location filename="../SettingsView.ui" line="625"/> + <source>Screenshot</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="598"/> + <location filename="../SettingsView.ui" line="635"/> + <source>Save data</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="608"/> + <location filename="../SettingsView.ui" line="642"/> + <source>Cheat codes</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="509"/> + <source>Enable rewind</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="../SettingsView.ui" line="516"/> + <source>Rewind history:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="557"/> - <location filename="../SettingsView.ui" line="601"/> - <source>Screenshot</source> + <location filename="../SettingsView.ui" line="548"/> + <source>Idle loops:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="567"/> - <location filename="../SettingsView.ui" line="611"/> - <source>Save data</source> + <location filename="../SettingsView.ui" line="581"/> + <source>Savestate extra data:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="577"/> <location filename="../SettingsView.ui" line="618"/> - <source>Cheat codes</source> + <source>Load extra data:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="594"/> - <source>Load extra data</source> + <location filename="../SettingsView.ui" line="660"/> + <source>GB BIOS file:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="632"/> - <source>Enable rewind</source> + <location filename="../SettingsView.ui" line="726"/> + <source>GBA BIOS file:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="639"/> - <source>Rewind history:</source> + <location filename="../SettingsView.ui" line="733"/> + <source>GBC BIOS file:</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="671"/> + <location filename="../SettingsView.ui" line="768"/> <source>Save games</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="705"/> - <location filename="../SettingsView.ui" line="753"/> - <location filename="../SettingsView.ui" line="801"/> - <location filename="../SettingsView.ui" line="849"/> + <location filename="../SettingsView.ui" line="802"/> + <location filename="../SettingsView.ui" line="850"/> + <location filename="../SettingsView.ui" line="898"/> + <location filename="../SettingsView.ui" line="946"/> <source>Same directory as the ROM</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="719"/> + <location filename="../SettingsView.ui" line="816"/> <source>Save states</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="767"/> + <location filename="../SettingsView.ui" line="864"/> <source>Screenshots</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../SettingsView.ui" line="815"/> + <location filename="../SettingsView.ui" line="912"/> <source>Patches</source> <translation type="unfinished"></translation> </message>@@ -3606,32 +4065,12 @@ <source>256 colors</source>
<translation type="unfinished"></translation> </message> <message> - <location filename="../TileView.ui" line="57"/> - <source>Tile #</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../TileView.ui" line="64"/> - <source>0</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../TileView.ui" line="78"/> - <source>Address</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../TileView.ui" line="85"/> - <source>0x06000000</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../TileView.ui" line="199"/> + <location filename="../TileView.ui" line="70"/> <source>×</source> <translation type="unfinished"></translation> </message> <message> - <location filename="../TileView.ui" line="212"/> + <location filename="../TileView.ui" line="83"/> <source>Magnification</source> <translation type="unfinished"></translation> </message>