diff --git a/CHANGES b/CHANGES
index 8b055ceba..cf7656cb3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -38,24 +38,44 @@ Features:
- Presets for Game Boy palettes
- Add Super Game Boy palettes for original Game Boy games
- Tool for converting scanned pictures of e-Reader cards to raw dotcode data
+ - Options for muting when inactive, minimized, or for different players in multiplayer
- Cheat code support in homebrew ports
- Support for combo "Super Game Boy Color" SGB + GBC ROM hacks
+ - Support for 64 kiB SRAM saves used in some bootlegs
+ - Discord Rich Presence now supports time elapsed
+ - Additional scaling shaders
Emulation fixes:
+ - GB Memory: Add cursory cartridge open bus emulation (fixes mgba.io/i/2032)
- GB Video: Clear VRAM on reset (fixes mgba.io/i/2152)
+ - GBA: Improve timing when not booting from BIOS
- GBA SIO: Add missing NORMAL8 implementation bits (fixes mgba.io/i/2172)
+ - GBA SIO: Fix missing interrupt on an unattached NORMAL transfer
+ - GBA SIO: Fix SI value for unattached MULTI mode
+ - GBA Memory: Fix prefetch mask when swapping modes within a region
+ - GBA Serialize: Fix loading audio enable bit late (fixes mgba.io/i/2230)
- GBA Video: Revert scanline latching changes (fixes mgba.io/i/2153, mgba.io/i/2149)
Other fixes:
- 3DS: Fix disabling "wide" mode on 2DS (fixes mgba.io/i/2167)
+ - ARM Debugger: Fix disassembly alignment (fixes mgba.io/i/2204)
- Core: Fix memory leak in opening games from the library
+ - Core: Fix memory searches for relative values (fixes mgba.io/i/2135)
+ - Core: Fix portable mode on macOS
+ - Core: Don't attempt to restore rewind diffs past start of rewind
+ - GB Audio: Fix audio channel 4 being slow to deserialize
- GB Core: Fix GBC colors setting breaking default model overrides (fixes mgba.io/i/2161)
- GBA: Fix out of bounds ROM accesses on patched ROMs smaller than 32 MiB
+ - mGUI: Cache save state screenshot validity in state menu (fixes mgba.io/i/2005)
- Qt: Fix infrequent deadlock when using sync to video
- Qt: Fix applying savetype-only overrides
- Qt: Fix crash in sprite view for partially out-of-bounds sprites (fixes mgba.io/i/2165)
+ - Qt: Fix having to press controller buttons twice for menu items (fixes mgba.io/i/2143)
+ - Qt: Redo sensor binding to be less fragile
- Util: Fix loading UPS patches that affect the last byte of the file
Misc:
- Core: Suspend runloop when a core crashes
- Qt: Rearrange menus some
+ - Qt: Clean up cheats dialog
+ - Qt: Only set default controller bindings if loading fails (fixes mgba.io/i/799)
- Util: Improve speed of UPS patch loading
0.9.1: (2021-04-18)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 75c767ca6..80c68d893 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -232,7 +232,8 @@ endif()
if(APPLE)
add_definitions(-D_DARWIN_C_SOURCE)
- if(CMAKE_SYSTEM_VERSION VERSION_GREATER "10.5.8")
+ list(APPEND OS_LIB "-framework Foundation")
+ if(NOT CMAKE_SYSTEM_VERSION VERSION_LESS "10.0") # Darwin 10.x is Mac OS X 10.6
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.6")
endif()
endif()
@@ -599,8 +600,7 @@ if(USE_FFMPEG)
set(CPACK_DEBIAN_PACKAGE_RECOMMENDS "libavcodec-extra|libavcodec-ffmpeg-extra${LIBAVCODEC_VERSION_MAJOR}")
endif()
if(APPLE)
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -framework VideoDecodeAcceleration -framework CoreVideo")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework VideoDecodeAcceleration -framework CoreVideo")
+ list(APPEND DEPENDENCY_LIB "-framework VideoDecodeAcceleration" "-framework CoreVideo")
endif()
endif()
diff --git a/README.md b/README.md
index fdc6d419c..bf438310a 100644
--- a/README.md
+++ b/README.md
@@ -83,7 +83,7 @@ The following mappers are partially supported:
Supported Platforms
-------------------
-- Windows Vista or newer
+- Windows 7 or newer
- OS X 10.8 (Mountain Lion)[[4]](#osxver) or newer
- Linux
- FreeBSD
diff --git a/README_DE.md b/README_DE.md
index 310ee7193..f14a65498 100644
--- a/README_DE.md
+++ b/README_DE.md
@@ -79,7 +79,7 @@ Die folgenden Mapper werden teilweise unterstützt:
Unterstützte Plattformen
------------------------
-- Windows Vista oder neuer
+- Windows 7 oder neuer
- OS X 10.8 (Mountain Lion)[[3]](#osxver) oder neuer
- Linux
- FreeBSD
diff --git a/README_ES.md b/README_ES.md
index 681ed5556..0a5df3e9b 100644
--- a/README_ES.md
+++ b/README_ES.md
@@ -79,7 +79,7 @@ Estos mappers tienen soporte parcial:
Plataformas soportadas
-------------------
-- Windows Vista o más reciente
+- Windows 7 o más reciente
- OS X 10.8 (Mountain Lion)[[3]](#osxver) o más reciente
- Linux
- FreeBSD
diff --git a/README_ZH_CN.md b/README_ZH_CN.md
index 4a5fa0adb..89cc6dc24 100644
--- a/README_ZH_CN.md
+++ b/README_ZH_CN.md
@@ -77,7 +77,7 @@ mGBA 是一个运行 Game Boy Advance 游戏的模拟器。mGBA 的目标是比
支持平台
-------------------
-- Windows Vista 或更新
+- Windows 7 或更新
- OS X 10.8(山狮 / Mountain Lion)[[3]](#osxver) 或更新
- Linux
- FreeBSD
diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/baseline_0000.png b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/baseline_0000.png
similarity index 100%
rename from cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/baseline_0000.png
rename to cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/baseline_0000.png
diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.gb b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/test.gb
similarity index 97%
rename from cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.gb
rename to cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/test.gb
index 02e0c0d2f..33d69f88c 100644
Binary files a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.gb and b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/test.gb differ
diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.sym b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/test.sym
similarity index 66%
rename from cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.sym
rename to cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/test.sym
index 48d92e7c7..58eb0b6bf 100644
--- a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256Kb/test.sym
+++ b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_256kb/test.sym
@@ -1,17 +1,17 @@
; this file was created with wlalink by ville helin .
-; wla symbolic information for "/home/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/ram_256Kb.gb".
+; wla symbolic information for "/home/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/ram_256kb.gb".
[labels]
-01:48bd clear_vram
-01:487a disable_lcd_safe
-01:4880 disable_lcd_safe@wait_ly_0
-01:4898 memcmp
-01:48c7 memcpy
-01:48d0 memset
-01:48e0 print_inline_string
-01:48a6 print_load_font
-01:48b2 print_newline
-01:48d9 print_string
+01:48c7 clear_vram
+01:4884 disable_lcd_safe
+01:488a disable_lcd_safe@wait_ly_0
+01:48a2 memcmp
+01:48d1 memcpy
+01:48da memset
+01:48ea print_inline_string
+01:48b0 print_load_font
+01:48bc print_newline
+01:48e3 print_string
01:47f0 quit
01:4805 quit@cb_return
01:480a quit@wait_ly_1
@@ -20,24 +20,24 @@
01:481c quit@wait_ly_4
01:4826 quit@success
01:484d quit@failure
-01:4862 quit@halt
-01:4863 quit@halt_execution_0
-01:4866 reset_screen
-01:4889 serial_send_byte
+01:486c quit@halt
+01:486d quit@halt_execution_0
+01:4870 reset_screen
+01:4893 serial_send_byte
01:4000 font
00:0150 main
-00:0150 test_round1
-00:016e test_round2
-00:01d2 test_round3
-00:0232 test_round4
-00:02a0 test_round5
-00:02fc test_round6
-00:0330 test_finish
-00:033a test_finish@quit_inline_1
-00:034b copy_bank_data
-00:036a check_bank_data
-00:038a all_ff
-00:039a all_00
+00:015f test_round1
+00:017d test_round2
+00:01e1 test_round3
+00:0241 test_round4
+00:02af test_round5
+00:030b test_round6
+00:033f test_finish
+00:0349 test_finish@quit_inline_1
+00:035a copy_bank_data
+00:0379 check_bank_data
+00:0399 all_ff
+00:03a9 all_00
00:1000 bank_data
00:1040 clear_ram
00:1062 fail_round1
@@ -52,6 +52,7 @@
00:10f0 fail_round5@quit_inline_6
00:1107 fail_round6
00:1111 fail_round6@quit_inline_7
+00:ff80 memcmp_hram
[definitions]
0000000a _sizeof_clear_vram
@@ -63,12 +64,13 @@
0000000c _sizeof_print_load_font
0000000b _sizeof_print_newline
00000007 _sizeof_print_string
-00000076 _sizeof_quit
+00000080 _sizeof_quit
00000014 _sizeof_reset_screen
0000000f _sizeof_serial_send_byte
000007f0 _sizeof_font
-00000000 _sizeof_test_round1
-0000001e _sizeof_main
+00000020 _sizeof_memcmp_hram
+0000000f _sizeof_main
+0000001e _sizeof_test_round1
00000064 _sizeof_test_round2
00000060 _sizeof_test_round3
0000006e _sizeof_test_round4
@@ -78,7 +80,7 @@
0000001f _sizeof_copy_bank_data
00000020 _sizeof_check_bank_data
00000010 _sizeof_all_ff
-00000c66 _sizeof_all_00
+00000c57 _sizeof_all_00
00000040 _sizeof_bank_data
00000022 _sizeof_clear_ram
00000021 _sizeof_fail_round1
diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/baseline_0000.png b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/baseline_0000.png
similarity index 100%
rename from cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/baseline_0000.png
rename to cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/baseline_0000.png
diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.gb b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/test.gb
similarity index 98%
rename from cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.gb
rename to cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/test.gb
index 7136b5dc0..8b0c95355 100644
Binary files a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.gb and b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/test.gb differ
diff --git a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.sym b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/test.sym
similarity index 65%
rename from cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.sym
rename to cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/test.sym
index ea568735e..80a8f7cce 100644
--- a/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64Kb/test.sym
+++ b/cinema/gb/mooneye-gb/emulator-only/mbc1/ram_64kb/test.sym
@@ -1,17 +1,17 @@
; this file was created with wlalink by ville helin .
-; wla symbolic information for "/home/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/ram_64Kb.gb".
+; wla symbolic information for "/home/vicki/Scratch/mooneye-gb/tests/build/emulator-only/mbc1/ram_64kb.gb".
[labels]
-01:48bd clear_vram
-01:487a disable_lcd_safe
-01:4880 disable_lcd_safe@wait_ly_0
-01:4898 memcmp
-01:48c7 memcpy
-01:48d0 memset
-01:48e0 print_inline_string
-01:48a6 print_load_font
-01:48b2 print_newline
-01:48d9 print_string
+01:48c7 clear_vram
+01:4884 disable_lcd_safe
+01:488a disable_lcd_safe@wait_ly_0
+01:48a2 memcmp
+01:48d1 memcpy
+01:48da memset
+01:48ea print_inline_string
+01:48b0 print_load_font
+01:48bc print_newline
+01:48e3 print_string
01:47f0 quit
01:4805 quit@cb_return
01:480a quit@wait_ly_1
@@ -20,23 +20,23 @@
01:481c quit@wait_ly_4
01:4826 quit@success
01:484d quit@failure
-01:4862 quit@halt
-01:4863 quit@halt_execution_0
-01:4866 reset_screen
-01:4889 serial_send_byte
+01:486c quit@halt
+01:486d quit@halt_execution_0
+01:4870 reset_screen
+01:4893 serial_send_byte
01:4000 font
00:0150 main
-00:0150 test_round1
-00:016e test_round2
-00:01c2 test_round3
-00:01cb test_round4
-00:01fb test_round5
-00:022c test_finish
-00:0236 test_finish@quit_inline_1
-00:0247 copy_bank_data
-00:025f check_bank_data
-00:0278 all_ff
-00:0288 all_00
+00:015f test_round1
+00:017d test_round2
+00:01d1 test_round3
+00:01da test_round4
+00:020a test_round5
+00:023b test_finish
+00:0245 test_finish@quit_inline_1
+00:0256 copy_bank_data
+00:026e check_bank_data
+00:0287 all_ff
+00:0297 all_00
00:1000 bank_data
00:1010 clear_ram
00:1032 fail_round1
@@ -49,6 +49,7 @@
00:109f fail_round4@quit_inline_5
00:10b6 fail_round5
00:10c0 fail_round5@quit_inline_6
+00:ff80 memcmp_hram
[definitions]
0000000a _sizeof_clear_vram
@@ -60,12 +61,13 @@
0000000c _sizeof_print_load_font
0000000b _sizeof_print_newline
00000007 _sizeof_print_string
-00000076 _sizeof_quit
+00000080 _sizeof_quit
00000014 _sizeof_reset_screen
0000000f _sizeof_serial_send_byte
000007f0 _sizeof_font
-00000000 _sizeof_test_round1
-0000001e _sizeof_main
+00000020 _sizeof_memcmp_hram
+0000000f _sizeof_main
+0000001e _sizeof_test_round1
00000054 _sizeof_test_round2
00000009 _sizeof_test_round3
00000030 _sizeof_test_round4
@@ -74,7 +76,7 @@
00000018 _sizeof_copy_bank_data
00000019 _sizeof_check_bank_data
00000010 _sizeof_all_ff
-00000d78 _sizeof_all_00
+00000d69 _sizeof_all_00
00000010 _sizeof_bank_data
00000022 _sizeof_clear_ram
00000021 _sizeof_fail_round1
diff --git a/include/mgba-util/gui/menu.h b/include/mgba-util/gui/menu.h
index dca1d60b3..8ac9d6846 100644
--- a/include/mgba-util/gui/menu.h
+++ b/include/mgba-util/gui/menu.h
@@ -17,13 +17,27 @@ CXX_GUARD_START
#define GUI_V_I(I) (struct GUIVariant) { .type = GUI_VARIANT_INT, .v.i = (I) }
#define GUI_V_F(F) (struct GUIVariant) { .type = GUI_VARIANT_FLOAT, .v.f = (F) }
#define GUI_V_S(S) (struct GUIVariant) { .type = GUI_VARIANT_STRING, .v.s = (S) }
+#define GUI_V_P(P) (struct GUIVariant) { .type = GUI_VARIANT_POINTER, .v.p = (P) }
+
+#define GUIVariantIs(V, T) ((V).type == GUI_VARIANT_##T)
+#define GUIVariantIsVoid(V) GUIVariantIs(V, VOID)
+#define GUIVariantIsUInt(V) GUIVariantIs(V, UNSIGNED)
+#define GUIVariantIsInt(V) GUIVariantIs(V, INT)
+#define GUIVariantIsFloat(V) GUIVariantIs(V, FLOAT)
+#define GUIVariantIsString(V) GUIVariantIs(V, STRING)
+#define GUIVariantIsPointer(V) GUIVariantIs(V, POINTER)
+
+#define GUIVariantCompareUInt(V, X) (GUIVariantIsUInt(V) && (V).v.u == (X))
+#define GUIVariantCompareInt(V, X) (GUIVariantIsInt(V) && (V).v.i == (X))
+#define GUIVariantCompareString(V, X) (GUIVariantIsString(V) && strcmp((V).v.s, (X)) == 0)
enum GUIVariantType {
GUI_VARIANT_VOID = 0,
GUI_VARIANT_UNSIGNED,
GUI_VARIANT_INT,
GUI_VARIANT_FLOAT,
- GUI_VARIANT_STRING
+ GUI_VARIANT_STRING,
+ GUI_VARIANT_POINTER,
};
struct GUIVariant {
@@ -33,13 +47,14 @@ struct GUIVariant {
int i;
float f;
const char* s;
+ void* p;
} v;
};
struct GUIMenu;
struct GUIMenuItem {
const char* title;
- void* data;
+ struct GUIVariant data;
unsigned state;
const char* const* validStates;
const struct GUIVariant* stateMappings;
diff --git a/include/mgba/core/input.h b/include/mgba/core/input.h
index e5f64d72a..f7ef212a5 100644
--- a/include/mgba/core/input.h
+++ b/include/mgba/core/input.h
@@ -70,7 +70,7 @@ bool mInputQueryHat(const struct mInputMap*, uint32_t type, int id, struct mInpu
void mInputUnbindHat(struct mInputMap*, uint32_t type, int id);
void mInputUnbindAllHats(struct mInputMap*, uint32_t type);
-void mInputMapLoad(struct mInputMap*, uint32_t type, const struct Configuration*);
+bool mInputMapLoad(struct mInputMap*, uint32_t type, const struct Configuration*);
void mInputMapSave(const struct mInputMap*, uint32_t type, struct Configuration*);
bool mInputProfileLoad(struct mInputMap*, uint32_t type, const struct Configuration*, const char* profile);
diff --git a/include/mgba/internal/gb/memory.h b/include/mgba/internal/gb/memory.h
index e2eecca4d..a9dc8b7e9 100644
--- a/include/mgba/internal/gb/memory.h
+++ b/include/mgba/internal/gb/memory.h
@@ -181,6 +181,9 @@ struct GBMemory {
union GBMBCState mbcState;
int currentBank;
int currentBank0;
+ unsigned cartBusDecay;
+ uint16_t cartBusPc;
+ uint8_t cartBus;
uint8_t* wram;
uint8_t* wramBank;
diff --git a/include/mgba/internal/gb/serialize.h b/include/mgba/internal/gb/serialize.h
index 18ac83b09..5191e0966 100644
--- a/include/mgba/internal/gb/serialize.h
+++ b/include/mgba/internal/gb/serialize.h
@@ -157,9 +157,11 @@ mLOG_DECLARE_CATEGORY(GB_STATE);
* | bit 3: IME
* | bit 4: Is HDMA active?
* | bits 5 - 7: Active RTC register
- * | 0x00196 - 0x00197: Reserved (leave zero)
+ * | 0x00196: Cartridge bus value
+ * | 0x00197: Reserved (leave zero)
* 0x00198 - 0x0019F: Global cycle counter
- * 0x001A0 - 0x0025F: Reserved (leave zero)
+ * 0x001A0 - 0x001A1: Program counter for last cartridge read
+ * 0x001A2 - 0x0025F: Reserved (leave zero)
* 0x00260 - 0x002FF: OAM
* 0x00300 - 0x0037F: I/O memory
* 0x00380 - 0x003FE: HRAM
@@ -401,12 +403,14 @@ struct GBSerializedState {
};
GBSerializedMemoryFlags flags;
- uint16_t reserved;
+ uint8_t cartBus;
+ uint8_t reserved;
} memory;
uint64_t globalCycles;
- uint32_t reserved[48];
+ uint16_t cartBusPc;
+ uint16_t reserved[95];
uint8_t oam[GB_SIZE_OAM];
diff --git a/include/mgba/internal/gba/memory.h b/include/mgba/internal/gba/memory.h
index 1bf8548a8..aa75e6a03 100644
--- a/include/mgba/internal/gba/memory.h
+++ b/include/mgba/internal/gba/memory.h
@@ -70,6 +70,7 @@ enum {
SIZE_CART1 = 0x02000000,
SIZE_CART2 = 0x02000000,
SIZE_CART_SRAM = 0x00008000,
+ SIZE_CART_SRAM512 = 0x00010000,
SIZE_CART_FLASH512 = 0x00010000,
SIZE_CART_FLASH1M = 0x00020000,
SIZE_CART_EEPROM = 0x00002000,
diff --git a/include/mgba/internal/gba/savedata.h b/include/mgba/internal/gba/savedata.h
index 05cd65963..395e06b7a 100644
--- a/include/mgba/internal/gba/savedata.h
+++ b/include/mgba/internal/gba/savedata.h
@@ -24,7 +24,8 @@ enum SavedataType {
SAVEDATA_FLASH512 = 2,
SAVEDATA_FLASH1M = 3,
SAVEDATA_EEPROM = 4,
- SAVEDATA_EEPROM512 = 5
+ SAVEDATA_EEPROM512 = 5,
+ SAVEDATA_SRAM512 = 6,
};
enum SavedataCommand {
@@ -110,6 +111,7 @@ void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type);
void GBASavedataInitFlash(struct GBASavedata* savedata);
void GBASavedataInitEEPROM(struct GBASavedata* savedata);
void GBASavedataInitSRAM(struct GBASavedata* savedata);
+void GBASavedataInitSRAM512(struct GBASavedata* savedata);
uint8_t GBASavedataReadFlash(struct GBASavedata* savedata, uint16_t address);
void GBASavedataWriteFlash(struct GBASavedata* savedata, uint16_t address, uint8_t value);
diff --git a/res/font-new.png b/res/font-new.png
index ea86ae72b..2192ec463 100644
Binary files a/res/font-new.png and b/res/font-new.png differ
diff --git a/res/shaders/scale2x.shader/manifest.ini b/res/shaders/scale2x.shader/manifest.ini
new file mode 100644
index 000000000..93b9f91c3
--- /dev/null
+++ b/res/shaders/scale2x.shader/manifest.ini
@@ -0,0 +1,11 @@
+[shader]
+name=Scale2x
+author=singron
+description=AdvanceMAME's Scale2x algorithm
+passes=1
+
+[pass.0]
+fragmentShader=scale2x.fs
+blend=1
+width=-2
+height=-2
diff --git a/res/shaders/scale2x.shader/scale2x.fs b/res/shaders/scale2x.shader/scale2x.fs
new file mode 100644
index 000000000..457f61987
--- /dev/null
+++ b/res/shaders/scale2x.shader/scale2x.fs
@@ -0,0 +1,39 @@
+/* Shader implementation of Scale2x is adapted from https://gist.github.com/singron/3161079 */
+varying vec2 texCoord;
+uniform sampler2D tex;
+uniform vec2 texSize;
+
+void main() {
+ // o = offset, the width of a pixel
+ vec2 o = 1.0 / texSize;
+
+ // texel arrangement
+ // A B C
+ // D E F
+ // G H I
+ vec4 B = texture2D(tex, texCoord + vec2( 0.0, o.y));
+ vec4 D = texture2D(tex, texCoord + vec2( -o.x, 0.0));
+ vec4 E = texture2D(tex, texCoord + vec2( 0.0, 0.0));
+ vec4 F = texture2D(tex, texCoord + vec2( o.x, 0.0));
+ vec4 H = texture2D(tex, texCoord + vec2( 0.0, -o.y));
+ vec2 p = texCoord * texSize;
+ // p = the texCoord within a pixel [0...1]
+ p = fract(p);
+ if (p.x > .5) {
+ if (p.y > .5) {
+ // Top Right
+ gl_FragColor = B == F && B != D && F != H ? F : E;
+ } else {
+ // Bottom Right
+ gl_FragColor = H == F && D != H && B != F ? F : E;
+ }
+ } else {
+ if (p.y > .5) {
+ // Top Left
+ gl_FragColor = D == B && B != F && D != H ? D : E;
+ } else {
+ // Bottom Left
+ gl_FragColor = D == H && D != B && H != F ? D : E;
+ }
+ }
+}
diff --git a/res/shaders/scale4x.shader/manifest.ini b/res/shaders/scale4x.shader/manifest.ini
new file mode 100644
index 000000000..b3c6c93de
--- /dev/null
+++ b/res/shaders/scale4x.shader/manifest.ini
@@ -0,0 +1,11 @@
+[shader]
+name=Scale4x
+author=singron, endrift
+description=AdvanceMAME's Scale4x algorithm
+passes=1
+
+[pass.0]
+fragmentShader=scale4x.fs
+blend=1
+width=-4
+height=-4
diff --git a/res/shaders/scale4x.shader/scale4x.fs b/res/shaders/scale4x.shader/scale4x.fs
new file mode 100644
index 000000000..b928ac5ea
--- /dev/null
+++ b/res/shaders/scale4x.shader/scale4x.fs
@@ -0,0 +1,54 @@
+/* Shader implementation of Scale2x is adapted from https://gist.github.com/singron/3161079 */
+varying vec2 texCoord;
+uniform sampler2D tex;
+uniform vec2 texSize;
+
+vec4 scale2x(vec4 pixels[5], vec2 p) {
+ // texel arrangement
+ // x 0 x
+ // 1 2 3
+ // x 4 x
+ // p = the texCoord within a pixel [0...1]
+ p = fract(p);
+ if (p.x > .5) {
+ if (p.y > .5) {
+ // Top Right
+ return pixels[0] == pixels[3] && pixels[0] != pixels[1] && pixels[3] != pixels[4] ? pixels[3] : pixels[2];
+ } else {
+ // Bottom Right
+ return pixels[4] == pixels[3] && pixels[1] != pixels[4] && pixels[0] != pixels[3] ? pixels[3] : pixels[2];
+ }
+ } else {
+ if (p.y > .5) {
+ // Top Left
+ return pixels[1] == pixels[0] && pixels[0] != pixels[3] && pixels[1] != pixels[4] ? pixels[1] : pixels[2];
+ } else {
+ // Bottom Left
+ return pixels[1] == pixels[4] && pixels[1] != pixels[0] && pixels[4] != pixels[3] ? pixels[1] : pixels[2];
+ }
+ }
+}
+
+vec4 scaleNeighborhood(vec2 p, vec2 x, vec2 o) {
+ vec4 neighborhood[5];
+ neighborhood[0] = texture2D(tex, texCoord + x + vec2( 0.0, o.y));
+ neighborhood[1] = texture2D(tex, texCoord + x + vec2(-o.x, 0.0));
+ neighborhood[2] = texture2D(tex, texCoord + x + vec2( 0.0, 0.0));
+ neighborhood[3] = texture2D(tex, texCoord + x + vec2( o.x, 0.0));
+ neighborhood[4] = texture2D(tex, texCoord + x + vec2( 0.0, -o.y));
+ return scale2x(neighborhood, p + x * texSize);
+}
+
+void main() {
+ // o = offset, the width of a pixel
+ vec2 o = 1.0 / texSize;
+
+ vec2 p = texCoord * texSize;
+ vec4 pixels[5];
+ pixels[0] = scaleNeighborhood(p, vec2( 0.0, o.y / 2.0), o);
+ pixels[1] = scaleNeighborhood(p, vec2(-o.x / 2.0, 0.0), o);
+ pixels[2] = scaleNeighborhood(p, vec2( 0.0, 0.0), o);
+ pixels[3] = scaleNeighborhood(p, vec2( o.x / 2.0, 0.0), o);
+ pixels[4] = scaleNeighborhood(p, vec2( 0.0, -o.y / 2.0), o);
+ gl_FragColor = scale2x(pixels, p * 2.0);
+}
diff --git a/src/arm/debugger/cli-debugger.c b/src/arm/debugger/cli-debugger.c
index df3e04c1c..4df448151 100644
--- a/src/arm/debugger/cli-debugger.c
+++ b/src/arm/debugger/cli-debugger.c
@@ -101,9 +101,10 @@ static inline uint32_t _printLine(struct CLIDebugger* debugger, uint32_t address
struct mCore* core = debugger->d.core;
char disassembly[64];
struct ARMInstructionInfo info;
+ address &= ~(WORD_SIZE_THUMB - 1);
be->printf(be, "%08X: ", address);
if (mode == MODE_ARM) {
- uint32_t instruction = core->busRead32(core, address);
+ uint32_t instruction = core->busRead32(core, address & ~(WORD_SIZE_ARM - 1));
ARMDecodeARM(instruction, &info);
ARMDisassemble(&info, core->cpu, core->symbolTable, address + WORD_SIZE_ARM * 2, disassembly, sizeof(disassembly));
be->printf(be, "%08X\t%s\n", instruction, disassembly);
diff --git a/src/core/config.c b/src/core/config.c
index 5a9599c4e..9f54aca26 100644
--- a/src/core/config.c
+++ b/src/core/config.c
@@ -19,6 +19,12 @@
#include
#endif
+#ifdef __APPLE__
+#include
+#include
+#include
+#endif
+
#ifdef PSP2
#include
#endif
@@ -274,6 +280,16 @@ void mCoreConfigPortablePath(char* out, size_t outLength) {
out[0] = '\0';
#else
getcwd(out, outLength);
+#ifdef __APPLE__
+ CFBundleRef mainBundle = CFBundleGetMainBundle();
+ if (strcmp(out, "/") == 0 && mainBundle) {
+ CFURLRef url = CFBundleCopyBundleURL(mainBundle);
+ CFURLRef suburl = CFURLCreateCopyDeletingLastPathComponent(kCFAllocatorDefault, url);
+ CFRelease(url);
+ CFURLGetFileSystemRepresentation(suburl, true, (UInt8*) out, outLength);
+ CFRelease(suburl);
+ }
+#endif
strncat(out, PATH_SEP "portable.ini", outLength - strlen(out));
#endif
}
diff --git a/src/core/input.c b/src/core/input.c
index c143805ac..76296a373 100644
--- a/src/core/input.c
+++ b/src/core/input.c
@@ -578,10 +578,10 @@ void mInputUnbindAllHats(struct mInputMap* map, uint32_t type) {
}
}
-void mInputMapLoad(struct mInputMap* map, uint32_t type, const struct Configuration* config) {
+bool mInputMapLoad(struct mInputMap* map, uint32_t type, const struct Configuration* config) {
char sectionName[SECTION_NAME_MAX];
_makeSectionName(map->info->platformName, sectionName, SECTION_NAME_MAX, type);
- _loadAll(map, type, sectionName, config);
+ return _loadAll(map, type, sectionName, config);
}
void mInputMapSave(const struct mInputMap* map, uint32_t type, struct Configuration* config) {
diff --git a/src/core/mem-search.c b/src/core/mem-search.c
index 7f0c215a1..cb026fd53 100644
--- a/src/core/mem-search.c
+++ b/src/core/mem-search.c
@@ -47,7 +47,7 @@ static size_t _search32(const void* mem, size_t size, const struct mCoreMemoryBl
res->segment = -1; // TODO
res->guessDivisor = 1;
res->guessMultiplier = 1;
- res->oldValue = value32;
+ res->oldValue = mem32[i >> 2];
++found;
}
}
@@ -70,7 +70,7 @@ static size_t _search16(const void* mem, size_t size, const struct mCoreMemoryBl
res->segment = -1; // TODO
res->guessDivisor = 1;
res->guessMultiplier = 1;
- res->oldValue = value16;
+ res->oldValue = mem16[i >> 1];
++found;
}
}
@@ -92,7 +92,7 @@ static size_t _search8(const void* mem, size_t size, const struct mCoreMemoryBlo
res->segment = -1; // TODO
res->guessDivisor = 1;
res->guessMultiplier = 1;
- res->oldValue = value8;
+ res->oldValue = mem8[i];
++found;
}
}
@@ -248,42 +248,46 @@ void mCoreMemorySearch(struct mCore* core, const struct mCoreMemorySearchParams*
}
}
-bool _testGuess(struct mCore* core, struct mCoreMemorySearchResult* res, const struct mCoreMemorySearchParams* params) {
- int64_t value;
+bool _testSpecificGuess(struct mCore* core, struct mCoreMemorySearchResult* res, int64_t opValue, enum mCoreMemorySearchOp op) {
int32_t offset = 0;
- char* end;
- if (params->op >= mCORE_MEMORY_SEARCH_DELTA) {
+ if (op >= mCORE_MEMORY_SEARCH_DELTA) {
offset = res->oldValue;
}
- value = strtoll(params->valueStr, &end, 10);
- if (end) {
- res->oldValue += value;
- if (_op(core->rawRead8(core, res->address, res->segment) * res->guessDivisor / res->guessMultiplier - offset, value, params->op)) {
+ res->oldValue += opValue;
+ int64_t value = core->rawRead8(core, res->address, res->segment);
+ if (_op(value * res->guessDivisor / res->guessMultiplier - offset, opValue, op)) {
+ res->oldValue = value;
+ return true;
+ }
+ if (!(res->address & 1) && (res->width >= 2 || res->width == -1)) {
+ value = core->rawRead16(core, res->address, res->segment);
+ if (_op(value * res->guessDivisor / res->guessMultiplier - offset, opValue, op)) {
+ res->oldValue = value;
return true;
}
- if (!(res->address & 1) && (res->width >= 2 || res->width == -1) && _op(core->rawRead16(core, res->address, res->segment) * res->guessDivisor / res->guessMultiplier - offset, value, params->op)) {
+ }
+ if (!(res->address & 3) && (res->width >= 4 || res->width == -1)) {
+ value = core->rawRead32(core, res->address, res->segment);
+ if (_op(value * res->guessDivisor / res->guessMultiplier - offset, opValue, op)) {
+ res->oldValue = value;
return true;
}
- if (!(res->address & 3) && (res->width >= 4 || res->width == -1) && _op(core->rawRead32(core, res->address, res->segment) * res->guessDivisor / res->guessMultiplier - offset, value, params->op)) {
- return true;
- }
- res->oldValue -= value;
+ }
+ res->oldValue -= opValue;
+ return false;
+}
+
+bool _testGuess(struct mCore* core, struct mCoreMemorySearchResult* res, const struct mCoreMemorySearchParams* params) {
+ char* end;
+ int64_t value = strtoll(params->valueStr, &end, 10);
+ if (end && _testSpecificGuess(core, res, value, params->op)) {
+ return true;
}
value = strtoll(params->valueStr, &end, 16);
- if (end) {
- res->oldValue += value;
- if (_op(core->rawRead8(core, res->address, res->segment) * res->guessDivisor / res->guessMultiplier - offset, value, params->op)) {
- return true;
- }
- if (!(res->address & 1) && (res->width >= 2 || res->width == -1) && _op(core->rawRead16(core, res->address, res->segment) * res->guessDivisor / res->guessMultiplier - offset, value, params->op)) {
- return true;
- }
- if (!(res->address & 3) && (res->width >= 4 || res->width == -1) && _op(core->rawRead32(core, res->address, res->segment) * res->guessDivisor / res->guessMultiplier - offset, value, params->op)) {
- return true;
- }
- res->oldValue -= value;
+ if (end && _testSpecificGuess(core, res, value, params->op)) {
+ return true;
}
return false;
}
diff --git a/src/core/rewind.c b/src/core/rewind.c
index 3a554ff4e..95f47ece4 100644
--- a/src/core/rewind.c
+++ b/src/core/rewind.c
@@ -12,7 +12,7 @@
DEFINE_VECTOR(mCoreRewindPatches, struct PatchFast);
-void _rewindDiff(struct mCoreRewindContext* context);
+static void _rewindDiff(struct mCoreRewindContext* context);
#ifndef DISABLE_THREADING
THREAD_ENTRY _rewindThread(void* context);
@@ -136,17 +136,19 @@ bool mCoreRewindRestore(struct mCoreRewindContext* context, struct mCore* core)
}
--context->current;
- struct PatchFast* patch = mCoreRewindPatchesGetPointer(&context->patchMemory, context->current);
- size_t size2 = context->previousState->size(context->previousState);
- size_t size = context->currentState->size(context->currentState);
- if (size2 < size) {
- size = size2;
+ if (context->size) {
+ struct PatchFast* patch = mCoreRewindPatchesGetPointer(&context->patchMemory, context->current);
+ size_t size2 = context->previousState->size(context->previousState);
+ size_t size = context->currentState->size(context->currentState);
+ if (size2 < size) {
+ size = size2;
+ }
+ void* current = context->currentState->map(context->currentState, size, MAP_READ);
+ void* previous = context->previousState->map(context->previousState, size, MAP_WRITE);
+ patch->d.applyPatch(&patch->d, previous, size, current, size);
+ context->currentState->unmap(context->currentState, current, size);
+ context->previousState->unmap(context->previousState, previous, size);
}
- void* current = context->currentState->map(context->currentState, size, MAP_READ);
- void* previous = context->previousState->map(context->previousState, size, MAP_WRITE);
- patch->d.applyPatch(&patch->d, previous, size, current, size);
- context->currentState->unmap(context->currentState, current, size);
- context->previousState->unmap(context->previousState, previous, size);
struct VFile* nextState = context->previousState;
context->previousState = context->currentState;
context->currentState = nextState;
diff --git a/src/feature/gui/cheats.c b/src/feature/gui/cheats.c
index d69d3ddc3..1b06afa0a 100644
--- a/src/feature/gui/cheats.c
+++ b/src/feature/gui/cheats.c
@@ -35,19 +35,19 @@ static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* dev
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Add line",
- .data = (void*) CHEAT_ADD_LINE,
+ .data = GUI_V_U(CHEAT_ADD_LINE),
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Rename",
- .data = (void*) CHEAT_RENAME,
+ .data = GUI_V_U(CHEAT_RENAME),
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Delete",
- .data = (void*) CHEAT_DELETE,
+ .data = GUI_V_U(CHEAT_DELETE),
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Back",
- .data = 0,
+ .data = GUI_V_V,
};
while (true) {
@@ -56,11 +56,11 @@ static void mGUIShowCheatSet(struct mGUIRunner* runner, struct mCheatDevice* dev
struct GUIMenuItem* item;
enum GUIMenuExitReason reason = GUIShowMenu(&runner->params, &menu, &item);
set->enabled = GUIMenuItemListGetPointer(&menu.items, 0)->state;
- if (reason != GUI_MENU_EXIT_ACCEPT || !item->data) {
+ if (reason != GUI_MENU_EXIT_ACCEPT || GUIVariantIsVoid(item->data)) {
break;
}
- enum mGUICheatAction action = (enum mGUICheatAction) item->data;
+ enum mGUICheatAction action = (enum mGUICheatAction) item->data.v.u;
switch (action) {
case CHEAT_ADD_LINE:
strlcpy(keyboard.title, "Add line", sizeof(keyboard.title));
@@ -108,7 +108,7 @@ void mGUIShowCheats(struct mGUIRunner* runner) {
struct mCheatSet* set = *mCheatSetsGetPointer(&device->cheats, i);
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = set->name,
- .data = set,
+ .data = GUI_V_P(set),
.state = set->enabled,
.validStates = offOn,
.nStates = 2
@@ -116,11 +116,11 @@ void mGUIShowCheats(struct mGUIRunner* runner) {
}
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Add new cheat set",
- .data = 0,
+ .data = GUI_V_V,
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Back",
- .data = (void*) -1,
+ .data = GUI_V_I(-1),
};
struct GUIMenuItem* item;
@@ -131,11 +131,11 @@ void mGUIShowCheats(struct mGUIRunner* runner) {
set->enabled = item->state;
}
- if (reason != GUI_MENU_EXIT_ACCEPT || item->data == (void*) -1) {
+ if (reason != GUI_MENU_EXIT_ACCEPT || GUIVariantCompareInt(item->data, -1)) {
break;
}
struct mCheatSet* set = NULL;
- if (!item->data) {
+ if (GUIVariantIsVoid(item->data)) {
struct GUIKeyboardParams keyboard;
GUIKeyboardParamsInit(&keyboard);
keyboard.maxLen = 50;
@@ -146,7 +146,7 @@ void mGUIShowCheats(struct mGUIRunner* runner) {
mCheatAddSet(device, set);
}
} else {
- set = item->data;
+ set = item->data.v.p;
}
if (set) {
mGUIShowCheatSet(runner, device, set);
diff --git a/src/feature/gui/gui-config.c b/src/feature/gui/gui-config.c
index 6d43c0480..8ab4dd7dc 100644
--- a/src/feature/gui/gui-config.c
+++ b/src/feature/gui/gui-config.c
@@ -22,6 +22,11 @@
#define GUI_MAX_INPUTS 7
#endif
+enum {
+ CONFIG_REMAP,
+ CONFIG_SAVE,
+};
+
static bool _biosNamed(const char* name) {
char ext[PATH_MAX + 1] = {};
separatePath(name, NULL, NULL, ext);
@@ -45,7 +50,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
GUIMenuItemListInit(&menu.items, 0);
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Frameskip",
- .data = "frameskip",
+ .data = GUI_V_S("frameskip"),
.submenu = 0,
.state = 0,
.validStates = (const char*[]) {
@@ -55,7 +60,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Show framerate",
- .data = "fpsCounter",
+ .data = GUI_V_S("fpsCounter"),
.submenu = 0,
.state = false,
.validStates = (const char*[]) {
@@ -65,7 +70,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Show status OSD",
- .data = "showOSD",
+ .data = GUI_V_S("showOSD"),
.submenu = 0,
.state = true,
.validStates = (const char*[]) {
@@ -75,7 +80,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Autosave state",
- .data = "autosave",
+ .data = GUI_V_S("autosave"),
.submenu = 0,
.state = true,
.validStates = (const char*[]) {
@@ -85,7 +90,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Autoload state",
- .data = "autoload",
+ .data = GUI_V_S("autoload"),
.submenu = 0,
.state = true,
.validStates = (const char*[]) {
@@ -95,7 +100,17 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Mute",
- .data = "mute",
+ .data = GUI_V_S("mute"),
+ .submenu = 0,
+ .state = false,
+ .validStates = (const char*[]) {
+ "Off", "On"
+ },
+ .nStates = 2
+ };
+ *GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
+ .title = "Fast forward mute",
+ .data = GUI_V_S("fastForwardMute"),
.submenu = 0,
.state = false,
.validStates = (const char*[]) {
@@ -105,7 +120,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Use BIOS if found",
- .data = "useBios",
+ .data = GUI_V_S("useBios"),
.submenu = 0,
.state = true,
.validStates = (const char*[]) {
@@ -116,26 +131,26 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
#ifdef M_CORE_GBA
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Select GBA BIOS path",
- .data = "gba.bios",
+ .data = GUI_V_S("gba.bios"),
};
#endif
#ifdef M_CORE_GB
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Select GB BIOS path",
- .data = "gb.bios",
+ .data = GUI_V_S("gb.bios"),
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Select GBC BIOS path",
- .data = "gbc.bios",
+ .data = GUI_V_S("gbc.bios"),
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Select SGB BIOS path",
- .data = "sgb.bios",
+ .data = GUI_V_S("sgb.bios"),
};
struct GUIMenuItem* palette = GUIMenuItemListAppend(&menu.items);
*palette = (struct GUIMenuItem) {
.title = "GB palette",
- .data = "gb.pal",
+ .data = GUI_V_S("gb.pal"),
};
const struct GBColorPreset* colorPresets;
palette->nStates = GBColorPresetList(&colorPresets);
@@ -147,7 +162,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
#endif
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Interframe blending",
- .data = "interframeBlending",
+ .data = GUI_V_S("interframeBlending"),
.submenu = 0,
.state = false,
.validStates = (const char*[]) {
@@ -158,7 +173,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
#if defined(M_CORE_GBA) && (defined(GEKKO) || defined(__SWITCH__) || defined(PSP2))
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Enable GBP features",
- .data = "gba.forceGbp",
+ .data = GUI_V_S("gba.forceGbp"),
.submenu = 0,
.state = false,
.validStates = (const char*[]) {
@@ -170,7 +185,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
#ifdef M_CORE_GB
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Enable SGB features",
- .data = "sgb.model",
+ .data = GUI_V_S("sgb.model"),
.submenu = 0,
.state = true,
.validStates = (const char*[]) {
@@ -184,7 +199,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Enable SGB borders",
- .data = "sgb.borders",
+ .data = GUI_V_S("sgb.borders"),
.submenu = 0,
.state = true,
.validStates = (const char*[]) {
@@ -194,7 +209,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Crop SGB borders",
- .data = "sgb.borderCrop",
+ .data = GUI_V_S("sgb.borderCrop"),
.submenu = 0,
.state = false,
.validStates = (const char*[]) {
@@ -214,7 +229,7 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
}
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Remap controls",
- .data = "*REMAP",
+ .data = GUI_V_U(CONFIG_REMAP),
.state = 0,
.validStates = i ? mapNames : 0,
.nStates = i
@@ -225,11 +240,11 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
}
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Save",
- .data = "*SAVE",
+ .data = GUI_V_U(CONFIG_SAVE),
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Cancel",
- .data = 0,
+ .data = GUI_V_V,
};
enum GUIMenuExitReason reason;
char gbaBiosPath[256] = "";
@@ -242,59 +257,63 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
struct GUIMenuItem* item;
for (i = 0; i < GUIMenuItemListSize(&menu.items); ++i) {
item = GUIMenuItemListGetPointer(&menu.items, i);
- if (!item->validStates || !item->data) {
+ if (!item->validStates || GUIVariantIsVoid(item->data)) {
continue;
}
- if (item->stateMappings) {
- size_t j;
- for (j = 0; j < item->nStates; ++j) {
- const struct GUIVariant* v = &item->stateMappings[j];
- struct GUIVariant test;
- switch (v->type) {
- case GUI_VARIANT_VOID:
- if (!mCoreConfigGetValue(&runner->config, item->data)) {
- item->state = j;
+ if (GUIVariantIsString(item->data)) {
+ if (item->stateMappings) {
+ size_t j;
+ for (j = 0; j < item->nStates; ++j) {
+ const struct GUIVariant* v = &item->stateMappings[j];
+ struct GUIVariant test;
+ switch (v->type) {
+ case GUI_VARIANT_VOID:
+ if (!mCoreConfigGetValue(&runner->config, item->data.v.s)) {
+ item->state = j;
+ break;
+ }
+ break;
+ case GUI_VARIANT_UNSIGNED:
+ if (mCoreConfigGetUIntValue(&runner->config, item->data.v.s, &test.v.u) && test.v.u == v->v.u) {
+ item->state = j;
+ break;
+ }
+ break;
+ case GUI_VARIANT_INT:
+ if (mCoreConfigGetIntValue(&runner->config, item->data.v.s, &test.v.i) && test.v.i == v->v.i) {
+ item->state = j;
+ break;
+ }
+ break;
+ case GUI_VARIANT_FLOAT:
+ if (mCoreConfigGetFloatValue(&runner->config, item->data.v.s, &test.v.f) && fabsf(test.v.f - v->v.f) <= 1e-3f) {
+ item->state = j;
+ break;
+ }
+ break;
+ case GUI_VARIANT_STRING:
+ test.v.s = mCoreConfigGetValue(&runner->config, item->data.v.s);
+ if (test.v.s && strcmp(test.v.s, v->v.s) == 0) {
+ item->state = j;
+ break;
+ }
+ break;
+ case GUI_VARIANT_POINTER:
break;
}
- break;
- case GUI_VARIANT_UNSIGNED:
- if (mCoreConfigGetUIntValue(&runner->config, item->data, &test.v.u) && test.v.u == v->v.u) {
- item->state = j;
- break;
- }
- break;
- case GUI_VARIANT_INT:
- if (mCoreConfigGetIntValue(&runner->config, item->data, &test.v.i) && test.v.i == v->v.i) {
- item->state = j;
- break;
- }
- break;
- case GUI_VARIANT_FLOAT:
- if (mCoreConfigGetFloatValue(&runner->config, item->data, &test.v.f) && fabsf(test.v.f - v->v.f) <= 1e-3f) {
- item->state = j;
- break;
- }
- break;
- case GUI_VARIANT_STRING:
- test.v.s = mCoreConfigGetValue(&runner->config, item->data);
- if (test.v.s && strcmp(test.v.s, v->v.s) == 0) {
- item->state = j;
- break;
- }
- break;
}
+ } else {
+ mCoreConfigGetUIntValue(&runner->config, item->data.v.s, &item->state);
}
- } else {
- mCoreConfigGetUIntValue(&runner->config, item->data, &item->state);
}
}
while (true) {
reason = GUIShowMenu(&runner->params, &menu, &item);
- if (reason != GUI_MENU_EXIT_ACCEPT || !item->data) {
+ if (reason != GUI_MENU_EXIT_ACCEPT || GUIVariantIsVoid(item->data)) {
break;
}
- if (!strcmp(item->data, "*SAVE")) {
+ if (GUIVariantCompareUInt(item->data, CONFIG_SAVE)) {
if (gbaBiosPath[0]) {
mCoreConfigSetValue(&runner->config, "gba.bios", gbaBiosPath);
}
@@ -309,30 +328,32 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
}
for (i = 0; i < GUIMenuItemListSize(&menu.items); ++i) {
item = GUIMenuItemListGetPointer(&menu.items, i);
- if (!item->validStates || !item->data || ((const char*) item->data)[0] == '*') {
+ if (!item->validStates || !GUIVariantIsString(item->data)) {
continue;
}
if (item->stateMappings) {
const struct GUIVariant* v = &item->stateMappings[item->state];
switch (v->type) {
case GUI_VARIANT_VOID:
- mCoreConfigSetValue(&runner->config, item->data, NULL);
+ mCoreConfigSetValue(&runner->config, item->data.v.s, NULL);
break;
case GUI_VARIANT_UNSIGNED:
- mCoreConfigSetUIntValue(&runner->config, item->data, v->v.u);
+ mCoreConfigSetUIntValue(&runner->config, item->data.v.s, v->v.u);
break;
case GUI_VARIANT_INT:
- mCoreConfigSetUIntValue(&runner->config, item->data, v->v.i);
+ mCoreConfigSetUIntValue(&runner->config, item->data.v.s, v->v.i);
break;
case GUI_VARIANT_FLOAT:
- mCoreConfigSetFloatValue(&runner->config, item->data, v->v.f);
+ mCoreConfigSetFloatValue(&runner->config, item->data.v.s, v->v.f);
break;
case GUI_VARIANT_STRING:
- mCoreConfigSetValue(&runner->config, item->data, v->v.s);
+ mCoreConfigSetValue(&runner->config, item->data.v.s, v->v.s);
+ break;
+ case GUI_VARIANT_POINTER:
break;
}
#ifdef M_CORE_GB
- } else if (!strcmp(item->data, "gb.pal")) {
+ } else if (GUIVariantCompareString(item->data, "gb.pal")) {
const struct GBColorPreset* preset = &colorPresets[item->state];
mCoreConfigSetUIntValue(&runner->config, "gb.pal[0]", preset->colors[0] & 0xFFFFFF);
mCoreConfigSetUIntValue(&runner->config, "gb.pal[1]", preset->colors[1] & 0xFFFFFF);
@@ -346,10 +367,10 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
mCoreConfigSetUIntValue(&runner->config, "gb.pal[9]", preset->colors[9] & 0xFFFFFF);
mCoreConfigSetUIntValue(&runner->config, "gb.pal[10]", preset->colors[10] & 0xFFFFFF);
mCoreConfigSetUIntValue(&runner->config, "gb.pal[11]", preset->colors[11] & 0xFFFFFF);
- mCoreConfigSetUIntValue(&runner->config, item->data, item->state);
+ mCoreConfigSetUIntValue(&runner->config, "gb.pal", item->state);
#endif
} else {
- mCoreConfigSetUIntValue(&runner->config, item->data, item->state);
+ mCoreConfigSetUIntValue(&runner->config, item->data.v.s, item->state);
}
}
if (runner->keySources) {
@@ -363,11 +384,11 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
mCoreLoadForeignConfig(runner->core, &runner->config);
break;
}
- if (!strcmp(item->data, "*REMAP")) {
+ if (GUIVariantCompareUInt(item->data, CONFIG_REMAP)) {
mGUIRemapKeys(&runner->params, &runner->core->inputMap, &runner->keySources[item->state]);
continue;
}
- if (!strcmp(item->data, "gba.bios")) {
+ if (GUIVariantCompareString(item->data, "gba.bios")) {
// TODO: show box if failed
if (!GUISelectFile(&runner->params, gbaBiosPath, sizeof(gbaBiosPath), _biosNamed, GBAIsBIOS, NULL)) {
gbaBiosPath[0] = '\0';
@@ -375,21 +396,21 @@ void mGUIShowConfig(struct mGUIRunner* runner, struct GUIMenuItem* extra, size_t
continue;
}
#ifdef M_CORE_GB
- if (!strcmp(item->data, "gb.bios")) {
+ if (GUIVariantCompareString(item->data, "gb.bios")) {
// TODO: show box if failed
if (!GUISelectFile(&runner->params, gbBiosPath, sizeof(gbBiosPath), _biosNamed, GBIsBIOS, NULL)) {
gbBiosPath[0] = '\0';
}
continue;
}
- if (!strcmp(item->data, "gbc.bios")) {
+ if (GUIVariantCompareString(item->data, "gbc.bios")) {
// TODO: show box if failed
if (!GUISelectFile(&runner->params, gbcBiosPath, sizeof(gbcBiosPath), _biosNamed, GBIsBIOS, NULL)) {
gbcBiosPath[0] = '\0';
}
continue;
}
- if (!strcmp(item->data, "sgb.bios")) {
+ if (GUIVariantCompareString(item->data, "sgb.bios")) {
// TODO: show box if failed
if (!GUISelectFile(&runner->params, sgbBiosPath, sizeof(sgbBiosPath), _biosNamed, GBIsBIOS, NULL)) {
sgbBiosPath[0] = '\0';
diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c
index 2f296ee1b..b7bb72a1b 100644
--- a/src/feature/gui/gui-runner.c
+++ b/src/feature/gui/gui-runner.c
@@ -42,6 +42,11 @@ enum {
#define RUNNER_STATE(X) ((X) << 16)
+enum {
+ SCREENSHOT_VALID = 0x10000,
+ SCREENSHOT_INVALID = 0x20000,
+};
+
static const struct mInputPlatformInfo _mGUIKeyInfo = {
.platformName = "gui",
.keyId = (const char*[GUI_INPUT_MAX]) {
@@ -107,39 +112,49 @@ static void _drawBackground(struct GUIBackground* background, void* context) {
static void _drawState(struct GUIBackground* background, void* id) {
struct mGUIBackground* gbaBackground = (struct mGUIBackground*) background;
- int stateId = ((int) id) >> 16;
+ unsigned stateId = ((uint32_t) id) >> 16;
if (gbaBackground->p->drawScreenshot) {
unsigned w, h;
gbaBackground->p->core->desiredVideoDimensions(gbaBackground->p->core, &w, &h);
- if (gbaBackground->screenshot && gbaBackground->screenshotId == (int) id) {
- gbaBackground->p->drawScreenshot(gbaBackground->p, gbaBackground->screenshot, w, h, true);
+ size_t size = w * h * BYTES_PER_PIXEL;
+ if (size != gbaBackground->imageSize) {
+ mappedMemoryFree(gbaBackground->image, gbaBackground->imageSize);
+ gbaBackground->image = NULL;
+ }
+ if (gbaBackground->image && gbaBackground->screenshotId == (stateId | SCREENSHOT_VALID)) {
+ gbaBackground->p->drawScreenshot(gbaBackground->p, gbaBackground->image, w, h, true);
return;
- }
- struct VFile* vf = mCoreGetState(gbaBackground->p->core, stateId, false);
- color_t* pixels = gbaBackground->screenshot;
- if (!pixels) {
- pixels = anonymousMemoryMap(w * h * 4);
- gbaBackground->screenshot = pixels;
- }
- bool success = false;
- if (vf && isPNG(vf) && pixels) {
- png_structp png = PNGReadOpen(vf, PNG_HEADER_BYTES);
- png_infop info = png_create_info_struct(png);
- png_infop end = png_create_info_struct(png);
- if (png && info && end) {
- success = PNGReadHeader(png, info);
- success = success && PNGReadPixels(png, info, pixels, w, h, w);
- success = success && PNGReadFooter(png, end);
+ } else if (gbaBackground->screenshotId != (stateId | SCREENSHOT_INVALID)) {
+ struct VFile* vf = mCoreGetState(gbaBackground->p->core, stateId, false);
+ color_t* pixels = gbaBackground->image;
+ if (!pixels) {
+ pixels = anonymousMemoryMap(size);
+ gbaBackground->image = pixels;
+ gbaBackground->imageSize = size;
+ }
+ bool success = false;
+ if (vf && isPNG(vf) && pixels) {
+ png_structp png = PNGReadOpen(vf, PNG_HEADER_BYTES);
+ png_infop info = png_create_info_struct(png);
+ png_infop end = png_create_info_struct(png);
+ if (png && info && end) {
+ success = PNGReadHeader(png, info);
+ success = success && PNGReadPixels(png, info, pixels, w, h, w);
+ success = success && PNGReadFooter(png, end);
+ }
+ PNGReadClose(png, info, end);
+ }
+ if (vf) {
+ vf->close(vf);
+ }
+ if (success) {
+ gbaBackground->p->drawScreenshot(gbaBackground->p, pixels, w, h, true);
+ gbaBackground->screenshotId = stateId | SCREENSHOT_VALID;
+ } else {
+ gbaBackground->screenshotId = stateId | SCREENSHOT_INVALID;
}
- PNGReadClose(png, info, end);
}
- if (vf) {
- vf->close(vf);
- }
- if (success) {
- gbaBackground->p->drawScreenshot(gbaBackground->p, pixels, w, h, true);
- gbaBackground->screenshotId = (int) id;
- } else if (gbaBackground->p->drawFrame) {
+ if (gbaBackground->p->drawFrame && gbaBackground->screenshotId == (stateId | SCREENSHOT_INVALID)) {
gbaBackground->p->drawFrame(gbaBackground->p, true);
}
}
@@ -315,7 +330,7 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
.draw = _drawState
},
.p = runner,
- .screenshot = 0,
+ .image = 0,
.screenshotId = 0
};
struct GUIMenu pauseMenu = {
@@ -336,38 +351,38 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
GUIMenuItemListInit(&pauseMenu.items, 0);
GUIMenuItemListInit(&stateSaveMenu.items, 9);
GUIMenuItemListInit(&stateLoadMenu.items, 10);
- *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Unpause", .data = (void*) RUNNER_CONTINUE };
+ *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Unpause", .data = GUI_V_U(RUNNER_CONTINUE) };
*GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Save state", .submenu = &stateSaveMenu };
*GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Load state", .submenu = &stateLoadMenu };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 1", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(1)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 2", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(2)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 3", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(3)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 4", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(4)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 5", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(5)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 6", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(6)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 7", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(7)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 8", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(8)) };
- *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 9", .data = (void*) (RUNNER_SAVE_STATE | RUNNER_STATE(9)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 1", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(1)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 2", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(2)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 3", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(3)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 4", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(4)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 5", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(5)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 6", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(6)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 7", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(7)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 8", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(8)) };
+ *GUIMenuItemListAppend(&stateSaveMenu.items) = (struct GUIMenuItem) { .title = "State 9", .data = GUI_V_U(RUNNER_SAVE_STATE | RUNNER_STATE(9)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "Autosave", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(0)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 1", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(1)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 2", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(2)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 3", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(3)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 4", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(4)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 5", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(5)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 6", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(6)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 7", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(7)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 8", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(8)) };
- *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 9", .data = (void*) (RUNNER_LOAD_STATE | RUNNER_STATE(9)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "Autosave", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(0)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 1", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(1)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 2", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(2)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 3", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(3)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 4", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(4)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 5", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(5)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 6", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(6)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 7", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(7)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 8", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(8)) };
+ *GUIMenuItemListAppend(&stateLoadMenu.items) = (struct GUIMenuItem) { .title = "State 9", .data = GUI_V_U(RUNNER_LOAD_STATE | RUNNER_STATE(9)) };
- *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Take screenshot", .data = (void*) RUNNER_SCREENSHOT };
+ *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Take screenshot", .data = GUI_V_U(RUNNER_SCREENSHOT) };
if (runner->params.getText) {
- *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Cheats", .data = (void*) RUNNER_CHEATS };
+ *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Cheats", .data = GUI_V_U(RUNNER_CHEATS) };
}
- *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Configure", .data = (void*) RUNNER_CONFIG };
- *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Reset game", .data = (void*) RUNNER_RESET };
- *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Exit game", .data = (void*) RUNNER_EXIT };
+ *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Configure", .data = GUI_V_U(RUNNER_CONFIG) };
+ *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Reset game", .data = GUI_V_U(RUNNER_RESET) };
+ *GUIMenuItemListAppend(&pauseMenu.items) = (struct GUIMenuItem) { .title = "Exit game", .data = GUI_V_U(RUNNER_EXIT) };
runner->params.drawStart();
if (runner->params.guiPrepare) {
@@ -455,6 +470,12 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
int drawFps = false;
mCoreConfigGetIntValue(&runner->config, "fpsCounter", &drawFps);
+ int mute = false;
+ mCoreConfigGetIntValue(&runner->config, "mute", &mute);
+
+ int fastForwardMute = false;
+ mCoreConfigGetIntValue(&runner->config, "fastForwardMute", &fastForwardMute);
+
bool running = true;
#ifndef DISABLE_THREADING
@@ -506,21 +527,33 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
if (guiKeys & (1 << mGUI_INPUT_SCREENSHOT)) {
mCoreTakeScreenshot(runner->core);
}
+ bool muteTogglePressed = guiKeys & (1 << mGUI_INPUT_MUTE_TOGGLE);
+ if (muteTogglePressed) {
+ mute = !mute;
+ mCoreConfigSetUIntValue(&runner->config, "mute", mute);
+ runner->core->reloadConfigOption(runner->core, "mute", &runner->config);
+ }
if (runner->setFrameLimiter) {
if (guiKeys & (1 << mGUI_INPUT_FAST_FORWARD_TOGGLE)) {
fastForward = !fastForward;
}
- if (fastForward || (heldKeys & (1 << mGUI_INPUT_FAST_FORWARD_HELD))) {
+ bool fastForwarding = fastForward || (heldKeys & (1 << mGUI_INPUT_FAST_FORWARD_HELD));
+ if (fastForwarding) {
+ if (fastForwardMute && !mute && !muteTogglePressed) {
+ mCoreConfigSetUIntValue(&runner->core->config, "mute", fastForwardMute);
+ runner->core->reloadConfigOption(runner->core, "mute", NULL);
+ }
+
runner->setFrameLimiter(runner, false);
} else {
runner->setFrameLimiter(runner, true);
+
+ if (fastForwardMute && !mute && !muteTogglePressed) {
+ mCoreConfigSetUIntValue(&runner->core->config, "mute", !fastForwardMute);
+ runner->core->reloadConfigOption(runner->core, "mute", NULL);
+ }
}
}
- if (guiKeys & (1 << mGUI_INPUT_MUTE_TOGGLE)) {
- int mute = !runner->core->opts.mute;
- mCoreConfigSetUIntValue(&runner->config, "mute", mute);
- runner->core->reloadConfigOption(runner->core, "mute", &runner->config);
- }
uint16_t keys = runner->pollGameInput(runner);
if (runner->prepareForFrame) {
runner->prepareForFrame(runner);
@@ -600,8 +633,8 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
uint32_t keys = 0xFFFFFFFF; // Huge hack to avoid an extra variable!
struct GUIMenuItem* item;
enum GUIMenuExitReason reason = GUIShowMenu(&runner->params, &pauseMenu, &item);
- if (reason == GUI_MENU_EXIT_ACCEPT) {
- switch (((int) item->data) & RUNNER_COMMAND_MASK) {
+ if (reason == GUI_MENU_EXIT_ACCEPT && item->data.type == GUI_VARIANT_UNSIGNED) {
+ switch (item->data.v.u & RUNNER_COMMAND_MASK) {
case RUNNER_EXIT:
running = false;
keys = 0;
@@ -610,10 +643,10 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
runner->core->reset(runner->core);
break;
case RUNNER_SAVE_STATE:
- mCoreSaveState(runner->core, ((int) item->data) >> 16, SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA | SAVESTATE_RTC | SAVESTATE_METADATA);
+ mCoreSaveState(runner->core, item->data.v.u >> 16, SAVESTATE_SCREENSHOT | SAVESTATE_SAVEDATA | SAVESTATE_RTC | SAVESTATE_METADATA);
break;
case RUNNER_LOAD_STATE:
- mCoreLoadState(runner->core, ((int) item->data) >> 16, SAVESTATE_SCREENSHOT | SAVESTATE_RTC);
+ mCoreLoadState(runner->core, item->data.v.u >> 16, SAVESTATE_SCREENSHOT | SAVESTATE_RTC);
break;
case RUNNER_SCREENSHOT:
mCoreTakeScreenshot(runner->core);
@@ -651,6 +684,8 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
}
mCoreConfigGetIntValue(&runner->config, "fpsCounter", &drawFps);
mCoreConfigGetIntValue(&runner->config, "showOSD", &showOSD);
+ mCoreConfigGetIntValue(&runner->config, "mute", &mute);
+ mCoreConfigGetIntValue(&runner->config, "fastForwardMute", &fastForwardMute);
#ifdef M_CORE_GB
if (runner->core->platform(runner->core) == mPLATFORM_GB) {
runner->core->reloadConfigOption(runner->core, "gb.pal", &runner->config);
@@ -676,10 +711,8 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) {
mLOG(GUI_RUNNER, DEBUG, "Unloading game...");
runner->core->unloadROM(runner->core);
drawState.screenshotId = 0;
- if (drawState.screenshot) {
- unsigned w, h;
- runner->core->desiredVideoDimensions(runner->core, &w, &h);
- mappedMemoryFree(drawState.screenshot, w * h * 4);
+ if (drawState.image) {
+ mappedMemoryFree(drawState.image, drawState.imageSize);
}
if (runner->config.port) {
diff --git a/src/feature/gui/gui-runner.h b/src/feature/gui/gui-runner.h
index 20762d58b..ea18cc5b8 100644
--- a/src/feature/gui/gui-runner.h
+++ b/src/feature/gui/gui-runner.h
@@ -31,8 +31,10 @@ struct mGUIBackground {
struct GUIBackground d;
struct mGUIRunner* p;
- color_t* screenshot;
- int screenshotId;
+ color_t* image;
+ size_t imageSize;
+
+ unsigned screenshotId;
};
struct mCore;
diff --git a/src/feature/gui/remap.c b/src/feature/gui/remap.c
index d09c0ca51..5f7da0f01 100644
--- a/src/feature/gui/remap.c
+++ b/src/feature/gui/remap.c
@@ -21,12 +21,12 @@ void mGUIRemapKeys(struct GUIParams* params, struct mInputMap* map, const struct
size_t i;
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Game keys:",
- .data = 0,
+ .data = GUI_V_V,
};
for (i = 0; i < map->info->nKeys; ++i) {
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = map->info->keyId[i],
- .data = (void*) (GUI_INPUT_MAX + i + 1),
+ .data = GUI_V_U(GUI_INPUT_MAX + i + 1),
.submenu = 0,
.state = mInputQueryBinding(map, keys->id, i) + 1,
.validStates = keyNames,
@@ -35,7 +35,7 @@ void mGUIRemapKeys(struct GUIParams* params, struct mInputMap* map, const struct
}
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Interface keys:",
- .data = 0,
+ .data = GUI_V_V,
};
for (i = 0; i < params->keyMap.info->nKeys; ++i) {
if (!params->keyMap.info->keyId[i]) {
@@ -43,7 +43,7 @@ void mGUIRemapKeys(struct GUIParams* params, struct mInputMap* map, const struct
}
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = params->keyMap.info->keyId[i],
- .data = (void*) i + 1,
+ .data = GUI_V_U(i + 1),
.submenu = 0,
.state = mInputQueryBinding(¶ms->keyMap, keys->id, i) + 1,
.validStates = keyNames,
@@ -52,30 +52,30 @@ void mGUIRemapKeys(struct GUIParams* params, struct mInputMap* map, const struct
}
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Save",
- .data = (void*) (GUI_INPUT_MAX + map->info->nKeys + 2),
+ .data = GUI_V_I(-2),
};
*GUIMenuItemListAppend(&menu.items) = (struct GUIMenuItem) {
.title = "Cancel",
- .data = 0,
+ .data = GUI_V_I(-1),
};
struct GUIMenuItem* item;
while (true) {
enum GUIMenuExitReason reason;
reason = GUIShowMenu(params, &menu, &item);
- if (reason != GUI_MENU_EXIT_ACCEPT || !item->data) {
+ if (reason != GUI_MENU_EXIT_ACCEPT || GUIVariantCompareInt(item->data, -1)) {
break;
}
- if (item->data == (void*) (GUI_INPUT_MAX + map->info->nKeys + 2)) {
+ if (GUIVariantCompareInt(item->data, -2)) {
for (i = 0; i < GUIMenuItemListSize(&menu.items); ++i) {
item = GUIMenuItemListGetPointer(&menu.items, i);
- if ((uintptr_t) item->data < 1) {
+ if (!GUIVariantIsUInt(item->data)) {
continue;
}
- if ((uintptr_t) item->data < GUI_INPUT_MAX + 1) {
- mInputBindKey(¶ms->keyMap, keys->id, item->state - 1, (uintptr_t) item->data - 1);
- } else if ((uintptr_t) item->data < GUI_INPUT_MAX + map->info->nKeys + 1) {
- mInputBindKey(map, keys->id, item->state - 1, (uintptr_t) item->data - GUI_INPUT_MAX - 1);
+ if (item->data.v.u < GUI_INPUT_MAX + 1) {
+ mInputBindKey(¶ms->keyMap, keys->id, item->state - 1, item->data.v.u - 1);
+ } else if (item->data.v.u < GUI_INPUT_MAX + map->info->nKeys + 1) {
+ mInputBindKey(map, keys->id, item->state - 1, item->data.v.u - GUI_INPUT_MAX - 1);
}
}
break;
diff --git a/src/gb/io.c b/src/gb/io.c
index 9ba248882..00f75ffd7 100644
--- a/src/gb/io.c
+++ b/src/gb/io.c
@@ -724,6 +724,7 @@ void GBIODeserialize(struct GB* gb, const struct GBSerializedState* state) {
gb->audio.enable = GBAudioEnableGetEnable(*gb->audio.nr52);
if (gb->audio.enable) {
+ gb->audio.playingCh1 = false;
GBIOWrite(gb, GB_REG_NR10, gb->memory.io[GB_REG_NR10]);
GBIOWrite(gb, GB_REG_NR11, gb->memory.io[GB_REG_NR11]);
GBIOWrite(gb, GB_REG_NR12, gb->memory.io[GB_REG_NR12]);
@@ -731,12 +732,14 @@ void GBIODeserialize(struct GB* gb, const struct GBSerializedState* state) {
gb->audio.ch1.control.frequency &= 0xFF;
gb->audio.ch1.control.frequency |= GBAudioRegisterControlGetFrequency(gb->memory.io[GB_REG_NR14] << 8);
gb->audio.ch1.control.stop = GBAudioRegisterControlGetStop(gb->memory.io[GB_REG_NR14] << 8);
+ gb->audio.playingCh2 = false;
GBIOWrite(gb, GB_REG_NR21, gb->memory.io[GB_REG_NR21]);
GBIOWrite(gb, GB_REG_NR22, gb->memory.io[GB_REG_NR22]);
GBIOWrite(gb, GB_REG_NR23, gb->memory.io[GB_REG_NR23]);
gb->audio.ch2.control.frequency &= 0xFF;
gb->audio.ch2.control.frequency |= GBAudioRegisterControlGetFrequency(gb->memory.io[GB_REG_NR24] << 8);
gb->audio.ch2.control.stop = GBAudioRegisterControlGetStop(gb->memory.io[GB_REG_NR24] << 8);
+ gb->audio.playingCh3 = false;
GBIOWrite(gb, GB_REG_NR30, gb->memory.io[GB_REG_NR30]);
GBIOWrite(gb, GB_REG_NR31, gb->memory.io[GB_REG_NR31]);
GBIOWrite(gb, GB_REG_NR32, gb->memory.io[GB_REG_NR32]);
@@ -744,6 +747,7 @@ void GBIODeserialize(struct GB* gb, const struct GBSerializedState* state) {
gb->audio.ch3.rate &= 0xFF;
gb->audio.ch3.rate |= GBAudioRegisterControlGetRate(gb->memory.io[GB_REG_NR34] << 8);
gb->audio.ch3.stop = GBAudioRegisterControlGetStop(gb->memory.io[GB_REG_NR34] << 8);
+ gb->audio.playingCh4 = false;
GBIOWrite(gb, GB_REG_NR41, gb->memory.io[GB_REG_NR41]);
GBIOWrite(gb, GB_REG_NR42, gb->memory.io[GB_REG_NR42]);
GBIOWrite(gb, GB_REG_NR43, gb->memory.io[GB_REG_NR43]);
diff --git a/src/gb/mbc.c b/src/gb/mbc.c
index 3cb9a1a5d..bd8ad46f0 100644
--- a/src/gb/mbc.c
+++ b/src/gb/mbc.c
@@ -322,6 +322,7 @@ void GBMBCInit(struct GB* gb) {
}
gb->memory.mbcRead = NULL;
gb->memory.directSramAccess = true;
+ gb->memory.cartBusDecay = 4;
switch (gb->memory.mbcType) {
case GB_MBC_NONE:
gb->memory.mbcWrite = _GBMBCNone;
@@ -442,6 +443,9 @@ void GBMBCInit(struct GB* gb) {
void GBMBCReset(struct GB* gb) {
gb->memory.currentBank0 = 0;
gb->memory.romBank = &gb->memory.rom[GB_SIZE_CART_BANK0];
+ gb->memory.cartBus = 0xFF;
+ gb->memory.cartBusPc = 0;
+ gb->memory.cartBusDecay = 1;
memset(&gb->memory.mbcState, 0, sizeof(gb->memory.mbcState));
GBMBCInit(gb);
diff --git a/src/gb/memory.c b/src/gb/memory.c
index fec8bf2ab..0ec280aa1 100644
--- a/src/gb/memory.c
+++ b/src/gb/memory.c
@@ -51,12 +51,17 @@ static const uint8_t _blockedRegion[1] = { 0xFF };
static void _pristineCow(struct GB* gba);
-static uint8_t GBFastLoad8(struct SM83Core* cpu, uint16_t address) {
+static uint8_t GBCartLoad8(struct SM83Core* cpu, uint16_t address) {
if (UNLIKELY(address >= cpu->memory.activeRegionEnd)) {
cpu->memory.setActiveRegion(cpu, address);
return cpu->memory.cpuLoad8(cpu, address);
}
- return cpu->memory.activeRegion[address & cpu->memory.activeMask];
+ struct GB* gb = (struct GB*) cpu->master;
+ struct GBMemory* memory = &gb->memory;
+ memory->cartBusPc = address;
+ uint8_t value = cpu->memory.activeRegion[address & cpu->memory.activeMask];
+ memory->cartBus = value;
+ return value;
}
static void GBSetActiveRegion(struct SM83Core* cpu, uint16_t address) {
@@ -67,7 +72,7 @@ static void GBSetActiveRegion(struct SM83Core* cpu, uint16_t address) {
case GB_REGION_CART_BANK0 + 1:
case GB_REGION_CART_BANK0 + 2:
case GB_REGION_CART_BANK0 + 3:
- cpu->memory.cpuLoad8 = GBFastLoad8;
+ cpu->memory.cpuLoad8 = GBCartLoad8;
cpu->memory.activeRegion = memory->romBase;
cpu->memory.activeRegionEnd = GB_BASE_CART_BANK1;
cpu->memory.activeMask = GB_SIZE_CART_BANK0 - 1;
@@ -88,7 +93,7 @@ static void GBSetActiveRegion(struct SM83Core* cpu, uint16_t address) {
cpu->memory.cpuLoad8 = GBLoad8;
break;
}
- cpu->memory.cpuLoad8 = GBFastLoad8;
+ cpu->memory.cpuLoad8 = GBCartLoad8;
if (gb->memory.mbcType != GB_MBC6) {
cpu->memory.activeRegion = memory->romBank;
cpu->memory.activeRegionEnd = GB_BASE_VRAM;
@@ -238,24 +243,31 @@ uint8_t GBLoad8(struct SM83Core* cpu, uint16_t address) {
case GB_REGION_CART_BANK0 + 2:
case GB_REGION_CART_BANK0 + 3:
if (address >= memory->romSize) {
- return 0xFF;
+ memory->cartBus = 0xFF;
+ } else {
+ memory->cartBus = memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)];
}
- return memory->romBase[address & (GB_SIZE_CART_BANK0 - 1)];
+ memory->cartBusPc = cpu->pc;
+ return memory->cartBus;
case GB_REGION_CART_BANK1 + 2:
case GB_REGION_CART_BANK1 + 3:
if (memory->mbcType == GB_MBC6) {
- return memory->mbcState.mbc6.romBank1[address & (GB_SIZE_CART_HALFBANK - 1)];
+ memory->cartBus = memory->mbcState.mbc6.romBank1[address & (GB_SIZE_CART_HALFBANK - 1)];
+ memory->cartBusPc = cpu->pc;
+ return memory->cartBus;
}
// Fall through
case GB_REGION_CART_BANK1:
case GB_REGION_CART_BANK1 + 1:
if (address >= memory->romSize) {
- return 0xFF;
+ memory->cartBus = 0xFF;
+ } else if ((memory->mbcType & GB_UNL_BBD) == GB_UNL_BBD) {
+ memory->cartBus = memory->mbcRead(memory, address);
+ } else {
+ memory->cartBus = memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)];
}
- if ((memory->mbcType & GB_UNL_BBD) == GB_UNL_BBD) {
- return memory->mbcRead(memory, address);
- }
- return memory->romBank[address & (GB_SIZE_CART_BANK0 - 1)];
+ memory->cartBusPc = cpu->pc;
+ return memory->cartBus;
case GB_REGION_VRAM:
case GB_REGION_VRAM + 1:
if (gb->video.mode != 3) {
@@ -265,15 +277,18 @@ uint8_t GBLoad8(struct SM83Core* cpu, uint16_t address) {
case GB_REGION_EXTERNAL_RAM:
case GB_REGION_EXTERNAL_RAM + 1:
if (memory->rtcAccess) {
- return memory->rtcRegs[memory->activeRtcReg];
+ memory->cartBus = memory->rtcRegs[memory->activeRtcReg];
} else if (memory->mbcRead) {
- return memory->mbcRead(memory, address);
+ memory->cartBus = memory->mbcRead(memory, address);
} else if (memory->sramAccess && memory->sram) {
- return memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)];
+ memory->cartBus = memory->sramBank[address & (GB_SIZE_EXTERNAL_RAM - 1)];
} else if (memory->mbcType == GB_HuC3) {
- return 0x01; // TODO: Is this supposed to be the current SRAM bank?
+ memory->cartBus = 0x01; // TODO: Is this supposed to be the current SRAM bank?
+ } else if (cpu->tMultiplier * (cpu->pc - memory->cartBusPc) >= memory->cartBusDecay) {
+ memory->cartBus = 0xFF;
}
- return 0xFF;
+ memory->cartBusPc = cpu->pc;
+ return memory->cartBus;
case GB_REGION_WORKING_RAM_BANK0:
case GB_REGION_WORKING_RAM_BANK0 + 2:
return memory->wram[address & (GB_SIZE_WORKING_RAM_BANK0 - 1)];
@@ -705,6 +720,9 @@ void GBMemorySerialize(const struct GB* gb, struct GBSerializedState* state) {
flags = GBSerializedMemoryFlagsSetActiveRtcReg(flags, memory->activeRtcReg);
STORE_16LE(flags, 0, &state->memory.flags);
+ state->memory.cartBus = memory->cartBus;
+ STORE_16LE(memory->cartBusPc, 0, &state->cartBusPc);
+
switch (memory->mbcType) {
case GB_MBC1:
state->memory.mbc1.mode = memory->mbcState.mbc1.mode;
@@ -784,6 +802,9 @@ void GBMemoryDeserialize(struct GB* gb, const struct GBSerializedState* state) {
memory->isHdma = GBSerializedMemoryFlagsGetIsHdma(flags);
memory->activeRtcReg = GBSerializedMemoryFlagsGetActiveRtcReg(flags);
+ memory->cartBus = state->memory.cartBus;
+ LOAD_16LE(memory->cartBusPc, 0, &state->cartBusPc);
+
switch (memory->mbcType) {
case GB_MBC1:
memory->mbcState.mbc1.mode = state->memory.mbc1.mode;
diff --git a/src/gba/gba.c b/src/gba/gba.c
index b38edd3f6..ea3a91501 100644
--- a/src/gba/gba.c
+++ b/src/gba/gba.c
@@ -265,8 +265,10 @@ void GBASkipBIOS(struct GBA* gba) {
} else {
cpu->gprs[ARM_PC] = BASE_WORKING_RAM + 0xC0;
}
- gba->video.vcount = 0x7D;
- gba->memory.io[REG_VCOUNT >> 1] = 0x7D;
+ gba->video.vcount = 0x7E;
+ gba->memory.io[REG_VCOUNT >> 1] = 0x7E;
+ mTimingDeschedule(&gba->timing, &gba->video.event);
+ mTimingSchedule(&gba->timing, &gba->video.event, 117);
gba->memory.io[REG_POSTFLG >> 1] = 1;
ARMWritePC(cpu);
}
diff --git a/src/gba/io.c b/src/gba/io.c
index a40f3bdde..9956747b6 100644
--- a/src/gba/io.c
+++ b/src/gba/io.c
@@ -973,6 +973,8 @@ void GBAIOSerialize(struct GBA* gba, struct GBASerializedState* state) {
}
void GBAIODeserialize(struct GBA* gba, const struct GBASerializedState* state) {
+ GBAAudioWriteSOUNDCNT_X(&gba->audio, state->io[REG_SOUNDCNT_X >> 1]);
+
int i;
for (i = 0; i < REG_MAX; i += 2) {
if (_isWSpecialRegister[i >> 1]) {
@@ -1003,7 +1005,6 @@ void GBAIODeserialize(struct GBA* gba, const struct GBASerializedState* state) {
LOAD_32(gba->memory.dma[i].nextCount, 0, &state->dma[i].nextCount);
LOAD_32(gba->memory.dma[i].when, 0, &state->dma[i].when);
}
- GBAAudioWriteSOUNDCNT_X(&gba->audio, gba->memory.io[REG_SOUNDCNT_X >> 1]);
gba->sio.siocnt = gba->memory.io[REG_SIOCNT >> 1];
GBASIOWriteRCNT(&gba->sio, gba->memory.io[REG_RCNT >> 1]);
diff --git a/src/gba/memory.c b/src/gba/memory.c
index acbbd0874..d79010770 100644
--- a/src/gba/memory.c
+++ b/src/gba/memory.c
@@ -127,6 +127,7 @@ void GBAMemoryReset(struct GBA* gba) {
memset(gba->memory.io, 0, sizeof(gba->memory.io));
GBAAdjustWaitstates(gba, 0);
+ gba->memory.activeRegion = -1;
gba->memory.agbPrintProtect = 0;
gba->memory.agbPrintBase = 0;
memset(&gba->memory.agbPrintCtx, 0, sizeof(gba->memory.agbPrintCtx));
@@ -266,6 +267,11 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) {
gba->lastJump = address;
memory->lastPrefetchedPc = 0;
if (newRegion == memory->activeRegion) {
+ if (cpu->cpsr.t) {
+ cpu->memory.activeMask |= WORD_SIZE_THUMB;
+ } else {
+ cpu->memory.activeMask &= -WORD_SIZE_ARM;
+ }
if (newRegion < REGION_CART0 || (address & (SIZE_CART0 - 1)) < memory->romSize) {
return;
}
@@ -717,6 +723,8 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) {
value = GBASavedataReadFlash(&memory->savedata, address);
} else if (memory->hw.devices & HW_TILT) {
value = GBAHardwareTiltRead(&memory->hw, address & OFFSET_MASK);
+ } else if (memory->savedata.type == SAVEDATA_SRAM512) {
+ value = memory->savedata.data[address & (SIZE_CART_SRAM512 - 1)];
} else {
mLOG(GBA_MEM, GAME_ERROR, "Reading from non-existent SRAM: 0x%08X", address);
value = 0xFF;
@@ -1070,6 +1078,9 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo
memory->savedata.dirty |= SAVEDATA_DIRT_NEW;
} else if (memory->hw.devices & HW_TILT) {
GBAHardwareTiltWrite(&memory->hw, address & OFFSET_MASK, value);
+ } else if (memory->savedata.type == SAVEDATA_SRAM512) {
+ memory->savedata.data[address & (SIZE_CART_SRAM512 - 1)] = value;
+ memory->savedata.dirty |= SAVEDATA_DIRT_NEW;
} else {
mLOG(GBA_MEM, GAME_ERROR, "Writing to non-existent SRAM: 0x%08X", address);
}
diff --git a/src/gba/overrides.c b/src/gba/overrides.c
index 2c95ada25..2e0ce10de 100644
--- a/src/gba/overrides.c
+++ b/src/gba/overrides.c
@@ -241,6 +241,9 @@ bool GBAOverrideFind(const struct Configuration* config, struct GBACartridgeOver
if (strcasecmp(savetype, "SRAM") == 0) {
found = true;
override->savetype = SAVEDATA_SRAM;
+ } else if (strcasecmp(savetype, "SRAM512") == 0) {
+ found = true;
+ override->savetype = SAVEDATA_SRAM512;
} else if (strcasecmp(savetype, "EEPROM") == 0) {
found = true;
override->savetype = SAVEDATA_EEPROM;
@@ -288,6 +291,9 @@ void GBAOverrideSave(struct Configuration* config, const struct GBACartridgeOver
case SAVEDATA_SRAM:
savetype = "SRAM";
break;
+ case SAVEDATA_SRAM512:
+ savetype = "SRAM512";
+ break;
case SAVEDATA_EEPROM:
savetype = "EEPROM";
break;
diff --git a/src/gba/savedata.c b/src/gba/savedata.c
index 1ae924a9f..fbae0a554 100644
--- a/src/gba/savedata.c
+++ b/src/gba/savedata.c
@@ -68,6 +68,9 @@ void GBASavedataDeinit(struct GBASavedata* savedata) {
case SAVEDATA_SRAM:
mappedMemoryFree(savedata->data, SIZE_CART_SRAM);
break;
+ case SAVEDATA_SRAM512:
+ mappedMemoryFree(savedata->data, SIZE_CART_SRAM512);
+ break;
case SAVEDATA_FLASH512:
mappedMemoryFree(savedata->data, SIZE_CART_FLASH512);
break;
@@ -124,6 +127,8 @@ bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out) {
switch (savedata->type) {
case SAVEDATA_SRAM:
return out->write(out, savedata->data, SIZE_CART_SRAM) == SIZE_CART_SRAM;
+ case SAVEDATA_SRAM512:
+ return out->write(out, savedata->data, SIZE_CART_SRAM512) == SIZE_CART_SRAM512;
case SAVEDATA_FLASH512:
return out->write(out, savedata->data, SIZE_CART_FLASH512) == SIZE_CART_FLASH512;
case SAVEDATA_FLASH1M:
@@ -153,6 +158,8 @@ size_t GBASavedataSize(const struct GBASavedata* savedata) {
switch (savedata->type) {
case SAVEDATA_SRAM:
return SIZE_CART_SRAM;
+ case SAVEDATA_SRAM512:
+ return SIZE_CART_SRAM512;
case SAVEDATA_FLASH512:
return SIZE_CART_FLASH512;
case SAVEDATA_FLASH1M:
@@ -233,6 +240,9 @@ void GBASavedataForceType(struct GBASavedata* savedata, enum SavedataType type)
case SAVEDATA_SRAM:
GBASavedataInitSRAM(savedata);
break;
+ case SAVEDATA_SRAM512:
+ GBASavedataInitSRAM512(savedata);
+ break;
case SAVEDATA_FORCE_NONE:
savedata->type = SAVEDATA_FORCE_NONE;
break;
@@ -322,6 +332,30 @@ void GBASavedataInitSRAM(struct GBASavedata* savedata) {
}
}
+void GBASavedataInitSRAM512(struct GBASavedata* savedata) {
+ if (savedata->type == SAVEDATA_AUTODETECT) {
+ savedata->type = SAVEDATA_SRAM512;
+ } else {
+ mLOG(GBA_SAVE, WARN, "Can't re-initialize savedata");
+ return;
+ }
+ off_t end;
+ if (!savedata->vf) {
+ end = 0;
+ savedata->data = anonymousMemoryMap(SIZE_CART_SRAM512);
+ } else {
+ end = savedata->vf->size(savedata->vf);
+ if (end < SIZE_CART_SRAM512) {
+ savedata->vf->truncate(savedata->vf, SIZE_CART_SRAM512);
+ }
+ savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_SRAM512, savedata->mapMode);
+ }
+
+ if (end < SIZE_CART_SRAM512) {
+ memset(&savedata->data[end], 0xFF, SIZE_CART_SRAM512 - end);
+ }
+}
+
uint8_t GBASavedataReadFlash(struct GBASavedata* savedata, uint16_t address) {
if (savedata->command == FLASH_COMMAND_ID) {
if (savedata->type == SAVEDATA_FLASH512) {
diff --git a/src/gba/serialize.c b/src/gba/serialize.c
index 022d7b92f..d3ce97d1c 100644
--- a/src/gba/serialize.c
+++ b/src/gba/serialize.c
@@ -158,6 +158,7 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) {
mLOG(GBA_STATE, WARN, "Savestate has unaligned PC and is probably corrupted");
gba->cpu->gprs[ARM_PC] &= ~1;
}
+ gba->memory.activeRegion = -1;
gba->cpu->memory.setActiveRegion(gba->cpu, gba->cpu->gprs[ARM_PC]);
if (state->biosPrefetch) {
LOAD_32(gba->memory.biosPrefetch, 0, &state->biosPrefetch);
diff --git a/src/gba/sio/lockstep.c b/src/gba/sio/lockstep.c
index 5cac226a1..ba1f3f0af 100644
--- a/src/gba/sio/lockstep.c
+++ b/src/gba/sio/lockstep.c
@@ -141,6 +141,7 @@ bool GBASIOLockstepNodeUnload(struct GBASIODriver* driver) {
case SIO_MULTI:
ATOMIC_SUB(node->p->attachedMulti, 1);
break;
+ case SIO_NORMAL_8:
case SIO_NORMAL_32:
ATOMIC_SUB(node->p->attachedNormal, 1);
break;
@@ -179,10 +180,14 @@ static uint16_t GBASIOLockstepNodeMultiWriteRegister(struct GBASIODriver* driver
mLOG(GBA_SIO, DEBUG, "Lockstep %i: SIOCNT <- %04X", node->id, value);
enum mLockstepPhase transferActive;
+ int attached;
ATOMIC_LOAD(transferActive, node->p->d.transferActive);
+ ATOMIC_LOAD(attached, node->p->d.attached);
+
+ driver->p->siocnt = GBASIOMultiplayerSetSlave(driver->p->siocnt, node->id || attached < 2);
if (value & 0x0080 && transferActive == TRANSFER_IDLE) {
- if (!node->id && GBASIOMultiplayerIsReady(node->d.p->siocnt)) {
+ if (!node->id && attached > 1 && GBASIOMultiplayerIsReady(node->d.p->siocnt)) {
mLOG(GBA_SIO, DEBUG, "Lockstep %i: Transfer initiated", node->id);
ATOMIC_STORE(node->p->d.transferActive, TRANSFER_STARTING);
ATOMIC_STORE(node->p->d.transferCycles, GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(node->d.p->siocnt)][node->p->d.attached - 1]);
@@ -442,11 +447,22 @@ static void _GBASIOLockstepNodeProcessEvents(struct mTiming* timing, void* user,
struct GBASIOLockstepNode* node = user;
mLockstepLock(&node->p->d);
- int32_t cycles = 0;
+ int32_t cycles = cycles = node->nextEvent;
node->nextEvent -= cyclesLate;
node->eventDiff += cyclesLate;
if (node->p->d.attached < 2) {
- cycles = GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(node->d.p->siocnt)][0];
+ switch (node->mode) {
+ case SIO_MULTI:
+ cycles = GBASIOCyclesPerTransfer[GBASIOMultiplayerGetBaud(node->d.p->siocnt)][0];
+ break;
+ case SIO_NORMAL_8:
+ case SIO_NORMAL_32:
+ if (node->nextEvent <= 0) {
+ cycles = _masterUpdate(node);
+ node->eventDiff = 0;
+ }
+ break;
+ }
} else if (node->nextEvent <= 0) {
if (!node->id) {
cycles = _masterUpdate(node);
@@ -455,8 +471,6 @@ static void _GBASIOLockstepNodeProcessEvents(struct mTiming* timing, void* user,
cycles += node->p->d.useCycles(&node->p->d, node->id, node->eventDiff);
}
node->eventDiff = 0;
- } else {
- cycles = node->nextEvent;
}
if (cycles > 0) {
node->nextEvent = 0;
diff --git a/src/gba/video.c b/src/gba/video.c
index 226cc9430..49613cb09 100644
--- a/src/gba/video.c
+++ b/src/gba/video.c
@@ -72,7 +72,7 @@ void GBAVideoReset(struct GBAVideo* video) {
} else {
// TODO: Verify exact scanline on hardware
video->vcount = 0x7E;
- nextEvent = 170;
+ nextEvent = 117;
}
video->p->memory.io[REG_VCOUNT >> 1] = video->vcount;
diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c
index 5f2e17e8e..61657d3a3 100644
--- a/src/platform/3ds/main.c
+++ b/src/platform/3ds/main.c
@@ -954,7 +954,7 @@ int main() {
.configExtra = (struct GUIMenuItem[]) {
{
.title = "Screen mode",
- .data = "screenMode",
+ .data = GUI_V_S("screenMode"),
.submenu = 0,
.state = SM_PA_TOP,
.validStates = (const char*[]) {
@@ -969,7 +969,7 @@ int main() {
},
{
.title = "Filtering",
- .data = "filterMode",
+ .data = GUI_V_S("filterMode"),
.submenu = 0,
.state = FM_LINEAR_2x,
.validStates = (const char*[]) {
@@ -981,7 +981,7 @@ int main() {
},
{
.title = "Screen darkening",
- .data = "darkenMode",
+ .data = GUI_V_S("darkenMode"),
.submenu = 0,
.state = DM_NATIVE,
.validStates = (const char*[]) {
@@ -994,7 +994,7 @@ int main() {
},
{
.title = "Camera",
- .data = "camera",
+ .data = GUI_V_S("camera"),
.submenu = 0,
.state = 1,
.validStates = (const char*[]) {
diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c
index 1f265150a..019db4adc 100644
--- a/src/platform/libretro/libretro.c
+++ b/src/platform/libretro/libretro.c
@@ -17,6 +17,7 @@
#include
#include
#include
+#include
#endif
#ifdef M_CORE_GBA
#include
@@ -146,6 +147,38 @@ static void _initRumble(void) {
rumbleInitDone = true;
}
+#ifdef M_CORE_GB
+static void _updateGbPal(void) {
+ struct retro_variable var;
+ var.key = "mgba_gb_colors";
+ var.value = 0;
+ if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ const struct GBColorPreset* presets;
+ size_t listSize = GBColorPresetList(&presets);
+ size_t i;
+ for (i = 0; i < listSize; ++i) {
+ if (strcmp(presets[i].name, var.value) != 0) {
+ continue;
+ }
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[0]", presets[i].colors[0] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[1]", presets[i].colors[1] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[2]", presets[i].colors[2] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[3]", presets[i].colors[3] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[4]", presets[i].colors[4] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[5]", presets[i].colors[5] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[6]", presets[i].colors[6] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[7]", presets[i].colors[7] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[8]", presets[i].colors[8] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[9]", presets[i].colors[9] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[10]", presets[i].colors[10] & 0xFFFFFF);
+ mCoreConfigSetUIntValue(&core->config, "gb.pal[11]", presets[i].colors[11] & 0xFFFFFF);
+ core->reloadConfigOption(core, "gb.pal", NULL);
+ break;
+ }
+ }
+}
+#endif
+
static void _reloadSettings(void) {
struct mCoreOptions opts = {
.useBios = true,
@@ -177,6 +210,14 @@ static void _reloadSettings(void) {
mCoreConfigSetDefaultValue(&core->config, "sgb.model", modelName);
mCoreConfigSetDefaultValue(&core->config, "cgb.model", modelName);
}
+
+ var.key = "mgba_sgb_borders";
+ var.value = 0;
+ if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
+ mCoreConfigSetDefaultIntValue(&core->config, "sgb.borders", strcmp(var.value, "ON") == 0);
+ }
+
+ _updateGbPal();
#endif
var.key = "mgba_use_bios";
@@ -191,14 +232,6 @@ static void _reloadSettings(void) {
opts.skipBios = strcmp(var.value, "ON") == 0;
}
-#ifdef M_CORE_GB
- var.key = "mgba_sgb_borders";
- var.value = 0;
- if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
- mCoreConfigSetDefaultIntValue(&core->config, "sgb.borders", strcmp(var.value, "ON") == 0);
- }
-#endif
-
var.key = "mgba_frameskip";
var.value = 0;
if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
@@ -248,6 +281,22 @@ unsigned retro_api_version(void) {
void retro_set_environment(retro_environment_t env) {
environCallback = env;
+#ifdef M_CORE_GB
+ const struct GBColorPreset* presets;
+ size_t listSize = GBColorPresetList(&presets);
+
+ size_t colorOpt;
+ for (colorOpt = 0; option_defs_us[colorOpt].key; ++colorOpt) {
+ if (strcmp(option_defs_us[colorOpt].key, "mgba_gb_colors") == 0) {
+ break;
+ }
+ }
+ size_t i;
+ for (i = 0; i < listSize && i < RETRO_NUM_CORE_OPTION_VALUES_MAX; ++i) {
+ option_defs_us[colorOpt].values[i].value = presets[i].name;
+ }
+#endif
+
libretro_set_core_options(environCallback);
}
@@ -429,6 +478,10 @@ void retro_run(void) {
mCoreConfigSetIntValue(&core->config, "frameskip", strtol(var.value, NULL, 10));
core->reloadConfigOption(core, "frameskip", NULL);
}
+
+#ifdef M_CORE_GB
+ _updateGbPal();
+#endif
}
keys = 0;
diff --git a/src/platform/libretro/libretro_core_options.h b/src/platform/libretro/libretro_core_options.h
index e41e6cda2..5b0a62b1e 100644
--- a/src/platform/libretro/libretro_core_options.h
+++ b/src/platform/libretro/libretro_core_options.h
@@ -186,6 +186,17 @@ struct retro_core_option_definition option_defs_us[] = {
},
"OFF"
},
+ {
+ "mgba_gb_colors",
+ "Set default Game Boy palette",
+ "Selects which palette is used for Game Boy games that are not Game Boy Color or Super Game Boy compatible, or if the model is forced to Game Boy.",
+ {
+ // This list is populated at runtime
+ { "Grayscale", NULL },
+ { NULL, NULL },
+ },
+ "Grayscale"
+ },
{ NULL, NULL, NULL, {{0}}, NULL },
};
diff --git a/src/platform/psp2/main.c b/src/platform/psp2/main.c
index 1296baa0e..2be4dafee 100644
--- a/src/platform/psp2/main.c
+++ b/src/platform/psp2/main.c
@@ -160,7 +160,7 @@ int main() {
.configExtra = (struct GUIMenuItem[]) {
{
.title = "Screen mode",
- .data = "screenMode",
+ .data = GUI_V_S("screenMode"),
.submenu = 0,
.state = 0,
.validStates = (const char*[]) {
@@ -173,7 +173,7 @@ int main() {
},
{
.title = "Camera",
- .data = "camera",
+ .data = GUI_V_S("camera"),
.submenu = 0,
.state = 1,
.validStates = (const char*[]) {
diff --git a/src/platform/qt/ActionMapper.cpp b/src/platform/qt/ActionMapper.cpp
index bdd2065cc..a0d80a0d1 100644
--- a/src/platform/qt/ActionMapper.cpp
+++ b/src/platform/qt/ActionMapper.cpp
@@ -87,7 +87,13 @@ void ActionMapper::rebuildMenu(const QString& menu, QMenu* qmenu, QWidget* conte
}
});
QObject::connect(action, &Action::enabled, qaction, &QAction::setEnabled);
- QObject::connect(action, &Action::activated, qaction, &QAction::setChecked);
+ QObject::connect(action, &Action::activated, [qaction, action](bool active) {
+ if (qaction->isCheckable()) {
+ qaction->setChecked(active);
+ } else if (active) {
+ action->setActive(false);
+ }
+ });
QObject::connect(action, &Action::destroyed, qaction, &QAction::deleteLater);
if (shortcut) {
QObject::connect(shortcut, &Shortcut::shortcutChanged, qaction, [qaction](int shortcut) {
diff --git a/src/platform/qt/AssetInfo.cpp b/src/platform/qt/AssetInfo.cpp
index 22f1a464e..b0d180ae3 100644
--- a/src/platform/qt/AssetInfo.cpp
+++ b/src/platform/qt/AssetInfo.cpp
@@ -22,6 +22,7 @@ void AssetInfo::addCustomProperty(const QString& id, const QString& visibleName)
QLabel* value = new QLabel;
value->setFont(GBAApp::app()->monospaceFont());
value->setAlignment(Qt::AlignRight);
+ value->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard);
newLayout->addWidget(value);
m_customProperties[id] = value;
int index = customLocation();
diff --git a/src/platform/qt/AssetTile.ui b/src/platform/qt/AssetTile.ui
index 6712166f2..266a042ec 100644
--- a/src/platform/qt/AssetTile.ui
+++ b/src/platform/qt/AssetTile.ui
@@ -51,7 +51,7 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -74,6 +74,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -96,7 +99,7 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -162,6 +165,9 @@
0x00 (00)
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -169,6 +175,9 @@
0x00 (00)
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -176,6 +185,9 @@
0x00 (00)
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
diff --git a/src/platform/qt/BattleChipView.ui b/src/platform/qt/BattleChipView.ui
index 0b50fe0be..ecb581fb3 100644
--- a/src/platform/qt/BattleChipView.ui
+++ b/src/platform/qt/BattleChipView.ui
@@ -142,7 +142,7 @@
-
- Ba&ttleChip Gate
+ Ba&ttleChip Gate
true
@@ -152,14 +152,14 @@
-
- Progress &Gate
+ Progress &Gate
-
- Beast &Link Gate
+ Beast &Link Gate
diff --git a/src/platform/qt/CheatsView.cpp b/src/platform/qt/CheatsView.cpp
index 9120e358b..5c5594067 100644
--- a/src/platform/qt/CheatsView.cpp
+++ b/src/platform/qt/CheatsView.cpp
@@ -8,8 +8,10 @@
#include "GBAApp.h"
#include "CoreController.h"
+#include
+#include
#include
-#include
+#include
#include
#ifdef M_CORE_GBA
@@ -30,58 +32,30 @@ CheatsView::CheatsView(std::shared_ptr controller, QWidget* pare
m_ui.cheatList->installEventFilter(this);
m_ui.cheatList->setModel(&m_model);
+ m_ui.codeEntry->setFont(GBAApp::app()->monospaceFont());
- connect(m_ui.load, &QPushButton::clicked, this, &CheatsView::load);
- connect(m_ui.save, &QPushButton::clicked, this, &CheatsView::save);
- connect(m_ui.addSet, &QPushButton::clicked, this, &CheatsView::addSet);
- connect(m_ui.remove, &QPushButton::clicked, this, &CheatsView::removeSet);
+ connect(m_ui.load, &QAbstractButton::clicked, this, &CheatsView::load);
+ connect(m_ui.save, &QAbstractButton::clicked, this, &CheatsView::save);
+ connect(m_ui.addSet, &QAbstractButton::clicked, this, &CheatsView::addSet);
+ connect(m_ui.remove, &QAbstractButton::clicked, this, &CheatsView::removeSet);
+ connect(m_ui.add, &QAbstractButton::clicked, this, &CheatsView::enterCheat);
connect(controller.get(), &CoreController::stopping, this, &CheatsView::close);
connect(controller.get(), &CoreController::stateLoaded, &m_model, &CheatsModel::invalidated);
- QPushButton* add;
switch (controller->platform()) {
#ifdef M_CORE_GBA
case mPLATFORM_GBA:
- connect(m_ui.add, &QPushButton::clicked, [this]() {
- enterCheat(GBA_CHEAT_AUTODETECT);
- });
-
- add = new QPushButton(tr("Add GameShark"));
- m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2);
- connect(add, &QPushButton::clicked, [this]() {
- enterCheat(GBA_CHEAT_GAMESHARK);
- });
-
- add = new QPushButton(tr("Add Pro Action Replay"));
- m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2);
- connect(add, &QPushButton::clicked, [this]() {
- enterCheat(GBA_CHEAT_PRO_ACTION_REPLAY);
- });
-
- add = new QPushButton(tr("Add CodeBreaker"));
- m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2);
- connect(add, &QPushButton::clicked, [this]() {
- enterCheat(GBA_CHEAT_CODEBREAKER);
- });
+ registerCodeType(tr("Autodetect (recommended)"), GBA_CHEAT_AUTODETECT);
+ registerCodeType(QLatin1String("GameShark"), GBA_CHEAT_GAMESHARK);
+ registerCodeType(QLatin1String("Action Replay MAX"), GBA_CHEAT_PRO_ACTION_REPLAY);
+ registerCodeType(QLatin1String("CodeBreaker"), GBA_CHEAT_CODEBREAKER);
break;
#endif
#ifdef M_CORE_GB
case mPLATFORM_GB:
- connect(m_ui.add, &QPushButton::clicked, [this]() {
- enterCheat(GB_CHEAT_AUTODETECT);
- });
-
- add = new QPushButton(tr("Add GameShark"));
- m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2);
- connect(add, &QPushButton::clicked, [this]() {
- enterCheat(GB_CHEAT_GAMESHARK);
- });
-
- add = new QPushButton(tr("Add GameGenie"));
- m_ui.gridLayout->addWidget(add, m_ui.gridLayout->rowCount(), 2, 1, 2);
- connect(add, &QPushButton::clicked, [this]() {
- enterCheat(GB_CHEAT_GAME_GENIE);
- });
+ registerCodeType(tr("Autodetect (recommended)"), GB_CHEAT_AUTODETECT);
+ registerCodeType(QLatin1String("GameShark"), GB_CHEAT_GAMESHARK);
+ registerCodeType(QLatin1String("Game Genie"), GB_CHEAT_GAME_GENIE);
break;
#endif
default:
@@ -127,6 +101,7 @@ void CheatsView::addSet() {
mCheatSet* set = m_controller->cheatDevice()->createSet(m_controller->cheatDevice(), nullptr);
m_model.addSet(set);
m_ui.cheatList->selectionModel()->select(m_model.index(m_model.rowCount() - 1, 0, QModelIndex()), QItemSelectionModel::ClearAndSelect);
+ enterCheat();
}
void CheatsView::removeSet() {
@@ -140,7 +115,21 @@ void CheatsView::removeSet() {
}
}
-void CheatsView::enterCheat(int codeType) {
+void CheatsView::registerCodeType(const QString& label, int type) {
+ QRadioButton* add = new QRadioButton(label);
+ m_ui.typeLayout->addWidget(add);
+ connect(add, &QAbstractButton::clicked, [this, type]() {
+ m_codeType = type;
+ });
+ if (!m_typeGroup) {
+ m_typeGroup = new QButtonGroup(this);
+ m_codeType = type;
+ add->setChecked(true);
+ }
+ m_typeGroup->addButton(add);
+}
+
+void CheatsView::enterCheat() {
mCheatSet* set = nullptr;
QModelIndexList selection = m_ui.cheatList->selectionModel()->selectedIndexes();
QModelIndex index;
@@ -163,7 +152,7 @@ void CheatsView::enterCheat(int codeType) {
QStringList cheats = m_ui.codeEntry->toPlainText().split('\n', QString::SkipEmptyParts);
for (const QString& string : cheats) {
m_model.beginAppendRow(index);
- mCheatAddLine(set, string.toUtf8().constData(), codeType);
+ mCheatAddLine(set, string.toUtf8().constData(), m_codeType);
m_model.endAppendRow();
}
if (set->refresh) {
diff --git a/src/platform/qt/CheatsView.h b/src/platform/qt/CheatsView.h
index 7e47ef07e..a6b9db848 100644
--- a/src/platform/qt/CheatsView.h
+++ b/src/platform/qt/CheatsView.h
@@ -33,13 +33,17 @@ private slots:
void save();
void addSet();
void removeSet();
+ void enterCheat();
private:
- void enterCheat(int codeType);
+ void registerCodeType(const QString& label, int type);
Ui::CheatsView m_ui;
std::shared_ptr m_controller;
CheatsModel m_model;
+ QButtonGroup* m_typeGroup = nullptr;
+
+ int m_codeType = 0;
};
}
diff --git a/src/platform/qt/CheatsView.ui b/src/platform/qt/CheatsView.ui
index e712f281c..fe2124022 100644
--- a/src/platform/qt/CheatsView.ui
+++ b/src/platform/qt/CheatsView.ui
@@ -6,60 +6,18 @@
0
0
- 629
- 428
+ 520
+ 455
Cheats
-
- -
-
-
- Remove
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
- Save
-
-
-
- -
-
-
- Load
-
-
-
- -
-
-
- Add New Set
-
-
-
- -
-
-
- Add
-
-
-
- -
+
+
-
-
+
0
0
@@ -75,18 +33,51 @@
- -
+
-
+
+
+ Add New Code
+
+
+
+ -
+
+
+ Load
+
+
+
+ -
+
+
+ Save
+
+
+
+ -
+
+
+ Remove
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ -
-
+
1
0
-
-
- Courier New
-
+
+ true
QPlainTextEdit::NoWrap
@@ -96,6 +87,21 @@
+ -
+
+
+ Add Lines
+
+
+
+ -
+
+
+ Code type
+
+
+
+
diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp
index 8d7352ee7..9500ea0bd 100644
--- a/src/platform/qt/CoreController.cpp
+++ b/src/platform/qt/CoreController.cpp
@@ -529,6 +529,21 @@ void CoreController::forceFastForward(bool enable) {
emit fastForwardChanged(enable || m_fastForward);
}
+void CoreController::overrideMute(bool override) {
+ m_mute = override;
+
+ Interrupter interrupter(this);
+ mCore* core = m_threadContext.core;
+ if (m_mute) {
+ core->opts.mute = true;
+ } else {
+ int fakeBool = 0;
+ mCoreConfigGetIntValue(&core->config, "mute", &fakeBool);
+ core->opts.mute = fakeBool;
+ }
+ core->reloadConfigOption(core, NULL, NULL);
+}
+
void CoreController::loadState(int slot) {
if (slot > 0 && slot != m_stateSlot) {
m_stateSlot = slot;
@@ -1046,7 +1061,7 @@ void CoreController::updateFastForward() {
m_threadContext.core->opts.volume = m_fastForwardVolume;
}
if (m_fastForwardMute >= 0) {
- m_threadContext.core->opts.mute = m_fastForwardMute;
+ m_threadContext.core->opts.mute = m_fastForwardMute || m_mute;
}
// If we aren't holding the fast forward button
diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h
index 32ae30b90..372f01406 100644
--- a/src/platform/qt/CoreController.h
+++ b/src/platform/qt/CoreController.h
@@ -141,6 +141,8 @@ public slots:
void setFastForward(bool);
void forceFastForward(bool);
+ void overrideMute(bool);
+
void loadState(int slot = 0);
void loadState(const QString& path, int flags = -1);
void loadState(QIODevice* iodev, int flags = -1);
@@ -272,6 +274,8 @@ private:
float m_fastForwardHeldRatio = -1.f;
float m_fpsTarget;
+ bool m_mute;
+
InputController* m_inputController = nullptr;
LogController* m_log = nullptr;
MultiplayerController* m_multiplayer = nullptr;
diff --git a/src/platform/qt/DebuggerConsole.cpp b/src/platform/qt/DebuggerConsole.cpp
index b7ac06323..2d4261afb 100644
--- a/src/platform/qt/DebuggerConsole.cpp
+++ b/src/platform/qt/DebuggerConsole.cpp
@@ -6,6 +6,7 @@
#include "DebuggerConsole.h"
#include "DebuggerConsoleController.h"
+#include "GBAApp.h"
#include
@@ -18,6 +19,8 @@ DebuggerConsole::DebuggerConsole(DebuggerConsoleController* controller, QWidget*
m_ui.setupUi(this);
m_ui.prompt->installEventFilter(this);
+ m_ui.log->setFont(GBAApp::app()->monospaceFont());
+ m_ui.prompt->setFont(GBAApp::app()->monospaceFont());
connect(m_ui.prompt, &QLineEdit::returnPressed, this, &DebuggerConsole::postLine);
connect(controller, &DebuggerConsoleController::log, this, &DebuggerConsole::log);
@@ -81,4 +84,4 @@ bool DebuggerConsole::eventFilter(QObject*, QEvent* event) {
m_ui.prompt->setText(m_history[m_history.size() - m_historyOffset]);
}
return true;
-}
\ No newline at end of file
+}
diff --git a/src/platform/qt/DebuggerConsole.ui b/src/platform/qt/DebuggerConsole.ui
index 7374afd89..4199e1e83 100644
--- a/src/platform/qt/DebuggerConsole.ui
+++ b/src/platform/qt/DebuggerConsole.ui
@@ -16,11 +16,6 @@
-
-
-
- Source Code Pro
-
-
Enter command (try `help` for more info)
@@ -35,11 +30,6 @@
-
-
-
- Source Code Pro
-
-
true
diff --git a/src/platform/qt/DiscordCoordinator.cpp b/src/platform/qt/DiscordCoordinator.cpp
index ab6a0445a..b090863cd 100644
--- a/src/platform/qt/DiscordCoordinator.cpp
+++ b/src/platform/qt/DiscordCoordinator.cpp
@@ -5,6 +5,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "DiscordCoordinator.h"
+#include
+
#include "CoreController.h"
#include "GBAApp.h"
@@ -31,6 +33,11 @@ static void updatePresence() {
discordPresence.details = s_title.toUtf8().constData();
discordPresence.instance = 1;
discordPresence.largeImageKey = "mgba";
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0))
+ discordPresence.startTimestamp = QDateTime::currentSecsSinceEpoch();
+#else
+ discordPresence.startTimestamp = QDateTime::currentMSecsSinceEpoch() / 1000;
+#endif
Discord_UpdatePresence(&discordPresence);
} else {
Discord_ClearPresence();
diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp
index 1ca7143d4..7af01fd49 100644
--- a/src/platform/qt/DisplayGL.cpp
+++ b/src/platform/qt/DisplayGL.cpp
@@ -447,12 +447,12 @@ void PainterGL::draw() {
m_delayTimer.start();
} else {
if (sync->audioWait || sync->videoFrameWait) {
- while (m_delayTimer.nsecsElapsed() + 2000000 < 1000000000 / sync->fpsTarget) {
+ while (m_delayTimer.nsecsElapsed() + 1'000'000 < 1'000'000'000 / sync->fpsTarget) {
QThread::usleep(500);
}
forceRedraw = true;
} else if (!forceRedraw) {
- forceRedraw = m_delayTimer.nsecsElapsed() + 2000000 >= 1000000000 / m_surface->screen()->refreshRate();
+ forceRedraw = m_delayTimer.nsecsElapsed() + 1'000'000 >= 1'000'000'000 / m_surface->screen()->refreshRate();
}
}
mCoreSyncWaitFrameEnd(sync);
diff --git a/src/platform/qt/IOViewer.ui b/src/platform/qt/IOViewer.ui
index bcd338af9..e53541f4a 100644
--- a/src/platform/qt/IOViewer.ui
+++ b/src/platform/qt/IOViewer.ui
@@ -25,6 +25,9 @@
0x0000
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
diff --git a/src/platform/qt/ObjView.ui b/src/platform/qt/ObjView.ui
index adf60a165..6ee83b3e5 100644
--- a/src/platform/qt/ObjView.ui
+++ b/src/platform/qt/ObjView.ui
@@ -82,7 +82,7 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -173,6 +173,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -199,6 +202,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -246,6 +252,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -272,6 +281,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -283,6 +295,9 @@
+0.00
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -290,6 +305,9 @@
+1.00
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -304,6 +322,9 @@
+1.00
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -324,6 +345,9 @@
+0.00
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -405,6 +429,9 @@
Off
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -439,6 +466,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -473,9 +503,6 @@
-
- Return, Ctrl+R
-
@@ -564,6 +591,9 @@
Normal
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -669,6 +699,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
diff --git a/src/platform/qt/OverrideView.ui b/src/platform/qt/OverrideView.ui
index 97061d6db..e1e84927c 100644
--- a/src/platform/qt/OverrideView.ui
+++ b/src/platform/qt/OverrideView.ui
@@ -143,7 +143,17 @@
-
- EEPROM
+ EEPROM 8kB
+
+
+ -
+
+ EEPROM 512 bytes
+
+
+ -
+
+ SRAM 64kB (bootlegs only)
diff --git a/src/platform/qt/PaletteView.ui b/src/platform/qt/PaletteView.ui
index 9224969bf..ea1357bc0 100644
--- a/src/platform/qt/PaletteView.ui
+++ b/src/platform/qt/PaletteView.ui
@@ -211,6 +211,9 @@
0x00 (00)
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -218,6 +221,9 @@
0x00 (00)
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -225,6 +231,9 @@
0x00 (00)
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
@@ -274,6 +283,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -284,6 +296,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
-
@@ -294,6 +309,9 @@
Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
+
diff --git a/src/platform/qt/ROMInfo.ui b/src/platform/qt/ROMInfo.ui
index a328bbd98..aeebdad7f 100644
--- a/src/platform/qt/ROMInfo.ui
+++ b/src/platform/qt/ROMInfo.ui
@@ -36,7 +36,7 @@
true
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -53,7 +53,7 @@
{TITLE}
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -70,7 +70,7 @@
{ID}
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -87,7 +87,7 @@
{SIZE}
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
@@ -104,7 +104,7 @@
{CRC}
- Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse
+ Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse
diff --git a/src/platform/qt/ReportView.cpp b/src/platform/qt/ReportView.cpp
index d21da1422..737247eba 100644
--- a/src/platform/qt/ReportView.cpp
+++ b/src/platform/qt/ReportView.cpp
@@ -98,6 +98,7 @@ ReportView::ReportView(QWidget* parent)
QString description = m_ui.description->text();
description.replace("{projectName}", QLatin1String(projectName));
m_ui.description->setText(description);
+ m_ui.fileView->setFont(GBAApp::app()->monospaceFont());
connect(m_ui.fileList, &QListWidget::currentTextChanged, this, &ReportView::setShownReport);
}
diff --git a/src/platform/qt/ReportView.ui b/src/platform/qt/ReportView.ui
index 9c7f2158c..8b6614d18 100644
--- a/src/platform/qt/ReportView.ui
+++ b/src/platform/qt/ReportView.ui
@@ -50,11 +50,6 @@
0
-
-
- Monospace
-
-
Qt::TextEditorInteraction
diff --git a/src/platform/qt/SensorView.cpp b/src/platform/qt/SensorView.cpp
index ba8f87da2..1742a26ee 100644
--- a/src/platform/qt/SensorView.cpp
+++ b/src/platform/qt/SensorView.cpp
@@ -79,14 +79,11 @@ void SensorView::setController(std::shared_ptr controller) {
void SensorView::jiggerer(QAbstractButton* button, void (InputController::*setter)(int)) {
connect(button, &QAbstractButton::toggled, [this, button, setter](bool checked) {
if (!checked) {
- m_jiggered = nullptr;
+ m_button = nullptr;
} else {
button->setFocus();
- m_jiggered = [this, button, setter](int axis) {
- (m_input->*setter)(axis);
- button->setChecked(false);
- button->clearFocus();
- };
+ m_button = button;
+ m_setter = setter;
}
});
button->installEventFilter(this);
@@ -106,8 +103,12 @@ bool SensorView::eventFilter(QObject*, QEvent* event) {
if (event->type() == GamepadAxisEvent::Type()) {
GamepadAxisEvent* gae = static_cast(event);
gae->accept();
- if (m_jiggered && gae->direction() != GamepadAxisEvent::NEUTRAL && gae->isNew()) {
- m_jiggered(gae->axis());
+ if (m_button && gae->direction() != GamepadAxisEvent::NEUTRAL && gae->isNew()) {
+ m_button->removeEventFilter(this);
+ m_button->clearFocus();
+ m_button->setChecked(false);
+ (m_input->*m_setter)(gae->axis());
+ m_button = nullptr;
}
return true;
}
diff --git a/src/platform/qt/SensorView.h b/src/platform/qt/SensorView.h
index 4cead7d11..5ccc40ec8 100644
--- a/src/platform/qt/SensorView.h
+++ b/src/platform/qt/SensorView.h
@@ -42,7 +42,9 @@ private slots:
private:
Ui::SensorView m_ui;
- std::function m_jiggered;
+ QAbstractButton* m_button = nullptr;
+ void (InputController::*m_setter)(int);
+
std::shared_ptr m_controller;
InputController* m_input;
mRotationSource* m_rotation;
diff --git a/src/platform/qt/SettingsView.cpp b/src/platform/qt/SettingsView.cpp
index 8695cfa4d..d198fd054 100644
--- a/src/platform/qt/SettingsView.cpp
+++ b/src/platform/qt/SettingsView.cpp
@@ -423,6 +423,8 @@ void SettingsView::updateConfig() {
saveSetting("suspendScreensaver", m_ui.suspendScreensaver);
saveSetting("pauseOnFocusLost", m_ui.pauseOnFocusLost);
saveSetting("pauseOnMinimize", m_ui.pauseOnMinimize);
+ saveSetting("muteOnFocusLost", m_ui.muteOnFocusLost);
+ saveSetting("muteOnMinimize", m_ui.muteOnMinimize);
saveSetting("savegamePath", m_ui.savegamePath);
saveSetting("savestatePath", m_ui.savestatePath);
saveSetting("screenshotPath", m_ui.screenshotPath);
@@ -534,6 +536,14 @@ void SettingsView::updateConfig() {
emit languageChanged();
}
+ if (m_ui.multiplayerAudioAll->isChecked()) {
+ m_controller->setQtOption("multiplayerAudio", "all");
+ } else if (m_ui.multiplayerAudio1->isChecked()) {
+ m_controller->setQtOption("multiplayerAudio", "p1");
+ } else if (m_ui.multiplayerAudioActive->isChecked()) {
+ m_controller->setQtOption("multiplayerAudio", "active");
+ }
+
int hwaccelVideo = m_controller->getOption("hwaccelVideo").toInt();
saveSetting("hwaccelVideo", m_ui.hwaccelVideo->currentIndex());
if (hwaccelVideo != m_ui.hwaccelVideo->currentIndex()) {
@@ -767,6 +777,15 @@ void SettingsView::reloadConfig() {
m_ui.videoScaleSize->setText(tr("(%1×%2)").arg(GBA_VIDEO_HORIZONTAL_PIXELS * value).arg(GBA_VIDEO_VERTICAL_PIXELS * value));
});
loadSetting("videoScale", m_ui.videoScale, 1);
+
+ QString multiplayerAudio = m_controller->getQtOption("multiplayerAudio").toString();
+ if (multiplayerAudio == QLatin1String("p1")) {
+ m_ui.multiplayerAudio1->setChecked(true);
+ } else if (multiplayerAudio == QLatin1String("active")) {
+ m_ui.multiplayerAudioActive->setChecked(true);
+ } else {
+ m_ui.multiplayerAudioAll->setChecked(true);
+ }
}
void SettingsView::addPage(const QString& name, QWidget* view, Page index) {
diff --git a/src/platform/qt/SettingsView.ui b/src/platform/qt/SettingsView.ui
index cff99a847..bb1903c24 100644
--- a/src/platform/qt/SettingsView.ui
+++ b/src/platform/qt/SettingsView.ui
@@ -313,21 +313,61 @@
- -
+
-
+
+
+ Audio in multiplayer:
+
+
+
+ -
+
+
+ All windows
+
+
+ true
+
+
+ multiplayerAudio
+
+
+
+ -
+
+
+ Player 1 window only
+
+
+ multiplayerAudio
+
+
+
+ -
+
+
+ Currently active player window
+
+
+ multiplayerAudio
+
+
+
+ -
Qt::Horizontal
- -
+
-
Display driver:
- -
+
-
@@ -337,14 +377,14 @@
- -
+
-
Frameskip:
- -
+
-
-
@@ -365,14 +405,14 @@
- -
+
-
FPS target:
- -
+
-
-
@@ -399,28 +439,28 @@
- -
+
-
Native (59.7275)
- -
+
-
Qt::Horizontal
- -
+
-
Sync:
- -
+
-
-
@@ -438,28 +478,28 @@
- -
+
-
Lock aspect ratio
- -
+
-
Force integer scaling
- -
+
-
Interframe blending
- -
+
-
Bilinear filtering
@@ -556,18 +596,22 @@
-
-
-
- Pause when inactive
-
-
-
- -
-
-
- Pause when minimized
-
-
+
+
-
+
+
+ Pause
+
+
+
+ -
+
+
+ Mute
+
+
+
+
-
@@ -684,6 +728,38 @@
+ -
+
+
-
+
+
+ Pause
+
+
+
+ -
+
+
+ Mute
+
+
+
+
+
+ -
+
+
+ When inactive:
+
+
+
+ -
+
+
+ When minimized:
+
+
+
@@ -2218,5 +2294,6 @@
+
diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp
index 6760960fd..e55a7dcd5 100644
--- a/src/platform/qt/Window.cpp
+++ b/src/platform/qt/Window.cpp
@@ -250,6 +250,11 @@ void Window::resizeFrame(const QSize& size) {
}
}
+void Window::updateMultiplayerActive(bool active) {
+ m_multiActive = active;
+ updateMute();
+}
+
void Window::setConfig(ConfigController* config) {
m_config = config;
}
@@ -282,6 +287,7 @@ void Window::reloadConfig() {
if (m_audioProcessor) {
m_audioProcessor->configure(m_config);
}
+ updateMute();
m_display->resizeContext();
}
@@ -673,12 +679,17 @@ void Window::resizeEvent(QResizeEvent*) {
void Window::showEvent(QShowEvent* event) {
if (m_wasOpened) {
- if (event->spontaneous() && m_config->getOption("pauseOnMinimize").toInt() && m_controller) {
+ if (event->spontaneous() && m_controller) {
focusCheck();
- if (m_autoresume) {
+ if (m_config->getOption("pauseOnMinimize").toInt() && m_autoresume) {
m_controller->setPaused(false);
m_autoresume = false;
}
+
+ if (m_config->getOption("muteOnMinimize").toInt()) {
+ m_inactiveMute = false;
+ updateMute();
+ }
}
return;
}
@@ -709,13 +720,18 @@ void Window::hideEvent(QHideEvent* event) {
if (!event->spontaneous()) {
return;
}
- if (!m_config->getOption("pauseOnMinimize").toInt() || !m_controller) {
+ if (!m_controller) {
return;
}
- if (!m_controller->isPaused()) {
+
+ if (m_config->getOption("pauseOnMinimize").toInt() && !m_controller->isPaused()) {
m_autoresume = true;
m_controller->setPaused(true);
}
+ if (m_config->getOption("muteOnMinimize").toInt()) {
+ m_inactiveMute = true;
+ updateMute();
+ }
}
void Window::closeEvent(QCloseEvent* event) {
@@ -737,6 +753,13 @@ void Window::closeEvent(QCloseEvent* event) {
}
void Window::focusInEvent(QFocusEvent*) {
+ for (Window* window : GBAApp::app()->windows()) {
+ if (window != this) {
+ window->updateMultiplayerActive(false);
+ } else {
+ updateMultiplayerActive(true);
+ }
+ }
m_display->forceDraw();
}
@@ -1873,15 +1896,25 @@ Action* Window::addGameAction(const QString& visibleName, const QString& name, A
}
void Window::focusCheck() {
- if (!m_config->getOption("pauseOnFocusLost").toInt() || !m_controller) {
+ if (!m_controller) {
return;
}
- if (QGuiApplication::focusWindow() && m_autoresume) {
- m_controller->setPaused(false);
- m_autoresume = false;
- } else if (!QGuiApplication::focusWindow() && !m_controller->isPaused()) {
- m_autoresume = true;
- m_controller->setPaused(true);
+ if (m_config->getOption("pauseOnFocusLost").toInt()) {
+ if (QGuiApplication::focusWindow() && m_autoresume) {
+ m_controller->setPaused(false);
+ m_autoresume = false;
+ } else if (!QGuiApplication::focusWindow() && !m_controller->isPaused()) {
+ m_autoresume = true;
+ m_controller->setPaused(true);
+ }
+ }
+ if (m_config->getOption("muteOnFocusLost").toInt()) {
+ if (QGuiApplication::focusWindow()) {
+ m_inactiveMute = false;
+ } else {
+ m_inactiveMute = true;
+ }
+ updateMute();
}
}
@@ -2020,6 +2053,26 @@ void Window::attachDisplay() {
m_display->startDrawing(m_controller);
}
+void Window::updateMute() {
+ if (!m_controller) {
+ return;
+ }
+
+ bool mute = m_inactiveMute;
+
+ if (!mute) {
+ QString multiplayerAudio = m_config->getQtOption("multiplayerAudio").toString();
+ if (multiplayerAudio == QLatin1String("p1")) {
+ MultiplayerController* multiplayer = m_controller->multiplayerController();
+ mute = multiplayer && multiplayer->attached() > 1 && multiplayer->playerId(m_controller.get());
+ } else if (multiplayerAudio == QLatin1String("active")) {
+ mute = !m_multiActive;
+ }
+ }
+
+ m_controller->overrideMute(mute);
+}
+
void Window::setLogo() {
m_screenWidget->setPixmap(m_logo);
m_screenWidget->setCenteredAspectRatio(m_logo.width(), m_logo.height());
diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h
index 57a5b1416..5b193728e 100644
--- a/src/platform/qt/Window.h
+++ b/src/platform/qt/Window.h
@@ -64,6 +64,7 @@ public:
void resizeFrame(const QSize& size);
void updateMultiplayerStatus(bool canOpenAnother) { m_multiWindow->setEnabled(canOpenAnother); }
+ void updateMultiplayerActive(bool active);
signals:
void startDrawing();
@@ -145,6 +146,7 @@ private slots:
void focusCheck();
void updateFrame();
+ void updateMute();
void setLogo();
@@ -224,6 +226,9 @@ private:
bool m_hitUnimplementedBiosCall;
+ bool m_inactiveMute = false;
+ bool m_multiActive = true;
+
std::unique_ptr m_overrideView;
std::unique_ptr m_sensorView;
std::unique_ptr m_dolphinView;
diff --git a/src/platform/qt/input/InputController.cpp b/src/platform/qt/input/InputController.cpp
index 9658fabd7..318bd79c9 100644
--- a/src/platform/qt/input/InputController.cpp
+++ b/src/platform/qt/input/InputController.cpp
@@ -59,6 +59,7 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren
mSDLInitEvents(&s_sdlEvents);
}
++s_sdlInited;
+ m_sdlPlayer.bindings = &m_inputMap;
updateJoysticks();
#endif
@@ -272,34 +273,45 @@ void InputController::setConfiguration(ConfigController* config) {
if (!m_playerAttached) {
m_playerAttached = mSDLAttachPlayer(&s_sdlEvents, &m_sdlPlayer);
}
- loadConfiguration(SDL_BINDING_BUTTON);
+ if (!loadConfiguration(SDL_BINDING_BUTTON)) {
+ mSDLInitBindingsGBA(&m_inputMap);
+ }
loadProfile(SDL_BINDING_BUTTON, profileForType(SDL_BINDING_BUTTON));
#endif
restoreModel();
}
-void InputController::loadConfiguration(uint32_t type) {
+bool InputController::loadConfiguration(uint32_t type) {
if (!m_activeKeyInfo) {
- return;
+ return false;
+ }
+ if (!mInputMapLoad(&m_inputMap, type, m_config->input())) {
+ return false;
}
- mInputMapLoad(&m_inputMap, type, m_config->input());
#ifdef BUILD_SDL
if (m_playerAttached) {
mSDLPlayerLoadConfig(&m_sdlPlayer, m_config->input());
}
#endif
+ return true;
}
-void InputController::loadProfile(uint32_t type, const QString& profile) {
+bool InputController::loadProfile(uint32_t type, const QString& profile) {
if (profile.isEmpty()) {
- return;
+ return false;
}
- const InputProfile* ip = InputProfile::findProfile(profile);
- if (ip) {
- ip->apply(this);
+ bool loaded = mInputProfileLoad(&m_inputMap, type, m_config->input(), profile.toUtf8().constData());
+ recalibrateAxes();
+ if (!loaded) {
+ const InputProfile* ip = InputProfile::findProfile(profile);
+ if (ip) {
+ ip->apply(this);
+ loaded = true;
+ }
}
recalibrateAxes();
emit profileLoaded(profile);
+ return loaded;
}
void InputController::saveConfiguration() {
diff --git a/src/platform/qt/input/InputController.h b/src/platform/qt/input/InputController.h
index ce195ba83..4e41e947e 100644
--- a/src/platform/qt/input/InputController.h
+++ b/src/platform/qt/input/InputController.h
@@ -73,8 +73,8 @@ public:
void setConfiguration(ConfigController* config);
void saveConfiguration();
- void loadConfiguration(uint32_t type);
- void loadProfile(uint32_t type, const QString& profile);
+ bool loadConfiguration(uint32_t type);
+ bool loadProfile(uint32_t type, const QString& profile);
void saveConfiguration(uint32_t type);
void saveProfile(uint32_t type, const QString& profile);
const char* profileForType(uint32_t type);
diff --git a/src/platform/qt/library/LibraryController.cpp b/src/platform/qt/library/LibraryController.cpp
index 9e7045b15..403bed6e7 100644
--- a/src/platform/qt/library/LibraryController.cpp
+++ b/src/platform/qt/library/LibraryController.cpp
@@ -106,6 +106,7 @@ VFile* LibraryController::selectedVFile() {
QByteArray filenameUtf8(entry.filename.toUtf8());
libentry.base = baseUtf8.constData();
libentry.filename = filenameUtf8.constData();
+ libentry.platform = mPLATFORM_NONE;
return mLibraryOpenVFile(m_library.get(), &libentry);
} else {
return nullptr;
diff --git a/src/platform/qt/ts/medusa-emu-de.ts b/src/platform/qt/ts/medusa-emu-de.ts
index 810c8356a..526ffc342 100644
--- a/src/platform/qt/ts/medusa-emu-de.ts
+++ b/src/platform/qt/ts/medusa-emu-de.ts
@@ -56,12 +56,12 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.
- In Archiv öffnen …
+ In Archiv öffnen …
- Laden …
+ Laden …
@@ -69,12 +69,12 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.
- Tile Nr.
+ Tile #
- Palette Nr.
+ Palette #
@@ -1071,7 +1071,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.
-
+ Paletten-Voreinstellung
@@ -4252,7 +4252,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.
- Lesegerät-Kartenbild in Rohdaten umwandeln …
+ Lesegerät-Kartenbild in Rohdaten umwandeln …
@@ -5357,37 +5357,37 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.
-
+ Nur Standard-Farbpalette
-
+ SGB-Farbpalette, sofern verfügbar
-
+ GBC-Farbpalette, sofern verfügbar
-
+ SGB (bevorzugt) oder GBC-Farbpalette, sofern verfügbar
-
+ Game Boy Camera
-
+ Treiber:
-
+ Quelle:
@@ -5448,42 +5448,42 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.
-
+ Modelle
-
+ Nur GB:
-
+ SGB-kompatibel:
-
+ Nur GBC:
-
+ GBC-kompatibel:
-
+ SGB- und GBC-kompatibel:
-
+ Game Boy-Palette
-
+ Voreinstellungen:
@@ -5538,7 +5538,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.
-
+ VBA-Bug-Kompatibilität in ROM-Hacks aktivieren
diff --git a/src/platform/qt/ts/medusa-emu-es.ts b/src/platform/qt/ts/medusa-emu-es.ts
index 488ffbc1a..f9f6e5c99 100644
--- a/src/platform/qt/ts/medusa-emu-es.ts
+++ b/src/platform/qt/ts/medusa-emu-es.ts
@@ -5286,37 +5286,37 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd.
-
+ Sólo paleta de colores predeterminada
-
+ Paleta de color SGB si está disponible
-
+ Paleta de color GBC si está disponible
-
+ Paleta de colores SGB (preferida) o GBC si está disponible
-
+ Cámara Game Boy
-
+ Controlador:
-
+ Fuente:
@@ -5362,12 +5362,12 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd.
-
+ Activar modo de compatibilidad VBA en ROM hacks
-
+ Ajustes:
@@ -5662,37 +5662,37 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd.
-
+ Modelos
-
+ Sólo GB:
-
+ Compatible con SGB:
-
+ Sólo GBC:
-
+ Compatible con GBC:
-
+ Compatible con SGB y GBC:
-
+ Paleta de Game Boy
diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts
index 49cd3575a..fbc94e550 100644
--- a/src/platform/qt/ts/mgba-fr.ts
+++ b/src/platform/qt/ts/mgba-fr.ts
@@ -1047,12 +1047,12 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Couleurs du Sprite nº 1
+ Couleurs du Sprite nº 1
- Couleurs du Sprite nº 2
+ Couleurs du Sprite nº 2
@@ -1184,7 +1184,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- 2021
+ 2021
@@ -1446,17 +1446,17 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Mode 0 : 4 couches de tuile
+ Mode 0 : 4 couches de tuile
- Mode 1 : 2 couches de tuiles + 1 couche de tuiles pivotée / mise à l'échelle
+ Mode 1 : 2 couches de tuiles + 1 couche de tuiles pivotée / mise à l'échelle
- Mode 2 : 2 couches de tuiles pivotées / mises à l'échelle
+ Mode 2 : 2 couches de tuiles pivotées / mises à l'échelle
@@ -1501,22 +1501,22 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Activer l'arrière-plan nº 0
+ Activer l'arrière-plan nº 0
- Activer l'arrière-plan nº 1
+ Activer l'arrière-plan nº 1
- Activer l'arrière-plan nº 2
+ Activer l'arrière-plan nº 2
- Activer l'arrière-plan nº 3
+ Activer l'arrière-plan nº 3
@@ -1526,12 +1526,12 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Activer la fenêtre nº 0
+ Activer la fenêtre nº 0
- Actvier la fenêtre nº 1
+ Actvier la fenêtre nº 1
@@ -1728,82 +1728,82 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- La fenêtre nº 0 active l'arrière plan nº 0
+ La fenêtre nº 0 active l'arrière plan nº 0
- La fenêtre nº 0 active l'arrière plan nº 1
+ La fenêtre nº 0 active l'arrière plan nº 1
- La fenêtre nº 0 active l'arrière plan nº 2
+ La fenêtre nº 0 active l'arrière plan nº 2
- La fenêtre nº 0 active l'arrière plan nº 3
+ La fenêtre nº 0 active l'arrière plan nº 3
- La fenêtre nº 0 active l'OBJ
+ La fenêtre nº 0 active l'OBJ
- La fenêtre nº 0 active le mixage
+ La fenêtre nº 0 active le mixage
- La fenêtre nº 1 active l'arrière plan nº 0
+ La fenêtre nº 1 active l'arrière plan nº 0
- La fenêtre nº 1 active l'arrière plan nº 1
+ La fenêtre nº 1 active l'arrière plan nº 1
- La fenêtre nº 1 active l'arrière plan nº 2
+ La fenêtre nº 1 active l'arrière plan nº 2
- La fenêtre nº 1 active l'arrière plan nº 3
+ La fenêtre nº 1 active l'arrière plan nº 3
- La fenêtre nº 1 active l'OBJ
+ La fenêtre nº 1 active l'OBJ
- La fenêtre nº 1 active le mixage
+ La fenêtre nº 1 active le mixage
- La fenêtre extérieure active l'arrière plan nº 0
+ La fenêtre extérieure active l'arrière plan nº 0
- La fenêtre extérieure active l'arrière plan nº 1
+ La fenêtre extérieure active l'arrière plan nº 1
- La fenêtre extérieure active l'arrière plan nº 2
+ La fenêtre extérieure active l'arrière plan nº 2
- La fenêtre extérieure active l'arrière plan nº 3
+ La fenêtre extérieure active l'arrière plan nº 3
@@ -1981,7 +1981,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Durée de balayage (en 1/128 s)
+ Durée de balayage (en 1/128 s)
@@ -2090,28 +2090,28 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- 0 %
+ 0 %
- 100 %
+ 100 %
- 50 %
+ 50 %
- 25 %
+ 25 %
@@ -2119,7 +2119,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- 75 %
+ 75 %
@@ -2944,17 +2944,17 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- 4,19 MHz
+ 4,19 MHz
- 8,38 MHz
+ 8,38 MHz
- 16,78 MHz
+ 16,78 MHz
@@ -3407,7 +3407,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- [%1] %2 : %3
+ [%1] %2 : %3
@@ -4836,7 +4836,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Nom du jeu :
+ Nom du jeu :
@@ -5271,7 +5271,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- IPS ciblée :
+ IPS ciblée :
@@ -5727,7 +5727,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Couleurs par défaut de la sprite nº 1 :
+ Couleurs par défaut de la sprite nº 1 :
@@ -5737,17 +5737,17 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.
- Modèle Game Boy uniquement :
+ Modèle Game Boy uniquement :
- Modèle Game Boy uniquement :
+ Modèle Game Boy uniquement :
- Modèle Game Boy / Game Boy Color :
+ Modèle Game Boy / Game Boy Color :
diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts
index 1c00f6165..dcf59662c 100644
--- a/src/platform/qt/ts/mgba-hu.ts
+++ b/src/platform/qt/ts/mgba-hu.ts
@@ -6,33 +6,34 @@
-
+ Névjegy
-
+ <a href="http://mgba.io/">Weboldal</a> • <a href="https://forums.mgba.io/">Fórumok / Támogatás</a> • <a href="https://patreon.com/mgba">Adományozás</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Forráskód</a>
-
+ Git-ág: <tt>{gitBranch}</tt><br/>Revízió: <tt>{gitCommit}</tt>
-
+ Az {projectName} szeretne köszönetet nyilvánítani a következő Patreon-támogatóknak:
-
+ © 2013 – {year} Jeffrey Pfau, a Mozilla Public License 2.0 alatt licencelve
+A Game Boy Advance a Nintendo Co., Ltd. bejegyzett védjegye
-
+ A {projectName} egy nyílt forráskódú Game Boy Advance emulátor
@@ -40,12 +41,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Archívum megnyitása...
-
+ Betöltés...
@@ -58,27 +59,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Paletta #
-
+ Cím
-
+ Piros
-
+ Zöld
-
+ Kék
@@ -164,37 +165,37 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Csalások
-
+ Eltávolítás
-
+ Mentés
-
+ Betöltés
-
+ Új kollekció hozzáadása
-
+ Hozzáadás
-
+ Írd ide a kódokat...
@@ -202,17 +203,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Hibakereső
-
+ Parancsbevitel (több információ: `help`)
-
+ Törés
@@ -220,37 +221,37 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Csatlakozás Dolphin emulátorhoz
-
+ Helyi számítógép
-
+ IP-cím
-
+ Csatlakozás
-
+ Kapcsolat bontása
-
+ Bezárás
-
+ Emuláció újraindítása csatlakozáskor
@@ -258,37 +259,37 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Képkocka vizsgáló
-
+ Nagyítás
-
+ Képkocka befagyasztása
-
+ Háttérszín
-
+ Pásztázó/Scanline-effektusok letiltása
-
+ Exportálás
-
+ Visszaállítás
@@ -296,47 +297,47 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ GIF/WebP/APNG felvétel készítése
-
+ Újrajátszás
-
+ Indít
-
+ Leállít
-
+ Fájl kiválasztása
-
+ APNG
-
+ GIF
-
+ WebP
-
+ Képkockák kihagyása
@@ -344,7 +345,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ I/O-vizsgáló
@@ -462,62 +463,62 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Naplók
-
+ Engedélyezett szintek
-
+ Debug
-
+ Csonk (Stub)
-
+ Infó
-
+ Figyelmeztetés (Warning)
-
+ Hiba
-
+ Végzetes hiba
-
+ Játékbeli hiba
-
+ Haladó beállítások
-
+ Napló törlése
-
+ Sorok maximális száma
@@ -530,17 +531,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Nagyítás
-
+ Exportálás
-
+ Másolás
@@ -548,17 +549,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Memóriarégió mentése
-
+ Kezdőcím:
-
+ Bájtok száma:
@@ -571,149 +572,149 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Keresés memóriában
-
+ Cím
-
+ Jelenlegi érték
-
+ Típus
-
+ Érték
-
+ Numerikus
-
+ Szöveg
-
+ Szélesség
-
+ Sejtés alapján
-
+ 1 Bájt (8-bites)
-
+ 2 Bájt (16-bites)
-
+ 4 Bájt (32-bites)
-
+ Számérték típusa
-
+ Decimális
-
+ Hexadecimális
-
+ Keresés típusa
-
+ Értékkel megegyező
-
+ Értéknél nagyobb
-
+ Értéknél kisebb
-
+ Ismeretlen/megváltozott
-
+ Értéknyivel megváltozott
-
+ Változatlan
-
+ Növekedett
-
+ Lecsökkent
-
+ Keresés ROM-ban
-
+ Új keresés
-
+ Keresés a jelenlegi listában
-
+ Megnyitás a memórianézegetőben
-
+ Frissítés
@@ -721,77 +722,77 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Memória
-
+ Cím vizsgálata:
-
+ Igazítás beállítása:
-
+ &1 bájt
-
+ &2 bájt
-
+ &4 bájt
-
+ Előjel nélküli egészként:
-
+ Előjeles egészként:
-
+ Szövegként:
-
+ TBL betöltése
-
+ Kiválasztott régió másolása
-
+ Beillesztés
-
+ Kiválasztott régió mentése
-
+ Régió mentése
-
+ Betöltés
@@ -799,82 +800,82 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Sprite-ok
-
+ Cím
-
+ Másolás
-
+ Nagyítás
-
+ Geometria
-
+ Pozíció
-
+ ,
-
+ Méretek
-
+ ×
-
+ Mátrix
-
+ Exportálás
-
+ Attribútumok
-
+ Transzformáció
-
+ Ki
-
+ Paletta
-
+ Kétszeres méret
@@ -887,49 +888,49 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Megfordítás
Short for horizontal
-
+ V
Short for vertical
-
+ F
-
+ Mód
-
+ Normál
-
+ Mozaik
-
+ Engedélyezve
-
+ Prioritás
-
+ Mező
@@ -937,12 +938,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Játékbeli felülbírálások
-
+ Game Boy Advance
@@ -950,112 +951,112 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Automatikus észlelés
-
+ Valósidejű óra
-
+ Giroszkóp
-
+ Dőlésérzékelő
-
+ Fényérzékelő
-
+ Rezgés
-
+ Mentés típusa
-
+ Nincs
-
+ SRAM
-
+ Flash 512kb
-
+ Flash 1Mb
-
+ EEPROM
-
+ Üresjárati ciklus
-
+ Game Boy Player funkciók
-
+ VBA bug kompatibilitási mód
-
+ Game Boy
-
+ Game Boy modell
-
+ Memória bank vezérlő (MBC)
-
+ Háttérszínek
-
+ Sprite-színek 1
-
+ Sprite-színek 2
-
+ Paletta preset
@@ -1063,62 +1064,62 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Paletta
-
+ Háttér
-
+ Objektumok
-
+ Kiválasztás
-
+ Piros
-
+ Zöld
-
+ Kék
-
+ 16-bites érték
-
+ Hex kód
-
+ Paletta index
-
+ Háttérpaletta exportálása
-
+ Objektumpaletta exportálása
@@ -1126,27 +1127,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Elhelyezés igazítása
-
+ Mind
-
+ Eltolás
-
+ X
-
+ Y
@@ -1154,27 +1155,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Game Boy Printer
-
+ Siess!
-
+ Leszakítás
-
+ Nagyítás
-
+ Másolás
@@ -1182,7 +1183,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ 2021
@@ -1190,14 +1191,14 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ %0%1%2
-
+ 0x%0 (%1)
@@ -1205,12 +1206,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ (névtelen)
-
+ Nem sikerült a csalásfájl megnyitása: %1
@@ -1219,28 +1220,28 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ GameShark kód hozzáadása
-
+ Pro Action Replay kód hozzáadása
-
+ CodeBreaker kód hozzáadása
-
+ GameGenie kód hozzáadása
-
+ Csalásfájl kiválasztása
@@ -1248,27 +1249,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Nem sikerült a mentésfájl megnyitása: %1
-
+ Nem sikerült a játékfájl megnyitása: %1
-
+ A játékkazettát nem lehet kirántani ismeretlen platformon!
-
+ A pillanatkép fájljának olvasásra való megnyitása sikertelen: %1
-
+ A pillanatkép fájljának írásra való megnyitása sikertelen: %1
@@ -1276,17 +1277,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Nem sikerült a játékfájl megnyitása: %1
-
+ A játék betöltése nem sikerült. Biztos vagy benne, hogy a megfelelő formátumú?
-
+ Nem sikerült a mentésfájl megnyitása. Írható a mentést tartalmazó könyvtár?
@@ -1294,52 +1295,52 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Képkocka exportálása
-
+ Portable Network Graphics (*.png)
-
+ Nincs
-
+ Háttér
-
+ Ablak
-
+ Objektumablak
-
+ Sprite
-
+ Háttérréteg
-
+ Képkocka
-
+ %1 %2
@@ -1347,7 +1348,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Discord Rich Presence engedélyezése
@@ -1355,22 +1356,22 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Gombhozzárendelés törlése
-
+ Analóg hozzárendelések törlése
-
+ Frissítés
-
+ Mind beállítása
@@ -1378,32 +1379,32 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Szerverbeállítások
-
+ Helyi port
-
+ Cím hozzárendelése
-
+ Törés
-
+ Leállítás
-
+ Indítás
@@ -1413,7 +1414,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ A GDB szerver elindítása nem sikerült
@@ -1421,17 +1422,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Nem sikerült a kimeneti fájl megnyitása: %1
-
+ Kimeneti fájl kiválasztása
-
+ Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng)
@@ -1439,42 +1440,42 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd.
-
+ Háttérrajzolási mód
-
+ Mód 0: 4 db mezőréteg
-
+ Mód 1: 2 db mezőréteg + 1 db forgatott/skálázott mezőréteg
-
+ Mód 2: 2 db forgatott/skálázott mezőréteg
-
+ Mód 3: Teljes 15-bites bitmap
-
+ Mód 4: Teljes 8-bites bitmap
-
+ Mód 5: Kis 15-bites bitmap
-
+ CGB mód
diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts
new file mode 100644
index 000000000..2d1834779
--- /dev/null
+++ b/src/platform/qt/ts/mgba-ms.ts
@@ -0,0 +1,6027 @@
+
+
+
+
+ AboutScreen
+
+
+
+ Perihal
+
+
+
+
+ <a href="http://mgba.io/">Laman Web</a> • <a href="https://forums.mgba.io/">Forum / Bantuan</a> • <a href="https://patreon.com/mgba">Derma</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Kod Sumber</a>
+
+
+
+
+
+
+
+
+
+ {projectName} ingin mengucapkan terima kasih kepada para penaung dari Patreon:
+
+
+
+
+
+
+
+
+
+ {projectName} adalah sebuah pelagak Game Boy Advance sumber terbuka
+
+
+
+ ArchiveInspector
+
+
+
+ Buka dalam arkib...
+
+
+
+
+ Memuatkan...
+
+
+
+ AssetTile
+
+
+
+ Jubin #
+
+
+
+
+ Palet #
+
+
+
+
+ Alamat
+
+
+
+
+ Merah
+
+
+
+
+ Hijau
+
+
+
+
+ Biru
+
+
+
+ BattleChipView
+
+
+
+ BattleChip Gate
+
+
+
+
+ Nama Chip
+
+
+
+
+ Memasukkan
+
+
+
+
+ Simpan
+
+
+
+
+ Muat
+
+
+
+
+ Tambah
+
+
+
+
+ Buang
+
+
+
+
+ Jenis Gate
+
+
+
+
+ Ba&ttleChip Gate
+
+
+
+
+ Progress &Gate
+
+
+
+
+ Beast &Link Gate
+
+
+
+
+ Dimasukkan
+
+
+
+
+
+
+
+
+
+ Kemaskini data Chip
+
+
+
+
+ Lanjutan
+
+
+
+ CheatsView
+
+
+
+ Tipuan
+
+
+
+
+ Buang
+
+
+
+
+ Simpan
+
+
+
+
+ Muat
+
+
+
+
+ Tambah Set Baru
+
+
+
+
+ Tambah
+
+
+
+
+ Masuk kod di sini...
+
+
+
+ DebuggerConsole
+
+
+
+ Penyahpepijat
+
+
+
+
+ Masuk perintah (cuba `help` untuk maklumat lanjut)
+
+
+
+
+
+
+
+
+ DolphinConnector
+
+
+
+ Sambung ke Dolphin
+
+
+
+
+ Komputer lokal
+
+
+
+
+ Alamat IP
+
+
+
+
+ Sambung
+
+
+
+
+ Putus
+
+
+
+
+ Tutup
+
+
+
+
+ Tetap semula pada sambungan
+
+
+
+ FrameView
+
+
+
+ Periksa bingkai
+
+
+
+
+ Pembesaran
+
+
+
+
+ Bingkai beku
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Eksport
+
+
+
+
+ Tetap semula
+
+
+
+ GIFView
+
+
+
+ Rakam GIF/WebP/APNG
+
+
+
+
+ Gelung
+
+
+
+
+ Mula
+
+
+
+
+ Henti
+
+
+
+
+ Pilih Fail
+
+
+
+
+ APNG
+
+
+
+
+ GIF
+
+
+
+
+ WebP
+
+
+
+
+ Langkauan bingkai
+
+
+
+ IOViewer
+
+
+
+ Pelihat I/O
+
+
+
+
+ 0x0000
+
+
+
+
+ B
+
+
+
+ LibraryTree
+
+
+
+ Nama
+
+
+
+
+ Lokasi
+
+
+
+
+ Platform
+
+
+
+
+ Saiz
+
+
+
+
+ CRC32
+
+
+
+ LoadSaveState
+
+
+
+
+ Keadaan %1
+
+
+
+
+
+
+
+
+
+
+
+
+ Tiada Simpanan
+
+
+
+
+ 5
+
+
+
+
+ 6
+
+
+
+
+ 8
+
+
+
+
+ 4
+
+
+
+
+ 1
+
+
+
+
+ 3
+
+
+
+
+ 7
+
+
+
+
+ 9
+
+
+
+
+ 2
+
+
+
+
+ Batal
+
+
+
+ LogView
+
+
+
+ Log
+
+
+
+
+
+
+
+
+
+ Nyahpepijat
+
+
+
+
+
+
+
+
+
+ Maklumat
+
+
+
+
+ Amaran
+
+
+
+
+ Ralat
+
+
+
+
+
+
+
+
+
+ Ralat Permainan
+
+
+
+
+ Lanjutan
+
+
+
+
+ Kosongkan
+
+
+
+
+
+
+
+
+ MapView
+
+
+
+ Peta
+
+
+
+
+ Pembesaran
+
+
+
+
+ Eksport
+
+
+
+
+ Salin
+
+
+
+ MemoryDump
+
+
+
+ Simpan Julat Ingatan
+
+
+
+
+ Alamat Permulaan:
+
+
+
+
+ Bilangan Bait:
+
+
+
+
+
+
+
+
+ MemorySearch
+
+
+
+ Cari Ingatan
+
+
+
+
+ Alamat
+
+
+
+
+ Nilai Semasa
+
+
+
+
+
+ Jenis
+
+
+
+
+ Nilai
+
+
+
+
+ Angka
+
+
+
+
+ Teks
+
+
+
+
+ Lebar
+
+
+
+
+
+ Teka
+
+
+
+
+ 1 Bait (8-bit)
+
+
+
+
+ 2 Bait (16-bit)
+
+
+
+
+ 4 Bait (32-bit)
+
+
+
+
+ Jenis Angka
+
+
+
+
+ Perpuluhan
+
+
+
+
+ Perenambelasan
+
+
+
+
+ Jenis carian
+
+
+
+
+ Sama dgn nilai
+
+
+
+
+ Lebih dari nilai
+
+
+
+
+ Kurang dari nilai
+
+
+
+
+ Tdk diketahui/terubah
+
+
+
+
+
+
+
+
+
+ Tidak diubah
+
+
+
+
+ Bertambah
+
+
+
+
+ Berkurang
+
+
+
+
+ Cari ROM
+
+
+
+
+ Carian Baru
+
+
+
+
+ Cari Dalam
+
+
+
+
+ Buka dalam Pelihat Ingatan
+
+
+
+
+ Segar Semula
+
+
+
+ MemoryView
+
+
+
+ Ingatan
+
+
+
+
+ Periksa Alamat:
+
+
+
+
+ Penjajaran:
+
+
+
+
+ &1 Bait
+
+
+
+
+ &2 Bait
+
+
+
+
+ &4 Bait
+
+
+
+
+ Integer tanpa tanda:
+
+
+
+
+ Integer tanda:
+
+
+
+
+ Rentetan:
+
+
+
+
+ Muat TBL
+
+
+
+
+ Salin Pilihan
+
+
+
+
+ Tampal
+
+
+
+
+ Simpan Pilihan
+
+
+
+
+ Simpan Julat
+
+
+
+
+ Muat
+
+
+
+ ObjView
+
+
+
+
+
+
+
+
+ Alamat
+
+
+
+
+ Salin
+
+
+
+
+ Pembesaran
+
+
+
+
+ Geometri
+
+
+
+
+ Kedudukan
+
+
+
+
+ ,
+
+
+
+
+ Matra
+
+
+
+
+ ×
+
+
+
+
+ Matriks
+
+
+
+
+ Eksport
+
+
+
+
+ Ciri-ciri
+
+
+
+
+ Jelmaan
+
+
+
+
+
+
+
+
+
+ Palet
+
+
+
+
+
+
+
+
+
+
+
+
+ Kembali, Ctrl+R
+
+
+
+
+
+
+
+
+
+ Short for horizontal
+
+
+
+
+
+ Short for vertical
+
+
+
+
+
+ Mod
+
+
+
+
+ Biasa
+
+
+
+
+ Mozek
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Jubin
+
+
+
+ OverrideView
+
+
+
+
+
+
+
+
+ Game Boy Advance
+
+
+
+
+
+
+
+ Autokesan
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PaletteView
+
+
+
+ Palet
+
+
+
+
+ Latar belakang
+
+
+
+
+ Objek
+
+
+
+
+ Pilihan
+
+
+
+
+ Merah
+
+
+
+
+ Hijau
+
+
+
+
+ Biru
+
+
+
+
+ Nilai 16-bit
+
+
+
+
+ Kod per-16-an
+
+
+
+
+ Indeks palet
+
+
+
+
+ Eksport LB
+
+
+
+
+ Eksport OBJ
+
+
+
+ PlacementControl
+
+
+
+ Melaras peletakan
+
+
+
+
+ Semua
+
+
+
+
+ Ofset
+
+
+
+
+ X
+
+
+
+
+ Y
+
+
+
+ PrinterView
+
+
+
+ Pencetak Game Boy
+
+
+
+
+ Cepat!
+
+
+
+
+
+
+
+
+
+ Pembesaran
+
+
+
+
+ Salin
+
+
+
+ QGBA::AboutScreen
+
+
+
+ 2021
+
+
+
+ QGBA::AssetTile
+
+
+
+ %0%1%2
+
+
+
+
+
+
+ 0x%0 (%1)
+
+
+
+ QGBA::CheatsModel
+
+
+
+ (tidak bertajuk)
+
+
+
+
+ Gagal membuka fail tipu: %1
+
+
+
+ QGBA::CheatsView
+
+
+
+
+ Tambah GameShark
+
+
+
+
+ Tambah Pro Action Replay
+
+
+
+
+ Tambah CodeBreaker
+
+
+
+
+ Tambah GameGenie
+
+
+
+
+
+ Pilih fail tipu
+
+
+
+ QGBA::CoreController
+
+
+
+ Gagal membuka fail tersimpan: %1
+
+
+
+
+ Gagal membuka fail permainan: %1
+
+
+
+
+
+
+
+
+
+ Gagal membuka fail snapshot untuk baca: %1
+
+
+
+
+ Gagal membuka fail snapshot untuk menulis: %1
+
+
+
+ QGBA::CoreManager
+
+
+
+ Gagal membuka fail permainan: %1
+
+
+
+
+ Gagal memuat permainan. Adakah ia dalam format betul?
+
+
+
+
+ Gagal membuka fail tersimpan. Adakah direktori simpanan diboleh-tulis?
+
+
+
+ QGBA::FrameView
+
+
+
+ Eksport bingkai
+
+
+
+
+ Grafik Rangkaian Mudah Alih (*.png)
+
+
+
+
+ Tiada
+
+
+
+
+ Latar belakang
+
+
+
+
+ Tetingkap
+
+
+
+
+ Objwin
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Bingkai
+
+
+
+
+ %1 %2
+
+
+
+ QGBA::GBAApp
+
+
+
+ Dayakan Discord Rich Presence
+
+
+
+ QGBA::GBAKeyEditor
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Segar Semula
+
+
+
+
+
+
+
+
+ QGBA::GDBWindow
+
+
+
+ Tetapan pelayan
+
+
+
+
+ Port lokal
+
+
+
+
+ Alamat terikat
+
+
+
+
+
+
+
+
+
+ Henti
+
+
+
+
+ Mula
+
+
+
+
+ Nahas
+
+
+
+
+ Tidak dapat memulakan pelayan GDB
+
+
+
+ QGBA::GIFView
+
+
+
+ Gagal membuka fail output: %1
+
+
+
+
+ Pilih fail output
+
+
+
+
+ Format Saling Tukar Grafik (*.gif);;WebP ( *.webp);;Grafik Rangkaian Animasi Mudah Alih (*.png *.apng)
+
+
+
+ QGBA::IOViewer
+
+
+
+ Mod latar belakang
+
+
+
+
+ Mod 0: 4 lapisan jubin
+
+
+
+
+ Mod 1: 2 lapisan jubin + 1 lapisan jubin terputar/terskala
+
+
+
+
+ Mod 2: 2 lapisan jubin terputar/terskala
+
+
+
+
+ Mod 3: Bitmap 15-bit penuh
+
+
+
+
+ Mod 4: Bitmap 8-bit penuh
+
+
+
+
+ Mod 5: Bitmap 15-bit kecil
+
+
+
+
+ Mod CGB
+
+
+
+
+ Pilihan Bingkai
+
+
+
+
+
+
+
+
+
+ Pemetaan jubin OBJ linear
+
+
+
+
+ Paksa skrin kosong
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::KeyEditor
+
+
+
+
+ ---
+
+
+
+
+ Super (L)
+
+
+
+
+ Super (R)
+
+
+
+
+ Menu
+
+
+
+ QGBA::LoadSaveState
+
+
+
+ Keadaan Termuat
+
+
+
+
+ Keadaan Tersimpan
+
+
+
+
+ Kosong
+
+
+
+
+ Rosak
+
+
+
+
+ Slot %1
+
+
+
+ QGBA::LogConfigModel
+
+
+
+
+ Piawai
+
+
+
+
+
+
+
+
+
+ Ralat
+
+
+
+
+ Amaran
+
+
+
+
+ Maklumat
+
+
+
+
+ Nyahpepijat
+
+
+
+
+ Kontot
+
+
+
+
+ Ralat Permainan
+
+
+
+ QGBA::LogController
+
+
+
+ [%1] %2: %3
+
+
+
+
+ Ralat dilakukan
+
+
+
+
+ NYAHPEPIJAT
+
+
+
+
+ KONTOT
+
+
+
+
+ MAKLUMAT
+
+
+
+
+ AMARAN
+
+
+
+
+ RALAT
+
+
+
+
+
+
+
+
+
+ RALAT PERMAINAN
+
+
+
+ QGBA::MapView
+
+
+
+ Keutamaan
+
+
+
+
+
+ Dasar peta
+
+
+
+
+
+ Dasar Jubin
+
+
+
+
+ Saiz
+
+
+
+
+
+ Ofset
+
+
+
+
+ Xform
+
+
+
+
+ Alamat Peta
+
+
+
+
+ Cermin
+
+
+
+
+ Tiada
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Eksport peta
+
+
+
+
+ Grafik Rangkaian Mudah Alih (*.png)
+
+
+
+ QGBA::MemoryDump
+
+
+
+ Simpan sekitar ingatan
+
+
+
+
+ Gagal membuka fail output: %1
+
+
+
+ QGBA::MemoryModel
+
+
+
+ Salin pilihan
+
+
+
+
+ Simpan pilihan
+
+
+
+
+ Tampal
+
+
+
+
+ Muat
+
+
+
+
+ Semua
+
+
+
+
+ Muat TBL
+
+
+
+
+ Simpan ingatan terpilih
+
+
+
+
+ Gagal membuka fail output: %1
+
+
+
+
+ Muat ingatan
+
+
+
+
+ Gagal membuka fail input: %1
+
+
+
+
+ TBL
+
+
+
+
+ ISO-8859-1
+
+
+
+ QGBA::MemorySearch
+
+
+
+ (%0/%1×)
+
+
+
+
+ (⅟%0×)
+
+
+
+
+ (%0×)
+
+
+
+
+ %1 bait%2
+
+
+
+ QGBA::ObjView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::OverrideView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::PaletteView
+
+
+
+ #%0
+
+
+
+
+ 0x%0
+
+
+
+
+
+
+
+ 0x%0 (%1)
+
+
+
+
+ Eksport palet
+
+
+
+
+ Windows PAL (*.pal);;Jadual Warna Adobe(*.act)
+
+
+
+
+ Gagal membuka fail palet output: %1
+
+
+
+ QGBA::ROMInfo
+
+
+
+
+
+
+
+ (tidak diketahui)
+
+
+
+
+
+ bait
+
+
+
+
+ (tiada pangkalan data hadir)
+
+
+
+ QGBA::ReportView
+
+
+
+ Arkib laporan pepijat
+
+
+
+
+ Arkib ZIP (*.zip)
+
+
+
+ QGBA::SaveConverter
+
+
+
+ Simpanan permainan dan keadaan tersimpan (%1)
+
+
+
+
+ Pilih simpanan permainan atau keadaan tersimpan
+
+
+
+
+ Simpanan permainan (%1)
+
+
+
+
+ Pilih simpanan permainan
+
+
+
+
+ Penukaran gagal
+
+
+
+
+ Gagal menukar simpanan permainan. Mungkin ini suatu pepijat.
+
+
+
+
+ Tiada pilihan
+
+
+
+
+ Tidak dapat membuka fail
+
+
+
+
+ Tiada format yang sah ditemui
+
+
+
+
+ Sila pilih fail input yang sah
+
+
+
+
+ Tiada penukaran yang sah ditemui
+
+
+
+
+ Tidak boleh menukar simpanan permainan antara platform
+
+
+
+ QGBA::SettingsView
+
+
+
+
+ Multimedia Qt
+
+
+
+
+ SDL
+
+
+
+
+ Perisian (Qt)
+
+
+
+
+ OpenGL
+
+
+
+
+ OpenGL (paksa versi 1.x)
+
+
+
+
+ Tiada (Gambar Tenang)
+
+
+
+
+ Papan Kekunci
+
+
+
+
+ Pengawal
+
+
+
+
+ Pintas
+
+
+
+
+
+
+
+
+
+
+ Pilih BIOS
+
+
+
+
+ Pilih direktori
+
+
+
+
+ (%1×%2)
+
+
+
+ QGBA::ShaderSelector
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::ShortcutModel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::TileView
+
+
+
+ Eksport jubin
+
+
+
+
+
+ Grafik Rangkaian Mudah Alih (*.png)
+
+
+
+
+ Eksport jubin
+
+
+
+ QGBA::VideoView
+
+
+
+ Gagal membuka fail video output: %1
+
+
+
+
+ Asal (%0x%1)
+
+
+
+
+ Pilih fail output
+
+
+
+ QGBA::Window
+
+
+
+ ROM Game Boy Advance (%1)
+
+
+
+
+ ROM Game Boy (%1)
+
+
+
+
+ Semua ROM (%1)
+
+
+
+
+ %1 Log Video (*.mvl)
+
+
+
+
+ Arkib (%1)
+
+
+
+
+
+
+ Pilih ROM
+
+
+
+
+ Pilih folder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pilih gambar
+
+
+
+
+ Fail gambar (*.png *.gif *.jpg *.jpeg);;Semua fail (*)
+
+
+
+
+
+ Simpanan GameShark (*.sps *.xps)
+
+
+
+
+ Pilih log video
+
+
+
+
+ Log video (*.mvl)
+
+
+
+
+ Nahas
+
+
+
+
+ Permainan menjemput nahas dengan ralat berikut:
+
+%1
+
+
+
+
+ Tidak dapat memula
+
+
+
+
+ Permainan tidak dapat bermula.
+
+
+
+
+ Panggilan BIOS yg belum dilaksanakan
+
+
+
+
+ Permainan ini menggunakan panggilan BIOS yang belum dilaksanakan. Sila pakai BIOS rasmi untuk pengalaman yang lebih baik.
+
+
+
+
+ Gagal mencipta peranti paparan yang sesuai, berbalik ke paparan perisian. Permainan mungkin menjadi lembap, terutamanya dengan tetingkap besar.
+
+
+
+
+ Betulkah mahu buat jadi mudah alih?
+
+
+
+
+ Ini akan menetapkan pelagak untuk muat konfigurasi dari direktori yang sama dengan fail bolehlakunya. Teruskan?
+
+
+
+
+ Mula semula diperlukan
+
+
+
+
+ Beberapa perubahan tidak akan dilaksanakan sehingga pelagak dimula semula.
+
+
+
+
+ - Pemain %1 dari %2
+
+
+
+
+ %1 - %2
+
+
+
+
+ %1 - %2 - %3
+
+
+
+
+ %1 - %2 (%3 fps) - %4
+
+
+
+
+ &File
+
+
+
+
+ Muat %ROM...
+
+
+
+
+ Muat ROM daripada arkib...
+
+
+
+
+ Tambah folder ke perpustakaan...
+
+
+
+
+ Simpanan permainan (%1)
+
+
+
+
+ Pilih simpanan permainan
+
+
+
+
+ mGBA fail keadaan tersimpan (%1)
+
+
+
+
+
+ Pilih keadaan tersimpan
+
+
+
+
+
+
+
+
+
+ Fail gambar (*.png *.jpg *.jpeg)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Muat simpanan permainan alternatif...
+
+
+
+
+ Muat simpanan permainan sementara...
+
+
+
+
+
+
+
+
+
+ But BIOS
+
+
+
+
+ Ganti ROM...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ &Perihal ROM...
+
+
+
+
+ Terkini
+
+
+
+
+ Buat jadi mudah alih
+
+
+
+
+ &Muat keadaan
+
+
+
+
+ Muat fail keadaan...
+
+
+
+
+ &Simpan keadaan
+
+
+
+
+ Simpan fail keadaan...
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Muat terkini
+
+
+
+
+ Simpan terkini
+
+
+
+
+ Buat asal keadaan termuat
+
+
+
+
+ Buat asal keadaan tersimpan
+
+
+
+
+
+ Keadaan &%1
+
+
+
+
+ Muat gambar kamera...
+
+
+
+
+ Tukar simpanan permainan...
+
+
+
+
+ Import Simpanan GameShark...
+
+
+
+
+ Eksport Simpanan GameShark...
+
+
+
+
+ Tetingkap multipemain baru
+
+
+
+
+ Sambung ke Dolphin...
+
+
+
+
+ Laporkan pepijat...
+
+
+
+
+ Perihal...
+
+
+
+
+ &Keluar
+
+
+
+
+ Pe&lagak
+
+
+
+
+
+
+
+
+
+ &Matikan
+
+
+
+
+ Alih keluar Game Pak
+
+
+
+
+ &Jeda
+
+
+
+
+ Bingkai se&terusnya
+
+
+
+
+ Mundar laju (pegang)
+
+
+
+
+ Mundar &laju
+
+
+
+
+ Kelajuan mundar laju
+
+
+
+
+ Tidak terbatas
+
+
+
+
+ %0x
+
+
+
+
+ Putar balik (pegang)
+
+
+
+
+ Ma&ndir
+
+
+
+
+ Langkah belakang
+
+
+
+
+ Segerak ke &video
+
+
+
+
+ Segerak ke &audio
+
+
+
+
+ Pengesan suria
+
+
+
+
+ Meningkatkan aras suria
+
+
+
+
+ Mengurangkan aras suria
+
+
+
+
+ Aras suria paling terang
+
+
+
+
+ Aras suria paling gelap
+
+
+
+
+ Kecerahan %1
+
+
+
+
+ Pencetak Game Boy...
+
+
+
+
+ BattleChip Gate...
+
+
+
+
+ Audio/&Video
+
+
+
+
+ Saiz bingkai
+
+
+
+
+ %1×
+
+
+
+
+ Togol skrinpenuh
+
+
+
+
+ Kekalkan nisbah aspek
+
+
+
+
+ Paksa skala integer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Langkauan &bingkai
+
+
+
+
+ Senyap
+
+
+
+
+ Sasaran FPS
+
+
+
+
+ Asal (59.7275)
+
+
+
+
+ Ambil &cekupan skrin
+
+
+
+
+ F12
+
+
+
+
+ Rakam A/V...
+
+
+
+
+ Rakam GIF/WebP/APNG...
+
+
+
+
+ Lapisan video
+
+
+
+
+ Saluran audio
+
+
+
+
+ Melaras peletakan lapisan...
+
+
+
+
+ &Alat
+
+
+
+
+ Lihat &log...
+
+
+
+
+
+
+
+
+
+ Pengesan Game Pak...
+
+
+
+
+ &Tipu...
+
+
+
+
+ Tetapan...
+
+
+
+
+ Buka konsol penyahpepijat...
+
+
+
+
+ Mula pelayan &GDB...
+
+
+
+
+ Pelihat &palet...
+
+
+
+
+
+
+
+
+
+ Pelihat &jubin...
+
+
+
+
+ Pelihat pe&ta...
+
+
+
+
+ Periksa &bingkai...
+
+
+
+
+ Lihat ingatan...
+
+
+
+
+ Cari ingatan...
+
+
+
+
+ Lihat daftar &I/O...
+
+
+
+
+ Rakam log video nyahpepijat...
+
+
+
+
+ Henti log video nyahpepijat
+
+
+
+
+ Keluar skrinpenuh
+
+
+
+
+ Butang GameShark (pegang)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kosongkan
+
+
+
+ QObject
+
+
+
+ %1 bait
+
+
+
+
+ %1 kiB
+
+
+
+
+ %1 MiB
+
+
+
+
+ GBA
+
+
+
+
+ GB
+
+
+
+
+ ?
+
+
+
+ QShortcut
+
+
+
+ Shift
+
+
+
+
+ Ctrl
+
+
+
+
+ Alt
+
+
+
+
+ Meta
+
+
+
+ ROMInfo
+
+
+
+ Perihal ROM
+
+
+
+
+ Nama permainan:
+
+
+
+
+ {NAME}
+
+
+
+
+ Nama dalaman:
+
+
+
+
+ {TITLE}
+
+
+
+
+ ID Permainan:
+
+
+
+
+ {ID}
+
+
+
+
+ Saiz fail:
+
+
+
+
+ {SIZE}
+
+
+
+
+ CRC32:
+
+
+
+
+ {CRC}
+
+
+
+ ReportView
+
+
+
+ Menjanakan Laporan Pepijat
+
+
+
+
+ <html><head/><body><p>Untuk membuat laporan pepijat, janakan fail laporan dan lampirkannya pada laporan anda. Adalah disyorkan untuk sertakan fail simpanan, kerana ini kerap membantu dalam persoalan penyahpepijatan. Penjanaan ini akan mengumpul maklumat tentang versi {projectName}, konfigurasi, komputer, dan permainan yang sedang terbuka. Setelah pengumpulan sudah siap, anda boleh memeriksa semua maklumat yang dikumpul dan simpankannya dalam fail zip. Proses kumpulan ini akan mencuba secara automatik untuk menghapuskan semua maklumat peribadi, contohnya nama pengguna (kalau ada di laluan direktori), tetapi anda masih boleh menyunting selepas itu. Seterusnya, sila klik butang di bawah atau pergi ke <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> untuk membuat laporan pepijat di GitHub. Pastikan anda melampirkan laporan yang telah dijana!</p></body></html>
+
+
+
+
+ Menjanakan laporan
+
+
+
+
+ Simpan
+
+
+
+
+ Buka senarai persoalan dalam pelayar
+
+
+
+
+ Sertakan fail simpanan
+
+
+
+
+ Cipta dan sertakan keadaan tersimpan
+
+
+
+ SaveConverter
+
+
+
+ Tukar/Ekstrak Simpanan Permainan
+
+
+
+
+ Fail input
+
+
+
+
+
+ Pilih fail
+
+
+
+
+ Fail output
+
+
+
+
+ Simpanan permainan %1 %2
+
+
+
+
+ little-endian
+
+
+
+
+ big-endian
+
+
+
+
+ SRAM
+
+
+
+
+ %1 kilat
+
+
+
+
+ %1 EEPROM
+
+
+
+
+ %1 SRAM + RTC
+
+
+
+
+ %1 SRAM
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kilat MBC6
+
+
+
+
+ MBC6 bergabung SRAM + kilat
+
+
+
+
+ SRAM MBC6
+
+
+
+
+ TAMA5
+
+
+
+
+ %1 (%2)
+
+
+
+
+ Keadaan tersimpan %1 dgn simpanan permainan terbenam %2
+
+
+
+ SensorView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SettingsView
+
+
+
+ Tetapan
+
+
+
+
+ Audio/Video
+
+
+
+
+ Antara muka
+
+
+
+
+ Pelagakan
+
+
+
+
+ Penambahan
+
+
+
+
+ BIOS
+
+
+
+
+ Laluan
+
+
+
+
+ Log
+
+
+
+
+ Game Boy
+
+
+
+
+ Pemacu audio:
+
+
+
+
+ Penimbal audio:
+
+
+
+
+
+ 1536
+
+
+
+
+ 512
+
+
+
+
+ 768
+
+
+
+
+ 1024
+
+
+
+
+ 2048
+
+
+
+
+ 3072
+
+
+
+
+ 4096
+
+
+
+
+ sampel
+
+
+
+
+ Kadar sampel:
+
+
+
+
+
+ 44100
+
+
+
+
+ 22050
+
+
+
+
+ 32000
+
+
+
+
+ 48000
+
+
+
+
+ Hz
+
+
+
+
+ Isipadu:
+
+
+
+
+
+ Senyap
+
+
+
+
+ Isipadu mundar laju:
+
+
+
+
+ Pemacu paparan:
+
+
+
+
+ Langkauan bingkai:
+
+
+
+
+ Langkau setiap
+
+
+
+
+
+ bingkai
+
+
+
+
+ Sasaran FPS:
+
+
+
+
+ bingkai per saat
+
+
+
+
+ Segerak:
+
+
+
+
+ Video
+
+
+
+
+ Audio
+
+
+
+
+ Kekalkan nisbah aspek
+
+
+
+
+ Paksa skala integer
+
+
+
+
+ Penapisan bilinear
+
+
+
+
+ Palet warna piawai sahaja
+
+
+
+
+ Palet warna SGB jika ada
+
+
+
+
+ Palet warna GBC jika ada
+
+
+
+
+ SGB (pilihan utama) atau palet warna GBC jika ada
+
+
+
+
+ Game Boy Camera
+
+
+
+
+ Pemacu:
+
+
+
+
+ Sumber:
+
+
+
+
+ Asal (59.7275)
+
+
+
+
+ Persebatian antarabingkai
+
+
+
+
+ Bahasa
+
+
+
+
+ Inggeris
+
+
+
+
+ Perpustakaan:
+
+
+
+
+ Pandangan senarai
+
+
+
+
+ Pandangan pohon
+
+
+
+
+ Tunjuk semasa tiada permainan dibuka
+
+
+
+
+ Kosongkan cache
+
+
+
+
+ Izin tekan arah-arah input yang berlawan sekaligus
+
+
+
+
+ Gantung screensaver
+
+
+
+
+ Jeda bila tidak aktif
+
+
+
+
+ Jeda bila diminimumkan
+
+
+
+
+ Kemaskini tajuk tetingkap secara dinamik
+
+
+
+
+ Tunjuk nama ROM dan bukan nama fail dalam bar tajuk
+
+
+
+
+ Tunjuk mesej OSD
+
+
+
+
+ Dayakan Discord Rich Presence
+
+
+
+
+ Simpan keadaan secara automatik
+
+
+
+
+ Muat keadaan secara automatik
+
+
+
+
+ Simpan tipuan secara automatik
+
+
+
+
+ Muat tipuan secara automatik
+
+
+
+
+ Tunjuk FPS dalam bar tajuk
+
+
+
+
+ Kelajuan mundar laju:
+
+
+
+
+
+ Tidak terbatas
+
+
+
+
+ Kelajuan mundar laju (pegang):
+
+
+
+
+
+
+
+
+
+ Dayakan putar balik
+
+
+
+
+ Sejarah putar balik:
+
+
+
+
+
+
+
+
+
+ Jalan semua
+
+
+
+
+ Buang yg diketahui
+
+
+
+
+ Kesan dan buang
+
+
+
+
+ Pra-muat selurus ROM ke dalam ingatan
+
+
+
+
+ Data ekstra keadaan tersimpan:
+
+
+
+
+
+ Simpanan permainan
+
+
+
+
+ Data ekstra keadaan muat:
+
+
+
+
+ Model
+
+
+
+
+ GB sahaja:
+
+
+
+
+ SGB serasi:
+
+
+
+
+ GBC sahaja:
+
+
+
+
+ GBC serasi:
+
+
+
+
+ SGB dan GBC serasi:
+
+
+
+
+ Palet Game Boy
+
+
+
+
+ Praset:
+
+
+
+
+
+ Cekupan skrin
+
+
+
+
+
+ Kod tipu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Perisian
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ (240×160)
+
+
+
+
+
+
+
+
+
+ Fail BIOS GB:
+
+
+
+
+
+
+
+
+
+
+
+
+ Pilih fail
+
+
+
+
+ Guna fail BIOS jika ada
+
+
+
+
+ Langkau pendahuluan BIOS
+
+
+
+
+ Fail BIOS GBA:
+
+
+
+
+ Fail BIOS GBC:
+
+
+
+
+ Fail BIOS SGB:
+
+
+
+
+ Simpanan permainan
+
+
+
+
+
+
+
+
+ Direktori sama dengan ROM
+
+
+
+
+ Keadaan tersimpan
+
+
+
+
+ Cekupan skrin
+
+
+
+
+
+
+
+
+
+ Tipuan
+
+
+
+
+ Log dalam fail
+
+
+
+
+ Log dalam konsol
+
+
+
+
+ Pilih fail log
+
+
+
+
+ Warna LB piawai:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ShaderSelector
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nama
+
+
+
+
+ Pencipta
+
+
+
+
+ Huraian
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ShortcutView
+
+
+
+ Sunting pintasan
+
+
+
+
+ Papan kekunci
+
+
+
+
+
+
+
+
+
+ Kosongkan
+
+
+
+ TileView
+
+
+
+ Jubin
+
+
+
+
+ Eksport yg dipilih
+
+
+
+
+ Eksport Semua
+
+
+
+
+ 256 warna
+
+
+
+
+ Pembesaran
+
+
+
+
+ Jubin per baris
+
+
+
+
+
+
+
+
+
+ Salin yg dipilih
+
+
+
+
+ Salin Semua
+
+
+
+ VideoView
+
+
+
+ Rakam Video
+
+
+
+
+ Mula
+
+
+
+
+ Henti
+
+
+
+
+ Pilih Fail
+
+
+
+
+ Praset
+
+
+
+
+ &Kualiti Tinggi
+
+
+
+
+ &YouTube
+
+
+
+
+
+ WebM
+
+
+
+
+
+ MP4
+
+
+
+
+
+
+
+
+
+ 4K
+
+
+
+
+ &1080p
+
+
+
+
+ &720p
+
+
+
+
+ &480p
+
+
+
+
+ &Asal
+
+
+
+
+ Format
+
+
+
+
+ MKV
+
+
+
+
+ AVI
+
+
+
+
+ HEVC
+
+
+
+
+ HEVC (NVENC)
+
+
+
+
+ VP8
+
+
+
+
+ VP9
+
+
+
+
+ FFV1
+
+
+
+
+
+ Tiada
+
+
+
+
+ FLAC
+
+
+
+
+ Opus
+
+
+
+
+ Vorbis
+
+
+
+
+ MP3
+
+
+
+
+ AAC
+
+
+
+
+
+
+
+
+
+ Kadar bit (kbps)
+
+
+
+
+ ABR
+
+
+
+
+ H.264
+
+
+
+
+ H.264 (NVENC)
+
+
+
+
+ VBR
+
+
+
+
+ CRF
+
+
+
+
+ Matra
+
+
+
+
+ Kekalkan nisbah aspek
+
+
+
+
+ Lanjutan
+
+
+
diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts
new file mode 100644
index 000000000..fb64b8041
--- /dev/null
+++ b/src/platform/qt/ts/mgba-pl.ts
@@ -0,0 +1,6025 @@
+
+
+
+
+ AboutScreen
+
+
+
+ O aplikacji
+
+
+
+
+ <a href="http://mgba.io/">Strona WWW</a> • <a href="https://forums.mgba.io/">Forum / Pomoc</a> • <a href="https://patreon.com/mgba">Wesprzyj</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Kod źródłowy</a>
+
+
+
+
+ Gałąź git: <tt>{gitBranch}</tt><br/>Rewizja: <tt>{gitCommit}</tt>
+
+
+
+
+ {projectName} pragnie podziękować następującym patronom z Patreon:
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ArchiveInspector
+
+
+
+ Otwórz w archiwum…
+
+
+
+
+ Ładowanie…
+
+
+
+ AssetTile
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adres
+
+
+
+
+ Czerwony
+
+
+
+
+ Zielony
+
+
+
+
+ Niebieski
+
+
+
+ BattleChipView
+
+
+
+ BattleChip Gate
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zapisz
+
+
+
+
+ Wgraj
+
+
+
+
+ Dodaj
+
+
+
+
+ Usuń
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID chipu
+
+
+
+
+ Zaktualizuj dane chipu
+
+
+
+
+ Pokaż zaawansowane opcje
+
+
+
+ CheatsView
+
+
+
+
+
+
+
+
+ Usuń
+
+
+
+
+ Zapisz
+
+
+
+
+ Wgraj
+
+
+
+
+ Dodaj nowy zestaw
+
+
+
+
+ Dodaj
+
+
+
+
+
+
+
+
+ DebuggerConsole
+
+
+
+ Debugger
+
+
+
+
+ Podaj komendę (by uzyskać więcej informacji, podaj `help`)
+
+
+
+
+ Przerwij
+
+
+
+ DolphinConnector
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Adres IP
+
+
+
+
+ Połącz
+
+
+
+
+ Rozłącz
+
+
+
+
+ Zamknij
+
+
+
+
+
+
+
+
+ FrameView
+
+
+
+
+
+
+
+
+ Powiększenie
+
+
+
+
+
+
+
+
+
+ Kolor tła
+
+
+
+
+
+
+
+
+
+ Eksportuj
+
+
+
+
+ Resetuj
+
+
+
+ GIFView
+
+
+
+ Zapisz GIF/WebP/APNG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Stop
+
+
+
+
+ Wybierz plik
+
+
+
+
+ APNG
+
+
+
+
+ GIF
+
+
+
+
+ WebP
+
+
+
+
+
+
+
+
+ IOViewer
+
+
+
+
+
+
+
+
+ 0x0000
+
+
+
+
+ B
+
+
+
+ LibraryTree
+
+
+
+ Nazwa
+
+
+
+
+ Lokacja
+
+
+
+
+ Platforma
+
+
+
+
+ Rozmiar
+
+
+
+
+ CRC32
+
+
+
+ LoadSaveState
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 5
+
+
+
+
+ 6
+
+
+
+
+ 8
+
+
+
+
+ 4
+
+
+
+
+ 1
+
+
+
+
+ 3
+
+
+
+
+ 7
+
+
+
+
+ 9
+
+
+
+
+ 2
+
+
+
+
+ Anuluj
+
+
+
+ LogView
+
+
+
+ Logi
+
+
+
+
+ Aktywne poziomy logowania
+
+
+
+
+ Debug
+
+
+
+
+ Stub
+
+
+
+
+ Info
+
+
+
+
+ Ostrzeżenie
+
+
+
+
+ Błąd
+
+
+
+
+ Błąd krytyczny
+
+
+
+
+ Błąd gry
+
+
+
+
+ Ustawienia zaawansowane
+
+
+
+
+ Wyczyść
+
+
+
+
+ Maks. liczba linii
+
+
+
+ MapView
+
+
+
+ Mapy
+
+
+
+
+
+
+
+
+
+ Eksportuj
+
+
+
+
+ Kopiuj
+
+
+
+ MemoryDump
+
+
+
+
+
+
+
+
+ Adres początkowy:
+
+
+
+
+ Liczba bajtów:
+
+
+
+
+
+
+
+
+ MemorySearch
+
+
+
+
+
+
+
+
+ Adres
+
+
+
+
+ Obecna wartość
+
+
+
+
+
+ Typ
+
+
+
+
+ Wartość
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Decymalny
+
+
+
+
+ Heksadecymalny
+
+
+
+
+ Wyszukaj typ
+
+
+
+
+ Wartość równa
+
+
+
+
+ Wartość większa niż
+
+
+
+
+ Wartość mniejsza niż
+
+
+
+
+ Nieznana/zmieniona
+
+
+
+
+
+
+
+
+
+ Niezmieniona
+
+
+
+
+ Zwiększona
+
+
+
+
+ Zmniejszona
+
+
+
+
+ Przeszukaj ROM
+
+
+
+
+ Nowe wyszukiwanie
+
+
+
+
+ Znajdź wewnątrz
+
+
+
+
+ Otwórz w Podglądzie Pamięci
+
+
+
+
+ Odśwież
+
+
+
+ MemoryView
+
+
+
+ Pamięć
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ &1 bajt
+
+
+
+
+ &2 bajty
+
+
+
+
+ &4 bajty
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kopiuj zaznaczenie
+
+
+
+
+ Wklej
+
+
+
+
+ Zapisz zaznaczenie
+
+
+
+
+ Zapisz zakres
+
+
+
+
+ Wgraj
+
+
+
+ ObjView
+
+
+
+
+
+
+
+
+ Adres
+
+
+
+
+ Kopiuj
+
+
+
+
+ Powiększenie
+
+
+
+
+ Geometria
+
+
+
+
+ Pozycja
+
+
+
+
+ ,
+
+
+
+
+ Wymiary
+
+
+
+
+ ×
+
+
+
+
+ Macierz
+
+
+
+
+ Eksportuj
+
+
+
+
+ Atrybuty
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Short for horizontal
+
+
+
+
+
+ Short for vertical
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ OverrideView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PaletteView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PlacementControl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PrinterView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Kopiuj
+
+
+
+ QGBA::AboutScreen
+
+
+
+ 2021
+
+
+
+ QGBA::AssetTile
+
+
+
+ %0%1%2
+
+
+
+
+
+
+ 0x%0 (%1)
+
+
+
+ QGBA::CheatsModel
+
+
+
+ (bez nazwy)
+
+
+
+
+
+
+
+
+ QGBA::CheatsView
+
+
+
+
+ Dodaj GameShark
+
+
+
+
+ Dodaj Pro Action Replay
+
+
+
+
+ Dodaj CodeBreaker
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::CoreController
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::CoreManager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::FrameView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::GBAApp
+
+
+
+
+
+
+
+ QGBA::GBAKeyEditor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::GDBWindow
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::GIFView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::IOViewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::KeyEditor
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::LoadSaveState
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::LogConfigModel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::LogController
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::MapView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::MemoryDump
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::MemoryModel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Wgraj
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::MemorySearch
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::ObjView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::OverrideView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::PaletteView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::ROMInfo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::ReportView
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::SaveConverter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::SettingsView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::ShaderSelector
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::ShortcutModel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::TileView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::VideoView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QGBA::Window
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QObject
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ QShortcut
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ROMInfo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ReportView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SaveConverter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SensorView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SettingsView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ShaderSelector
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ShortcutView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TileView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ VideoView
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts
index ed1072c86..e1325d190 100644
--- a/src/platform/qt/ts/mgba-pt_BR.ts
+++ b/src/platform/qt/ts/mgba-pt_BR.ts
@@ -1,6 +1,6 @@
-
+
AboutScreen
@@ -11,7 +11,7 @@
- <a href="http://mgba.io/">Site</a> • <a href="https://forums.mgba.io/">Fóruns / Suporte</a> • <a href="https://patreon.com/mgba">Doar</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Fonte</a>
+ <a href="http://mgba.io/">Site da Web</a> • <a href="https://forums.mgba.io/">Fóruns / Suporte</a> • <a href="https://patreon.com/mgba">Doar</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Fonte</a>
@@ -21,19 +21,19 @@
- {projectName} gostaria de agradecer aos seguintes patrões do Patreon:
+ O {projectName} gostaria de agradecer aos seguintes patronos do Patreon:
- © 2013 – {year} Jeffrey Pfau, licenciado sob a Licença Pública Mozilla, versão 2.0
+ © 2013 – {year} Jeffrey Pfau, licenciado sob a Licença Pública do Mozilla, versão 2.0
Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- {projectName} é um emulador de Game Boy Advance de Código Aberto
+ {projectName} é um emulador de Game Boy Advance de código fonte aberto
@@ -41,7 +41,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Abrir no arquivo...
+ Abrir no arquivo compactado...
@@ -54,7 +54,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Bloco #
+ Ladrilho #
@@ -117,27 +117,27 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Excluir
+ Remover
- Gate type
+ Tipo de Gate
- Ba&ttleChip Gate
+ Po&rtal do BattleChip
- Progress &Gate
+ Portal do &Progresso
- Beast &Link Gate
+ Portal do &Link da Beast
@@ -165,12 +165,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Cheats
+ Trapaças
- Excluir
+ Remover
@@ -203,12 +203,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Depurador
+ Debugger
- Digite o comando (ou `help` para mais informações)
+ Insira o comando (tente `help` pra mais informações)
@@ -259,7 +259,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Inspecionar quadro
+ Inspecionar frame
@@ -269,7 +269,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Congelar quadro
+ Congelar frame
@@ -279,7 +279,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Desativar efeitos scanline
+ Desativar efeitos de scanline
@@ -302,7 +302,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Repetir
+ Repetir animação
@@ -317,7 +317,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Selecionar arquivo
+ Selecionar Arquivo
@@ -368,7 +368,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Localização
+ Local
@@ -405,7 +405,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Não salvar
+ Nenhum Save
@@ -468,12 +468,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Níveis Habilitados
+ Níveis Ativados
- Depurar
+ Debug
@@ -559,12 +559,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Número de bytes:
+ Quantidade de Bytes:
- Salvar múltiplos bancos
+ Salvar através de vários bancos
@@ -608,22 +608,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Tamanho
+ Largura
- 1 Byte (8-bit)
+ 1 Byte (8 bits)
- 2 Bytes (16-bit)
+ 2 Bytes (16 bits)
- 4 Bytes (32-bit)
+ 4 Bytes (32 bits)
@@ -648,12 +648,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Maior que o valor
+ Maior do que o valor
- Menor que o valor
+ Menor do que o valor
@@ -663,12 +663,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Alterado por valor
+ Alterado por quantia
- Inalterado
+ Sem mudança
@@ -683,7 +683,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Pesquisar ROM
+ Procurar na ROM
@@ -699,12 +699,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Adivinhar
+ Detectar
- Buscar nos Resultados
+ Pesquisar nos Resultados
@@ -800,7 +800,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Sprites
+ Imagens Móveis
@@ -830,7 +830,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Desligado
+ Não
@@ -858,7 +858,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Return, Ctrl+R
+ Retornar, Ctrl+R
@@ -895,7 +895,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Habilitado
+ Ativado
@@ -905,7 +905,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Bloco
+ Ladrilho
@@ -938,7 +938,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Substituições no jogo
+ Substituições do Jogo
@@ -951,12 +951,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Autodetectar
+ Auto-detectar
- Relógio em tempo real
+ Relógio de tempo real
@@ -976,12 +976,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Vibrar
+ Rumble
- Tipo de salvamento
+ Tipo de save
@@ -996,12 +996,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Flash 512kb
+ Flash de 512 kbs
- Flash 1Mb
+ Flash de 1 Mb
@@ -1011,7 +1011,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Loop ocioso
+ Loop inativo
@@ -1021,7 +1021,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Modo de compatibilidade para falhas no VBA
+ Modo de compatibilidade dos bugs do VBA
@@ -1036,12 +1036,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Controlador de banco de memória
+ Controle do banco de memória
- Cores do Plano de Fundo
+ Cores do 2º Plano
@@ -1056,7 +1056,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
-
+ Pré-definições da paleta
@@ -1069,7 +1069,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Plano de Fundo
+ 2º plano
@@ -1099,7 +1099,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Valor 16-bit
+ Valor de 16 bits
@@ -1155,17 +1155,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Game Boy Printer
+ Impressora do Game Boy
- Se apresse!
+ Apresse-se!
- Desligar
+ Rasgar
@@ -1211,7 +1211,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Falha ao abrir arquivo de cheats: %1
+ Falhou em abrir o arquivo das trapaças: %1
@@ -1241,7 +1241,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Selecionar arquivo de cheats
+ Selecionar arquivo de trapaças
@@ -1249,27 +1249,27 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Falha ao abrir o arquivo de salvamento: %1
+ Falhou em abrir o arquivo do save: %1
- Falha ao abrir o arquivo do jogo: %1
+ Falhou em abrir o arquivo do jogo: %1
- Não é possível remover o game pak numa plataforma inesperada!
+ Não pode arrancar o pacote numa plataforma inesperada!
- Falha ao abrir o arquivo de snapshot para leitura: %1
+ Falhou em abrir o arquivo do snapshot pra leitura: %1
- Falha ao abrir o arquivo de snapshot para escrita: %1
+ Falhou em abrir o arquivo do snapshot pra gravação: %1
@@ -1277,17 +1277,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Falha ao abrir o arquivo do jogo: %1
+ Falhou em abrir o arquivo do jogo: %1
- Não foi possível carregar o jogo. Tem certeza que está no formato correto?
+ Não pôde carregar o jogo. Você tem certeza que está no formato correto?
- Falha ao abrir o arquivo de salvamento. O diretório para salvar tem permissão de escrita?
+ Falhou em abrir o arquivo do save. O diretório do save é gravável?
@@ -1295,12 +1295,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Exportar quadro
+ Exportar frame
- Portable Network Graphics (*.png)
+ Gráficos Portáteis da Rede (*.png)
@@ -1310,7 +1310,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Plano de Fundo
+ 2º plano
@@ -1330,12 +1330,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Cor de Fundo
+ Cenário
- Quadro
+ Frame
@@ -1409,12 +1409,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Travar
+ Crash
- Não foi possível iniciar o servidor GDB
+ Não pôde iniciar o servidor do GDB
@@ -1422,12 +1422,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Falha ao abrir arquivo de saída: %1
+ Falhou em abrir arquivo de saída: %1
- Selecionar arquivo de saída
+ Selecionar o arquivo de saída
@@ -1440,37 +1440,37 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Modo do plano de fundo
+ Modo do 2º plano
- Modo 0: 4 fundos de blocos
+ Modo 0: 4 camadas de ladrilhos
- Modo 1: 2 fundos de blocos + 1 fundo de blocos com rotação/escala
+ Modo 1: 2 camadas de ladrilhos + 1 camada de ladrilhos rotacionada/redimensionada
- Modo 2: 2 fundos de blocos com rotação/escala
+ Modo 2: 2 camadas de ladrilhos rotacionadas/redimensionadas
- Modo 3: Bitmap 15-bit completo
+ Modo 3: Bitmap de 15 bits completo
- Modo 4: Bitmap 8-bits completo
+ Modo 4: Bitmap de 8 bits completo
- Modo 5: Bitmap 15-bits pequeno
+ Modo 5: Bitmap de 15 bits pequeno
@@ -1480,42 +1480,42 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Selecionar quadro
+ Selecionar frame
- Barramento Horizontal Desbloqueado
+ Destrancou HBlank
- Mapeamento linear do OBJ
+ Mapeamento do mosaio do OBJ linear
- Forçar limpeza da tela
+ Forçar tela vazia
- Ativar plano de fundo 0
+ Ativar 2º plano 0
- Ativar plano de fundo 1
+ Ativar 2º plano 1
- Ativar plano de fundo 2
+ Ativar 2º plano 2
- Ativar plano de fundo 3
+ Ativar 2º plano 3
@@ -1535,12 +1535,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ativar Janela OBJ
+ Ativar Janela do OBJ
- Trocar componentes verde
+ Trocar componentes verdes
@@ -1560,17 +1560,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ativar geração de VBlank IRQ
+ Ativar geração do IRQ VBlank
- Ativar geração de HBlank IRQ
+ Ativar geração do IRQ HBlank
- Ativar geração de VCounter IRQ
+ Ativar geração do IRQ VCounter
@@ -1596,7 +1596,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Base dos gráficos de blocos (* 16kB)
+ Base dos dados de ladrilhos (* 16 kB)
@@ -1604,7 +1604,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ativar mosaico
+ Ativar efeito mosaico
@@ -1612,7 +1612,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ativar 256-cores
+ Ativar 256 cores
@@ -1620,7 +1620,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Base do mapa de blocos (* 2 kB)
+ Base do mapa de ladrilhos (* 2 kB)
@@ -1628,13 +1628,13 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Dimensões do plano de fundo
+ Dimensões do 2º plano
- Overflow wraps
+ Embrulhos do excesso
@@ -1682,7 +1682,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Parte inteira
+ Parte integral
@@ -1690,7 +1690,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Número inteiro (baixo)
+ Parte integral (baixo)
@@ -1698,7 +1698,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Número inteiro (alto)
+ Parte integral (alto)
@@ -1812,37 +1812,37 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Fora da janela ativar blend
+ Fora da janela ativar mistura
- Janela OBJ ativar BG 0
+ Janela do OBJ ativar BG 0
- Janela OBJ ativar BG 1
+ Janela do OBJ ativar BG 1
- Janela OBJ ativar BG 2
+ Janela do OBJ ativar BG 2
- Janela OBJ ativar BG 3
+ Janela do OBJ ativar BG 3
- Janela OBJ ativar OBJ
+ Janela do OBJ ativar OBJ
- Janela OBJ ativar blend
+ Janela do OBJ ativar mistura
@@ -1857,12 +1857,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Tamanho vertical do mosaico de objeto
+ Tamanho vertical do mosaico de objetos
- Tamanho horizontal do mosaico de objeto
+ Tamanho horizontal do mosaico de objetos
@@ -1887,17 +1887,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- OBJ alvo 1
+ Alvo do OBJ 1
- Backdrop alvo 1
+ Alvo do cenário 1
- Modo Blend
+ Modo de Mistura
@@ -1942,45 +1942,45 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- OBJ alvo 2
+ Alvo do OBJ 2
- Backdrop alvo 2
+ Alvo do cenário 2
- Blend A (alvo 1)
+ Mistura A (alvo 1)
- Blend B (alvo 2)
+ Mistura B (alvo 2)
- Blend Y
+ Mistura Y
- Sweep shifts
+ Trocas de varredura
- Sweep subtract
+ Subtrair varredura
- Sweep time (em 1/128s)
+ Tempo da varredura (em 1/128s)
@@ -2000,7 +2000,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ciclo de trabalho
+ Ciclo do dever
@@ -2010,7 +2010,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Envelope step time
+ Tempo do passo do envelope
@@ -2020,7 +2020,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Envelope increase
+ Aumentar envelope
@@ -2037,7 +2037,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Frequência de som
+ Frequência do som
@@ -2066,7 +2066,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Tabela de som com duplo tamanho
+ Tabela de som com tamanho duplo
@@ -2148,70 +2148,70 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Frequência de turno
+ Frequência do deslocador
- Volume PSG direito
+ Volume do PSG direito
- Volume PSG esquerdo
+ Volume do PSG esquerdo
- Ativar canal 1 à direita
+ Ativar canal 1 a direita
- Ativar canal 2 à direita
+ Ativar canal 2 a direita
- Ativar canal 3 à direita
+ Ativar canal 3 a direita
- Ativar canal 4 à direita
+ Ativar canal 4 a direita
- Ativar canal 1 à esquerda
+ Ativar canal 1 a esquerda
- Ativar canal 2 à esquerda
+ Ativar canal 2 a esquerda
- Ativar canal 3 à esquerda
+ Ativar canal 3 a esquerda
- Ativar canal 4 à esquerda
+ Ativar canal 4 a esquerda
- Volume principal do PSG
+ Volume mestre do PSG
@@ -2226,12 +2226,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ativar canal A à direita
+ Ativar canal A a direita
- Ativar canal A à esquerda
+ Ativar canal A a esquerda
@@ -2260,17 +2260,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Redefinir canal A
+ Resetar canal A
- Ativar canal B à direita
+ Ativar canal B a direita
- Ativar canal B à esquerda
+ Ativar canal B a esquerda
@@ -2280,7 +2280,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Redefinir canal B
+ Resetar canal B
@@ -2439,12 +2439,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Fonte (alto)
+ Fonte (alta)
- Fonte (baixo)
+ Fonte (baixa)
@@ -2518,7 +2518,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Corrigido
+ Consertado
@@ -2534,7 +2534,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Deslocamento de origem
+ Deslocamento da fonte
@@ -2550,7 +2550,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- 32-bit
+ 32 bits
@@ -2625,7 +2625,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Áudio FIFO
+ Áudio do FIFO
@@ -2707,7 +2707,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Select
+ Selecionar
@@ -2731,13 +2731,13 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Cima
+ Pra cima
- Baixo
+ Pra baixo
@@ -2851,7 +2851,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Aguardar SRAM
+ Espera do SRAM
@@ -2921,33 +2921,33 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Terminal PHI
+ Terminal do PHI
- Desativado
+ Desativar
- 4.19MHz
+ 4.19 MHz
- 8.38MHz
+ 8.38 MHz
- 16.78MHz
+ 16.78 MHz
- Pré-carregamento de Gamepak
+ Pré-carga do Gamepak
@@ -2967,12 +2967,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Cima/Select
+ Pra cima/Select
- Baixo/Start
+ Pra baixo/Start
@@ -2982,17 +2982,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Botões ativos
+ Botões de face ativos
- Clock interno
+ Relógio interno
- 32 vezes o clock (apenas GBC)
+ 32x o clock (só no GBC)
@@ -3051,27 +3051,27 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Saída da esquerda
+ Saída esquerda
- Plano de fundo ativo/prioridade
+ Ativar/prioridade do 2º plano
- Ativar sprites
+ Ativar imagens móveis
- Sprites com dobro da altura
+ Imagens móveis com dobro da altura
- Mapeamento de blocos no Fundo
+ Mapa de ladrilhos do plano de fundo
@@ -3088,7 +3088,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Mapeamento dos gráficos no Fundo
+ Dados de ladrilhos do plano de fundo
@@ -3108,7 +3108,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Mapeamento de blocos na Janela
+ Mapa de ladrilhos da janela
@@ -3123,22 +3123,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- 0: HBlank / Barramento Horizontal
+ 0: HBlank
- 1: VBlank / Barramento Vertical
+ 1: VBlank
- 2: Varredura OAM
+ 2: Scan do OAM
- 3: HDraw / Desenho Horizontal
+ 3: HDraw
@@ -3173,12 +3173,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Comparação de coordenada Y
+ Comparação da coordenada Y
- Iniciar, byte superior
+ Iniciar byte superior
@@ -3211,7 +3211,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Preparar para mudança de velocidade
+ Preparar pra trocar velocidade
@@ -3231,12 +3231,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Afinação
+ Cronometragem
- Bit de escrita
+ Bit de gravação
@@ -3276,7 +3276,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ordenação da Sprite
+ Ordenação de sprites
@@ -3286,12 +3286,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ordem por coordenada X
+ Organização da coordenada X
- Banco WRAM
+ Banco do WRAM
@@ -3305,12 +3305,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Super (L)
+ Super (E)
- Super (R)
+ Super (D)
@@ -3323,12 +3323,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Carregar Estado
+ Carregar o State
- Salvar Estado
+ Salvar o State
@@ -3343,7 +3343,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Espaço %1
+ Slot %1
@@ -3362,12 +3362,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Error
+ Erro
- Warning
+ Aviso
@@ -3400,7 +3400,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ocorreu um erro
+ Um erro ocorreu
@@ -3420,12 +3420,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- WARN
+ AVISAR
- ERROR
+ ERRO
@@ -3435,7 +3435,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- GAME ERROR
+ ERRO DO JOGO
@@ -3455,7 +3455,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Base do bloco
+ Base dos ladrilhos
@@ -3481,7 +3481,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Espelhamento
+ Espelho
@@ -3518,7 +3518,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Portable Network Graphics (*.png)
+ Gráficos Portáteis da Rede (*.png)
@@ -3526,12 +3526,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Salvar região de memória
+ Salvar a região da memória
- Falha ao abrir arquivo de saída: %1
+ Falhou em abrir o arquivo de saída: %1
@@ -3574,7 +3574,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Falha ao abrir arquivo de saída: %1
+ Falhou em abrir o arquivo de saída: %1
@@ -3584,7 +3584,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Falha ao abrir arquivo de entrada: %1
+ Falhou em abrir o arquivo de entrada: %1
@@ -3679,7 +3679,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Portable Network Graphics (*.png)
+ Gráficos Portáteis da Rede (*.png)
@@ -3728,12 +3728,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Windows PAL (*.pal);;Adobe Color Table (*.act)
+ Windows PAL (*.pal);;Tabela de Cores da Adobe (*.act)
- Falha ao abrir arquivo de paleta de saída: %1
+ Falhou em abrir o arquivo de saída da paleta: %1
@@ -3756,7 +3756,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- (nenhum banco de dados)
+ (nenhum banco de dados presente)
@@ -3764,12 +3764,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Arquivo de reportagem de falhas
+ Arquivo compactado do relatório dos bugs
- Arquivo ZIP (*.zip)
+ Arquivo compactado ZIP (*.zip)
@@ -3777,42 +3777,42 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Estado de jogos salvados (%1)
+ Saves dos jogos e save states (%1)
- Selecione o estado de jogo gravado
+ Selecione o save do jogo ou save state
- Salvar jogos (%1)
+ Saves dos jogos (%1)
- Selecione o jogo salvado
+ Selecione o save do jogo
- Conversão falhada
+ A conversão falhou
- Falha ao converter o jogo salvado. Provavelmente um erro de programação.
+ Falhou em converter o save do jogo. Isto é provavelmente um bug.
- Nenhum ficheiro selecionado
+ Nenhum arquivo selecionado
- Não foi possivel abrir o ficheiro
+ Não pôde abrir o arquivo
@@ -3822,7 +3822,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Por favor selecione um ficheiro de entrada válido
+ Por favor selecione um arquivo de entrada válido
@@ -3832,7 +3832,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Não foi possível converter o jogo salvado entre plataformas
+ Não pôde converter os saves do jogo entre as plataformas
@@ -3841,7 +3841,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Qt Multimídia
+ Multimídia do Qt
@@ -3861,12 +3861,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- OpenGL (forçar versão 1.x)
+ OpenGL (forçar a versão 1.x)
- Nenhum (Imagem parada)
+ Nenhum (Imagem Parada)
@@ -3897,7 +3897,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Selecione diretório
+ Selecione o diretório
@@ -3935,7 +3935,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Passar %1
+ Passe %1
@@ -3961,18 +3961,18 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Exportar blocos
+ Exportar ladrilhos
- Portable Network Graphics (*.png)
+ Gráficos Portáteis da Rede (*.png)
- Exportar bloco
+ Exportar ladrilho
@@ -3980,7 +3980,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Falha ao abrir arquivo de vídeo de saída: %1
+ Falhou em abrir o arquivo de saída do vídeo: %1
@@ -3998,12 +3998,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- ROMs de Game Boy Advance (%1)
+ ROMs do Game Boy Advance (%1)
- ROMs de Game Boy (%1)
+ ROMs do Game Boy (%1)
@@ -4013,12 +4013,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- %1 Logs de Vídeo (*.mvl)
+ %1 Registros do Vídeo (*.mvl)
- Arquivos (%1)
+ Arquivos Compactados (%1)
@@ -4036,12 +4036,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Selecionar salvamento
+ Selecionar save
- Selecione correção
+ Selecionar patch
@@ -4051,12 +4051,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Selecione dotcode do e-Reader
+ Selecionar dotcode do e-Reader
- e-Reader card (*.raw *.bin *.bmp)
+ Cartão do e-Reader (*.raw *.bin *.bmp)
@@ -4072,66 +4072,66 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- GameShark saves (*.sps *.xps)
+ Saves do GameShark (*.sps *.xps)
- Selecionar registro de vídeo
+ Selecionar registro do vídeo
- Video logs (*.mvl)
+ Registros do vídeo (*.mvl)
- Travamento
+ Crash
- O jogo travou com o seguinte erro:
+ O jogo teve um crash com o seguinte erro:
%1
- Chamada de BIOS não implementada
+ Chamada da BIOS não implementada
- Este jogo usa uma chamada de BIOS que não está implementada. Por favor, use a BIOS oficial para uma melhor experiência.
+ Este jogo usa uma chamada de BIOS que não está implementada. Por favor use a BIOS oficial pra uma melhor experiência.
- Falha ao criar um adaptador de gráficos apropriado, voltando ao gráficos por software. Os jogos poderão correr lentamente, especialmente em janelas grandes.
+ Falhou em criar um dispositivo de exibição apropriado, voltando a exibição por software. Os jogos podem executar lentamente, especialmente com janelas maiores.
- Quer mesmo tornar portátil?
+ Realmente tornar portátil?
- Isto fará com que o emulador carregue sua configuração a partir do mesmo diretório que o executável. Você quer continuar?
+ Isto fará o emulador carregar sua configuração do mesmo diretório que o executável. Você quer continuar?
- É necessário reiniciar
+ Reiniciar é necessário
- Algumas alterações não terão efeito até que o emulador seja reiniciado.
+ Algumas mudanças não terão efeito até que o emulador seja reiniciado.
@@ -4166,12 +4166,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Carregar ROM em arquivo...
+ Carregar ROM no arquivo compactado...
- Adicionar pasta à biblioteca...
+ Adicionar a pasta a biblioteca...
@@ -4181,7 +4181,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Rodar BIOS
+ Dar Boot na BIOS
@@ -4191,12 +4191,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Informações da ROM...
+ Informações da &ROM...
- Recente
+ Recentes
@@ -4206,7 +4206,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Carregar Estado
+ &Carregar state
@@ -4221,7 +4221,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Sensores de Game Pak...
+ Sensores do Game Pak...
@@ -4231,73 +4231,73 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Carregar arquivo de estado...
+ Carregar arquivo do state...
- Jogos salvados (%1)
+ Saves dos jogos (%1)
- Selecione jogo salvado
+ Selecione save do jogo
- Ficheiro de estado de jogo mGBA (%1)
+ Arquivos do save state do mGBA (%1)
- Selecione estado de jogo gravado
+ Selecione save state
-
+ Selecionar imagens do cartão do e-Reader
-
+ Arquivo da imagem (*.png *.jpg *.jpeg)
-
+ Conversão concluída
-
+ %1 de %2 cartões do e-Reader convertidos com sucesso.
- Carregar jogo salvado alternativo...
+ Carregar save alternativo do jogo...
- Carregar jogo salvado temporário...
+ Carregar save temporário do jogo...
-
+ Converter imagem do cartão do e-Reader pro natural...
- &Salvar Estado
+ &Salvar o state
- Salvar arquivo de estado...
+ Arquivo do save state...
@@ -4312,28 +4312,28 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Carregar recente
+ Carregar recentes
- Salvar recente
+ Salvar recentes
- Desfazer carregar estado
+ Desfazer o carregamento do state
- Desfazer salvar estado
+ Desfazer o salvamento do state
- Estado &%1
+ State &%1
@@ -4343,7 +4343,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Converter jogo salvado...
+ Converter save do jogo...
@@ -4358,7 +4358,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Sair
+ S&air
@@ -4373,12 +4373,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Desligar
+ De&sligar
- Remover game pak
+ Arrancar game pak
@@ -4388,22 +4388,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Próximo quadro
+ &Próximo frame
- Avançar rápido (segurado)
+ Avanço rápido (segurado)
- Avanço &Rápido
+ &Avanço rápido
- Velocidade de avanço
+ Velocidade do avanço rápido
@@ -4433,12 +4433,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Sincronizar para &vídeo
+ Sincronizar no &vídeo
- Sincronizar para &áudio
+ Sincronizar no &áudio
@@ -4478,7 +4478,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Tamanho do quadro
+ Tamanho do frame
@@ -4488,12 +4488,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Fixar proporção
+ Trancar proporção do aspecto
- Forçar dimensionamento inteiro
+ Forçar dimensionamento da integral
@@ -4503,7 +4503,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Salto de quadro
+ Frame&skip
@@ -4513,7 +4513,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Meta de FPS
+ FPS alvo
@@ -4523,7 +4523,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Capturar &tela
+ Tirar &screenshot
@@ -4533,12 +4533,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Impressora Game Boy...
+ Impressora do Game Boy...
- BattleChip Gate...
+ Portal do BattleChip...
@@ -4548,7 +4548,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Blending entre-telas
+ Mistura do interframe
@@ -4558,7 +4558,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Camadas de vídeo
+ Camadas do vídeo
@@ -4568,7 +4568,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ajustar posicionamento de plano...
+ Ajustar posicionamento da camada...
@@ -4583,32 +4583,32 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Game &overrides...
+ Substituições &do jogo...
- Não foi possível Iniciar
+ Não Pôde Iniciar
- Não foi possível iniciar o jogo.
+ Não pôde iniciar o jogo.
- Escanear dotcode do e-Reader...
+ Escanear dotcodes do e-Reader...
- Importar salvamento do GameShark...
+ Importar Save do GameShark...
- Exportar salvamento do GameShark...
+ Exportar Save do GameShark...
@@ -4618,7 +4618,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Cheats...
+ &Trapaças...
@@ -4628,12 +4628,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Abrir console de depuração...
+ Abrir console do debugger...
- Iniciar servidor &GDB...
+ Iniciar servidor do &GDB...
@@ -4643,12 +4643,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Visualizar &sprites...
+ Visualizar &imagens móveis...
- Visualizar &blocos...
+ Visualizar &ladrilhos...
@@ -4658,7 +4658,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Inspetor de &quadro...
+ Inspetor dos &frames...
@@ -4668,7 +4668,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Pesquisar memória...
+ Procurar memória...
@@ -4678,12 +4678,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Gravar log de vídeo de depuração...
+ Gravar registro do vídeo de debug...
- Parar log de vídeo de depuração
+ Parar log do vídeo de debug
@@ -4693,62 +4693,62 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Botão de GameShark (segurado)
+ Botão do GameShark (segurado)
- Disparo automático
+ Auto-disparar
- Disparo automático A
+ Auto-disparar A
- Disparo automático B
+ Auto-disparar B
- Disparo automático L
+ Auto-disparar L
- Disparo automático R
+ Auto-disparar R
- Disparo automático Start
+ Auto-disparar Start
- Disparo automático Select
+ Auto-disparar Select
- Disparo automático Cima
+ Auto-disparar Pra Cima
- Disparo automático Direita
+ Auto-disparar Direita
- Disparo automático Baixo
+ Auto-disparar Pra Baixo
- Disparo automático Esquerda
+ Auto-disparar Esquerda
@@ -4761,12 +4761,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- %1 kiB
+ %1 kiBs
- %1 MiB
+ %1 MiBs
@@ -4776,7 +4776,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- GB
+ GBs
@@ -4837,7 +4837,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- ID do jogo:
+ ID do Jogo:
@@ -4870,12 +4870,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Gerar Relatório de Bug
+ Gerar Relatório do Bug
- <html><head/><body><p>Para reportar um bug, primeiro gere um ficheiro de relatório para anexar ao relatório de bug. É recomendado que inclua ficheiros de jogos salvados, já que podem ajudar a resolver problemas de depuração. Isto irá coletar informações sobre a versão do {projectName} que está a correr, suas configurações, seu computador, e o jogo que está aberto (se algum). Quando a coleção estiver completa você poderá revisar toda a informação coletada abaixo e gravar para um ficheiro zip. A coleção tentará automaticamente editar qualquer informação pessoal, como o seu username em qualquer pasta colecionada, mas em qualquer caso você poderá editar mais tarde. Depois de gerado e gravado o relatório, por favor clique no botão abaixo ou vá a <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> para reportar o bug ao GitHub. Certifique-se de anexou o relatório que você gerou!</p></body></html>
+ <html><head/><body><p>Pra apresentar um relatório de bug, por favor primeiro gere um arquivo de relatório pra anexar ao relatório do bug. É recomendado que você inclua os arquivos dos saves como estes frequentemente ajudam com problemas de debugging. Isto coletará um pouco de informação sobre a versão do {projectName} que você está em executando, suas configurações, seu computador e o jogo que você abriu atualmente (se algum). Uma vez que esta coleção estiver completada você pode rever toda a informação coletada abaixo e salvá-la num arquivo zip. A coleção tentará automaticamente reescrever qualquer informação pessoal, tal como seu nome de usuário se está em qualquer dos caminhos coletados, mas em qualquer caso você pode editá-lo mais tarde. Depois que você o gerou e o salvou, por favor clique no botão abaixo ou vá em <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> pra apresentar o relatório no GitHub. Tenha a certeza de anexar o relatório que você gerou!</p></body></html>
@@ -4895,12 +4895,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Incluir ficheiro de jogo salvado
+ Incluir arquivo do save
- Criar e incluir estado de jogo
+ Criar e incluir savestate
@@ -4908,12 +4908,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Converter e extrair jogo salvado
+ Converter/Extrair o Save do Jogo
- Ficheiro de entrada
+ Arquivo de entrada
@@ -4924,22 +4924,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Ficheiro de saída
+ Arquivo de saída
- %1 %2 jogo salvado
+ %1 %2 save do jogo
- endian pequeno
+ little endian
- endian grande
+ big endian
@@ -4969,22 +4969,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- packed MBC2
+ empacotou o MBC2
- unpacked MBC2
+ desempacotou o MBC2
- MBC6 flash
+ Flash do MBC6
- MBC6 combinado SRAM + flash
+ MBC6 SRAM combinado + flash
@@ -5004,7 +5004,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- %1 estado de jogo embutido com %2 jogo salvado
+ %1 save state com %2 saves dos jogos embutidos
@@ -5032,7 +5032,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Horário iniciando em
+ Horário do início em
@@ -5042,7 +5042,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- dd/MM/yy hh:mm:ss
+ MM/dd/yy hh:mm:ss AP
@@ -5137,7 +5137,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Buffer de áudio:
+ Buffer do áudio:
@@ -5183,7 +5183,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Taxa de amostragem:
+ Taxa das amostras:
@@ -5225,7 +5225,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Volume durante avanço rápido:
+ Avançar o volume rápido:
@@ -5235,7 +5235,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Salto de quadro:
+ Frameskip:
@@ -5246,17 +5246,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- quadros
+ frames
- Meta de FPS:
+ FPS alvo:
- quadros por segundo
+ frames por segundo
@@ -5276,7 +5276,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Fixar proporção
+ Trancar proporção do aspecto
@@ -5286,37 +5286,37 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
-
+ Só a cor padrão da paleta
-
+ Paleta das cores SGB se disponível
-
+ Paleta das cores do GBC se disponível
-
+ SGB (preferido) ou paleta das cores do GBC se disponível
-
+ Câmera do Game Boy
-
+ Driver:
-
+ Fonte:
@@ -5326,7 +5326,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Interframe blending
+ Mistura do interframe
@@ -5341,33 +5341,33 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Exibir mensagens OSD
+ Mostrarr mensagens do OSD
- Dados extras do estado de jogo:
+ Dados extras do save state:
- Salvar jogo
+ Save do jogo
- Carregar dados extras do estado de jogo:
+ Carregar dados extras do state:
-
+ Ativar compatibilidade dos bugs do VBA nos hacks das ROMs
-
+ Pré-definições:
@@ -5377,7 +5377,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Velocidade de avanço (segurado):
+ Velocidade do avanço rápido (segurado):
@@ -5387,7 +5387,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Registrar para arquivo
+ Registrar no arquivo
@@ -5402,7 +5402,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Forçar dimensionamento inteiro
+ Forçar dimensionamento da integral
@@ -5412,7 +5412,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Português do Brasil
+ Inglês
@@ -5432,7 +5432,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Exibir quando nenhum jogo estiver aberto
+ Mostrar quando nenhum jogo estiver aberto
@@ -5447,7 +5447,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Suspender protetor de tela
+ Suspender proteção de tela
@@ -5462,32 +5462,32 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Salvar cheats automaticamente
+ Salvar trapaças automaticamente
- Carregar cheats automaticamente
+ Carregar trapaças automaticamente
- Salvar estado automaticamente
+ Salvar o state automaticamente
- Carregar estado automaticamente
+ Carregar o state automaticamente
- Habilitar Discord Rich Presence
+ Ativar Discord Rich Presence
- Velocidade de avanço:
+ Velocidade de avanço rápido:
@@ -5503,12 +5503,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Histórico de retrocesso:
+ Histórico do retrocesso:
- Loops ociosos:
+ Loops inativos:
@@ -5529,33 +5529,33 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Captura de tela
+ Screenshot
- Códigos de cheat
+ Códigos de trapaça
- Pré-carregar toda a ROM na memória
+ Pré-carregar a ROM inteira na memória
- Intervalo do Disparo Automático:
+ Intervalo do Auto-Disparo:
- Ativar funcionalidades do Game Boy Player por padrão
+ Ativar funções do Game Boy Player por padrão
- Renderizador de vídeo:
+ Renderizador do vídeo:
@@ -5575,17 +5575,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Escala de alta resolução:
+ Escala de alta-resolução:
- XQ GBA audio (experimental)
+ Áudio do XQ GBA (experimental)
- Arquivo GB BIOS:
+ Arquivo do GB BIOS:
@@ -5603,32 +5603,32 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Usar o arquivo BIOS se encontrado
+ Usar o arquivo da BIOS se encontrado
- Pular introdução da BIOS
+ Ignorar introdução da BIOS
- Arquivo GBA BIOS:
+ Arquivo da BIOS do GBA:
- Arquivo GBC BIOS:
+ Arquivo da BIOS do GBC:
- Arquivo SGB BIOS:
+ Arquivo da BIOS do SGB:
- Arquivos de salvamento
+ Saves dos jogos
@@ -5637,17 +5637,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Mesmo diretório que a ROM
+ O mesmo diretório que a ROM
- Estados salvos
+ Save states
- Capturas de tela
+ Screenshots
@@ -5657,42 +5657,42 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Cheats
+ Trapaças
-
+ Modelos
-
+ Só GB:
-
+ Compatível com SGB:
-
+ Só no GBC:
-
+ Compatível com GBC:
-
+ Compatível com SGB e GBC:
-
+ Paleta do Game Boy
@@ -5707,12 +5707,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Cores padrão do sprite 1:
+ Cores padrão de sprite 1:
- Cores padrão do sprite 2:
+ Cores padrão de sprite 2:
@@ -5745,7 +5745,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Remover Shader
+ Descarregar Shader
@@ -5781,7 +5781,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Blocos
+ Ladrilhos
@@ -5806,17 +5806,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Blocos por linha
+ Ladrilhos por linha
- Ajustar à janela
+ Encaixar na janela
- Copiar selecionado
+ Copiar Selecionado
@@ -5844,12 +5844,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Selecionar arquivo
+ Selecionar Arquivo
- Predefinições
+ Pre-definições
@@ -5891,7 +5891,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- &Sem perdas
+ &Sem Perdas
@@ -5977,12 +5977,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Sem compressão
+ Descomprimido
- Bitrate (kbps)
+ Taxa dos bits (kbps)
@@ -6017,12 +6017,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd.
- Fixar proporção
+ Trancar proporção do aspecto
- Mostrar opções avançadas
+ Mostrar as avançadas
diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts
index 3550b9d37..23ede6e5e 100644
--- a/src/platform/qt/ts/mgba-tr.ts
+++ b/src/platform/qt/ts/mgba-tr.ts
@@ -11,12 +11,12 @@
-
+ <a href="http://mgba.io/">Web Sayfası</a> • <a href="https://forums.mgba.io/">Forumlar / Destek</a> • <a href="https://patreon.com/mgba">Bağış</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Kaynak</a>
-
+ Dal: <tt>{gitBranch}</tt><br/>Revizyon: <tt>{gitCommit}</tt>
@@ -33,7 +33,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ {projectName} bir açık kaynak Game Boy Advance öykünücüsüdür
@@ -122,7 +122,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Gate türü
@@ -147,12 +147,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Çip ID
- Chip verilerini güncelle
+ Çip verilerini güncelle
@@ -195,7 +195,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kodları buraya gir...
@@ -203,7 +203,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Hata Ayıklayıcı
@@ -213,7 +213,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Ara ver
@@ -221,37 +221,37 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Doliphin'e bağlan
-
+ Yerel bilgisayar
-
+ IP Adresi
-
+ Bağlan
-
+ Bağlantıyı Kes
-
+ Kapat
-
+ Bağlantıyı Sıfırla
@@ -259,37 +259,37 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kareyi izle
-
+ Büyütme
-
+ Kareyi Dondur
-
+ Arka Plan Rengi
-
+ Scanline Efektini devre dışı bırak
-
+ Çıkar
- Reset
+ Sıfırla
@@ -297,12 +297,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ GIF/Web/APNG Kaydet
-
+ Döngü
@@ -322,17 +322,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ APNG
-
+ GIF
-
+ WebP
@@ -392,7 +392,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ %1 Durum
@@ -420,7 +420,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Geri
@@ -463,7 +463,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Girdiler
@@ -478,7 +478,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Matris
@@ -498,17 +498,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Ölümcül
-
+ Oyun Hatası
-
+ Gelişmiş ayarlar
@@ -541,7 +541,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kopyala
@@ -549,22 +549,22 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Bellek Aralığını Kaydet
-
+ Adres Başlangıcı:
-
+ Bayt Sayısı:
-
+ Bellek depoları arası döküm
@@ -572,7 +572,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Bellek Arama
@@ -649,57 +649,57 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Arama türü
-
+ Eş değer
-
+ Değerden büyük
-
+ Değerden küçük
-
+ Bilinmeyen/değiştirilmiş
-
+ Değere göre değiştirildi
-
+ Değiştirilmemiş
-
+ Arttırılmış
-
+ Azaltılmış
-
+ ROM Ara
-
+ Yeni Arama
@@ -722,7 +722,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Bellek
@@ -787,7 +787,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Aralığı Kaydet
@@ -800,7 +800,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Spritelar
@@ -840,12 +840,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kopyala
-
+ Matrix
@@ -956,7 +956,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Gerçek Zaman Saati
@@ -971,12 +971,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Işık Sensörü
-
+ Titreşim
@@ -1011,17 +1011,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Boşta İşlem
-
+ Game Boy Player özellikleri
-
+ VBA hata uyumluluk modu
@@ -1036,7 +1036,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Bellek bank kontrolcüsü
@@ -1056,7 +1056,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Palet ön ayar
@@ -1109,7 +1109,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Palet indeks
@@ -1155,27 +1155,27 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Game Boy Yazıcı
-
+ Acele et!
-
+ Parçalara ayır
-
+ Kopyala
-
+ Büyütme
@@ -1183,7 +1183,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ 2021
@@ -1259,7 +1259,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Beklenmedik bir platformda kartı çıkaramazsın!
@@ -1282,12 +1282,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Oyun yüklenemedi. Doğru formatta olduğundan emin misin?
+ Oyun yüklenemedi. Doğru formatta olduğundan emin misin?
-
+ Kayıt dosyası açılma başarısız. Kayıt yolu yazılabilir mi?
@@ -1295,52 +1295,52 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kareyi Dışarı Aktar
-
+ Portable Network Graphics (*.png)
- Hiçbiri
+ Hiçbiri
- Arkaplan
+ Arka Plan
-
+ Pencere
-
+ Nes. Pen.
-
+ Sprite
-
+ Arka fon
-
+ Kare
-
+ %1 %2
@@ -1356,12 +1356,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Tuşu Temizle
-
+ Analogu Temizle
@@ -1394,7 +1394,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ İptal
@@ -1409,7 +1409,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Hata
@@ -1422,7 +1422,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Çıkış dosyası açılamadı:%1
+ Çıkış dosyası açılamadı:%1
@@ -1432,7 +1432,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng)
@@ -1475,7 +1475,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ CGB Mod
@@ -1485,7 +1485,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kilidi Açık HBlank
@@ -1540,7 +1540,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Yeşil bileşenleri değiştir
@@ -1596,7 +1596,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Tile veri tabanı (* 16kB)
@@ -1620,7 +1620,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Tile plan tabanı (* 2kB)
@@ -1690,7 +1690,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Tamsayı kısmı (düşük)
@@ -1698,7 +1698,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Tamsayı kısmı (yüksek)
@@ -1852,7 +1852,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Arka plan yatay mozaik boyutu
+ Arka plan yatay mozaik boyutu
@@ -1867,27 +1867,27 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ BG 0 hedef 1
-
+ BG 1 hedef 1
-
+ BG 2 hedef 1
-
+ BG 3 hedef 1
-
+ NESNE hedef 1
@@ -2408,7 +2408,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Adres (düşük)
@@ -2420,53 +2420,53 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Adres (yüksek)
-
+ Ses frekansı (düşük)
-
+ Ses frekansı (yüksek)
-
+ Kaynak (yüksek)
-
+ Kaynak (düşük)
-
+ Hedef (düşük)
-
+ Hedef (yüksek)
-
+ Yeşil (düşük)
-
+ Yeşil (yüksek)
@@ -2957,341 +2957,341 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Sağ/A
-
+ Sol/B
-
+ Yukarı/Select
-
+ Aşağı/Start
-
+ D-pad Etkinleştir
-
+ Yüz tuşlarını etkinleştir
-
+ Dahili saat
-
+ 32× saat ölçümü (yalnızca CGB)
-
+ Aktarım etkin
-
+ Bölücü
-
+ 1/16
-
+ LCD DURUM
-
+ Zamanlayıcı
-
+ Seri
-
+ Joypad
-
+ Ses sağ
-
+ Çıkış sağ
-
+ Ses sol
-
+ Çıkış sol
-
+ Arkaplanı etkinleştir/öncelik
-
+ Spriteları Etkinleştir
-
+ Çift yükseklikte spritelar
-
+ Arka plan tile haritası
-
+ 0x9800 – 0x9BFF
-
+ 0x9C00 – 0x9FFF
-
+ Arka plan tile verisi
-
+ 0x8800 – 0x87FF
-
+ 0x8000 – 0x8FFF
-
+ Pencereyi etkinleştir
-
+ Pencere tile haritası
-
+ LCD Etkinleştir
- Mod
+ Mod
-
+ 0: HBlank
-
+ 1: VBlank
-
+ 2: OAM tarama
-
+ 3: HDraw
-
+ LYC'de
-
+ HBlank (mod 0) IRQ Etkinleştir
-
+ VBlank (mod 1) Etkinleştir
-
+ OAM (mod 2) IRQ Etkinleştir
-
+ LYC IRQ Etkinleştir
-
+ Geçerli Y koordinatı
-
+ Karşılaştırılan Y koordinatı
-
+ Üst bayttan başla
-
+ Renk 0 ton
-
+ Renk 1 ton
-
+ Renk 2 ton
-
+ Renk 3 ton
-
+ Değiştirme hızını hazırlama
-
+ 2x Hız
-
+ VRAM deposu
-
+ Uzunluk
-
+ Zamanlama
-
+ Yazma biti
-
+ Okuma biti
-
+ Bilinmeyen
-
+ Mevcut indeks
-
+ Oto-artış
- Kırmızı
+ Kırmızı
- Mavi
+ Mavi
-
+ Sprite Düzenleme
-
+ OAM sırası
-
+ x koordinat sıralaması
-
+ WRAM deposu
@@ -3305,17 +3305,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Süper (L)
-
+ Süper (R)
-
+ Menü
@@ -3323,12 +3323,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Konum yükle
+ Durum yükle
- Konumu kaydet
+ Durumu Kaydet
@@ -3400,12 +3400,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Bir hata meydana geldi
-
+ HATA AYIKLAMA
@@ -3415,27 +3415,27 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ BİLGİ
-
+ UYARI
-
+ HATA
-
+ CİDDİ
-
+ OYUN HATASI
@@ -3443,45 +3443,45 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Öncelik
+ Öncelik
-
+ Temel harita
-
+ Temel tile
- Boyut
+ Boyut
- Çıkıntı
+ Offset
-
+ Xform
-
+ Harita Ad.
-
+ Ayna
@@ -3508,12 +3508,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ N/A
-
+ Haritayı dışarı aktar
@@ -3526,12 +3526,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Hafıza bölgesini kaydet
- Çıkış dosyası açılamadı:%1
+ Çıkış dosyası açılamadı: %1
@@ -3539,7 +3539,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Seçileni kopyala
+ Seçilenleri kopyala
@@ -3569,7 +3569,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Seçilen memory'i kaydet
+ Seçilen hafızayı kaydet
@@ -3579,7 +3579,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Memory yükle
+ Hafıza yükle
@@ -3631,7 +3631,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kapalı
@@ -3643,7 +3643,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ ---
@@ -3687,17 +3687,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Resmi MBCler
-
+ Lisanslı MBC'ler
-
+ Lisanssız MBCler
@@ -3764,12 +3764,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Hata rapor arşivi
-
+ ZIP arşivi (*.zip)
@@ -3777,62 +3777,62 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kayıtlı oyunlar ve kayıtlı durumlar (%1)
-
+ Kayıtlı oyun veya kayıtlı durum seç
-
+ Kayıtlı oyunlar (%1)
-
+ Kayıtlı oyun seç
-
+ Dönüştürme başarısız
-
+ Kayıtlı oyunu dönüştürme başarısız. Muhtemelen bir hata meydana geldi.
-
+ Seçili dosya yok
-
+ Dosya açılamadı
-
+ Geçerli türler bulunamadı
-
+ Lütfen geçerli bir giriş dosyası seç
-
+ Geçerli dönüştürme bulunamadı
-
+ Kayıtlı oyunlar platformlar arasında dönüştürülemez
@@ -3897,12 +3897,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Yolu seç
-
+ (%1×%2)
@@ -3943,17 +3943,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Eylem
- Klavye
+ Klavye
-
+ Oyun Kolu
@@ -3961,18 +3961,18 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Tileleri dışarı aktar
-
+ Portable Network Graphics (*.png)
-
+ Tileyi dışarı aktar
@@ -4051,32 +4051,32 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ e-Okuyucu nokta kodunu seç
-
+ e-Okuyucu kart (*.raw *.bin *.bmp)
-
+ e-Okuyucu kartından görüntüleri seç
-
+ Görüntü dosyası (*.png *.jpg *.jpeg)
-
+ Dönüştürme tamamlandı
-
+ %1 / %2 e-Okuyucu kartları dönüştürme tamamlandı.
@@ -4131,7 +4131,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Uygun görüntü cihazı oluşturma başarısız, yazılım ekranına dönülüyor. Oyunlar özellikle daha büyük ekranlarda yavaş çalışabilir.
@@ -4211,7 +4211,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ e-Okuyucu kart resimlerini rawa dönüştür...
@@ -4292,7 +4292,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kayıtlı oyun dömnüştürülüyor...
@@ -4302,12 +4302,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Dolphin'e Bağlan...
-
+ Hata rapor et...
@@ -4527,88 +4527,88 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Oyunların üzerine yazılanlar
+ & Oyunun üzerine yazılanlar...
-
+ Başlatılamadı
-
+ Kayıtlı oyunlar (%1)
-
+ Kayıtlı oyun seç
-
+ mGBA kayıt durum dosyası (%1)
-
+ Kayıt durumu seç
-
+ Oyun başlatılamadı.
-
+ Alternatif kayıtlı oyun yükle...
-
+ Geçici kayıtlı oyunu yükle...
-
+ e-Okuyucu noktakodları tara...
-
+ GameShark kaydını içeri aktar...
-
+ GameShark kaydını dışarı aktar...
-
+ %1×
-
+ Kareler-arası Karıştırma
-
+ A/V Kayıt...
-
+ GIF/WebP/APNG Kayıt...
-
+ Oyun Kartuş sensörleri...
@@ -4653,7 +4653,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ &Kare denetçisi...
@@ -4673,12 +4673,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Hata ayıklama video günlüğünü kaydet...
-
+ Hata ayıklama video günlüğünü durdur
@@ -4748,7 +4748,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Temizle
+ Temizle
@@ -4756,17 +4756,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ %1 bayt
-
+ %1 kiB
-
+ %1 MiB
@@ -4789,22 +4789,22 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Shift
-
+ Kontrol
-
+ Alt
-
+ Derece
@@ -4870,37 +4870,37 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Hata Raporu Oluştur
-
+ <html><head/><body><p>Bir hata raporu göndermek için lütfen önce dosyalamak üzere olduğun hata raporuna eklemek üzere bir rapor dosyası oluştur. Genellikle hata ayıklama, sorunlara yardımcı olduğundan, kaydetme dosyalarını eklemeniz önerilir. Bu, çalıştırdığın {projectName} sürümü, sistemin, bilgisayarın ve şu anda açık olan (varsa) oyun hakkında bazı bilgiler toplayacaktır. Bunlar tamamlandıktan sonra aşağıda toplanan tüm bilgileri gözden geçirebilir ve bir zip dosyasına kaydedebilirsin. Veriler, toplanan yollardan herhangi birindeyse, kullanıcı adın gibi kişisel bilgileri otomatik olarak yeniden düzenlemeye çalışır, ancak daha sonra elle düzenleyebilirsin. Oluşturup kaydettikten sonra lütfen aşağıdaki düğmeye tıkla veya <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> adresinden hata dosyanı GitHub'a yükleyebilirsin. Oluşturduğun raporu dönüştürmeyi unutma!</p></body></html>
-
+ Rapor oluştur
- Kaydet
+ Kaydet
-
+ Sorun listesini tarayıcıda aç
-
+ Kayıt dosyasını dahil et
-
+ Kayıt durumunu oluştur ve dahil et
@@ -4908,103 +4908,103 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Kayıt Dosyasını Dönüştür/Çıkar
-
+ Giriş dosyası
- Gözat
+ Gözat
-
+ Çıkış dosyası
-
+ %1 %2 kayıtlı oyun
-
+ little endian
-
+ big endian
-
+ SRAM
-
+ %1 flash
-
+ %1 EEPROM
-
+ %1 SRAM + RTC
-
+ %1 SRAM
-
+ paketli MBC2
-
+ paketlenmemiş MBC2
-
+ MBC6 flash
-
+ MBC6 ile birleştirilmiş SRAM + flash
-
+ MBC6 SRAM
-
+ TAMA5
-
+ %1 (%2)
-
+ Gömülü %2 kayıtlı oyunla %1 kayıt durumu
@@ -5107,7 +5107,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Geliştirmeler
@@ -5183,7 +5183,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Değer oranı
+ Değer oranı:
@@ -5214,7 +5214,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Ses
+ Ses:
@@ -5261,7 +5261,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Eşitle
+ Senkronize Et:
@@ -5291,82 +5291,82 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Modeller
-
+ Sadece GB:
-
+ SGB uyumlu:
-
+ Sadece GBC:
-
+ Uyumlu GBC:
-
+ Uyumlu SGB ve GBC:
-
+ Game Boy paleti
-
+ Sadece varsayılan renk paleti
-
+ Mevcutsa SGB renk paketi
-
+ Mevcutsa GBC renk paketi
-
+ Mevcutsa SGB (tercih edilen) ya da GBC renk paketi
-
+ Game Boy Kamera
-
+ Sürücü:
-
+ Kaynak:
-
+ Yerel (59.7275)
-
+ Kareler-arası Karıştırma
@@ -5381,7 +5381,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Kütüphane
+ Kütüphane:
@@ -5421,12 +5421,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Küçültüldüğünde duraklat
-
+ Pencere boyutuna göre dinamik olarak güncelle
@@ -5436,28 +5436,28 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Durum ekstra veriyi kaydet:
-
+ Oyunu kaydet
-
+ Durum ekstra veriyi yükle:
-
+ ROM hacklerinde VBA hata uyumluluğunu etkinleştir
-
+ Ön ayar:
@@ -5487,12 +5487,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ OSD mesajlarını göster
-
+ Başlık çubuğunda ROM adı yerine dosya adını göster
@@ -5508,7 +5508,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ İleri sarma (tutulan) hızı:
@@ -5565,42 +5565,42 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Game Boy Player özelliklerini varsayılan olarak etkinleştir
-
+ Video oluşturucu:
-
+ Yazılım
-
+ OpenGL
-
+ OpenGL geliştirmeleri
-
+ Yüksek kalite ölçeği:
-
+ (240×160)
-
+ XQ GBA ses (deneysel)
@@ -5667,7 +5667,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Ekran görüntüleri:
+ Ekran Görüntüleri
@@ -5786,12 +5786,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Seçileni Dışarı Aktar
-
+ Hepsini Dışarı Aktar
@@ -5816,12 +5816,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ Seçilenleri Kopyala
-
+ Hepsini Kopyala
@@ -5916,7 +5916,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ 4K
@@ -5947,7 +5947,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
- Hiçbiri
+ Hiçbiri
@@ -5992,22 +5992,22 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır.
-
+ H.264
-
+ H.264 (NVENC)
-
+ VBR
-
+ CRF
diff --git a/src/platform/sdl/CMakeLists.txt b/src/platform/sdl/CMakeLists.txt
index d5bf20707..e36b7abd5 100644
--- a/src/platform/sdl/CMakeLists.txt
+++ b/src/platform/sdl/CMakeLists.txt
@@ -48,8 +48,10 @@ endif()
if(WIN32)
list(APPEND SDL_LIBRARY imm32 setupapi version winmm)
elseif(APPLE)
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework AppKit -framework AudioUnit -framework Carbon -framework CoreAudio -framework AudioToolbox -framework ForceFeedback -framework IOKit")
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}" PARENT_SCOPE)
+ list(APPEND SDL_LIBRARY "-framework AppKit" "-framework AudioUnit" "-framework Carbon" "-framework CoreAudio" "-framework AudioToolbox" "-framework ForceFeedback" "-framework IOKit")
+ if(NOT CMAKE_SYSTEM_VERSION VERSION_LESS "17.0") # Darwin 17.x is macOS 10.13
+ list(APPEND SDL_LIBRARY "-framework Metal")
+ endif()
endif()
if(NOT SDLMAIN_LIBRARY)
diff --git a/src/platform/switch/main.c b/src/platform/switch/main.c
index 7ba497d85..d127a93fb 100644
--- a/src/platform/switch/main.c
+++ b/src/platform/switch/main.c
@@ -924,7 +924,7 @@ int main(int argc, char* argv[]) {
.configExtra = (struct GUIMenuItem[]) {
{
.title = "Screen mode",
- .data = "screenMode",
+ .data = GUI_V_S("screenMode"),
.submenu = 0,
.state = SM_PA,
.validStates = (const char*[]) {
@@ -936,7 +936,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "Fast forward cap",
- .data = "fastForwardCap",
+ .data = GUI_V_S("fastForwardCap"),
.submenu = 0,
.state = 7,
.validStates = (const char*[]) {
@@ -966,7 +966,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "GPU-accelerated renderer",
- .data = "hwaccelVideo",
+ .data = GUI_V_S("hwaccelVideo"),
.submenu = 0,
.state = 0,
.validStates = (const char*[]) {
@@ -977,7 +977,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "Hi-res scaling (requires GPU rendering)",
- .data = "videoScale",
+ .data = GUI_V_S("videoScale"),
.submenu = 0,
.state = 0,
.validStates = (const char*[]) {
@@ -1000,7 +1000,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "Use built-in brightness sensor for Boktai",
- .data = "useLightSensor",
+ .data = GUI_V_S("useLightSensor"),
.submenu = 0,
.state = illuminanceAvailable,
.validStates = (const char*[]) {
diff --git a/src/platform/wii/main.c b/src/platform/wii/main.c
index 535ed8091..8149ce285 100644
--- a/src/platform/wii/main.c
+++ b/src/platform/wii/main.c
@@ -490,7 +490,7 @@ int main(int argc, char* argv[]) {
.configExtra = (struct GUIMenuItem[]) {
{
.title = "Video mode",
- .data = "videoMode",
+ .data = GUI_V_S("videoMode"),
.submenu = 0,
.state = 0,
.validStates = (const char*[]) {
@@ -503,7 +503,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "Screen mode",
- .data = "screenMode",
+ .data = GUI_V_S("screenMode"),
.submenu = 0,
.state = 0,
.validStates = (const char*[]) {
@@ -514,7 +514,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "Filtering",
- .data = "filter",
+ .data = GUI_V_S("filter"),
.submenu = 0,
.state = 0,
.validStates = (const char*[]) {
@@ -526,7 +526,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "Horizontal stretch",
- .data = "stretchWidth",
+ .data = GUI_V_S("stretchWidth"),
.submenu = 0,
.state = 7,
.validStates = (const char*[]) {
@@ -546,7 +546,7 @@ int main(int argc, char* argv[]) {
},
{
.title = "Vertical stretch",
- .data = "stretchHeight",
+ .data = GUI_V_S("stretchHeight"),
.submenu = 0,
.state = 6,
.validStates = (const char*[]) {
diff --git a/src/util/gui/file-select.c b/src/util/gui/file-select.c
index b8802d8cc..8c6b86ca8 100644
--- a/src/util/gui/file-select.c
+++ b/src/util/gui/file-select.c
@@ -94,7 +94,7 @@ static bool _refreshDirectory(struct GUIParams* params, const char* currentPath,
} else {
name = strdup(name);
}
- *GUIMenuItemListAppend(currentFiles) = (struct GUIMenuItem) { .title = name, .data = (void*) de->type(de) };
+ *GUIMenuItemListAppend(currentFiles) = (struct GUIMenuItem) { .title = name, .data = GUI_V_U(de->type(de)) };
++items;
}
qsort(GUIMenuItemListGetPointer(currentFiles, 1), GUIMenuItemListSize(currentFiles) - 1, sizeof(struct GUIMenuItem), _strpcmp);
@@ -124,7 +124,7 @@ static bool _refreshDirectory(struct GUIParams* params, const char* currentPath,
params->drawEnd();
}
struct GUIMenuItem* testItem = GUIMenuItemListGetPointer(currentFiles, item);
- if (testItem->data != (void*) VFS_FILE) {
+ if (!GUIVariantCompareUInt(testItem->data, VFS_FILE)) {
++item;
continue;
}
diff --git a/src/util/gui/menu.c b/src/util/gui/menu.c
index ddcc1bf22..0a51102d0 100644
--- a/src/util/gui/menu.c
+++ b/src/util/gui/menu.c
@@ -137,7 +137,7 @@ enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* men
if (reason != GUI_MENU_EXIT_BACK) {
return reason;
}
- } else if ((*item)->validStates && !(*item)->data) {
+ } else if ((*item)->validStates && !(*item)->data.v.p) {
_itemNext(*item, true);
} else {
return GUI_MENU_EXIT_ACCEPT;
@@ -152,7 +152,7 @@ enum GUIMenuExitReason GUIShowMenu(struct GUIParams* params, struct GUIMenu* men
params->drawStart();
if (menu->background) {
- menu->background->draw(menu->background, GUIMenuItemListGetPointer(&menu->items, menu->index)->data);
+ menu->background->draw(menu->background, GUIMenuItemListGetPointer(&menu->items, menu->index)->data.v.p);
}
if (params->guiPrepare) {
params->guiPrepare();