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. Open in archive... - In Archiv öffnen … + In Archiv öffnen … Loading... - Laden … + Laden … @@ -69,12 +69,12 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. Tile # - Tile Nr. + Tile # Palette # - Palette Nr. + Palette # @@ -1071,7 +1071,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. Palette preset - + Paletten-Voreinstellung @@ -4252,7 +4252,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. Convert e-Reader card image to raw... - 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. Default color palette only - + Nur Standard-Farbpalette SGB color palette if available - + SGB-Farbpalette, sofern verfügbar GBC color palette if available - + GBC-Farbpalette, sofern verfügbar SGB (preferred) or GBC color palette if available - + SGB (bevorzugt) oder GBC-Farbpalette, sofern verfügbar Game Boy Camera - + Game Boy Camera Driver: - + Treiber: Source: - + Quelle: @@ -5448,42 +5448,42 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. Models - + Modelle GB only: - + Nur GB: SGB compatible: - + SGB-kompatibel: GBC only: - + Nur GBC: GBC compatible: - + GBC-kompatibel: SGB and GBC compatible: - + SGB- und GBC-kompatibel: Game Boy palette - + Game Boy-Palette Preset: - + Voreinstellungen: @@ -5538,7 +5538,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. Enable VBA bug compatibility in ROM hacks - + 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. Default color palette only - + Sólo paleta de colores predeterminada SGB color palette if available - + Paleta de color SGB si está disponible GBC color palette if available - + Paleta de color GBC si está disponible SGB (preferred) or GBC color palette if available - + Paleta de colores SGB (preferida) o GBC si está disponible Game Boy Camera - + Cámara Game Boy Driver: - + Controlador: Source: - + Fuente: @@ -5362,12 +5362,12 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Enable VBA bug compatibility in ROM hacks - + Activar modo de compatibilidad VBA en ROM hacks Preset: - + Ajustes: @@ -5662,37 +5662,37 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Models - + Modelos GB only: - + Sólo GB: SGB compatible: - + Compatible con SGB: GBC only: - + Sólo GBC: GBC compatible: - + Compatible con GBC: SGB and GBC compatible: - + Compatible con SGB y GBC: Game Boy palette - + 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. Sprite Colors 1 - Couleurs du Sprite nº 1 + Couleurs du Sprite nº 1 Sprite Colors 2 - 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 + 2021 @@ -1446,17 +1446,17 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Mode 0: 4 tile layers - Mode 0 : 4 couches de tuile + Mode 0 : 4 couches de tuile Mode 1: 2 tile layers + 1 rotated/scaled tile layer - 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 rotated/scaled tile layers - 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. Enable background 0 - Activer l'arrière-plan nº 0 + Activer l'arrière-plan nº 0 Enable background 1 - Activer l'arrière-plan nº 1 + Activer l'arrière-plan nº 1 Enable background 2 - Activer l'arrière-plan nº 2 + Activer l'arrière-plan nº 2 Enable background 3 - 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. Enable Window 0 - Activer la fenêtre nº 0 + Activer la fenêtre nº 0 Enable Window 1 - 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. Window 0 enable BG 0 - La fenêtre nº 0 active l'arrière plan nº 0 + La fenêtre nº 0 active l'arrière plan nº 0 Window 0 enable BG 1 - La fenêtre nº 0 active l'arrière plan nº 1 + La fenêtre nº 0 active l'arrière plan nº 1 Window 0 enable BG 2 - La fenêtre nº 0 active l'arrière plan nº 2 + La fenêtre nº 0 active l'arrière plan nº 2 Window 0 enable BG 3 - La fenêtre nº 0 active l'arrière plan nº 3 + La fenêtre nº 0 active l'arrière plan nº 3 Window 0 enable OBJ - La fenêtre nº 0 active l'OBJ + La fenêtre nº 0 active l'OBJ Window 0 enable blend - La fenêtre nº 0 active le mixage + La fenêtre nº 0 active le mixage Window 1 enable BG 0 - La fenêtre nº 1 active l'arrière plan nº 0 + La fenêtre nº 1 active l'arrière plan nº 0 Window 1 enable BG 1 - La fenêtre nº 1 active l'arrière plan nº 1 + La fenêtre nº 1 active l'arrière plan nº 1 Window 1 enable BG 2 - La fenêtre nº 1 active l'arrière plan nº 2 + La fenêtre nº 1 active l'arrière plan nº 2 Window 1 enable BG 3 - La fenêtre nº 1 active l'arrière plan nº 3 + La fenêtre nº 1 active l'arrière plan nº 3 Window 1 enable OBJ - La fenêtre nº 1 active l'OBJ + La fenêtre nº 1 active l'OBJ Window 1 enable blend - La fenêtre nº 1 active le mixage + La fenêtre nº 1 active le mixage Outside window enable BG 0 - La fenêtre extérieure active l'arrière plan nº 0 + La fenêtre extérieure active l'arrière plan nº 0 Outside window enable BG 1 - La fenêtre extérieure active l'arrière plan nº 1 + La fenêtre extérieure active l'arrière plan nº 1 Outside window enable BG 2 - La fenêtre extérieure active l'arrière plan nº 2 + La fenêtre extérieure active l'arrière plan nº 2 Outside window enable BG 3 - 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. Sweep time (in 1/128s) - 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 % + 0 % 100% - 100 % + 100 % 50% - 50 % + 50 % 25% - 25 % + 25 % @@ -2119,7 +2119,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. 75% - 75 % + 75 % @@ -2944,17 +2944,17 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. 4.19MHz - 4,19 MHz + 4,19 MHz 8.38MHz - 8,38 MHz + 8,38 MHz 16.78MHz - 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 + [%1] %2 : %3 @@ -4836,7 +4836,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Game name: - Nom du jeu : + Nom du jeu : @@ -5271,7 +5271,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. FPS target: - IPS ciblée : + IPS ciblée : @@ -5727,7 +5727,7 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. Default sprite colors 1: - 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. Game Boy-only model: - Modèle Game Boy uniquement : + Modèle Game Boy uniquement : Game Boy Color-only model: - Modèle Game Boy uniquement : + Modèle Game Boy uniquement : Game Boy/Game Boy Color model: - 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 @@ About - + Névjegy <a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a> - + <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> Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> - + Git-ág: <tt>{gitBranch}</tt><br/>Revízió: <tt>{gitCommit}</tt> {projectName} would like to thank the following patrons from Patreon: - + Az {projectName} szeretne köszönetet nyilvánítani a következő Patreon-támogatóknak: © 2013 – {year} Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - + © 2013 – {year} Jeffrey Pfau, a Mozilla Public License 2.0 alatt licencelve +A Game Boy Advance a Nintendo Co., Ltd. bejegyzett védjegye {projectName} is an open-source Game Boy Advance emulator - + 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. Open in archive... - + Archívum megnyitása... Loading... - + Betöltés... @@ -58,27 +59,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Palette # - + Paletta # Address - + Cím Red - + Piros Green - + Zöld Blue - + Kék @@ -164,37 +165,37 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Cheats - + Csalások Remove - + Eltávolítás Save - + Mentés Load - + Betöltés Add New Set - + Új kollekció hozzáadása Add - + Hozzáadás Enter codes here... - + Írd ide a kódokat... @@ -202,17 +203,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Debugger - + Hibakereső Enter command (try `help` for more info) - + Parancsbevitel (több információ: `help`) Break - + Törés @@ -220,37 +221,37 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Connect to Dolphin - + Csatlakozás Dolphin emulátorhoz Local computer - + Helyi számítógép IP address - + IP-cím Connect - + Csatlakozás Disconnect - + Kapcsolat bontása Close - + Bezárás Reset on connect - + Emuláció újraindítása csatlakozáskor @@ -258,37 +259,37 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Inspect frame - + Képkocka vizsgáló Magnification - + Nagyítás Freeze frame - + Képkocka befagyasztása Backdrop color - + Háttérszín Disable scanline effects - + Pásztázó/Scanline-effektusok letiltása Export - + Exportálás Reset - + Visszaállítás @@ -296,47 +297,47 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Record GIF/WebP/APNG - + GIF/WebP/APNG felvétel készítése Loop - + Újrajátszás Start - + Indít Stop - + Leállít Select File - + Fájl kiválasztása APNG - + APNG GIF - + GIF WebP - + WebP Frameskip - + Képkockák kihagyása @@ -344,7 +345,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. I/O Viewer - + I/O-vizsgáló @@ -462,62 +463,62 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Logs - + Naplók Enabled Levels - + Engedélyezett szintek Debug - + Debug Stub - + Csonk (Stub) Info - + Infó Warning - + Figyelmeztetés (Warning) Error - + Hiba Fatal - + Végzetes hiba Game Error - + Játékbeli hiba Advanced settings - + Haladó beállítások Clear - + Napló törlése Max Lines - + Sorok maximális száma @@ -530,17 +531,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Magnification - + Nagyítás Export - + Exportálás Copy - + Másolás @@ -548,17 +549,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Save Memory Range - + Memóriarégió mentése Start Address: - + Kezdőcím: Byte Count: - + Bájtok száma: @@ -571,149 +572,149 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Memory Search - + Keresés memóriában Address - + Cím Current Value - + Jelenlegi érték Type - + Típus Value - + Érték Numeric - + Numerikus Text - + Szöveg Width - + Szélesség Guess - + Sejtés alapján 1 Byte (8-bit) - + 1 Bájt (8-bites) 2 Bytes (16-bit) - + 2 Bájt (16-bites) 4 Bytes (32-bit) - + 4 Bájt (32-bites) Number type - + Számérték típusa Decimal - + Decimális Hexadecimal - + Hexadecimális Search type - + Keresés típusa Equal to value - + Értékkel megegyező Greater than value - + Értéknél nagyobb Less than value - + Értéknél kisebb Unknown/changed - + Ismeretlen/megváltozott Changed by value - + Értéknyivel megváltozott Unchanged - + Változatlan Increased - + Növekedett Decreased - + Lecsökkent Search ROM - + Keresés ROM-ban New Search - + Új keresés Search Within - + Keresés a jelenlegi listában Open in Memory Viewer - + Megnyitás a memórianézegetőben Refresh - + Frissítés @@ -721,77 +722,77 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Memory - + Memória Inspect Address: - + Cím vizsgálata: Set Alignment: - + Igazítás beállítása: &1 Byte - + &1 bájt &2 Bytes - + &2 bájt &4 Bytes - + &4 bájt Unsigned Integer: - + Előjel nélküli egészként: Signed Integer: - + Előjeles egészként: String: - + Szövegként: Load TBL - + TBL betöltése Copy Selection - + Kiválasztott régió másolása Paste - + Beillesztés Save Selection - + Kiválasztott régió mentése Save Range - + Régió mentése Load - + Betöltés @@ -799,82 +800,82 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Sprites - + Sprite-ok Address - + Cím Copy - + Másolás Magnification - + Nagyítás Geometry - + Geometria Position - + Pozíció , - + , Dimensions - + Méretek × - + × Matrix - + Mátrix Export - + Exportálás Attributes - + Attribútumok Transform - + Transzformáció Off - + Ki Palette - + Paletta Double Size - + Kétszeres méret @@ -887,49 +888,49 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Flipped - + Megfordítás H Short for horizontal - + V V Short for vertical - + F Mode - + Mód Normal - + Normál Mosaic - + Mozaik Enabled - + Engedélyezve Priority - + Prioritás Tile - + Mező @@ -937,12 +938,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Game Overrides - + Játékbeli felülbírálások Game Boy Advance - + Game Boy Advance @@ -950,112 +951,112 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Autodetect - + Automatikus észlelés Realtime clock - + Valósidejű óra Gyroscope - + Giroszkóp Tilt - + Dőlésérzékelő Light sensor - + Fényérzékelő Rumble - + Rezgés Save type - + Mentés típusa None - + Nincs SRAM - + SRAM Flash 512kb - + Flash 512kb Flash 1Mb - + Flash 1Mb EEPROM - + EEPROM Idle loop - + Üresjárati ciklus Game Boy Player features - + Game Boy Player funkciók VBA bug compatibility mode - + VBA bug kompatibilitási mód Game Boy - + Game Boy Game Boy model - + Game Boy modell Memory bank controller - + Memória bank vezérlő (MBC) Background Colors - + Háttérszínek Sprite Colors 1 - + Sprite-színek 1 Sprite Colors 2 - + Sprite-színek 2 Palette preset - + Paletta preset @@ -1063,62 +1064,62 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Palette - + Paletta Background - + Háttér Objects - + Objektumok Selection - + Kiválasztás Red - + Piros Green - + Zöld Blue - + Kék 16-bit value - + 16-bites érték Hex code - + Hex kód Palette index - + Paletta index Export BG - + Háttérpaletta exportálása Export OBJ - + Objektumpaletta exportálása @@ -1126,27 +1127,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Adjust placement - + Elhelyezés igazítása All - + Mind Offset - + Eltolás X - + X Y - + Y @@ -1154,27 +1155,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Game Boy Printer - + Game Boy Printer Hurry up! - + Siess! Tear off - + Leszakítás Magnification - + Nagyítás Copy - + Másolás @@ -1182,7 +1183,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 2021 - + 2021 @@ -1190,14 +1191,14 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. %0%1%2 - + %0%1%2 0x%0 (%1) - + 0x%0 (%1) @@ -1205,12 +1206,12 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. (untitled) - + (névtelen) Failed to open cheats file: %1 - + 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. Add GameShark - + GameShark kód hozzáadása Add Pro Action Replay - + Pro Action Replay kód hozzáadása Add CodeBreaker - + CodeBreaker kód hozzáadása Add GameGenie - + GameGenie kód hozzáadása Select cheats file - + Csalásfájl kiválasztása @@ -1248,27 +1249,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Failed to open save file: %1 - + Nem sikerült a mentésfájl megnyitása: %1 Failed to open game file: %1 - + Nem sikerült a játékfájl megnyitása: %1 Can't yank pack in unexpected platform! - + A játékkazettát nem lehet kirántani ismeretlen platformon! Failed to open snapshot file for reading: %1 - + A pillanatkép fájljának olvasásra való megnyitása sikertelen: %1 Failed to open snapshot file for writing: %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. Failed to open game file: %1 - + Nem sikerült a játékfájl megnyitása: %1 Could not load game. Are you sure it's in the correct format? - + A játék betöltése nem sikerült. Biztos vagy benne, hogy a megfelelő formátumú? Failed to open save file. Is the save directory writable? - + 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. Export frame - + Képkocka exportálása Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) None - + Nincs Background - + Háttér Window - + Ablak Objwin - + Objektumablak Sprite - + Sprite Backdrop - + Háttérréteg Frame - + Képkocka %1 %2 - + %1 %2 @@ -1347,7 +1348,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Enable Discord Rich Presence - + Discord Rich Presence engedélyezése @@ -1355,22 +1356,22 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Clear Button - + Gombhozzárendelés törlése Clear Analog - + Analóg hozzárendelések törlése Refresh - + Frissítés Set all - + Mind beállítása @@ -1378,32 +1379,32 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Server settings - + Szerverbeállítások Local port - + Helyi port Bind address - + Cím hozzárendelése Break - + Törés Stop - + Leállítás Start - + Indítás @@ -1413,7 +1414,7 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Could not start GDB server - + A GDB szerver elindítása nem sikerült @@ -1421,17 +1422,17 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Failed to open output file: %1 - + Nem sikerült a kimeneti fájl megnyitása: %1 Select output file - + Kimeneti fájl kiválasztása Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) - + 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. Background mode - + Háttérrajzolási mód Mode 0: 4 tile layers - + Mód 0: 4 db mezőréteg Mode 1: 2 tile layers + 1 rotated/scaled tile layer - + Mód 1: 2 db mezőréteg + 1 db forgatott/skálázott mezőréteg Mode 2: 2 rotated/scaled tile layers - + Mód 2: 2 db forgatott/skálázott mezőréteg Mode 3: Full 15-bit bitmap - + Mód 3: Teljes 15-bites bitmap Mode 4: Full 8-bit bitmap - + Mód 4: Teljes 8-bites bitmap Mode 5: Small 15-bit bitmap - + Mód 5: Kis 15-bites bitmap CGB Mode - + 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 + + + About + Perihal + + + + <a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a> + <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> + + + + Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> + + + + + {projectName} would like to thank the following patrons from Patreon: + {projectName} ingin mengucapkan terima kasih kepada para penaung dari Patreon: + + + + © 2013 – {year} Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 +Game Boy Advance is a registered trademark of Nintendo Co., Ltd. + + + + + {projectName} is an open-source Game Boy Advance emulator + {projectName} adalah sebuah pelagak Game Boy Advance sumber terbuka + + + + ArchiveInspector + + + Open in archive... + Buka dalam arkib... + + + + Loading... + Memuatkan... + + + + AssetTile + + + Tile # + Jubin # + + + + Palette # + Palet # + + + + Address + Alamat + + + + Red + Merah + + + + Green + Hijau + + + + Blue + Biru + + + + BattleChipView + + + BattleChip Gate + BattleChip Gate + + + + Chip name + Nama Chip + + + + Insert + Memasukkan + + + + Save + Simpan + + + + Load + Muat + + + + Add + Tambah + + + + Remove + Buang + + + + Gate type + Jenis Gate + + + + Ba&ttleChip Gate + Ba&ttleChip Gate + + + + Progress &Gate + Progress &Gate + + + + Beast &Link Gate + Beast &Link Gate + + + + Inserted + Dimasukkan + + + + Chip ID + + + + + Update Chip data + Kemaskini data Chip + + + + Show advanced + Lanjutan + + + + CheatsView + + + Cheats + Tipuan + + + + Remove + Buang + + + + Save + Simpan + + + + Load + Muat + + + + Add New Set + Tambah Set Baru + + + + Add + Tambah + + + + Enter codes here... + Masuk kod di sini... + + + + DebuggerConsole + + + Debugger + Penyahpepijat + + + + Enter command (try `help` for more info) + Masuk perintah (cuba `help` untuk maklumat lanjut) + + + + Break + + + + + DolphinConnector + + + Connect to Dolphin + Sambung ke Dolphin + + + + Local computer + Komputer lokal + + + + IP address + Alamat IP + + + + Connect + Sambung + + + + Disconnect + Putus + + + + Close + Tutup + + + + Reset on connect + Tetap semula pada sambungan + + + + FrameView + + + Inspect frame + Periksa bingkai + + + + Magnification + Pembesaran + + + + Freeze frame + Bingkai beku + + + + Backdrop color + + + + + Disable scanline effects + + + + + Export + Eksport + + + + Reset + Tetap semula + + + + GIFView + + + Record GIF/WebP/APNG + Rakam GIF/WebP/APNG + + + + Loop + Gelung + + + + Start + Mula + + + + Stop + Henti + + + + Select File + Pilih Fail + + + + APNG + APNG + + + + GIF + GIF + + + + WebP + WebP + + + + Frameskip + Langkauan bingkai + + + + IOViewer + + + I/O Viewer + Pelihat I/O + + + + 0x0000 + 0x0000 + + + + B + B + + + + LibraryTree + + + Name + Nama + + + + Location + Lokasi + + + + Platform + Platform + + + + Size + Saiz + + + + CRC32 + CRC32 + + + + LoadSaveState + + + + %1 State + Keadaan %1 + + + + + + + + + + + + No Save + Tiada Simpanan + + + + 5 + 5 + + + + 6 + 6 + + + + 8 + 8 + + + + 4 + 4 + + + + 1 + 1 + + + + 3 + 3 + + + + 7 + 7 + + + + 9 + 9 + + + + 2 + 2 + + + + Cancel + Batal + + + + LogView + + + Logs + Log + + + + Enabled Levels + + + + + Debug + Nyahpepijat + + + + Stub + + + + + Info + Maklumat + + + + Warning + Amaran + + + + Error + Ralat + + + + Fatal + + + + + Game Error + Ralat Permainan + + + + Advanced settings + Lanjutan + + + + Clear + Kosongkan + + + + Max Lines + + + + + MapView + + + Maps + Peta + + + + Magnification + Pembesaran + + + + Export + Eksport + + + + Copy + Salin + + + + MemoryDump + + + Save Memory Range + Simpan Julat Ingatan + + + + Start Address: + Alamat Permulaan: + + + + Byte Count: + Bilangan Bait: + + + + Dump across banks + + + + + MemorySearch + + + Memory Search + Cari Ingatan + + + + Address + Alamat + + + + Current Value + Nilai Semasa + + + + + Type + Jenis + + + + Value + Nilai + + + + Numeric + Angka + + + + Text + Teks + + + + Width + Lebar + + + + + Guess + Teka + + + + 1 Byte (8-bit) + 1 Bait (8-bit) + + + + 2 Bytes (16-bit) + 2 Bait (16-bit) + + + + 4 Bytes (32-bit) + 4 Bait (32-bit) + + + + Number type + Jenis Angka + + + + Decimal + Perpuluhan + + + + Hexadecimal + Perenambelasan + + + + Search type + Jenis carian + + + + Equal to value + Sama dgn nilai + + + + Greater than value + Lebih dari nilai + + + + Less than value + Kurang dari nilai + + + + Unknown/changed + Tdk diketahui/terubah + + + + Changed by value + + + + + Unchanged + Tidak diubah + + + + Increased + Bertambah + + + + Decreased + Berkurang + + + + Search ROM + Cari ROM + + + + New Search + Carian Baru + + + + Search Within + Cari Dalam + + + + Open in Memory Viewer + Buka dalam Pelihat Ingatan + + + + Refresh + Segar Semula + + + + MemoryView + + + Memory + Ingatan + + + + Inspect Address: + Periksa Alamat: + + + + Set Alignment: + Penjajaran: + + + + &1 Byte + &1 Bait + + + + &2 Bytes + &2 Bait + + + + &4 Bytes + &4 Bait + + + + Unsigned Integer: + Integer tanpa tanda: + + + + Signed Integer: + Integer tanda: + + + + String: + Rentetan: + + + + Load TBL + Muat TBL + + + + Copy Selection + Salin Pilihan + + + + Paste + Tampal + + + + Save Selection + Simpan Pilihan + + + + Save Range + Simpan Julat + + + + Load + Muat + + + + ObjView + + + Sprites + + + + + Address + Alamat + + + + Copy + Salin + + + + Magnification + Pembesaran + + + + Geometry + Geometri + + + + Position + Kedudukan + + + + , + , + + + + Dimensions + Matra + + + + × + × + + + + Matrix + Matriks + + + + Export + Eksport + + + + Attributes + Ciri-ciri + + + + Transform + Jelmaan + + + + Off + + + + + Palette + Palet + + + + Double Size + + + + + + + + Return, Ctrl+R + Kembali, Ctrl+R + + + + Flipped + + + + + H + Short for horizontal + + + + + V + Short for vertical + + + + + Mode + Mod + + + + Normal + Biasa + + + + Mosaic + Mozek + + + + Enabled + + + + + Priority + + + + + Tile + Jubin + + + + OverrideView + + + Game Overrides + + + + + Game Boy Advance + Game Boy Advance + + + + + + + Autodetect + Autokesan + + + + Realtime clock + + + + + Gyroscope + + + + + Tilt + + + + + Light sensor + + + + + Rumble + + + + + Save type + + + + + None + + + + + SRAM + + + + + Flash 512kb + + + + + Flash 1Mb + + + + + EEPROM + + + + + Idle loop + + + + + Game Boy Player features + + + + + VBA bug compatibility mode + + + + + Game Boy + + + + + Game Boy model + + + + + Memory bank controller + + + + + Background Colors + + + + + Sprite Colors 1 + + + + + Sprite Colors 2 + + + + + Palette preset + + + + + PaletteView + + + Palette + Palet + + + + Background + Latar belakang + + + + Objects + Objek + + + + Selection + Pilihan + + + + Red + Merah + + + + Green + Hijau + + + + Blue + Biru + + + + 16-bit value + Nilai 16-bit + + + + Hex code + Kod per-16-an + + + + Palette index + Indeks palet + + + + Export BG + Eksport LB + + + + Export OBJ + Eksport OBJ + + + + PlacementControl + + + Adjust placement + Melaras peletakan + + + + All + Semua + + + + Offset + Ofset + + + + X + X + + + + Y + Y + + + + PrinterView + + + Game Boy Printer + Pencetak Game Boy + + + + Hurry up! + Cepat! + + + + Tear off + + + + + Magnification + Pembesaran + + + + Copy + Salin + + + + QGBA::AboutScreen + + + 2021 + 2021 + + + + QGBA::AssetTile + + + %0%1%2 + %0%1%2 + + + + + + 0x%0 (%1) + 0x%0 (%1) + + + + QGBA::CheatsModel + + + (untitled) + (tidak bertajuk) + + + + Failed to open cheats file: %1 + Gagal membuka fail tipu: %1 + + + + QGBA::CheatsView + + + + Add GameShark + Tambah GameShark + + + + Add Pro Action Replay + Tambah Pro Action Replay + + + + Add CodeBreaker + Tambah CodeBreaker + + + + Add GameGenie + Tambah GameGenie + + + + + Select cheats file + Pilih fail tipu + + + + QGBA::CoreController + + + Failed to open save file: %1 + Gagal membuka fail tersimpan: %1 + + + + Failed to open game file: %1 + Gagal membuka fail permainan: %1 + + + + Can't yank pack in unexpected platform! + + + + + Failed to open snapshot file for reading: %1 + Gagal membuka fail snapshot untuk baca: %1 + + + + Failed to open snapshot file for writing: %1 + Gagal membuka fail snapshot untuk menulis: %1 + + + + QGBA::CoreManager + + + Failed to open game file: %1 + Gagal membuka fail permainan: %1 + + + + Could not load game. Are you sure it's in the correct format? + Gagal memuat permainan. Adakah ia dalam format betul? + + + + Failed to open save file. Is the save directory writable? + Gagal membuka fail tersimpan. Adakah direktori simpanan diboleh-tulis? + + + + QGBA::FrameView + + + Export frame + Eksport bingkai + + + + Portable Network Graphics (*.png) + Grafik Rangkaian Mudah Alih (*.png) + + + + None + Tiada + + + + Background + Latar belakang + + + + Window + Tetingkap + + + + Objwin + Objwin + + + + Sprite + + + + + Backdrop + + + + + Frame + Bingkai + + + + %1 %2 + %1 %2 + + + + QGBA::GBAApp + + + Enable Discord Rich Presence + Dayakan Discord Rich Presence + + + + QGBA::GBAKeyEditor + + + Clear Button + + + + + Clear Analog + + + + + Refresh + Segar Semula + + + + Set all + + + + + QGBA::GDBWindow + + + Server settings + Tetapan pelayan + + + + Local port + Port lokal + + + + Bind address + Alamat terikat + + + + Break + + + + + Stop + Henti + + + + Start + Mula + + + + Crash + Nahas + + + + Could not start GDB server + Tidak dapat memulakan pelayan GDB + + + + QGBA::GIFView + + + Failed to open output file: %1 + Gagal membuka fail output: %1 + + + + Select output file + Pilih fail output + + + + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) + Format Saling Tukar Grafik (*.gif);;WebP ( *.webp);;Grafik Rangkaian Animasi Mudah Alih (*.png *.apng) + + + + QGBA::IOViewer + + + Background mode + Mod latar belakang + + + + Mode 0: 4 tile layers + Mod 0: 4 lapisan jubin + + + + Mode 1: 2 tile layers + 1 rotated/scaled tile layer + Mod 1: 2 lapisan jubin + 1 lapisan jubin terputar/terskala + + + + Mode 2: 2 rotated/scaled tile layers + Mod 2: 2 lapisan jubin terputar/terskala + + + + Mode 3: Full 15-bit bitmap + Mod 3: Bitmap 15-bit penuh + + + + Mode 4: Full 8-bit bitmap + Mod 4: Bitmap 8-bit penuh + + + + Mode 5: Small 15-bit bitmap + Mod 5: Bitmap 15-bit kecil + + + + CGB Mode + Mod CGB + + + + Frame select + Pilihan Bingkai + + + + Unlocked HBlank + + + + + Linear OBJ tile mapping + Pemetaan jubin OBJ linear + + + + Force blank screen + Paksa skrin kosong + + + + Enable background 0 + + + + + Enable background 1 + + + + + Enable background 2 + + + + + Enable background 3 + + + + + Enable OBJ + + + + + Enable Window 0 + + + + + Enable Window 1 + + + + + Enable OBJ Window + + + + + Swap green components + + + + + Currently in VBlank + + + + + Currently in HBlank + + + + + Currently in VCounter + + + + + Enable VBlank IRQ generation + + + + + Enable HBlank IRQ generation + + + + + Enable VCounter IRQ generation + + + + + VCounter scanline + + + + + Current scanline + + + + + + + + Priority + + + + + + + + Tile data base (* 16kB) + + + + + + + + Enable mosaic + + + + + + + + Enable 256-color + + + + + + + + Tile map base (* 2kB) + + + + + + + + Background dimensions + + + + + + Overflow wraps + + + + + + + + + + Horizontal offset + + + + + + + + + + Vertical offset + + + + + + + + + + + + + + + + Fractional part + + + + + + + + + + + + Integer part + + + + + + + + Integer part (low) + + + + + + + + Integer part (high) + + + + + + End x + + + + + + Start x + + + + + + End y + + + + + + Start y + + + + + Window 0 enable BG 0 + + + + + Window 0 enable BG 1 + + + + + Window 0 enable BG 2 + + + + + Window 0 enable BG 3 + + + + + Window 0 enable OBJ + + + + + Window 0 enable blend + + + + + Window 1 enable BG 0 + + + + + Window 1 enable BG 1 + + + + + Window 1 enable BG 2 + + + + + Window 1 enable BG 3 + + + + + Window 1 enable OBJ + + + + + Window 1 enable blend + + + + + Outside window enable BG 0 + + + + + Outside window enable BG 1 + + + + + Outside window enable BG 2 + + + + + Outside window enable BG 3 + + + + + Outside window enable OBJ + + + + + Outside window enable blend + + + + + OBJ window enable BG 0 + + + + + OBJ window enable BG 1 + + + + + OBJ window enable BG 2 + + + + + OBJ window enable BG 3 + + + + + OBJ window enable OBJ + + + + + OBJ window enable blend + + + + + Background mosaic size vertical + + + + + Background mosaic size horizontal + + + + + Object mosaic size vertical + + + + + Object mosaic size horizontal + + + + + BG 0 target 1 + + + + + BG 1 target 1 + + + + + BG 2 target 1 + + + + + BG 3 target 1 + + + + + OBJ target 1 + + + + + Backdrop target 1 + + + + + Blend mode + + + + + Disabled + + + + + Additive blending + + + + + Brighten + + + + + Darken + + + + + BG 0 target 2 + + + + + BG 1 target 2 + + + + + BG 2 target 2 + + + + + BG 3 target 2 + + + + + OBJ target 2 + + + + + Backdrop target 2 + + + + + Blend A (target 1) + + + + + Blend B (target 2) + + + + + Blend Y + + + + + + Sweep shifts + + + + + + Sweep subtract + + + + + + Sweep time (in 1/128s) + + + + + + + + + + + + Sound length + + + + + + + + Duty cycle + + + + + + + + + + Envelope step time + + + + + + + + + + Envelope increase + + + + + + + + + + Initial volume + + + + + + + Sound frequency + + + + + + + + + + + + Timed + + + + + + + + + + + + Reset + + + + + Double-size wave table + + + + + Active wave table + + + + + + Enable channel 3 + + + + + + Volume + + + + + + 0% + + + + + + + 100% + + + + + + + 50% + + + + + + + 25% + + + + + + + + 75% + + + + + + Clock divider + + + + + + Register stages + + + + + + 15 + + + + + + 7 + + + + + + Shifter frequency + + + + + PSG volume right + + + + + PSG volume left + + + + + + Enable channel 1 right + + + + + + Enable channel 2 right + + + + + + Enable channel 3 right + + + + + + Enable channel 4 right + + + + + + Enable channel 1 left + + + + + + Enable channel 2 left + + + + + + Enable channel 3 left + + + + + + Enable channel 4 left + + + + + PSG master volume + + + + + Loud channel A + + + + + Loud channel B + + + + + Enable channel A right + + + + + Enable channel A left + + + + + Channel A timer + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + Channel A reset + + + + + Enable channel B right + + + + + Enable channel B left + + + + + Channel B timer + + + + + Channel B reset + + + + + + Active channel 1 + + + + + + Active channel 2 + + + + + + Active channel 3 + + + + + + Active channel 4 + + + + + + Enable audio + + + + + Bias + + + + + Resolution + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sample + + + + + + + + + + + + Address (low) + + + + + + + + + + + + Address (high) + + + + + + + Sound frequency (low) + + + + + + + Sound frequency (high) + + + + + Source (high) + + + + + Source (low) + + + + + Destination (high) + + + + + Destination (low) + + + + + + Green (low) + + + + + + Green (high) + + + + + + + + Word count + + + + + + + + Destination offset + + + + + + + + + + + + Increment + + + + + + + + + + + + Decrement + + + + + + + + + + + + Fixed + + + + + + + + Increment and reload + + + + + + + + Source offset + + + + + + + + Repeat + + + + + + + + 32-bit + + + + + + + + Start timing + + + + + + + + + Immediate + + + + + + + + + + + + VBlank + + + + + + + + + + + HBlank + + + + + + + + + + + + + IRQ + + + + + + + + + + + + + + + Enable + + + + + + + Audio FIFO + + + + + Video Capture + + + + + DRQ + + + + + + + + + + + + Value + + + + + + + + Scale + + + + + + + + + 1/64 + + + + + + + + + 1/256 + + + + + + + + + 1/1024 + + + + + + + Cascade + + + + + + A + + + + + + B + + + + + + Select + + + + + + Start + + + + + + Right + + + + + + Left + + + + + + Up + + + + + + Down + + + + + + R + + + + + + L + + + + + Condition + + + + + SC + + + + + SD + + + + + SI + + + + + SO + + + + + + VCounter + + + + + + Timer 0 + + + + + + Timer 1 + + + + + + Timer 2 + + + + + + Timer 3 + + + + + + SIO + + + + + + DMA 0 + + + + + + DMA 1 + + + + + + DMA 2 + + + + + + DMA 3 + + + + + + Keypad + + + + + + Gamepak + + + + + SRAM wait + + + + + + + + + 4 + + + + + + + + 3 + + + + + + + + + 2 + + + + + + + + + 8 + + + + + Cart 0 non-sequential + + + + + Cart 0 sequential + + + + + Cart 1 non-sequential + + + + + Cart 1 sequential + + + + + Cart 2 non-sequential + + + + + Cart 2 sequential + + + + + PHI terminal + + + + + + Disable + + + + + 4.19MHz + + + + + 8.38MHz + + + + + 16.78MHz + + + + + Gamepak prefetch + + + + + Enable IRQs + + + + + Right/A + + + + + Left/B + + + + + Up/Select + + + + + Down/Start + + + + + Active D-pad + + + + + Active face buttons + + + + + Internal clock + + + + + 32× clocking (CGB only) + + + + + Transfer active + + + + + Divider + + + + + 1/16 + + + + + + LCD STAT + + + + + + Timer + + + + + + Serial + + + + + + Joypad + + + + + Volume right + + + + + Output right + + + + + Volume left + + + + + Output left + + + + + Background enable/priority + + + + + Enable sprites + + + + + Double-height sprites + + + + + Background tile map + + + + + + 0x9800 – 0x9BFF + + + + + + 0x9C00 – 0x9FFF + + + + + Background tile data + + + + + 0x8800 – 0x87FF + + + + + 0x8000 – 0x8FFF + + + + + Enable window + + + + + Window tile map + + + + + Enable LCD + + + + + Mode + + + + + 0: HBlank + + + + + 1: VBlank + + + + + 2: OAM scan + + + + + 3: HDraw + + + + + In LYC + + + + + Enable HBlank (mode 0) IRQ + + + + + Enable VBlank (mode 1) IRQ + + + + + Enable OAM (mode 2) IRQ + + + + + Enable LYC IRQ + + + + + Current Y coordinate + + + + + Comparison Y coordinate + + + + + Start upper byte + + + + + + + Color 0 shade + + + + + + + Color 1 shade + + + + + + + Color 2 shade + + + + + + + Color 3 shade + + + + + Prepare to switch speed + + + + + Double speed + + + + + VRAM bank + + + + + Length + + + + + Timing + + + + + Write bit + + + + + Read bit + + + + + + Unknown + + + + + + Current index + + + + + + Auto-increment + + + + + + Red + + + + + + Blue + + + + + Sprite ordering + + + + + OAM order + + + + + x coordinate sorting + + + + + WRAM bank + + + + + QGBA::KeyEditor + + + + --- + --- + + + + Super (L) + Super (L) + + + + Super (R) + Super (R) + + + + Menu + Menu + + + + QGBA::LoadSaveState + + + Load State + Keadaan Termuat + + + + Save State + Keadaan Tersimpan + + + + Empty + Kosong + + + + Corrupted + Rosak + + + + Slot %1 + Slot %1 + + + + QGBA::LogConfigModel + + + + Default + Piawai + + + + Fatal + + + + + Error + Ralat + + + + Warning + Amaran + + + + Info + Maklumat + + + + Debug + Nyahpepijat + + + + Stub + Kontot + + + + Game Error + Ralat Permainan + + + + QGBA::LogController + + + [%1] %2: %3 + [%1] %2: %3 + + + + An error occurred + Ralat dilakukan + + + + DEBUG + NYAHPEPIJAT + + + + STUB + KONTOT + + + + INFO + MAKLUMAT + + + + WARN + AMARAN + + + + ERROR + RALAT + + + + FATAL + + + + + GAME ERROR + RALAT PERMAINAN + + + + QGBA::MapView + + + Priority + Keutamaan + + + + + Map base + Dasar peta + + + + + Tile base + Dasar Jubin + + + + Size + Saiz + + + + + Offset + Ofset + + + + Xform + Xform + + + + Map Addr. + Alamat Peta + + + + Mirror + Cermin + + + + None + Tiada + + + + Both + + + + + Horizontal + + + + + Vertical + + + + + + + N/A + + + + + Export map + Eksport peta + + + + Portable Network Graphics (*.png) + Grafik Rangkaian Mudah Alih (*.png) + + + + QGBA::MemoryDump + + + Save memory region + Simpan sekitar ingatan + + + + Failed to open output file: %1 + Gagal membuka fail output: %1 + + + + QGBA::MemoryModel + + + Copy selection + Salin pilihan + + + + Save selection + Simpan pilihan + + + + Paste + Tampal + + + + Load + Muat + + + + All + Semua + + + + Load TBL + Muat TBL + + + + Save selected memory + Simpan ingatan terpilih + + + + Failed to open output file: %1 + Gagal membuka fail output: %1 + + + + Load memory + Muat ingatan + + + + Failed to open input file: %1 + Gagal membuka fail input: %1 + + + + TBL + TBL + + + + ISO-8859-1 + ISO-8859-1 + + + + QGBA::MemorySearch + + + (%0/%1×) + (%0/%1×) + + + + (⅟%0×) + (⅟%0×) + + + + (%0×) + (%0×) + + + + %1 byte%2 + %1 bait%2 + + + + QGBA::ObjView + + + + 0x%0 + + + + + Off + + + + + + + + + + + + --- + + + + + Normal + + + + + Trans + + + + + OBJWIN + + + + + Invalid + + + + + + N/A + + + + + Export sprite + + + + + Portable Network Graphics (*.png) + + + + + QGBA::OverrideView + + + Official MBCs + + + + + Licensed MBCs + + + + + Unlicensed MBCs + + + + + QGBA::PaletteView + + + #%0 + #%0 + + + + 0x%0 + 0x%0 + + + + + + + 0x%0 (%1) + 0x%0 (%1) + + + + Export palette + Eksport palet + + + + Windows PAL (*.pal);;Adobe Color Table (*.act) + Windows PAL (*.pal);;Jadual Warna Adobe(*.act) + + + + Failed to open output palette file: %1 + Gagal membuka fail palet output: %1 + + + + QGBA::ROMInfo + + + + + + + (unknown) + (tidak diketahui) + + + + + bytes + bait + + + + (no database present) + (tiada pangkalan data hadir) + + + + QGBA::ReportView + + + Bug report archive + Arkib laporan pepijat + + + + ZIP archive (*.zip) + Arkib ZIP (*.zip) + + + + QGBA::SaveConverter + + + Save games and save states (%1) + Simpanan permainan dan keadaan tersimpan (%1) + + + + Select save game or save state + Pilih simpanan permainan atau keadaan tersimpan + + + + Save games (%1) + Simpanan permainan (%1) + + + + Select save game + Pilih simpanan permainan + + + + Conversion failed + Penukaran gagal + + + + Failed to convert the save game. This is probably a bug. + Gagal menukar simpanan permainan. Mungkin ini suatu pepijat. + + + + No file selected + Tiada pilihan + + + + Could not open file + Tidak dapat membuka fail + + + + No valid formats found + Tiada format yang sah ditemui + + + + Please select a valid input file + Sila pilih fail input yang sah + + + + No valid conversions found + Tiada penukaran yang sah ditemui + + + + Cannot convert save games between platforms + Tidak boleh menukar simpanan permainan antara platform + + + + QGBA::SettingsView + + + + Qt Multimedia + Multimedia Qt + + + + SDL + SDL + + + + Software (Qt) + Perisian (Qt) + + + + OpenGL + OpenGL + + + + OpenGL (force version 1.x) + OpenGL (paksa versi 1.x) + + + + None (Still Image) + Tiada (Gambar Tenang) + + + + Keyboard + Papan Kekunci + + + + Controllers + Pengawal + + + + Shortcuts + Pintas + + + + + Shaders + + + + + Select BIOS + Pilih BIOS + + + + Select directory + Pilih direktori + + + + (%1×%2) + (%1×%2) + + + + QGBA::ShaderSelector + + + No shader active + + + + + Load shader + + + + + No shader loaded + + + + + by %1 + + + + + Preprocessing + + + + + Pass %1 + + + + + QGBA::ShortcutModel + + + Action + + + + + Keyboard + + + + + Gamepad + + + + + QGBA::TileView + + + Export tiles + Eksport jubin + + + + + Portable Network Graphics (*.png) + Grafik Rangkaian Mudah Alih (*.png) + + + + Export tile + Eksport jubin + + + + QGBA::VideoView + + + Failed to open output video file: %1 + Gagal membuka fail video output: %1 + + + + Native (%0x%1) + Asal (%0x%1) + + + + Select output file + Pilih fail output + + + + QGBA::Window + + + Game Boy Advance ROMs (%1) + ROM Game Boy Advance (%1) + + + + Game Boy ROMs (%1) + ROM Game Boy (%1) + + + + All ROMs (%1) + Semua ROM (%1) + + + + %1 Video Logs (*.mvl) + %1 Log Video (*.mvl) + + + + Archives (%1) + Arkib (%1) + + + + + + Select ROM + Pilih ROM + + + + Select folder + Pilih folder + + + + + Select save + + + + + Select patch + + + + + Patches (*.ips *.ups *.bps) + + + + + Select e-Reader dotcode + + + + + e-Reader card (*.raw *.bin *.bmp) + + + + + Select image + Pilih gambar + + + + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) + Fail gambar (*.png *.gif *.jpg *.jpeg);;Semua fail (*) + + + + + GameShark saves (*.sps *.xps) + Simpanan GameShark (*.sps *.xps) + + + + Select video log + Pilih log video + + + + Video logs (*.mvl) + Log video (*.mvl) + + + + Crash + Nahas + + + + The game has crashed with the following error: + +%1 + Permainan menjemput nahas dengan ralat berikut: + +%1 + + + + Couldn't Start + Tidak dapat memula + + + + Could not start game. + Permainan tidak dapat bermula. + + + + Unimplemented BIOS call + Panggilan BIOS yg belum dilaksanakan + + + + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. + Permainan ini menggunakan panggilan BIOS yang belum dilaksanakan. Sila pakai BIOS rasmi untuk pengalaman yang lebih baik. + + + + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. + Gagal mencipta peranti paparan yang sesuai, berbalik ke paparan perisian. Permainan mungkin menjadi lembap, terutamanya dengan tetingkap besar. + + + + Really make portable? + Betulkah mahu buat jadi mudah alih? + + + + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? + Ini akan menetapkan pelagak untuk muat konfigurasi dari direktori yang sama dengan fail bolehlakunya. Teruskan? + + + + Restart needed + Mula semula diperlukan + + + + Some changes will not take effect until the emulator is restarted. + Beberapa perubahan tidak akan dilaksanakan sehingga pelagak dimula semula. + + + + - Player %1 of %2 + - Pemain %1 dari %2 + + + + %1 - %2 + %1 - %2 + + + + %1 - %2 - %3 + %1 - %2 - %3 + + + + %1 - %2 (%3 fps) - %4 + %1 - %2 (%3 fps) - %4 + + + + &File + &File + + + + Load &ROM... + Muat %ROM... + + + + Load ROM in archive... + Muat ROM daripada arkib... + + + + Add folder to library... + Tambah folder ke perpustakaan... + + + + Save games (%1) + Simpanan permainan (%1) + + + + Select save game + Pilih simpanan permainan + + + + mGBA save state files (%1) + mGBA fail keadaan tersimpan (%1) + + + + + Select save state + Pilih keadaan tersimpan + + + + Select e-Reader card images + + + + + Image file (*.png *.jpg *.jpeg) + Fail gambar (*.png *.jpg *.jpeg) + + + + Conversion finished + + + + + %1 of %2 e-Reader cards converted successfully. + + + + + Load alternate save game... + Muat simpanan permainan alternatif... + + + + Load temporary save game... + Muat simpanan permainan sementara... + + + + Load &patch... + + + + + Boot BIOS + But BIOS + + + + Replace ROM... + Ganti ROM... + + + + Scan e-Reader dotcodes... + + + + + Convert e-Reader card image to raw... + + + + + ROM &info... + &Perihal ROM... + + + + Recent + Terkini + + + + Make portable + Buat jadi mudah alih + + + + &Load state + &Muat keadaan + + + + Load state file... + Muat fail keadaan... + + + + &Save state + &Simpan keadaan + + + + Save state file... + Simpan fail keadaan... + + + + Quick load + + + + + Quick save + + + + + Load recent + Muat terkini + + + + Save recent + Simpan terkini + + + + Undo load state + Buat asal keadaan termuat + + + + Undo save state + Buat asal keadaan tersimpan + + + + + State &%1 + Keadaan &%1 + + + + Load camera image... + Muat gambar kamera... + + + + Convert save game... + Tukar simpanan permainan... + + + + Import GameShark Save... + Import Simpanan GameShark... + + + + Export GameShark Save... + Eksport Simpanan GameShark... + + + + New multiplayer window + Tetingkap multipemain baru + + + + Connect to Dolphin... + Sambung ke Dolphin... + + + + Report bug... + Laporkan pepijat... + + + + About... + Perihal... + + + + E&xit + &Keluar + + + + &Emulation + Pe&lagak + + + + &Reset + + + + + Sh&utdown + &Matikan + + + + Yank game pak + Alih keluar Game Pak + + + + &Pause + &Jeda + + + + &Next frame + Bingkai se&terusnya + + + + Fast forward (held) + Mundar laju (pegang) + + + + &Fast forward + Mundar &laju + + + + Fast forward speed + Kelajuan mundar laju + + + + Unbounded + Tidak terbatas + + + + %0x + %0x + + + + Rewind (held) + Putar balik (pegang) + + + + Re&wind + Ma&ndir + + + + Step backwards + Langkah belakang + + + + Sync to &video + Segerak ke &video + + + + Sync to &audio + Segerak ke &audio + + + + Solar sensor + Pengesan suria + + + + Increase solar level + Meningkatkan aras suria + + + + Decrease solar level + Mengurangkan aras suria + + + + Brightest solar level + Aras suria paling terang + + + + Darkest solar level + Aras suria paling gelap + + + + Brightness %1 + Kecerahan %1 + + + + Game Boy Printer... + Pencetak Game Boy... + + + + BattleChip Gate... + BattleChip Gate... + + + + Audio/&Video + Audio/&Video + + + + Frame size + Saiz bingkai + + + + %1× + %1× + + + + Toggle fullscreen + Togol skrinpenuh + + + + Lock aspect ratio + Kekalkan nisbah aspek + + + + Force integer scaling + Paksa skala integer + + + + Interframe blending + + + + + Bilinear filtering + + + + + Frame&skip + Langkauan &bingkai + + + + Mute + Senyap + + + + FPS target + Sasaran FPS + + + + Native (59.7275) + Asal (59.7275) + + + + Take &screenshot + Ambil &cekupan skrin + + + + F12 + F12 + + + + Record A/V... + Rakam A/V... + + + + Record GIF/WebP/APNG... + Rakam GIF/WebP/APNG... + + + + Video layers + Lapisan video + + + + Audio channels + Saluran audio + + + + Adjust layer placement... + Melaras peletakan lapisan... + + + + &Tools + &Alat + + + + View &logs... + Lihat &log... + + + + Game &overrides... + + + + + Game Pak sensors... + Pengesan Game Pak... + + + + &Cheats... + &Tipu... + + + + Settings... + Tetapan... + + + + Open debugger console... + Buka konsol penyahpepijat... + + + + Start &GDB server... + Mula pelayan &GDB... + + + + View &palette... + Pelihat &palet... + + + + View &sprites... + + + + + View &tiles... + Pelihat &jubin... + + + + View &map... + Pelihat pe&ta... + + + + &Frame inspector... + Periksa &bingkai... + + + + View memory... + Lihat ingatan... + + + + Search memory... + Cari ingatan... + + + + View &I/O registers... + Lihat daftar &I/O... + + + + Record debug video log... + Rakam log video nyahpepijat... + + + + Stop debug video log + Henti log video nyahpepijat + + + + Exit fullscreen + Keluar skrinpenuh + + + + GameShark Button (held) + Butang GameShark (pegang) + + + + Autofire + + + + + Autofire A + + + + + Autofire B + + + + + Autofire L + + + + + Autofire R + + + + + Autofire Start + + + + + Autofire Select + + + + + Autofire Up + + + + + Autofire Right + + + + + Autofire Down + + + + + Autofire Left + + + + + Clear + Kosongkan + + + + QObject + + + %1 byte + %1 bait + + + + %1 kiB + %1 kiB + + + + %1 MiB + %1 MiB + + + + GBA + GBA + + + + GB + GB + + + + ? + ? + + + + QShortcut + + + Shift + Shift + + + + Control + Ctrl + + + + Alt + Alt + + + + Meta + Meta + + + + ROMInfo + + + ROM Info + Perihal ROM + + + + Game name: + Nama permainan: + + + + {NAME} + {NAME} + + + + Internal name: + Nama dalaman: + + + + {TITLE} + {TITLE} + + + + Game ID: + ID Permainan: + + + + {ID} + {ID} + + + + File size: + Saiz fail: + + + + {SIZE} + {SIZE} + + + + CRC32: + CRC32: + + + + {CRC} + {CRC} + + + + ReportView + + + Generate Bug Report + Menjanakan Laporan Pepijat + + + + <html><head/><body><p>To file a bug report, please first generate a report file to attach to the bug report you're about to file. It is recommended that you include the save files, as these often help with debugging issues. This will collect some information about the version of {projectName} you're running, your configuration, your computer, and the game you currently have open (if any). Once this collection is completed you can review all of the information gathered below and save it to a zip file. The collection will automatically attempt to redact any personal information, such as your username if it's in any of the paths gathered, but just in case you can edit it afterwards. After you have generated and saved it, please click the button below or go to <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> to file the bug report on GitHub. Make sure to attach the report you generated!</p></body></html> + <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> + + + + Generate report + Menjanakan laporan + + + + Save + Simpan + + + + Open issue list in browser + Buka senarai persoalan dalam pelayar + + + + Include save file + Sertakan fail simpanan + + + + Create and include savestate + Cipta dan sertakan keadaan tersimpan + + + + SaveConverter + + + Convert/Extract Save Game + Tukar/Ekstrak Simpanan Permainan + + + + Input file + Fail input + + + + + Browse + Pilih fail + + + + Output file + Fail output + + + + %1 %2 save game + Simpanan permainan %1 %2 + + + + little endian + little-endian + + + + big endian + big-endian + + + + SRAM + SRAM + + + + %1 flash + %1 kilat + + + + %1 EEPROM + %1 EEPROM + + + + %1 SRAM + RTC + %1 SRAM + RTC + + + + %1 SRAM + %1 SRAM + + + + packed MBC2 + + + + + unpacked MBC2 + + + + + MBC6 flash + Kilat MBC6 + + + + MBC6 combined SRAM + flash + MBC6 bergabung SRAM + kilat + + + + MBC6 SRAM + SRAM MBC6 + + + + TAMA5 + TAMA5 + + + + %1 (%2) + %1 (%2) + + + + %1 save state with embedded %2 save game + Keadaan tersimpan %1 dgn simpanan permainan terbenam %2 + + + + SensorView + + + Sensors + + + + + Realtime clock + + + + + Fixed time + + + + + System time + + + + + Start time at + + + + + Now + + + + + MM/dd/yy hh:mm:ss AP + + + + + Light sensor + + + + + Brightness + + + + + Tilt sensor + + + + + + Set Y + + + + + + Set X + + + + + Gyroscope + + + + + Sensitivity + + + + + SettingsView + + + Settings + Tetapan + + + + Audio/Video + Audio/Video + + + + Interface + Antara muka + + + + Emulation + Pelagakan + + + + Enhancements + Penambahan + + + + BIOS + BIOS + + + + Paths + Laluan + + + + Logging + Log + + + + Game Boy + Game Boy + + + + Audio driver: + Pemacu audio: + + + + Audio buffer: + Penimbal audio: + + + + + 1536 + 1536 + + + + 512 + 512 + + + + 768 + 768 + + + + 1024 + 1024 + + + + 2048 + 2048 + + + + 3072 + 3072 + + + + 4096 + 4096 + + + + samples + sampel + + + + Sample rate: + Kadar sampel: + + + + + 44100 + 44100 + + + + 22050 + 22050 + + + + 32000 + 32000 + + + + 48000 + 48000 + + + + Hz + Hz + + + + Volume: + Isipadu: + + + + + Mute + Senyap + + + + Fast forward volume: + Isipadu mundar laju: + + + + Display driver: + Pemacu paparan: + + + + Frameskip: + Langkauan bingkai: + + + + Skip every + Langkau setiap + + + + + frames + bingkai + + + + FPS target: + Sasaran FPS: + + + + frames per second + bingkai per saat + + + + Sync: + Segerak: + + + + Video + Video + + + + Audio + Audio + + + + Lock aspect ratio + Kekalkan nisbah aspek + + + + Force integer scaling + Paksa skala integer + + + + Bilinear filtering + Penapisan bilinear + + + + Default color palette only + Palet warna piawai sahaja + + + + SGB color palette if available + Palet warna SGB jika ada + + + + GBC color palette if available + Palet warna GBC jika ada + + + + SGB (preferred) or GBC color palette if available + SGB (pilihan utama) atau palet warna GBC jika ada + + + + Game Boy Camera + Game Boy Camera + + + + Driver: + Pemacu: + + + + Source: + Sumber: + + + + Native (59.7275) + Asal (59.7275) + + + + Interframe blending + Persebatian antarabingkai + + + + Language + Bahasa + + + + English + Inggeris + + + + Library: + Perpustakaan: + + + + List view + Pandangan senarai + + + + Tree view + Pandangan pohon + + + + Show when no game open + Tunjuk semasa tiada permainan dibuka + + + + Clear cache + Kosongkan cache + + + + Allow opposing input directions + Izin tekan arah-arah input yang berlawan sekaligus + + + + Suspend screensaver + Gantung screensaver + + + + Pause when inactive + Jeda bila tidak aktif + + + + Pause when minimized + Jeda bila diminimumkan + + + + Dynamically update window title + Kemaskini tajuk tetingkap secara dinamik + + + + Show filename instead of ROM name in title bar + Tunjuk nama ROM dan bukan nama fail dalam bar tajuk + + + + Show OSD messages + Tunjuk mesej OSD + + + + Enable Discord Rich Presence + Dayakan Discord Rich Presence + + + + Automatically save state + Simpan keadaan secara automatik + + + + Automatically load state + Muat keadaan secara automatik + + + + Automatically save cheats + Simpan tipuan secara automatik + + + + Automatically load cheats + Muat tipuan secara automatik + + + + Show FPS in title bar + Tunjuk FPS dalam bar tajuk + + + + Fast forward speed: + Kelajuan mundar laju: + + + + + Unbounded + Tidak terbatas + + + + Fast forward (held) speed: + Kelajuan mundar laju (pegang): + + + + Autofire interval: + + + + + Enable rewind + Dayakan putar balik + + + + Rewind history: + Sejarah putar balik: + + + + Idle loops: + + + + + Run all + Jalan semua + + + + Remove known + Buang yg diketahui + + + + Detect and remove + Kesan dan buang + + + + Preload entire ROM into memory + Pra-muat selurus ROM ke dalam ingatan + + + + Save state extra data: + Data ekstra keadaan tersimpan: + + + + + Save game + Simpanan permainan + + + + Load state extra data: + Data ekstra keadaan muat: + + + + Models + Model + + + + GB only: + GB sahaja: + + + + SGB compatible: + SGB serasi: + + + + GBC only: + GBC sahaja: + + + + GBC compatible: + GBC serasi: + + + + SGB and GBC compatible: + SGB dan GBC serasi: + + + + Game Boy palette + Palet Game Boy + + + + Preset: + Praset: + + + + + Screenshot + Cekupan skrin + + + + + Cheat codes + Kod tipu + + + + Enable Game Boy Player features by default + + + + + Enable VBA bug compatibility in ROM hacks + + + + + Video renderer: + + + + + Software + Perisian + + + + OpenGL + + + + + OpenGL enhancements + + + + + High-resolution scale: + + + + + (240×160) + (240×160) + + + + XQ GBA audio (experimental) + + + + + GB BIOS file: + Fail BIOS GB: + + + + + + + + + + + + Browse + Pilih fail + + + + Use BIOS file if found + Guna fail BIOS jika ada + + + + Skip BIOS intro + Langkau pendahuluan BIOS + + + + GBA BIOS file: + Fail BIOS GBA: + + + + GBC BIOS file: + Fail BIOS GBC: + + + + SGB BIOS file: + Fail BIOS SGB: + + + + Save games + Simpanan permainan + + + + + + + + Same directory as the ROM + Direktori sama dengan ROM + + + + Save states + Keadaan tersimpan + + + + Screenshots + Cekupan skrin + + + + Patches + + + + + Cheats + Tipuan + + + + Log to file + Log dalam fail + + + + Log to console + Log dalam konsol + + + + Select Log File + Pilih fail log + + + + Default BG colors: + Warna LB piawai: + + + + Default sprite colors 1: + + + + + Default sprite colors 2: + + + + + Super Game Boy borders + + + + + ShaderSelector + + + Shaders + + + + + Active Shader: + + + + + Name + Nama + + + + Author + Pencipta + + + + Description + Huraian + + + + Unload Shader + + + + + Load New Shader + + + + + ShortcutView + + + Edit Shortcuts + Sunting pintasan + + + + Keyboard + Papan kekunci + + + + Gamepad + + + + + Clear + Kosongkan + + + + TileView + + + Tiles + Jubin + + + + Export Selected + Eksport yg dipilih + + + + Export All + Eksport Semua + + + + 256 colors + 256 warna + + + + Magnification + Pembesaran + + + + Tiles per row + Jubin per baris + + + + Fit to window + + + + + Copy Selected + Salin yg dipilih + + + + Copy All + Salin Semua + + + + VideoView + + + Record Video + Rakam Video + + + + Start + Mula + + + + Stop + Henti + + + + Select File + Pilih Fail + + + + Presets + Praset + + + + High &Quality + &Kualiti Tinggi + + + + &YouTube + &YouTube + + + + + WebM + WebM + + + + + MP4 + MP4 + + + + &Lossless + + + + + 4K + 4K + + + + &1080p + &1080p + + + + &720p + &720p + + + + &480p + &480p + + + + &Native + &Asal + + + + Format + Format + + + + MKV + MKV + + + + AVI + AVI + + + + HEVC + HEVC + + + + HEVC (NVENC) + HEVC (NVENC) + + + + VP8 + VP8 + + + + VP9 + VP9 + + + + FFV1 + FFV1 + + + + + None + Tiada + + + + FLAC + FLAC + + + + Opus + Opus + + + + Vorbis + Vorbis + + + + MP3 + MP3 + + + + AAC + AAC + + + + Uncompressed + + + + + Bitrate (kbps) + Kadar bit (kbps) + + + + ABR + ABR + + + + H.264 + H.264 + + + + H.264 (NVENC) + H.264 (NVENC) + + + + VBR + VBR + + + + CRF + CRF + + + + Dimensions + Matra + + + + Lock aspect ratio + Kekalkan nisbah aspek + + + + Show advanced + 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 + + + About + O aplikacji + + + + <a href="http://mgba.io/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a> + <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> + + + + Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> + Gałąź git: <tt>{gitBranch}</tt><br/>Rewizja: <tt>{gitCommit}</tt> + + + + {projectName} would like to thank the following patrons from Patreon: + {projectName} pragnie podziękować następującym patronom z Patreon: + + + + © 2013 – {year} Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 +Game Boy Advance is a registered trademark of Nintendo Co., Ltd. + + + + + {projectName} is an open-source Game Boy Advance emulator + + + + + ArchiveInspector + + + Open in archive... + Otwórz w archiwum… + + + + Loading... + Ładowanie… + + + + AssetTile + + + Tile # + + + + + Palette # + + + + + Address + Adres + + + + Red + Czerwony + + + + Green + Zielony + + + + Blue + Niebieski + + + + BattleChipView + + + BattleChip Gate + BattleChip Gate + + + + Chip name + + + + + Insert + + + + + Save + Zapisz + + + + Load + Wgraj + + + + Add + Dodaj + + + + Remove + Usuń + + + + Gate type + + + + + Ba&ttleChip Gate + + + + + Progress &Gate + + + + + Beast &Link Gate + + + + + Inserted + + + + + Chip ID + ID chipu + + + + Update Chip data + Zaktualizuj dane chipu + + + + Show advanced + Pokaż zaawansowane opcje + + + + CheatsView + + + Cheats + + + + + Remove + Usuń + + + + Save + Zapisz + + + + Load + Wgraj + + + + Add New Set + Dodaj nowy zestaw + + + + Add + Dodaj + + + + Enter codes here... + + + + + DebuggerConsole + + + Debugger + Debugger + + + + Enter command (try `help` for more info) + Podaj komendę (by uzyskać więcej informacji, podaj `help`) + + + + Break + Przerwij + + + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + Adres IP + + + + Connect + Połącz + + + + Disconnect + Rozłącz + + + + Close + Zamknij + + + + Reset on connect + + + + + FrameView + + + Inspect frame + + + + + Magnification + Powiększenie + + + + Freeze frame + + + + + Backdrop color + Kolor tła + + + + Disable scanline effects + + + + + Export + Eksportuj + + + + Reset + Resetuj + + + + GIFView + + + Record GIF/WebP/APNG + Zapisz GIF/WebP/APNG + + + + Loop + + + + + Start + + + + + Stop + Stop + + + + Select File + Wybierz plik + + + + APNG + APNG + + + + GIF + GIF + + + + WebP + WebP + + + + Frameskip + + + + + IOViewer + + + I/O Viewer + + + + + 0x0000 + 0x0000 + + + + B + B + + + + LibraryTree + + + Name + Nazwa + + + + Location + Lokacja + + + + Platform + Platforma + + + + Size + Rozmiar + + + + CRC32 + CRC32 + + + + LoadSaveState + + + + %1 State + + + + + + + + + + + + + No Save + + + + + 5 + 5 + + + + 6 + 6 + + + + 8 + 8 + + + + 4 + 4 + + + + 1 + 1 + + + + 3 + 3 + + + + 7 + 7 + + + + 9 + 9 + + + + 2 + 2 + + + + Cancel + Anuluj + + + + LogView + + + Logs + Logi + + + + Enabled Levels + Aktywne poziomy logowania + + + + Debug + Debug + + + + Stub + Stub + + + + Info + Info + + + + Warning + Ostrzeżenie + + + + Error + Błąd + + + + Fatal + Błąd krytyczny + + + + Game Error + Błąd gry + + + + Advanced settings + Ustawienia zaawansowane + + + + Clear + Wyczyść + + + + Max Lines + Maks. liczba linii + + + + MapView + + + Maps + Mapy + + + + Magnification + + + + + Export + Eksportuj + + + + Copy + Kopiuj + + + + MemoryDump + + + Save Memory Range + + + + + Start Address: + Adres początkowy: + + + + Byte Count: + Liczba bajtów: + + + + Dump across banks + + + + + MemorySearch + + + Memory Search + + + + + Address + Adres + + + + Current Value + Obecna wartość + + + + + Type + Typ + + + + Value + Wartość + + + + Numeric + + + + + Text + + + + + Width + + + + + + Guess + + + + + 1 Byte (8-bit) + + + + + 2 Bytes (16-bit) + + + + + 4 Bytes (32-bit) + + + + + Number type + + + + + Decimal + Decymalny + + + + Hexadecimal + Heksadecymalny + + + + Search type + Wyszukaj typ + + + + Equal to value + Wartość równa + + + + Greater than value + Wartość większa niż + + + + Less than value + Wartość mniejsza niż + + + + Unknown/changed + Nieznana/zmieniona + + + + Changed by value + + + + + Unchanged + Niezmieniona + + + + Increased + Zwiększona + + + + Decreased + Zmniejszona + + + + Search ROM + Przeszukaj ROM + + + + New Search + Nowe wyszukiwanie + + + + Search Within + Znajdź wewnątrz + + + + Open in Memory Viewer + Otwórz w Podglądzie Pamięci + + + + Refresh + Odśwież + + + + MemoryView + + + Memory + Pamięć + + + + Inspect Address: + + + + + Set Alignment: + + + + + &1 Byte + &1 bajt + + + + &2 Bytes + &2 bajty + + + + &4 Bytes + &4 bajty + + + + Unsigned Integer: + + + + + Signed Integer: + + + + + String: + + + + + Load TBL + + + + + Copy Selection + Kopiuj zaznaczenie + + + + Paste + Wklej + + + + Save Selection + Zapisz zaznaczenie + + + + Save Range + Zapisz zakres + + + + Load + Wgraj + + + + ObjView + + + Sprites + + + + + Address + Adres + + + + Copy + Kopiuj + + + + Magnification + Powiększenie + + + + Geometry + Geometria + + + + Position + Pozycja + + + + , + , + + + + Dimensions + Wymiary + + + + × + × + + + + Matrix + Macierz + + + + Export + Eksportuj + + + + Attributes + Atrybuty + + + + Transform + + + + + Off + + + + + Palette + + + + + Double Size + + + + + + + + Return, Ctrl+R + + + + + Flipped + + + + + H + Short for horizontal + + + + + V + Short for vertical + + + + + Mode + + + + + Normal + + + + + Mosaic + + + + + Enabled + + + + + Priority + + + + + Tile + + + + + OverrideView + + + Game Overrides + + + + + Game Boy Advance + + + + + + + + Autodetect + + + + + Realtime clock + + + + + Gyroscope + + + + + Tilt + + + + + Light sensor + + + + + Rumble + + + + + Save type + + + + + None + + + + + SRAM + + + + + Flash 512kb + + + + + Flash 1Mb + + + + + EEPROM + + + + + Idle loop + + + + + Game Boy Player features + + + + + VBA bug compatibility mode + + + + + Game Boy + + + + + Game Boy model + + + + + Memory bank controller + + + + + Background Colors + + + + + Sprite Colors 1 + + + + + Sprite Colors 2 + + + + + Palette preset + + + + + PaletteView + + + Palette + + + + + Background + + + + + Objects + + + + + Selection + + + + + Red + + + + + Green + + + + + Blue + + + + + 16-bit value + + + + + Hex code + + + + + Palette index + + + + + Export BG + + + + + Export OBJ + + + + + PlacementControl + + + Adjust placement + + + + + All + + + + + Offset + + + + + X + + + + + Y + + + + + PrinterView + + + Game Boy Printer + + + + + Hurry up! + + + + + Tear off + + + + + Magnification + + + + + Copy + Kopiuj + + + + QGBA::AboutScreen + + + 2021 + 2021 + + + + QGBA::AssetTile + + + %0%1%2 + %0%1%2 + + + + + + 0x%0 (%1) + 0x%0 (%1) + + + + QGBA::CheatsModel + + + (untitled) + (bez nazwy) + + + + Failed to open cheats file: %1 + + + + + QGBA::CheatsView + + + + Add GameShark + Dodaj GameShark + + + + Add Pro Action Replay + Dodaj Pro Action Replay + + + + Add CodeBreaker + Dodaj CodeBreaker + + + + Add GameGenie + + + + + + Select cheats file + + + + + QGBA::CoreController + + + Failed to open save file: %1 + + + + + Failed to open game file: %1 + + + + + Can't yank pack in unexpected platform! + + + + + Failed to open snapshot file for reading: %1 + + + + + Failed to open snapshot file for writing: %1 + + + + + QGBA::CoreManager + + + Failed to open game file: %1 + + + + + Could not load game. Are you sure it's in the correct format? + + + + + Failed to open save file. Is the save directory writable? + + + + + QGBA::FrameView + + + Export frame + + + + + Portable Network Graphics (*.png) + + + + + None + + + + + Background + + + + + Window + + + + + Objwin + + + + + Sprite + + + + + Backdrop + + + + + Frame + + + + + %1 %2 + + + + + QGBA::GBAApp + + + Enable Discord Rich Presence + + + + + QGBA::GBAKeyEditor + + + Clear Button + + + + + Clear Analog + + + + + Refresh + + + + + Set all + + + + + QGBA::GDBWindow + + + Server settings + + + + + Local port + + + + + Bind address + + + + + Break + + + + + Stop + + + + + Start + + + + + Crash + + + + + Could not start GDB server + + + + + QGBA::GIFView + + + Failed to open output file: %1 + + + + + Select output file + + + + + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) + + + + + QGBA::IOViewer + + + Background mode + + + + + Mode 0: 4 tile layers + + + + + Mode 1: 2 tile layers + 1 rotated/scaled tile layer + + + + + Mode 2: 2 rotated/scaled tile layers + + + + + Mode 3: Full 15-bit bitmap + + + + + Mode 4: Full 8-bit bitmap + + + + + Mode 5: Small 15-bit bitmap + + + + + CGB Mode + + + + + Frame select + + + + + Unlocked HBlank + + + + + Linear OBJ tile mapping + + + + + Force blank screen + + + + + Enable background 0 + + + + + Enable background 1 + + + + + Enable background 2 + + + + + Enable background 3 + + + + + Enable OBJ + + + + + Enable Window 0 + + + + + Enable Window 1 + + + + + Enable OBJ Window + + + + + Swap green components + + + + + Currently in VBlank + + + + + Currently in HBlank + + + + + Currently in VCounter + + + + + Enable VBlank IRQ generation + + + + + Enable HBlank IRQ generation + + + + + Enable VCounter IRQ generation + + + + + VCounter scanline + + + + + Current scanline + + + + + + + + Priority + + + + + + + + Tile data base (* 16kB) + + + + + + + + Enable mosaic + + + + + + + + Enable 256-color + + + + + + + + Tile map base (* 2kB) + + + + + + + + Background dimensions + + + + + + Overflow wraps + + + + + + + + + + Horizontal offset + + + + + + + + + + Vertical offset + + + + + + + + + + + + + + + + Fractional part + + + + + + + + + + + + Integer part + + + + + + + + Integer part (low) + + + + + + + + Integer part (high) + + + + + + End x + + + + + + Start x + + + + + + End y + + + + + + Start y + + + + + Window 0 enable BG 0 + + + + + Window 0 enable BG 1 + + + + + Window 0 enable BG 2 + + + + + Window 0 enable BG 3 + + + + + Window 0 enable OBJ + + + + + Window 0 enable blend + + + + + Window 1 enable BG 0 + + + + + Window 1 enable BG 1 + + + + + Window 1 enable BG 2 + + + + + Window 1 enable BG 3 + + + + + Window 1 enable OBJ + + + + + Window 1 enable blend + + + + + Outside window enable BG 0 + + + + + Outside window enable BG 1 + + + + + Outside window enable BG 2 + + + + + Outside window enable BG 3 + + + + + Outside window enable OBJ + + + + + Outside window enable blend + + + + + OBJ window enable BG 0 + + + + + OBJ window enable BG 1 + + + + + OBJ window enable BG 2 + + + + + OBJ window enable BG 3 + + + + + OBJ window enable OBJ + + + + + OBJ window enable blend + + + + + Background mosaic size vertical + + + + + Background mosaic size horizontal + + + + + Object mosaic size vertical + + + + + Object mosaic size horizontal + + + + + BG 0 target 1 + + + + + BG 1 target 1 + + + + + BG 2 target 1 + + + + + BG 3 target 1 + + + + + OBJ target 1 + + + + + Backdrop target 1 + + + + + Blend mode + + + + + Disabled + + + + + Additive blending + + + + + Brighten + + + + + Darken + + + + + BG 0 target 2 + + + + + BG 1 target 2 + + + + + BG 2 target 2 + + + + + BG 3 target 2 + + + + + OBJ target 2 + + + + + Backdrop target 2 + + + + + Blend A (target 1) + + + + + Blend B (target 2) + + + + + Blend Y + + + + + + Sweep shifts + + + + + + Sweep subtract + + + + + + Sweep time (in 1/128s) + + + + + + + + + + + + Sound length + + + + + + + + Duty cycle + + + + + + + + + + Envelope step time + + + + + + + + + + Envelope increase + + + + + + + + + + Initial volume + + + + + + + Sound frequency + + + + + + + + + + + + Timed + + + + + + + + + + + + Reset + + + + + Double-size wave table + + + + + Active wave table + + + + + + Enable channel 3 + + + + + + Volume + + + + + + 0% + + + + + + + 100% + + + + + + + 50% + + + + + + + 25% + + + + + + + + 75% + + + + + + Clock divider + + + + + + Register stages + + + + + + 15 + + + + + + 7 + + + + + + Shifter frequency + + + + + PSG volume right + + + + + PSG volume left + + + + + + Enable channel 1 right + + + + + + Enable channel 2 right + + + + + + Enable channel 3 right + + + + + + Enable channel 4 right + + + + + + Enable channel 1 left + + + + + + Enable channel 2 left + + + + + + Enable channel 3 left + + + + + + Enable channel 4 left + + + + + PSG master volume + + + + + Loud channel A + + + + + Loud channel B + + + + + Enable channel A right + + + + + Enable channel A left + + + + + Channel A timer + + + + + + 0 + + + + + + + + + + + + + 1 + + + + + Channel A reset + + + + + Enable channel B right + + + + + Enable channel B left + + + + + Channel B timer + + + + + Channel B reset + + + + + + Active channel 1 + + + + + + Active channel 2 + + + + + + Active channel 3 + + + + + + Active channel 4 + + + + + + Enable audio + + + + + Bias + + + + + Resolution + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sample + + + + + + + + + + + + Address (low) + + + + + + + + + + + + Address (high) + + + + + + + Sound frequency (low) + + + + + + + Sound frequency (high) + + + + + Source (high) + + + + + Source (low) + + + + + Destination (high) + + + + + Destination (low) + + + + + + Green (low) + + + + + + Green (high) + + + + + + + + Word count + + + + + + + + Destination offset + + + + + + + + + + + + Increment + + + + + + + + + + + + Decrement + + + + + + + + + + + + Fixed + + + + + + + + Increment and reload + + + + + + + + Source offset + + + + + + + + Repeat + + + + + + + + 32-bit + + + + + + + + Start timing + + + + + + + + + Immediate + + + + + + + + + + + + VBlank + + + + + + + + + + + HBlank + + + + + + + + + + + + + IRQ + + + + + + + + + + + + + + + Enable + + + + + + + Audio FIFO + + + + + Video Capture + + + + + DRQ + + + + + + + + + + + + Value + + + + + + + + Scale + + + + + + + + + 1/64 + + + + + + + + + 1/256 + + + + + + + + + 1/1024 + + + + + + + Cascade + + + + + + A + + + + + + B + + + + + + Select + + + + + + Start + + + + + + Right + + + + + + Left + + + + + + Up + + + + + + Down + + + + + + R + + + + + + L + + + + + Condition + + + + + SC + + + + + SD + + + + + SI + + + + + SO + + + + + + VCounter + + + + + + Timer 0 + + + + + + Timer 1 + + + + + + Timer 2 + + + + + + Timer 3 + + + + + + SIO + + + + + + DMA 0 + + + + + + DMA 1 + + + + + + DMA 2 + + + + + + DMA 3 + + + + + + Keypad + + + + + + Gamepak + + + + + SRAM wait + + + + + + + + + 4 + + + + + + + + 3 + + + + + + + + + 2 + + + + + + + + + 8 + + + + + Cart 0 non-sequential + + + + + Cart 0 sequential + + + + + Cart 1 non-sequential + + + + + Cart 1 sequential + + + + + Cart 2 non-sequential + + + + + Cart 2 sequential + + + + + PHI terminal + + + + + + Disable + + + + + 4.19MHz + + + + + 8.38MHz + + + + + 16.78MHz + + + + + Gamepak prefetch + + + + + Enable IRQs + + + + + Right/A + + + + + Left/B + + + + + Up/Select + + + + + Down/Start + + + + + Active D-pad + + + + + Active face buttons + + + + + Internal clock + + + + + 32× clocking (CGB only) + + + + + Transfer active + + + + + Divider + + + + + 1/16 + + + + + + LCD STAT + + + + + + Timer + + + + + + Serial + + + + + + Joypad + + + + + Volume right + + + + + Output right + + + + + Volume left + + + + + Output left + + + + + Background enable/priority + + + + + Enable sprites + + + + + Double-height sprites + + + + + Background tile map + + + + + + 0x9800 – 0x9BFF + + + + + + 0x9C00 – 0x9FFF + + + + + Background tile data + + + + + 0x8800 – 0x87FF + + + + + 0x8000 – 0x8FFF + + + + + Enable window + + + + + Window tile map + + + + + Enable LCD + + + + + Mode + + + + + 0: HBlank + + + + + 1: VBlank + + + + + 2: OAM scan + + + + + 3: HDraw + + + + + In LYC + + + + + Enable HBlank (mode 0) IRQ + + + + + Enable VBlank (mode 1) IRQ + + + + + Enable OAM (mode 2) IRQ + + + + + Enable LYC IRQ + + + + + Current Y coordinate + + + + + Comparison Y coordinate + + + + + Start upper byte + + + + + + + Color 0 shade + + + + + + + Color 1 shade + + + + + + + Color 2 shade + + + + + + + Color 3 shade + + + + + Prepare to switch speed + + + + + Double speed + + + + + VRAM bank + + + + + Length + + + + + Timing + + + + + Write bit + + + + + Read bit + + + + + + Unknown + + + + + + Current index + + + + + + Auto-increment + + + + + + Red + + + + + + Blue + + + + + Sprite ordering + + + + + OAM order + + + + + x coordinate sorting + + + + + WRAM bank + + + + + QGBA::KeyEditor + + + + --- + + + + + Super (L) + + + + + Super (R) + + + + + Menu + + + + + QGBA::LoadSaveState + + + Load State + + + + + Save State + + + + + Empty + + + + + Corrupted + + + + + Slot %1 + + + + + QGBA::LogConfigModel + + + + Default + + + + + Fatal + + + + + Error + + + + + Warning + + + + + Info + + + + + Debug + + + + + Stub + + + + + Game Error + + + + + QGBA::LogController + + + [%1] %2: %3 + + + + + An error occurred + + + + + DEBUG + + + + + STUB + + + + + INFO + + + + + WARN + + + + + ERROR + + + + + FATAL + + + + + GAME ERROR + + + + + QGBA::MapView + + + Priority + + + + + + Map base + + + + + + Tile base + + + + + Size + + + + + + Offset + + + + + Xform + + + + + Map Addr. + + + + + Mirror + + + + + None + + + + + Both + + + + + Horizontal + + + + + Vertical + + + + + + + N/A + + + + + Export map + + + + + Portable Network Graphics (*.png) + + + + + QGBA::MemoryDump + + + Save memory region + + + + + Failed to open output file: %1 + + + + + QGBA::MemoryModel + + + Copy selection + + + + + Save selection + + + + + Paste + + + + + Load + Wgraj + + + + All + + + + + Load TBL + + + + + Save selected memory + + + + + Failed to open output file: %1 + + + + + Load memory + + + + + Failed to open input file: %1 + + + + + TBL + + + + + ISO-8859-1 + + + + + QGBA::MemorySearch + + + (%0/%1×) + + + + + (⅟%0×) + + + + + (%0×) + + + + + %1 byte%2 + + + + + QGBA::ObjView + + + + 0x%0 + + + + + Off + + + + + + + + + + + + --- + + + + + Normal + + + + + Trans + + + + + OBJWIN + + + + + Invalid + + + + + + N/A + + + + + Export sprite + + + + + Portable Network Graphics (*.png) + + + + + QGBA::OverrideView + + + Official MBCs + + + + + Licensed MBCs + + + + + Unlicensed MBCs + + + + + QGBA::PaletteView + + + #%0 + + + + + 0x%0 + + + + + + + + 0x%0 (%1) + + + + + Export palette + + + + + Windows PAL (*.pal);;Adobe Color Table (*.act) + + + + + Failed to open output palette file: %1 + + + + + QGBA::ROMInfo + + + + + + + (unknown) + + + + + + bytes + + + + + (no database present) + + + + + QGBA::ReportView + + + Bug report archive + + + + + ZIP archive (*.zip) + + + + + QGBA::SaveConverter + + + Save games and save states (%1) + + + + + Select save game or save state + + + + + Save games (%1) + + + + + Select save game + + + + + Conversion failed + + + + + Failed to convert the save game. This is probably a bug. + + + + + No file selected + + + + + Could not open file + + + + + No valid formats found + + + + + Please select a valid input file + + + + + No valid conversions found + + + + + Cannot convert save games between platforms + + + + + QGBA::SettingsView + + + + Qt Multimedia + + + + + SDL + + + + + Software (Qt) + + + + + OpenGL + + + + + OpenGL (force version 1.x) + + + + + None (Still Image) + + + + + Keyboard + + + + + Controllers + + + + + Shortcuts + + + + + + Shaders + + + + + Select BIOS + + + + + Select directory + + + + + (%1×%2) + + + + + QGBA::ShaderSelector + + + No shader active + + + + + Load shader + + + + + No shader loaded + + + + + by %1 + + + + + Preprocessing + + + + + Pass %1 + + + + + QGBA::ShortcutModel + + + Action + + + + + Keyboard + + + + + Gamepad + + + + + QGBA::TileView + + + Export tiles + + + + + + Portable Network Graphics (*.png) + + + + + Export tile + + + + + QGBA::VideoView + + + Failed to open output video file: %1 + + + + + Native (%0x%1) + + + + + Select output file + + + + + QGBA::Window + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + + + Archives (%1) + + + + + + + Select ROM + + + + + Select folder + + + + + + Select save + + + + + Select patch + + + + + Patches (*.ips *.ups *.bps) + + + + + Select e-Reader dotcode + + + + + e-Reader card (*.raw *.bin *.bmp) + + + + + Select image + + + + + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) + + + + + + GameShark saves (*.sps *.xps) + + + + + Select video log + + + + + Video logs (*.mvl) + + + + + Crash + + + + + The game has crashed with the following error: + +%1 + + + + + Couldn't Start + + + + + Could not start game. + + + + + Unimplemented BIOS call + + + + + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. + + + + + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. + + + + + Really make portable? + + + + + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? + + + + + Restart needed + + + + + Some changes will not take effect until the emulator is restarted. + + + + + - Player %1 of %2 + + + + + %1 - %2 + + + + + %1 - %2 - %3 + + + + + %1 - %2 (%3 fps) - %4 + + + + + &File + + + + + Load &ROM... + + + + + Load ROM in archive... + + + + + Add folder to library... + + + + + Save games (%1) + + + + + Select save game + + + + + mGBA save state files (%1) + + + + + + Select save state + + + + + Select e-Reader card images + + + + + Image file (*.png *.jpg *.jpeg) + + + + + Conversion finished + + + + + %1 of %2 e-Reader cards converted successfully. + + + + + Load alternate save game... + + + + + Load temporary save game... + + + + + Load &patch... + + + + + Boot BIOS + + + + + Replace ROM... + + + + + Scan e-Reader dotcodes... + + + + + Convert e-Reader card image to raw... + + + + + ROM &info... + + + + + Recent + + + + + Make portable + + + + + &Load state + + + + + Load state file... + + + + + &Save state + + + + + Save state file... + + + + + Quick load + + + + + Quick save + + + + + Load recent + + + + + Save recent + + + + + Undo load state + + + + + Undo save state + + + + + + State &%1 + + + + + Load camera image... + + + + + Convert save game... + + + + + Import GameShark Save... + + + + + Export GameShark Save... + + + + + New multiplayer window + + + + + Connect to Dolphin... + + + + + Report bug... + + + + + About... + + + + + E&xit + + + + + &Emulation + + + + + &Reset + + + + + Sh&utdown + + + + + Yank game pak + + + + + &Pause + + + + + &Next frame + + + + + Fast forward (held) + + + + + &Fast forward + + + + + Fast forward speed + + + + + Unbounded + + + + + %0x + + + + + Rewind (held) + + + + + Re&wind + + + + + Step backwards + + + + + Sync to &video + + + + + Sync to &audio + + + + + Solar sensor + + + + + Increase solar level + + + + + Decrease solar level + + + + + Brightest solar level + + + + + Darkest solar level + + + + + Brightness %1 + + + + + Game Boy Printer... + + + + + BattleChip Gate... + + + + + Audio/&Video + + + + + Frame size + + + + + %1× + + + + + Toggle fullscreen + + + + + Lock aspect ratio + + + + + Force integer scaling + + + + + Interframe blending + + + + + Bilinear filtering + + + + + Frame&skip + + + + + Mute + + + + + FPS target + + + + + Native (59.7275) + + + + + Take &screenshot + + + + + F12 + + + + + Record A/V... + + + + + Record GIF/WebP/APNG... + + + + + Video layers + + + + + Audio channels + + + + + Adjust layer placement... + + + + + &Tools + + + + + View &logs... + + + + + Game &overrides... + + + + + Game Pak sensors... + + + + + &Cheats... + + + + + Settings... + + + + + Open debugger console... + + + + + Start &GDB server... + + + + + View &palette... + + + + + View &sprites... + + + + + View &tiles... + + + + + View &map... + + + + + &Frame inspector... + + + + + View memory... + + + + + Search memory... + + + + + View &I/O registers... + + + + + Record debug video log... + + + + + Stop debug video log + + + + + Exit fullscreen + + + + + GameShark Button (held) + + + + + Autofire + + + + + Autofire A + + + + + Autofire B + + + + + Autofire L + + + + + Autofire R + + + + + Autofire Start + + + + + Autofire Select + + + + + Autofire Up + + + + + Autofire Right + + + + + Autofire Down + + + + + Autofire Left + + + + + Clear + + + + + QObject + + + %1 byte + + + + + %1 kiB + + + + + %1 MiB + + + + + GBA + + + + + GB + + + + + ? + + + + + QShortcut + + + Shift + + + + + Control + + + + + Alt + + + + + Meta + + + + + ROMInfo + + + ROM Info + + + + + Game name: + + + + + {NAME} + + + + + Internal name: + + + + + {TITLE} + + + + + Game ID: + + + + + {ID} + + + + + File size: + + + + + {SIZE} + + + + + CRC32: + + + + + {CRC} + + + + + ReportView + + + Generate Bug Report + + + + + <html><head/><body><p>To file a bug report, please first generate a report file to attach to the bug report you're about to file. It is recommended that you include the save files, as these often help with debugging issues. This will collect some information about the version of {projectName} you're running, your configuration, your computer, and the game you currently have open (if any). Once this collection is completed you can review all of the information gathered below and save it to a zip file. The collection will automatically attempt to redact any personal information, such as your username if it's in any of the paths gathered, but just in case you can edit it afterwards. After you have generated and saved it, please click the button below or go to <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> to file the bug report on GitHub. Make sure to attach the report you generated!</p></body></html> + + + + + Generate report + + + + + Save + + + + + Open issue list in browser + + + + + Include save file + + + + + Create and include savestate + + + + + SaveConverter + + + Convert/Extract Save Game + + + + + Input file + + + + + + Browse + + + + + Output file + + + + + %1 %2 save game + + + + + little endian + + + + + big endian + + + + + SRAM + + + + + %1 flash + + + + + %1 EEPROM + + + + + %1 SRAM + RTC + + + + + %1 SRAM + + + + + packed MBC2 + + + + + unpacked MBC2 + + + + + MBC6 flash + + + + + MBC6 combined SRAM + flash + + + + + MBC6 SRAM + + + + + TAMA5 + + + + + %1 (%2) + + + + + %1 save state with embedded %2 save game + + + + + SensorView + + + Sensors + + + + + Realtime clock + + + + + Fixed time + + + + + System time + + + + + Start time at + + + + + Now + + + + + MM/dd/yy hh:mm:ss AP + + + + + Light sensor + + + + + Brightness + + + + + Tilt sensor + + + + + + Set Y + + + + + + Set X + + + + + Gyroscope + + + + + Sensitivity + + + + + SettingsView + + + Settings + + + + + Audio/Video + + + + + Interface + + + + + Emulation + + + + + Enhancements + + + + + BIOS + + + + + Paths + + + + + Logging + + + + + Game Boy + + + + + Audio driver: + + + + + Audio buffer: + + + + + + 1536 + + + + + 512 + + + + + 768 + + + + + 1024 + + + + + 2048 + + + + + 3072 + + + + + 4096 + + + + + samples + + + + + Sample rate: + + + + + + 44100 + + + + + 22050 + + + + + 32000 + + + + + 48000 + + + + + Hz + + + + + Volume: + + + + + + Mute + + + + + Fast forward volume: + + + + + Display driver: + + + + + Frameskip: + + + + + Skip every + + + + + + frames + + + + + FPS target: + + + + + frames per second + + + + + Sync: + + + + + Video + + + + + Audio + + + + + Lock aspect ratio + + + + + Force integer scaling + + + + + Bilinear filtering + + + + + Default color palette only + + + + + SGB color palette if available + + + + + GBC color palette if available + + + + + SGB (preferred) or GBC color palette if available + + + + + Game Boy Camera + + + + + Driver: + + + + + Source: + + + + + Native (59.7275) + + + + + Interframe blending + + + + + Language + + + + + English + + + + + Library: + + + + + List view + + + + + Tree view + + + + + Show when no game open + + + + + Clear cache + + + + + Allow opposing input directions + + + + + Suspend screensaver + + + + + Pause when inactive + + + + + Pause when minimized + + + + + Dynamically update window title + + + + + Show filename instead of ROM name in title bar + + + + + Show OSD messages + + + + + Enable Discord Rich Presence + + + + + Automatically save state + + + + + Automatically load state + + + + + Automatically save cheats + + + + + Automatically load cheats + + + + + Show FPS in title bar + + + + + Fast forward speed: + + + + + + Unbounded + + + + + Fast forward (held) speed: + + + + + Autofire interval: + + + + + Enable rewind + + + + + Rewind history: + + + + + Idle loops: + + + + + Run all + + + + + Remove known + + + + + Detect and remove + + + + + Preload entire ROM into memory + + + + + Save state extra data: + + + + + + Save game + + + + + Load state extra data: + + + + + Models + + + + + GB only: + + + + + SGB compatible: + + + + + GBC only: + + + + + GBC compatible: + + + + + SGB and GBC compatible: + + + + + Game Boy palette + + + + + Preset: + + + + + + Screenshot + + + + + + Cheat codes + + + + + Enable Game Boy Player features by default + + + + + Enable VBA bug compatibility in ROM hacks + + + + + Video renderer: + + + + + Software + + + + + OpenGL + + + + + OpenGL enhancements + + + + + High-resolution scale: + + + + + (240×160) + + + + + XQ GBA audio (experimental) + + + + + GB BIOS file: + + + + + + + + + + + + + Browse + + + + + Use BIOS file if found + + + + + Skip BIOS intro + + + + + GBA BIOS file: + + + + + GBC BIOS file: + + + + + SGB BIOS file: + + + + + Save games + + + + + + + + + Same directory as the ROM + + + + + Save states + + + + + Screenshots + + + + + Patches + + + + + Cheats + + + + + Log to file + + + + + Log to console + + + + + Select Log File + + + + + Default BG colors: + + + + + Default sprite colors 1: + + + + + Default sprite colors 2: + + + + + Super Game Boy borders + + + + + ShaderSelector + + + Shaders + + + + + Active Shader: + + + + + Name + + + + + Author + + + + + Description + + + + + Unload Shader + + + + + Load New Shader + + + + + ShortcutView + + + Edit Shortcuts + + + + + Keyboard + + + + + Gamepad + + + + + Clear + + + + + TileView + + + Tiles + + + + + Export Selected + + + + + Export All + + + + + 256 colors + + + + + Magnification + + + + + Tiles per row + + + + + Fit to window + + + + + Copy Selected + + + + + Copy All + + + + + VideoView + + + Record Video + + + + + Start + + + + + Stop + + + + + Select File + + + + + Presets + + + + + High &Quality + + + + + &YouTube + + + + + + WebM + + + + + + MP4 + + + + + &Lossless + + + + + 4K + + + + + &1080p + + + + + &720p + + + + + &480p + + + + + &Native + + + + + Format + + + + + MKV + + + + + AVI + + + + + HEVC + + + + + HEVC (NVENC) + + + + + VP8 + + + + + VP9 + + + + + FFV1 + + + + + + None + + + + + FLAC + + + + + Opus + + + + + Vorbis + + + + + MP3 + + + + + AAC + + + + + Uncompressed + + + + + Bitrate (kbps) + + + + + ABR + + + + + H.264 + + + + + H.264 (NVENC) + + + + + VBR + + + + + CRF + + + + + Dimensions + + + + + Lock aspect ratio + + + + + Show advanced + + + + 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/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a> - <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} would like to thank the following patrons from Patreon: - {projectName} gostaria de agradecer aos seguintes patrões do Patreon: + O {projectName} gostaria de agradecer aos seguintes patronos do Patreon: © 2013 – {year} Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 Game Boy Advance is a registered trademark of Nintendo Co., Ltd. - © 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} is an open-source Game Boy Advance emulator - {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. Open in archive... - Abrir no arquivo... + Abrir no arquivo compactado... @@ -54,7 +54,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Tile # - Bloco # + Ladrilho # @@ -117,27 +117,27 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Remove - Excluir + Remover Gate type - Gate type + Tipo de Gate Ba&ttleChip Gate - Ba&ttleChip Gate + Po&rtal do BattleChip Progress &Gate - Progress &Gate + Portal do &Progresso Beast &Link Gate - Beast &Link Gate + Portal do &Link da Beast @@ -165,12 +165,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Cheats - Cheats + Trapaças Remove - Excluir + Remover @@ -203,12 +203,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Debugger - Depurador + Debugger Enter command (try `help` for more info) - 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. Inspect frame - Inspecionar quadro + Inspecionar frame @@ -269,7 +269,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Freeze frame - Congelar quadro + Congelar frame @@ -279,7 +279,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Disable scanline effects - Desativar efeitos scanline + Desativar efeitos de scanline @@ -302,7 +302,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Loop - Repetir + Repetir animação @@ -317,7 +317,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Select File - Selecionar arquivo + Selecionar Arquivo @@ -368,7 +368,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Location - Localização + Local @@ -405,7 +405,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. No Save - Não salvar + Nenhum Save @@ -468,12 +468,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Enabled Levels - Níveis Habilitados + Níveis Ativados Debug - Depurar + Debug @@ -559,12 +559,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Byte Count: - Número de bytes: + Quantidade de Bytes: Dump across banks - 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. Width - Tamanho + Largura 1 Byte (8-bit) - 1 Byte (8-bit) + 1 Byte (8 bits) 2 Bytes (16-bit) - 2 Bytes (16-bit) + 2 Bytes (16 bits) 4 Bytes (32-bit) - 4 Bytes (32-bit) + 4 Bytes (32 bits) @@ -648,12 +648,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Greater than value - Maior que o valor + Maior do que o valor Less than value - Menor que o valor + Menor do que o valor @@ -663,12 +663,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Changed by value - Alterado por valor + Alterado por quantia Unchanged - Inalterado + Sem mudança @@ -683,7 +683,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Search ROM - Pesquisar ROM + Procurar na ROM @@ -699,12 +699,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Guess - Adivinhar + Detectar Search Within - Buscar nos Resultados + Pesquisar nos Resultados @@ -800,7 +800,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Sprites - Sprites + Imagens Móveis @@ -830,7 +830,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Off - Desligado + Não @@ -858,7 +858,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Return, Ctrl+R - Return, Ctrl+R + Retornar, Ctrl+R @@ -895,7 +895,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Enabled - Habilitado + Ativado @@ -905,7 +905,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Tile - Bloco + Ladrilho @@ -938,7 +938,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Game Overrides - Substituições no jogo + Substituições do Jogo @@ -951,12 +951,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Autodetect - Autodetectar + Auto-detectar Realtime clock - Relógio em tempo real + Relógio de tempo real @@ -976,12 +976,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Rumble - Vibrar + Rumble Save type - Tipo de salvamento + Tipo de save @@ -996,12 +996,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Flash 512kb - Flash 512kb + Flash de 512 kbs Flash 1Mb - Flash 1Mb + Flash de 1 Mb @@ -1011,7 +1011,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Idle loop - Loop ocioso + Loop inativo @@ -1021,7 +1021,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. VBA bug compatibility mode - 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. Memory bank controller - Controlador de banco de memória + Controle do banco de memória Background Colors - Cores do Plano de Fundo + Cores do 2º Plano @@ -1056,7 +1056,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Palette preset - + Pré-definições da paleta @@ -1069,7 +1069,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Background - Plano de Fundo + 2º plano @@ -1099,7 +1099,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. 16-bit value - Valor 16-bit + Valor de 16 bits @@ -1155,17 +1155,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Game Boy Printer - Game Boy Printer + Impressora do Game Boy Hurry up! - Se apresse! + Apresse-se! Tear off - Desligar + Rasgar @@ -1211,7 +1211,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Failed to open cheats file: %1 - 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. Select cheats file - Selecionar arquivo de cheats + Selecionar arquivo de trapaças @@ -1249,27 +1249,27 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Failed to open save file: %1 - Falha ao abrir o arquivo de salvamento: %1 + Falhou em abrir o arquivo do save: %1 Failed to open game file: %1 - Falha ao abrir o arquivo do jogo: %1 + Falhou em abrir o arquivo do jogo: %1 Can't yank pack in unexpected platform! - Não é possível remover o game pak numa plataforma inesperada! + Não pode arrancar o pacote numa plataforma inesperada! Failed to open snapshot file for reading: %1 - Falha ao abrir o arquivo de snapshot para leitura: %1 + Falhou em abrir o arquivo do snapshot pra leitura: %1 Failed to open snapshot file for writing: %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. Failed to open game file: %1 - Falha ao abrir o arquivo do jogo: %1 + Falhou em abrir o arquivo do jogo: %1 Could not load game. Are you sure it's in the correct format? - 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? Failed to open save file. Is the save directory writable? - 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. Export frame - Exportar quadro + Exportar frame Portable Network Graphics (*.png) - 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. Background - Plano de Fundo + 2º plano @@ -1330,12 +1330,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Backdrop - Cor de Fundo + Cenário Frame - Quadro + Frame @@ -1409,12 +1409,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Crash - Travar + Crash Could not start GDB server - 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. Failed to open output file: %1 - Falha ao abrir arquivo de saída: %1 + Falhou em abrir arquivo de saída: %1 Select output file - 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. Background mode - Modo do plano de fundo + Modo do 2º plano Mode 0: 4 tile layers - Modo 0: 4 fundos de blocos + Modo 0: 4 camadas de ladrilhos Mode 1: 2 tile layers + 1 rotated/scaled tile layer - 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 Mode 2: 2 rotated/scaled tile layers - Modo 2: 2 fundos de blocos com rotação/escala + Modo 2: 2 camadas de ladrilhos rotacionadas/redimensionadas Mode 3: Full 15-bit bitmap - Modo 3: Bitmap 15-bit completo + Modo 3: Bitmap de 15 bits completo Mode 4: Full 8-bit bitmap - Modo 4: Bitmap 8-bits completo + Modo 4: Bitmap de 8 bits completo Mode 5: Small 15-bit bitmap - 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. Frame select - Selecionar quadro + Selecionar frame Unlocked HBlank - Barramento Horizontal Desbloqueado + Destrancou HBlank Linear OBJ tile mapping - Mapeamento linear do OBJ + Mapeamento do mosaio do OBJ linear Force blank screen - Forçar limpeza da tela + Forçar tela vazia Enable background 0 - Ativar plano de fundo 0 + Ativar 2º plano 0 Enable background 1 - Ativar plano de fundo 1 + Ativar 2º plano 1 Enable background 2 - Ativar plano de fundo 2 + Ativar 2º plano 2 Enable background 3 - Ativar plano de fundo 3 + Ativar 2º plano 3 @@ -1535,12 +1535,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Enable OBJ Window - Ativar Janela OBJ + Ativar Janela do OBJ Swap green components - Trocar componentes verde + Trocar componentes verdes @@ -1560,17 +1560,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Enable VBlank IRQ generation - Ativar geração de VBlank IRQ + Ativar geração do IRQ VBlank Enable HBlank IRQ generation - Ativar geração de HBlank IRQ + Ativar geração do IRQ HBlank Enable VCounter IRQ generation - 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. Tile data base (* 16kB) - 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. Enable mosaic - Ativar mosaico + Ativar efeito mosaico @@ -1612,7 +1612,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Enable 256-color - Ativar 256-cores + Ativar 256 cores @@ -1620,7 +1620,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Tile map base (* 2kB) - 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. Background dimensions - Dimensões do plano de fundo + Dimensões do 2º plano Overflow wraps - Overflow wraps + Embrulhos do excesso @@ -1682,7 +1682,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Integer part - Parte inteira + Parte integral @@ -1690,7 +1690,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Integer part (low) - Número inteiro (baixo) + Parte integral (baixo) @@ -1698,7 +1698,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Integer part (high) - Número inteiro (alto) + Parte integral (alto) @@ -1812,37 +1812,37 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Outside window enable blend - Fora da janela ativar blend + Fora da janela ativar mistura OBJ window enable BG 0 - Janela OBJ ativar BG 0 + Janela do OBJ ativar BG 0 OBJ window enable BG 1 - Janela OBJ ativar BG 1 + Janela do OBJ ativar BG 1 OBJ window enable BG 2 - Janela OBJ ativar BG 2 + Janela do OBJ ativar BG 2 OBJ window enable BG 3 - Janela OBJ ativar BG 3 + Janela do OBJ ativar BG 3 OBJ window enable OBJ - Janela OBJ ativar OBJ + Janela do OBJ ativar OBJ OBJ window enable blend - Janela OBJ ativar blend + Janela do OBJ ativar mistura @@ -1857,12 +1857,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Object mosaic size vertical - Tamanho vertical do mosaico de objeto + Tamanho vertical do mosaico de objetos Object mosaic size horizontal - 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 target 1 - OBJ alvo 1 + Alvo do OBJ 1 Backdrop target 1 - Backdrop alvo 1 + Alvo do cenário 1 Blend mode - Modo Blend + Modo de Mistura @@ -1942,45 +1942,45 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. OBJ target 2 - OBJ alvo 2 + Alvo do OBJ 2 Backdrop target 2 - Backdrop alvo 2 + Alvo do cenário 2 Blend A (target 1) - Blend A (alvo 1) + Mistura A (alvo 1) Blend B (target 2) - Blend B (alvo 2) + Mistura B (alvo 2) Blend Y - Blend Y + Mistura Y Sweep shifts - Sweep shifts + Trocas de varredura Sweep subtract - Sweep subtract + Subtrair varredura Sweep time (in 1/128s) - 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. Duty cycle - Ciclo de trabalho + Ciclo do dever @@ -2010,7 +2010,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Envelope step time - Envelope step time + Tempo do passo do envelope @@ -2020,7 +2020,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Envelope increase - Envelope increase + Aumentar envelope @@ -2037,7 +2037,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Sound frequency - Frequência de som + Frequência do som @@ -2066,7 +2066,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Double-size wave table - 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. Shifter frequency - Frequência de turno + Frequência do deslocador PSG volume right - Volume PSG direito + Volume do PSG direito PSG volume left - Volume PSG esquerdo + Volume do PSG esquerdo Enable channel 1 right - Ativar canal 1 à direita + Ativar canal 1 a direita Enable channel 2 right - Ativar canal 2 à direita + Ativar canal 2 a direita Enable channel 3 right - Ativar canal 3 à direita + Ativar canal 3 a direita Enable channel 4 right - Ativar canal 4 à direita + Ativar canal 4 a direita Enable channel 1 left - Ativar canal 1 à esquerda + Ativar canal 1 a esquerda Enable channel 2 left - Ativar canal 2 à esquerda + Ativar canal 2 a esquerda Enable channel 3 left - Ativar canal 3 à esquerda + Ativar canal 3 a esquerda Enable channel 4 left - Ativar canal 4 à esquerda + Ativar canal 4 a esquerda PSG master volume - Volume principal do PSG + Volume mestre do PSG @@ -2226,12 +2226,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Enable channel A right - Ativar canal A à direita + Ativar canal A a direita Enable channel A left - Ativar canal A à esquerda + Ativar canal A a esquerda @@ -2260,17 +2260,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Channel A reset - Redefinir canal A + Resetar canal A Enable channel B right - Ativar canal B à direita + Ativar canal B a direita Enable channel B left - Ativar canal B à esquerda + Ativar canal B a esquerda @@ -2280,7 +2280,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Channel B reset - Redefinir canal B + Resetar canal B @@ -2439,12 +2439,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Source (high) - Fonte (alto) + Fonte (alta) Source (low) - Fonte (baixo) + Fonte (baixa) @@ -2518,7 +2518,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Fixed - Corrigido + Consertado @@ -2534,7 +2534,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Source offset - Deslocamento de origem + Deslocamento da fonte @@ -2550,7 +2550,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. 32-bit - 32-bit + 32 bits @@ -2625,7 +2625,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Audio FIFO - Áudio FIFO + Áudio do FIFO @@ -2707,7 +2707,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Select - Select + Selecionar @@ -2731,13 +2731,13 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Up - Cima + Pra cima Down - Baixo + Pra baixo @@ -2851,7 +2851,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. SRAM wait - Aguardar SRAM + Espera do SRAM @@ -2921,33 +2921,33 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. PHI terminal - Terminal PHI + Terminal do PHI Disable - Desativado + Desativar 4.19MHz - 4.19MHz + 4.19 MHz 8.38MHz - 8.38MHz + 8.38 MHz 16.78MHz - 16.78MHz + 16.78 MHz Gamepak prefetch - Pré-carregamento de Gamepak + Pré-carga do Gamepak @@ -2967,12 +2967,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Up/Select - Cima/Select + Pra cima/Select Down/Start - Baixo/Start + Pra baixo/Start @@ -2982,17 +2982,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Active face buttons - Botões ativos + Botões de face ativos Internal clock - Clock interno + Relógio interno 32× clocking (CGB only) - 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. Output left - Saída da esquerda + Saída esquerda Background enable/priority - Plano de fundo ativo/prioridade + Ativar/prioridade do 2º plano Enable sprites - Ativar sprites + Ativar imagens móveis Double-height sprites - Sprites com dobro da altura + Imagens móveis com dobro da altura Background tile map - 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. Background tile data - 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. Window tile map - 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 - 0: HBlank / Barramento Horizontal + 0: HBlank 1: VBlank - 1: VBlank / Barramento Vertical + 1: VBlank 2: OAM scan - 2: Varredura OAM + 2: Scan do OAM 3: HDraw - 3: HDraw / Desenho Horizontal + 3: HDraw @@ -3173,12 +3173,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Comparison Y coordinate - Comparação de coordenada Y + Comparação da coordenada Y Start upper byte - Iniciar, byte superior + Iniciar byte superior @@ -3211,7 +3211,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Prepare to switch speed - Preparar para mudança de velocidade + Preparar pra trocar velocidade @@ -3231,12 +3231,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Timing - Afinação + Cronometragem Write bit - Bit de escrita + Bit de gravação @@ -3276,7 +3276,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Sprite ordering - Ordenação da Sprite + Ordenação de sprites @@ -3286,12 +3286,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. x coordinate sorting - Ordem por coordenada X + Organização da coordenada X WRAM bank - Banco WRAM + Banco do WRAM @@ -3305,12 +3305,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Super (L) - Super (L) + Super (E) Super (R) - Super (R) + Super (D) @@ -3323,12 +3323,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Load State - Carregar Estado + Carregar o State Save State - Salvar Estado + Salvar o State @@ -3343,7 +3343,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Slot %1 - Espaço %1 + Slot %1 @@ -3362,12 +3362,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Error - Error + Erro Warning - Warning + Aviso @@ -3400,7 +3400,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. An error occurred - Ocorreu um erro + Um erro ocorreu @@ -3420,12 +3420,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. WARN - WARN + AVISAR ERROR - ERROR + ERRO @@ -3435,7 +3435,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. GAME ERROR - GAME ERROR + ERRO DO JOGO @@ -3455,7 +3455,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Tile base - Base do bloco + Base dos ladrilhos @@ -3481,7 +3481,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Mirror - Espelhamento + Espelho @@ -3518,7 +3518,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Portable Network Graphics (*.png) - 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. Save memory region - Salvar região de memória + Salvar a região da memória Failed to open output file: %1 - 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. Failed to open output file: %1 - 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. Failed to open input file: %1 - 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) - 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);;Adobe Color Table (*.act) + Windows PAL (*.pal);;Tabela de Cores da Adobe (*.act) Failed to open output palette file: %1 - 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. (no database present) - (nenhum banco de dados) + (nenhum banco de dados presente) @@ -3764,12 +3764,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Bug report archive - Arquivo de reportagem de falhas + Arquivo compactado do relatório dos bugs ZIP archive (*.zip) - Arquivo ZIP (*.zip) + Arquivo compactado ZIP (*.zip) @@ -3777,42 +3777,42 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Save games and save states (%1) - Estado de jogos salvados (%1) + Saves dos jogos e save states (%1) Select save game or save state - Selecione o estado de jogo gravado + Selecione o save do jogo ou save state Save games (%1) - Salvar jogos (%1) + Saves dos jogos (%1) Select save game - Selecione o jogo salvado + Selecione o save do jogo Conversion failed - Conversão falhada + A conversão falhou Failed to convert the save game. This is probably a bug. - Falha ao converter o jogo salvado. Provavelmente um erro de programação. + Falhou em converter o save do jogo. Isto é provavelmente um bug. No file selected - Nenhum ficheiro selecionado + Nenhum arquivo selecionado Could not open file - 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. Please select a valid input file - 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. Cannot convert save games between platforms - 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 Multimedia - Qt Multimídia + Multimídia do Qt @@ -3861,12 +3861,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. OpenGL (force version 1.x) - OpenGL (forçar versão 1.x) + OpenGL (forçar a versão 1.x) None (Still Image) - Nenhum (Imagem parada) + Nenhum (Imagem Parada) @@ -3897,7 +3897,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Select directory - Selecione diretório + Selecione o diretório @@ -3935,7 +3935,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Pass %1 - Passar %1 + Passe %1 @@ -3961,18 +3961,18 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Export tiles - Exportar blocos + Exportar ladrilhos Portable Network Graphics (*.png) - Portable Network Graphics (*.png) + Gráficos Portáteis da Rede (*.png) Export tile - Exportar bloco + Exportar ladrilho @@ -3980,7 +3980,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Failed to open output video file: %1 - 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. Game Boy Advance ROMs (%1) - ROMs de Game Boy Advance (%1) + ROMs do Game Boy Advance (%1) Game Boy ROMs (%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 Video Logs (*.mvl) - %1 Logs de Vídeo (*.mvl) + %1 Registros do Vídeo (*.mvl) Archives (%1) - Arquivos (%1) + Arquivos Compactados (%1) @@ -4036,12 +4036,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Select save - Selecionar salvamento + Selecionar save Select patch - Selecione correção + Selecionar patch @@ -4051,12 +4051,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Select e-Reader dotcode - Selecione dotcode do e-Reader + Selecionar dotcode do e-Reader e-Reader card (*.raw *.bin *.bmp) - 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) - GameShark saves (*.sps *.xps) + Saves do GameShark (*.sps *.xps) Select video log - Selecionar registro de vídeo + Selecionar registro do vídeo Video logs (*.mvl) - Video logs (*.mvl) + Registros do vídeo (*.mvl) Crash - Travamento + Crash The game has crashed with the following error: %1 - O jogo travou com o seguinte erro: + O jogo teve um crash com o seguinte erro: %1 Unimplemented BIOS call - Chamada de BIOS não implementada + Chamada da BIOS não implementada This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. - 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. Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - 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. Really make portable? - Quer mesmo tornar portátil? + Realmente tornar portátil? This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? - 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? Restart needed - É necessário reiniciar + Reiniciar é necessário Some changes will not take effect until the emulator is restarted. - 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. Load ROM in archive... - Carregar ROM em arquivo... + Carregar ROM no arquivo compactado... Add folder to library... - Adicionar pasta à biblioteca... + Adicionar a pasta a biblioteca... @@ -4181,7 +4181,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Boot BIOS - Rodar BIOS + Dar Boot na BIOS @@ -4191,12 +4191,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. ROM &info... - &Informações da ROM... + Informações da &ROM... Recent - Recente + Recentes @@ -4206,7 +4206,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. &Load state - &Carregar Estado + &Carregar state @@ -4221,7 +4221,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Game Pak sensors... - Sensores de Game Pak... + Sensores do Game Pak... @@ -4231,73 +4231,73 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Load state file... - Carregar arquivo de estado... + Carregar arquivo do state... Save games (%1) - Jogos salvados (%1) + Saves dos jogos (%1) Select save game - Selecione jogo salvado + Selecione save do jogo mGBA save state files (%1) - Ficheiro de estado de jogo mGBA (%1) + Arquivos do save state do mGBA (%1) Select save state - Selecione estado de jogo gravado + Selecione save state Select e-Reader card images - + Selecionar imagens do cartão do e-Reader Image file (*.png *.jpg *.jpeg) - + Arquivo da imagem (*.png *.jpg *.jpeg) Conversion finished - + Conversão concluída %1 of %2 e-Reader cards converted successfully. - + %1 de %2 cartões do e-Reader convertidos com sucesso. Load alternate save game... - Carregar jogo salvado alternativo... + Carregar save alternativo do jogo... Load temporary save game... - Carregar jogo salvado temporário... + Carregar save temporário do jogo... Convert e-Reader card image to raw... - + Converter imagem do cartão do e-Reader pro natural... &Save state - &Salvar Estado + &Salvar o state Save state file... - Salvar arquivo de estado... + Arquivo do save state... @@ -4312,28 +4312,28 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Load recent - Carregar recente + Carregar recentes Save recent - Salvar recente + Salvar recentes Undo load state - Desfazer carregar estado + Desfazer o carregamento do state Undo save state - Desfazer salvar estado + Desfazer o salvamento do state State &%1 - Estado &%1 + State &%1 @@ -4343,7 +4343,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Convert save game... - Converter jogo salvado... + Converter save do jogo... @@ -4358,7 +4358,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. E&xit - &Sair + S&air @@ -4373,12 +4373,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Sh&utdown - &Desligar + De&sligar Yank game pak - Remover game pak + Arrancar game pak @@ -4388,22 +4388,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. &Next frame - &Próximo quadro + &Próximo frame Fast forward (held) - Avançar rápido (segurado) + Avanço rápido (segurado) &Fast forward - Avanço &Rápido + &Avanço rápido Fast forward speed - Velocidade de avanço + Velocidade do avanço rápido @@ -4433,12 +4433,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Sync to &video - Sincronizar para &vídeo + Sincronizar no &vídeo Sync to &audio - Sincronizar para &áudio + Sincronizar no &áudio @@ -4478,7 +4478,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Frame size - Tamanho do quadro + Tamanho do frame @@ -4488,12 +4488,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Lock aspect ratio - Fixar proporção + Trancar proporção do aspecto Force integer scaling - Forçar dimensionamento inteiro + Forçar dimensionamento da integral @@ -4503,7 +4503,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Frame&skip - &Salto de quadro + Frame&skip @@ -4513,7 +4513,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. FPS target - Meta de FPS + FPS alvo @@ -4523,7 +4523,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Take &screenshot - Capturar &tela + Tirar &screenshot @@ -4533,12 +4533,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Game Boy Printer... - Impressora Game Boy... + Impressora do Game Boy... BattleChip Gate... - BattleChip Gate... + Portal do BattleChip... @@ -4548,7 +4548,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Interframe blending - Blending entre-telas + Mistura do interframe @@ -4558,7 +4558,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Video layers - Camadas de vídeo + Camadas do vídeo @@ -4568,7 +4568,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Adjust layer placement... - Ajustar posicionamento de plano... + Ajustar posicionamento da camada... @@ -4583,32 +4583,32 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Game &overrides... - Game &overrides... + Substituições &do jogo... Couldn't Start - Não foi possível Iniciar + Não Pôde Iniciar Could not start game. - Não foi possível iniciar o jogo. + Não pôde iniciar o jogo. Scan e-Reader dotcodes... - Escanear dotcode do e-Reader... + Escanear dotcodes do e-Reader... Import GameShark Save... - Importar salvamento do GameShark... + Importar Save do GameShark... Export GameShark Save... - Exportar salvamento do GameShark... + Exportar Save do GameShark... @@ -4618,7 +4618,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. &Cheats... - &Cheats... + &Trapaças... @@ -4628,12 +4628,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Open debugger console... - Abrir console de depuração... + Abrir console do debugger... Start &GDB server... - Iniciar servidor &GDB... + Iniciar servidor do &GDB... @@ -4643,12 +4643,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. View &sprites... - Visualizar &sprites... + Visualizar &imagens móveis... View &tiles... - Visualizar &blocos... + Visualizar &ladrilhos... @@ -4658,7 +4658,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. &Frame inspector... - Inspetor de &quadro... + Inspetor dos &frames... @@ -4668,7 +4668,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Search memory... - Pesquisar memória... + Procurar memória... @@ -4678,12 +4678,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Record debug video log... - Gravar log de vídeo de depuração... + Gravar registro do vídeo de debug... Stop debug video log - 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. GameShark Button (held) - Botão de GameShark (segurado) + Botão do GameShark (segurado) Autofire - Disparo automático + Auto-disparar Autofire A - Disparo automático A + Auto-disparar A Autofire B - Disparo automático B + Auto-disparar B Autofire L - Disparo automático L + Auto-disparar L Autofire R - Disparo automático R + Auto-disparar R Autofire Start - Disparo automático Start + Auto-disparar Start Autofire Select - Disparo automático Select + Auto-disparar Select Autofire Up - Disparo automático Cima + Auto-disparar Pra Cima Autofire Right - Disparo automático Direita + Auto-disparar Direita Autofire Down - Disparo automático Baixo + Auto-disparar Pra Baixo Autofire Left - Disparo automático Esquerda + Auto-disparar Esquerda @@ -4761,12 +4761,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. %1 kiB - %1 kiB + %1 kiBs %1 MiB - %1 MiB + %1 MiBs @@ -4776,7 +4776,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. GB - GB + GBs @@ -4837,7 +4837,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Game ID: - ID do jogo: + ID do Jogo: @@ -4870,12 +4870,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Generate Bug Report - Gerar Relatório de Bug + Gerar Relatório do Bug <html><head/><body><p>To file a bug report, please first generate a report file to attach to the bug report you're about to file. It is recommended that you include the save files, as these often help with debugging issues. This will collect some information about the version of {projectName} you're running, your configuration, your computer, and the game you currently have open (if any). Once this collection is completed you can review all of the information gathered below and save it to a zip file. The collection will automatically attempt to redact any personal information, such as your username if it's in any of the paths gathered, but just in case you can edit it afterwards. After you have generated and saved it, please click the button below or go to <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> to file the bug report on GitHub. Make sure to attach the report you generated!</p></body></html> - <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. Include save file - Incluir ficheiro de jogo salvado + Incluir arquivo do save Create and include savestate - Criar e incluir estado de jogo + Criar e incluir savestate @@ -4908,12 +4908,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Convert/Extract Save Game - Converter e extrair jogo salvado + Converter/Extrair o Save do Jogo Input file - Ficheiro de entrada + Arquivo de entrada @@ -4924,22 +4924,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Output file - Ficheiro de saída + Arquivo de saída %1 %2 save game - %1 %2 jogo salvado + %1 %2 save do jogo little endian - endian pequeno + little endian big endian - endian grande + big endian @@ -4969,22 +4969,22 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. packed MBC2 - packed MBC2 + empacotou o MBC2 unpacked MBC2 - unpacked MBC2 + desempacotou o MBC2 MBC6 flash - MBC6 flash + Flash do MBC6 MBC6 combined SRAM + flash - MBC6 combinado SRAM + flash + MBC6 SRAM combinado + flash @@ -5004,7 +5004,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. %1 save state with embedded %2 save game - %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. Start time at - Horário iniciando em + Horário do início em @@ -5042,7 +5042,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. MM/dd/yy hh:mm:ss AP - 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. Audio buffer: - Buffer de áudio: + Buffer do áudio: @@ -5183,7 +5183,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Sample rate: - Taxa de amostragem: + Taxa das amostras: @@ -5225,7 +5225,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Fast forward volume: - 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. Frameskip: - Salto de quadro: + Frameskip: @@ -5246,17 +5246,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. frames - quadros + frames FPS target: - Meta de FPS: + FPS alvo: frames per second - quadros por segundo + frames por segundo @@ -5276,7 +5276,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Lock aspect ratio - Fixar proporção + Trancar proporção do aspecto @@ -5286,37 +5286,37 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Default color palette only - + Só a cor padrão da paleta SGB color palette if available - + Paleta das cores SGB se disponível GBC color palette if available - + Paleta das cores do GBC se disponível SGB (preferred) or GBC color palette if available - + SGB (preferido) ou paleta das cores do GBC se disponível Game Boy Camera - + Câmera do Game Boy Driver: - + Driver: Source: - + Fonte: @@ -5326,7 +5326,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Interframe blending - Interframe blending + Mistura do interframe @@ -5341,33 +5341,33 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Show OSD messages - Exibir mensagens OSD + Mostrarr mensagens do OSD Save state extra data: - Dados extras do estado de jogo: + Dados extras do save state: Save game - Salvar jogo + Save do jogo Load state extra data: - Carregar dados extras do estado de jogo: + Carregar dados extras do state: Enable VBA bug compatibility in ROM hacks - + Ativar compatibilidade dos bugs do VBA nos hacks das ROMs Preset: - + Pré-definições: @@ -5377,7 +5377,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Fast forward (held) speed: - 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. Log to file - Registrar para arquivo + Registrar no arquivo @@ -5402,7 +5402,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Force integer scaling - Forçar dimensionamento inteiro + Forçar dimensionamento da integral @@ -5412,7 +5412,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. English - Português do Brasil + Inglês @@ -5432,7 +5432,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Show when no game open - 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. Suspend screensaver - Suspender protetor de tela + Suspender proteção de tela @@ -5462,32 +5462,32 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Automatically save cheats - Salvar cheats automaticamente + Salvar trapaças automaticamente Automatically load cheats - Carregar cheats automaticamente + Carregar trapaças automaticamente Automatically save state - Salvar estado automaticamente + Salvar o state automaticamente Automatically load state - Carregar estado automaticamente + Carregar o state automaticamente Enable Discord Rich Presence - Habilitar Discord Rich Presence + Ativar Discord Rich Presence Fast forward speed: - Velocidade de avanço: + Velocidade de avanço rápido: @@ -5503,12 +5503,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Rewind history: - Histórico de retrocesso: + Histórico do retrocesso: Idle loops: - Loops ociosos: + Loops inativos: @@ -5529,33 +5529,33 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Screenshot - Captura de tela + Screenshot Cheat codes - Códigos de cheat + Códigos de trapaça Preload entire ROM into memory - Pré-carregar toda a ROM na memória + Pré-carregar a ROM inteira na memória Autofire interval: - Intervalo do Disparo Automático: + Intervalo do Auto-Disparo: Enable Game Boy Player features by default - Ativar funcionalidades do Game Boy Player por padrão + Ativar funções do Game Boy Player por padrão Video renderer: - Renderizador de vídeo: + Renderizador do vídeo: @@ -5575,17 +5575,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. High-resolution scale: - Escala de alta resolução: + Escala de alta-resolução: XQ GBA audio (experimental) - XQ GBA audio (experimental) + Áudio do XQ GBA (experimental) GB BIOS file: - Arquivo GB BIOS: + Arquivo do GB BIOS: @@ -5603,32 +5603,32 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Use BIOS file if found - Usar o arquivo BIOS se encontrado + Usar o arquivo da BIOS se encontrado Skip BIOS intro - Pular introdução da BIOS + Ignorar introdução da BIOS GBA BIOS file: - Arquivo GBA BIOS: + Arquivo da BIOS do GBA: GBC BIOS file: - Arquivo GBC BIOS: + Arquivo da BIOS do GBC: SGB BIOS file: - Arquivo SGB BIOS: + Arquivo da BIOS do SGB: Save games - Arquivos de salvamento + Saves dos jogos @@ -5637,17 +5637,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Same directory as the ROM - Mesmo diretório que a ROM + O mesmo diretório que a ROM Save states - Estados salvos + Save states Screenshots - Capturas de tela + Screenshots @@ -5657,42 +5657,42 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Cheats - Cheats + Trapaças Models - + Modelos GB only: - + Só GB: SGB compatible: - + Compatível com SGB: GBC only: - + Só no GBC: GBC compatible: - + Compatível com GBC: SGB and GBC compatible: - + Compatível com SGB e GBC: Game Boy palette - + Paleta do Game Boy @@ -5707,12 +5707,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Default sprite colors 1: - Cores padrão do sprite 1: + Cores padrão de sprite 1: Default sprite colors 2: - 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. Unload Shader - Remover Shader + Descarregar Shader @@ -5781,7 +5781,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Tiles - Blocos + Ladrilhos @@ -5806,17 +5806,17 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Tiles per row - Blocos por linha + Ladrilhos por linha Fit to window - Ajustar à janela + Encaixar na janela Copy Selected - Copiar selecionado + Copiar Selecionado @@ -5844,12 +5844,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Select File - Selecionar arquivo + Selecionar Arquivo Presets - Predefinições + Pre-definições @@ -5891,7 +5891,7 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. &Lossless - &Sem perdas + &Sem Perdas @@ -5977,12 +5977,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Uncompressed - Sem compressão + Descomprimido Bitrate (kbps) - Bitrate (kbps) + Taxa dos bits (kbps) @@ -6017,12 +6017,12 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Lock aspect ratio - Fixar proporção + Trancar proporção do aspecto Show advanced - 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/">Website</a> • <a href="https://forums.mgba.io/">Forums / Support</a> • <a href="https://patreon.com/mgba">Donate</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Source</a> - + <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> Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> - + 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} is an open-source Game Boy Advance emulator - + {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 type - + Gate türü @@ -147,12 +147,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Chip ID - + Çip ID Update Chip data - Chip verilerini güncelle + Çip verilerini güncelle @@ -195,7 +195,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Enter codes here... - + Kodları buraya gir... @@ -203,7 +203,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Debugger - + Hata Ayıklayıcı @@ -213,7 +213,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Break - + Ara ver @@ -221,37 +221,37 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Connect to Dolphin - + Doliphin'e bağlan Local computer - + Yerel bilgisayar IP address - + IP Adresi Connect - + Bağlan Disconnect - + Bağlantıyı Kes Close - + Kapat Reset on connect - + Bağlantıyı Sıfırla @@ -259,37 +259,37 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Inspect frame - + Kareyi izle Magnification - + Büyütme Freeze frame - + Kareyi Dondur Backdrop color - + Arka Plan Rengi Disable scanline effects - + Scanline Efektini devre dışı bırak Export - + Çıkar Reset - Reset + Sıfırla @@ -297,12 +297,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Record GIF/WebP/APNG - + GIF/Web/APNG Kaydet Loop - + Döngü @@ -322,17 +322,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. APNG - + APNG GIF - + GIF WebP - + WebP @@ -392,7 +392,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. %1 State - + %1 Durum @@ -420,7 +420,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Cancel - + Geri @@ -463,7 +463,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Logs - + Girdiler @@ -478,7 +478,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Stub - + Matris @@ -498,17 +498,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Fatal - + Ölümcül Game Error - + Oyun Hatası Advanced settings - + Gelişmiş ayarlar @@ -541,7 +541,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Copy - + Kopyala @@ -549,22 +549,22 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Save Memory Range - + Bellek Aralığını Kaydet Start Address: - + Adres Başlangıcı: Byte Count: - + Bayt Sayısı: Dump across banks - + Bellek depoları arası döküm @@ -572,7 +572,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Memory Search - + Bellek Arama @@ -649,57 +649,57 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Search type - + Arama türü Equal to value - + Eş değer Greater than value - + Değerden büyük Less than value - + Değerden küçük Unknown/changed - + Bilinmeyen/değiştirilmiş Changed by value - + Değere göre değiştirildi Unchanged - + Değiştirilmemiş Increased - + Arttırılmış Decreased - + Azaltılmış Search ROM - + ROM Ara New Search - + Yeni Arama @@ -722,7 +722,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Memory - + Bellek @@ -787,7 +787,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Save Range - + Aralığı Kaydet @@ -800,7 +800,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Sprites - + Spritelar @@ -840,12 +840,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Copy - + Kopyala Matrix - + Matrix @@ -956,7 +956,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Realtime clock - + Gerçek Zaman Saati @@ -971,12 +971,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Light sensor - + Işık Sensörü Rumble - + Titreşim @@ -1011,17 +1011,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Idle loop - + Boşta İşlem Game Boy Player features - + Game Boy Player özellikleri VBA bug compatibility mode - + VBA hata uyumluluk modu @@ -1036,7 +1036,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Memory bank controller - + Bellek bank kontrolcüsü @@ -1056,7 +1056,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Palette preset - + Palet ön ayar @@ -1109,7 +1109,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Palette index - + Palet indeks @@ -1155,27 +1155,27 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Game Boy Printer - + Game Boy Yazıcı Hurry up! - + Acele et! Tear off - + Parçalara ayır Copy - + Kopyala Magnification - + Büyütme @@ -1183,7 +1183,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. 2021 - + 2021 @@ -1259,7 +1259,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Can't yank pack in unexpected platform! - + Beklenmedik bir platformda kartı çıkaramazsın! @@ -1282,12 +1282,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Could not load game. Are you sure it's in the correct format? - Oyun yüklenemedi. Doğru formatta olduğundan emin misin? + Oyun yüklenemedi. Doğru formatta olduğundan emin misin? Failed to open save file. Is the save directory writable? - + 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. Export frame - + Kareyi Dışarı Aktar Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) None - Hiçbiri + Hiçbiri Background - Arkaplan + Arka Plan Window - + Pencere Objwin - + Nes. Pen. Sprite - + Sprite Backdrop - + Arka fon Frame - + Kare %1 %2 - + %1 %2 @@ -1356,12 +1356,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Clear Button - + Tuşu Temizle Clear Analog - + Analogu Temizle @@ -1394,7 +1394,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Break - + İptal @@ -1409,7 +1409,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Crash - + Hata @@ -1422,7 +1422,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Failed to open output file: %1 - Çı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) - + 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 Mode - + CGB Mod @@ -1485,7 +1485,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Unlocked HBlank - + Kilidi Açık HBlank @@ -1540,7 +1540,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Swap green components - + Yeşil bileşenleri değiştir @@ -1596,7 +1596,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Tile data base (* 16kB) - + Tile veri tabanı (* 16kB) @@ -1620,7 +1620,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Tile map base (* 2kB) - + Tile plan tabanı (* 2kB) @@ -1690,7 +1690,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Integer part (low) - + Tamsayı kısmı (düşük) @@ -1698,7 +1698,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Integer part (high) - + Tamsayı kısmı (yüksek) @@ -1852,7 +1852,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Background mosaic size horizontal - 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 target 1 - + BG 0 hedef 1 BG 1 target 1 - + BG 1 hedef 1 BG 2 target 1 - + BG 2 hedef 1 BG 3 target 1 - + BG 3 hedef 1 OBJ target 1 - + NESNE hedef 1 @@ -2408,7 +2408,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Address (low) - + Adres (düşük) @@ -2420,53 +2420,53 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Address (high) - + Adres (yüksek) Sound frequency (low) - + Ses frekansı (düşük) Sound frequency (high) - + Ses frekansı (yüksek) Source (high) - + Kaynak (yüksek) Source (low) - + Kaynak (düşük) Destination (high) - + Hedef (düşük) Destination (low) - + Hedef (yüksek) Green (low) - + Yeşil (düşük) Green (high) - + Yeşil (yüksek) @@ -2957,341 +2957,341 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Right/A - + Sağ/A Left/B - + Sol/B Up/Select - + Yukarı/Select Down/Start - + Aşağı/Start Active D-pad - + D-pad Etkinleştir Active face buttons - + Yüz tuşlarını etkinleştir Internal clock - + Dahili saat 32× clocking (CGB only) - + 32× saat ölçümü (yalnızca CGB) Transfer active - + Aktarım etkin Divider - + Bölücü 1/16 - + 1/16 LCD STAT - + LCD DURUM Timer - + Zamanlayıcı Serial - + Seri Joypad - + Joypad Volume right - + Ses sağ Output right - + Çıkış sağ Volume left - + Ses sol Output left - + Çıkış sol Background enable/priority - + Arkaplanı etkinleştir/öncelik Enable sprites - + Spriteları Etkinleştir Double-height sprites - + Çift yükseklikte spritelar Background tile map - + Arka plan tile haritası 0x9800 – 0x9BFF - + 0x9800 – 0x9BFF 0x9C00 – 0x9FFF - + 0x9C00 – 0x9FFF Background tile data - + Arka plan tile verisi 0x8800 – 0x87FF - + 0x8800 – 0x87FF 0x8000 – 0x8FFF - + 0x8000 – 0x8FFF Enable window - + Pencereyi etkinleştir Window tile map - + Pencere tile haritası Enable LCD - + LCD Etkinleştir Mode - Mod + Mod 0: HBlank - + 0: HBlank 1: VBlank - + 1: VBlank 2: OAM scan - + 2: OAM tarama 3: HDraw - + 3: HDraw In LYC - + LYC'de Enable HBlank (mode 0) IRQ - + HBlank (mod 0) IRQ Etkinleştir Enable VBlank (mode 1) IRQ - + VBlank (mod 1) Etkinleştir Enable OAM (mode 2) IRQ - + OAM (mod 2) IRQ Etkinleştir Enable LYC IRQ - + LYC IRQ Etkinleştir Current Y coordinate - + Geçerli Y koordinatı Comparison Y coordinate - + Karşılaştırılan Y koordinatı Start upper byte - + Üst bayttan başla Color 0 shade - + Renk 0 ton Color 1 shade - + Renk 1 ton Color 2 shade - + Renk 2 ton Color 3 shade - + Renk 3 ton Prepare to switch speed - + Değiştirme hızını hazırlama Double speed - + 2x Hız VRAM bank - + VRAM deposu Length - + Uzunluk Timing - + Zamanlama Write bit - + Yazma biti Read bit - + Okuma biti Unknown - + Bilinmeyen Current index - + Mevcut indeks Auto-increment - + Oto-artış Red - Kırmızı + Kırmızı Blue - Mavi + Mavi Sprite ordering - + Sprite Düzenleme OAM order - + OAM sırası x coordinate sorting - + x koordinat sıralaması WRAM bank - + WRAM deposu @@ -3305,17 +3305,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Super (L) - + Süper (L) Super (R) - + Süper (R) Menu - + Menü @@ -3323,12 +3323,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Load State - Konum yükle + Durum yükle Save State - Konumu kaydet + Durumu Kaydet @@ -3400,12 +3400,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. An error occurred - + Bir hata meydana geldi DEBUG - + HATA AYIKLAMA @@ -3415,27 +3415,27 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. INFO - + BİLGİ WARN - + UYARI ERROR - + HATA FATAL - + CİDDİ GAME ERROR - + OYUN HATASI @@ -3443,45 +3443,45 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Priority - Öncelik + Öncelik Map base - + Temel harita Tile base - + Temel tile Size - Boyut + Boyut Offset - Çıkıntı + Offset Xform - + Xform Map Addr. - + Harita Ad. Mirror - + Ayna @@ -3508,12 +3508,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. N/A - + N/A Export map - + Haritayı dışarı aktar @@ -3526,12 +3526,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Save memory region - + Hafıza bölgesini kaydet Failed to open output file: %1 - Çı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. Copy selection - Seçileni kopyala + Seçilenleri kopyala @@ -3569,7 +3569,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Save selected memory - 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. Load memory - Memory yükle + Hafıza yükle @@ -3631,7 +3631,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Off - + 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. Official MBCs - + Resmi MBCler Licensed MBCs - + Lisanslı MBC'ler Unlicensed MBCs - + Lisanssız MBCler @@ -3764,12 +3764,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Bug report archive - + Hata rapor arşivi ZIP archive (*.zip) - + ZIP arşivi (*.zip) @@ -3777,62 +3777,62 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Save games and save states (%1) - + Kayıtlı oyunlar ve kayıtlı durumlar (%1) Select save game or save state - + Kayıtlı oyun veya kayıtlı durum seç Save games (%1) - + Kayıtlı oyunlar (%1) Select save game - + Kayıtlı oyun seç Conversion failed - + Dönüştürme başarısız Failed to convert the save game. This is probably a bug. - + Kayıtlı oyunu dönüştürme başarısız. Muhtemelen bir hata meydana geldi. No file selected - + Seçili dosya yok Could not open file - + Dosya açılamadı No valid formats found - + Geçerli türler bulunamadı Please select a valid input file - + Lütfen geçerli bir giriş dosyası seç No valid conversions found - + Geçerli dönüştürme bulunamadı Cannot convert save games between platforms - + 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. Select directory - + Yolu seç (%1×%2) - + (%1×%2) @@ -3943,17 +3943,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Action - + Eylem Keyboard - Klavye + Klavye Gamepad - + Oyun Kolu @@ -3961,18 +3961,18 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Export tiles - + Tileleri dışarı aktar Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) Export tile - + Tileyi dışarı aktar @@ -4051,32 +4051,32 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Select e-Reader dotcode - + e-Okuyucu nokta kodunu seç e-Reader card (*.raw *.bin *.bmp) - + e-Okuyucu kart (*.raw *.bin *.bmp) Select e-Reader card images - + e-Okuyucu kartından görüntüleri seç Image file (*.png *.jpg *.jpeg) - + Görüntü dosyası (*.png *.jpg *.jpeg) Conversion finished - + Dönüştürme tamamlandı %1 of %2 e-Reader cards converted successfully. - + %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. Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + 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. Convert e-Reader card image to raw... - + 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. Convert save game... - + 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. Connect to Dolphin... - + Dolphin'e Bağlan... Report bug... - + Hata rapor et... @@ -4527,88 +4527,88 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Game &overrides... - Oyunların üzerine yazılanlar + & Oyunun üzerine yazılanlar... Couldn't Start - + Başlatılamadı Save games (%1) - + Kayıtlı oyunlar (%1) Select save game - + Kayıtlı oyun seç mGBA save state files (%1) - + mGBA kayıt durum dosyası (%1) Select save state - + Kayıt durumu seç Could not start game. - + Oyun başlatılamadı. Load alternate save game... - + Alternatif kayıtlı oyun yükle... Load temporary save game... - + Geçici kayıtlı oyunu yükle... Scan e-Reader dotcodes... - + e-Okuyucu noktakodları tara... Import GameShark Save... - + GameShark kaydını içeri aktar... Export GameShark Save... - + GameShark kaydını dışarı aktar... %1× - + %1× Interframe blending - + Kareler-arası Karıştırma Record A/V... - + A/V Kayıt... Record GIF/WebP/APNG... - + GIF/WebP/APNG Kayıt... Game Pak sensors... - + Oyun Kartuş sensörleri... @@ -4653,7 +4653,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. &Frame inspector... - + &Kare denetçisi... @@ -4673,12 +4673,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Record debug video log... - + Hata ayıklama video günlüğünü kaydet... Stop debug video log - + Hata ayıklama video günlüğünü durdur @@ -4748,7 +4748,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Clear - Temizle + Temizle @@ -4756,17 +4756,17 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. %1 byte - + %1 bayt %1 kiB - + %1 kiB %1 MiB - + %1 MiB @@ -4789,22 +4789,22 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Shift - + Shift Control - + Kontrol Alt - + Alt Meta - + Derece @@ -4870,37 +4870,37 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Generate Bug Report - + Hata Raporu Oluştur <html><head/><body><p>To file a bug report, please first generate a report file to attach to the bug report you're about to file. It is recommended that you include the save files, as these often help with debugging issues. This will collect some information about the version of {projectName} you're running, your configuration, your computer, and the game you currently have open (if any). Once this collection is completed you can review all of the information gathered below and save it to a zip file. The collection will automatically attempt to redact any personal information, such as your username if it's in any of the paths gathered, but just in case you can edit it afterwards. After you have generated and saved it, please click the button below or go to <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> to file the bug report on GitHub. Make sure to attach the report you generated!</p></body></html> - + <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> Generate report - + Rapor oluştur Save - Kaydet + Kaydet Open issue list in browser - + Sorun listesini tarayıcıda aç Include save file - + Kayıt dosyasını dahil et Create and include savestate - + Kayıt durumunu oluştur ve dahil et @@ -4908,103 +4908,103 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Convert/Extract Save Game - + Kayıt Dosyasını Dönüştür/Çıkar Input file - + Giriş dosyası Browse - Gözat + Gözat Output file - + Çıkış dosyası %1 %2 save game - + %1 %2 kayıtlı oyun little endian - + little endian big endian - + big endian SRAM - + SRAM %1 flash - + %1 flash %1 EEPROM - + %1 EEPROM %1 SRAM + RTC - + %1 SRAM + RTC %1 SRAM - + %1 SRAM packed MBC2 - + paketli MBC2 unpacked MBC2 - + paketlenmemiş MBC2 MBC6 flash - + MBC6 flash MBC6 combined SRAM + flash - + MBC6 ile birleştirilmiş SRAM + flash MBC6 SRAM - + MBC6 SRAM TAMA5 - + TAMA5 %1 (%2) - + %1 (%2) %1 save state with embedded %2 save game - + 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. Enhancements - + Geliştirmeler @@ -5183,7 +5183,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Sample rate: - Değer oranı + Değer oranı: @@ -5214,7 +5214,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Volume: - Ses + Ses: @@ -5261,7 +5261,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Sync: - Eşitle + Senkronize Et: @@ -5291,82 +5291,82 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Models - + Modeller GB only: - + Sadece GB: SGB compatible: - + SGB uyumlu: GBC only: - + Sadece GBC: GBC compatible: - + Uyumlu GBC: SGB and GBC compatible: - + Uyumlu SGB ve GBC: Game Boy palette - + Game Boy paleti Default color palette only - + Sadece varsayılan renk paleti SGB color palette if available - + Mevcutsa SGB renk paketi GBC color palette if available - + Mevcutsa GBC renk paketi SGB (preferred) or GBC color palette if available - + Mevcutsa SGB (tercih edilen) ya da GBC renk paketi Game Boy Camera - + Game Boy Kamera Driver: - + Sürücü: Source: - + Kaynak: Native (59.7275) - + Yerel (59.7275) Interframe blending - + Kareler-arası Karıştırma @@ -5381,7 +5381,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Library: - Kütüphane + Kütüphane: @@ -5421,12 +5421,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Pause when minimized - + Küçültüldüğünde duraklat Dynamically update window title - + Pencere boyutuna göre dinamik olarak güncelle @@ -5436,28 +5436,28 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Save state extra data: - + Durum ekstra veriyi kaydet: Save game - + Oyunu kaydet Load state extra data: - + Durum ekstra veriyi yükle: Enable VBA bug compatibility in ROM hacks - + ROM hacklerinde VBA hata uyumluluğunu etkinleştir Preset: - + Ön ayar: @@ -5487,12 +5487,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Show OSD messages - + OSD mesajlarını göster Show filename instead of ROM name in title bar - + 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. Fast forward (held) speed: - + İleri sarma (tutulan) hızı: @@ -5565,42 +5565,42 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Enable Game Boy Player features by default - + Game Boy Player özelliklerini varsayılan olarak etkinleştir Video renderer: - + Video oluşturucu: Software - + Yazılım OpenGL - + OpenGL OpenGL enhancements - + OpenGL geliştirmeleri High-resolution scale: - + Yüksek kalite ölçeği: (240×160) - + (240×160) XQ GBA audio (experimental) - + XQ GBA ses (deneysel) @@ -5667,7 +5667,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Screenshots - 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. Export Selected - + Seçileni Dışarı Aktar Export All - + Hepsini Dışarı Aktar @@ -5816,12 +5816,12 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. Copy Selected - + Seçilenleri Kopyala Copy All - + Hepsini Kopyala @@ -5916,7 +5916,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. 4K - + 4K @@ -5947,7 +5947,7 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. None - Hiçbiri + Hiçbiri @@ -5992,22 +5992,22 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. H.264 - + H.264 H.264 (NVENC) - + H.264 (NVENC) VBR - + VBR CRF - + 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();