diff --git a/CHANGES b/CHANGES index 72b6c5eb1..fd24e8eb8 100644 --- a/CHANGES +++ b/CHANGES @@ -41,17 +41,24 @@ Misc: 0.11.0: (Future) Features: + - Scripting: New `input` API for getting raw keyboard/mouse/controller state - New unlicensed GB mappers: NT (older types 1 and 2), Li Cheng, GGB-81 - Debugger: Add range watchpoints Emulation fixes: + - GBA Audio: Fix improperly deserializing GB audio registers (fixes mgba.io/i/2793) - GBA Memory: Make VRAM access stalls only apply to BG RAM + - GBA SIO: Fix SIOCNT SI pin value after attaching player 2 (fixes mgba.io/i/2805) - GBA Video: Disable BG target 1 blending when OBJ blending (fixes mgba.io/i/2722) Other fixes: + - Core: Allow sending thread requests to a crashed core (fixes mgba.io/i/2784) - Qt: Fix crash when attempting to use OpenGL 2.1 to 3.1 (fixes mgba.io/i/2794) + - Qt: Disable sync while running scripts from main thread (fixes mgba.io/i/2738) + - Qt: Fix savestate preview sizes with different scales (fixes mgba.io/i/2560) Misc: - GB Serialize: Add missing savestate support for MBC6 and NT (newer) - GBA: Improve detection of valid ELF ROMs - Qt: Include wayland QPA in AppImage (fixes mgba.io/i/2796) + - Qt: Stop eating boolean action key events (fixes mgba.io/i/2636) 0.10.1: (2023-01-10) Emulation fixes: diff --git a/include/mgba/core/serialize.h b/include/mgba/core/serialize.h index 59ca1c19f..ee9de69a1 100644 --- a/include/mgba/core/serialize.h +++ b/include/mgba/core/serialize.h @@ -16,6 +16,7 @@ enum mStateExtdataTag { EXTDATA_SAVEDATA = 2, EXTDATA_CHEATS = 3, EXTDATA_RTC = 4, + EXTDATA_SCREENSHOT_DIMENSIONS = 5, EXTDATA_META_TIME = 0x101, EXTDATA_META_CREATOR = 0x102, EXTDATA_MAX diff --git a/include/mgba/internal/gba/memory.h b/include/mgba/internal/gba/memory.h index a6ddce5d2..9fa213d87 100644 --- a/include/mgba/internal/gba/memory.h +++ b/include/mgba/internal/gba/memory.h @@ -23,60 +23,60 @@ CXX_GUARD_START mLOG_DECLARE_CATEGORY(GBA_MEM); enum GBAMemoryRegion { - REGION_BIOS = 0x0, - REGION_WORKING_RAM = 0x2, - REGION_WORKING_IRAM = 0x3, - REGION_IO = 0x4, - REGION_PALETTE_RAM = 0x5, - REGION_VRAM = 0x6, - REGION_OAM = 0x7, - REGION_CART0 = 0x8, - REGION_CART0_EX = 0x9, - REGION_CART1 = 0xA, - REGION_CART1_EX = 0xB, - REGION_CART2 = 0xC, - REGION_CART2_EX = 0xD, - REGION_CART_SRAM = 0xE, - REGION_CART_SRAM_MIRROR = 0xF + GBA_REGION_BIOS = 0x0, + GBA_REGION_EWRAM = 0x2, + GBA_REGION_IWRAM = 0x3, + GBA_REGION_IO = 0x4, + GBA_REGION_PALETTE_RAM = 0x5, + GBA_REGION_VRAM = 0x6, + GBA_REGION_OAM = 0x7, + GBA_REGION_ROM0 = 0x8, + GBA_REGION_ROM0_EX = 0x9, + GBA_REGION_ROM1 = 0xA, + GBA_REGION_ROM1_EX = 0xB, + GBA_REGION_ROM2 = 0xC, + GBA_REGION_ROM2_EX = 0xD, + GBA_REGION_SRAM = 0xE, + GBA_REGION_SRAM_MIRROR = 0xF }; enum GBAMemoryBase { - BASE_BIOS = 0x00000000, - BASE_WORKING_RAM = 0x02000000, - BASE_WORKING_IRAM = 0x03000000, - BASE_IO = 0x04000000, - BASE_PALETTE_RAM = 0x05000000, - BASE_VRAM = 0x06000000, - BASE_OAM = 0x07000000, - BASE_CART0 = 0x08000000, - BASE_CART0_EX = 0x09000000, - BASE_CART1 = 0x0A000000, - BASE_CART1_EX = 0x0B000000, - BASE_CART2 = 0x0C000000, - BASE_CART2_EX = 0x0D000000, - BASE_CART_SRAM = 0x0E000000, - BASE_CART_SRAM_MIRROR = 0x0F000000 + GBA_BASE_BIOS = 0x00000000, + GBA_BASE_EWRAM = 0x02000000, + GBA_BASE_IWRAM = 0x03000000, + GBA_BASE_IO = 0x04000000, + GBA_BASE_PALETTE_RAM = 0x05000000, + GBA_BASE_VRAM = 0x06000000, + GBA_BASE_OAM = 0x07000000, + GBA_BASE_ROM0 = 0x08000000, + GBA_BASE_ROM0_EX = 0x09000000, + GBA_BASE_ROM1 = 0x0A000000, + GBA_BASE_ROM1_EX = 0x0B000000, + GBA_BASE_ROM2 = 0x0C000000, + GBA_BASE_ROM2_EX = 0x0D000000, + GBA_BASE_SRAM = 0x0E000000, + GBA_BASE_SRAM_MIRROR = 0x0F000000 }; enum { - SIZE_BIOS = 0x00004000, - SIZE_WORKING_RAM = 0x00040000, - SIZE_WORKING_IRAM = 0x00008000, - SIZE_IO = 0x00000400, - SIZE_PALETTE_RAM = 0x00000400, - SIZE_VRAM = 0x00018000, - SIZE_OAM = 0x00000400, - SIZE_CART0 = 0x02000000, - 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, - SIZE_CART_EEPROM512 = 0x00000200, + GBA_SIZE_BIOS = 0x00004000, + GBA_SIZE_EWRAM = 0x00040000, + GBA_SIZE_IWRAM = 0x00008000, + GBA_SIZE_IO = 0x00000400, + GBA_SIZE_PALETTE_RAM = 0x00000400, + GBA_SIZE_VRAM = 0x00018000, + GBA_SIZE_OAM = 0x00000400, + GBA_SIZE_ROM0 = 0x02000000, + GBA_SIZE_ROM1 = 0x02000000, + GBA_SIZE_ROM2 = 0x02000000, + GBA_SIZE_SRAM = 0x00008000, + GBA_SIZE_SRAM512 = 0x00010000, + GBA_SIZE_FLASH512 = 0x00010000, + GBA_SIZE_FLASH1M = 0x00020000, + GBA_SIZE_EEPROM = 0x00002000, + GBA_SIZE_EEPROM512 = 0x00000200, - SIZE_AGB_PRINT = 0x10000 + GBA_SIZE_AGB_PRINT = 0x10000 }; enum { diff --git a/include/mgba/internal/gba/serialize.h b/include/mgba/internal/gba/serialize.h index ec44dc8fd..25bd170d6 100644 --- a/include/mgba/internal/gba/serialize.h +++ b/include/mgba/internal/gba/serialize.h @@ -407,12 +407,12 @@ struct GBASerializedState { uint32_t reserved[12]; - uint16_t io[SIZE_IO >> 1]; - uint16_t pram[SIZE_PALETTE_RAM >> 1]; - uint16_t oam[SIZE_OAM >> 1]; - uint16_t vram[SIZE_VRAM >> 1]; - uint8_t iwram[SIZE_WORKING_IRAM]; - uint8_t wram[SIZE_WORKING_RAM]; + uint16_t io[GBA_SIZE_IO >> 1]; + uint16_t pram[GBA_SIZE_PALETTE_RAM >> 1]; + uint16_t oam[GBA_SIZE_OAM >> 1]; + uint16_t vram[GBA_SIZE_VRAM >> 1]; + uint8_t iwram[GBA_SIZE_IWRAM]; + uint8_t wram[GBA_SIZE_EWRAM]; }; static_assert(sizeof(struct GBASerializedState) == 0x61000, "GBA savestate struct sized wrong"); diff --git a/include/mgba/internal/script/types.h b/include/mgba/internal/script/types.h new file mode 100644 index 000000000..fde5ce0ae --- /dev/null +++ b/include/mgba/internal/script/types.h @@ -0,0 +1,20 @@ +/* Copyright (c) 2013-2023 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef M_SCRIPT_TYPES_INTERNAL_H +#define M_SCRIPT_TYPES_INTERNAL_H + +#include + +CXX_GUARD_START + +struct Table; +void mScriptContextGetInputTypes(struct Table*); + +void mScriptTypeAdd(struct Table*, const struct mScriptType* type); + +CXX_GUARD_END + +#endif diff --git a/include/mgba/script/context.h b/include/mgba/script/context.h index 396084f14..dcec138e1 100644 --- a/include/mgba/script/context.h +++ b/include/mgba/script/context.h @@ -96,7 +96,7 @@ void mScriptContextAttachSocket(struct mScriptContext* context); void mScriptContextExportConstants(struct mScriptContext* context, const char* nspace, struct mScriptKVPair* constants); void mScriptContextExportNamespace(struct mScriptContext* context, const char* nspace, struct mScriptKVPair* value); -void mScriptContextTriggerCallback(struct mScriptContext*, const char* callback); +void mScriptContextTriggerCallback(struct mScriptContext*, const char* callback, struct mScriptList* args); uint32_t mScriptContextAddCallback(struct mScriptContext*, const char* callback, struct mScriptValue* value); void mScriptContextRemoveCallback(struct mScriptContext*, uint32_t cbid); diff --git a/include/mgba/script/input.h b/include/mgba/script/input.h new file mode 100644 index 000000000..ae1260ad1 --- /dev/null +++ b/include/mgba/script/input.h @@ -0,0 +1,271 @@ +/* Copyright (c) 2013-2022 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#ifndef M_SCRIPT_INPUT_H +#define M_SCRIPT_INPUT_H + +#include + +#include +#include + +CXX_GUARD_START + +enum mScriptEventType { + mSCRIPT_EV_TYPE_NONE = 0, + mSCRIPT_EV_TYPE_KEY, + mSCRIPT_EV_TYPE_MOUSE_BUTTON, + mSCRIPT_EV_TYPE_MOUSE_MOVE, + mSCRIPT_EV_TYPE_MOUSE_WHEEL, + mSCRIPT_EV_TYPE_GAMEPAD_BUTTON, + mSCRIPT_EV_TYPE_GAMEPAD_HAT, + mSCRIPT_EV_TYPE_TRIGGER, + mSCRIPT_EV_TYPE_MAX +}; + +enum mScriptInputState { + mSCRIPT_INPUT_STATE_UP = 0, + mSCRIPT_INPUT_STATE_DOWN = 1, + mSCRIPT_INPUT_STATE_HELD = 2, +}; + +enum mScriptInputDirection { + mSCRIPT_INPUT_DIR_NONE = 0, + + mSCRIPT_INPUT_DIR_NORTH = 1, + mSCRIPT_INPUT_DIR_EAST = 2, + mSCRIPT_INPUT_DIR_SOUTH = 4, + mSCRIPT_INPUT_DIR_WEST = 8, + + mSCRIPT_INPUT_DIR_UP = mSCRIPT_INPUT_DIR_NORTH, + mSCRIPT_INPUT_DIR_RIGHT = mSCRIPT_INPUT_DIR_EAST, + mSCRIPT_INPUT_DIR_DOWN = mSCRIPT_INPUT_DIR_SOUTH, + mSCRIPT_INPUT_DIR_LEFT = mSCRIPT_INPUT_DIR_WEST, + + mSCRIPT_INPUT_DIR_NORTHEAST = mSCRIPT_INPUT_DIR_NORTH | mSCRIPT_INPUT_DIR_EAST, + mSCRIPT_INPUT_DIR_NORTHWEST = mSCRIPT_INPUT_DIR_NORTH | mSCRIPT_INPUT_DIR_WEST, + mSCRIPT_INPUT_DIR_SOUTHEAST = mSCRIPT_INPUT_DIR_SOUTH | mSCRIPT_INPUT_DIR_EAST, + mSCRIPT_INPUT_DIR_SOUTHWEST = mSCRIPT_INPUT_DIR_SOUTH | mSCRIPT_INPUT_DIR_WEST, +}; + +enum mScriptKeyModifier { + mSCRIPT_KMOD_NONE = 0, + + mSCRIPT_KMOD_LSHIFT = 0x1, + mSCRIPT_KMOD_RSHIFT = 0x2, + mSCRIPT_KMOD_SHIFT = 0x3, + + mSCRIPT_KMOD_LCONTROL = 0x4, + mSCRIPT_KMOD_RCONTROL = 0x8, + mSCRIPT_KMOD_CONTROL = 0xC, + + mSCRIPT_KMOD_LALT = 0x10, + mSCRIPT_KMOD_RALT = 0x20, + mSCRIPT_KMOD_ALT = 0x30, + + mSCRIPT_KMOD_LSUPER = 0x40, + mSCRIPT_KMOD_RSUPER = 0x80, + mSCRIPT_KMOD_SUPER = 0xC0, + + mSCRIPT_KMOD_CAPS_LOCK = 0x100, + mSCRIPT_KMOD_NUM_LOCK = 0x200, + mSCRIPT_KMOD_SCROLL_LOCK = 0x400, +}; + +#define mSCRIPT_KEYBASE 0x800000 + +enum mScriptKey { + mSCRIPT_KEY_NONE = 0, + + mSCRIPT_KEY_BACKSPACE = 0x000008, + mSCRIPT_KEY_TAB = 0x000009, + mSCRIPT_KEY_ENTER = 0x00000A, + mSCRIPT_KEY_ESCAPE = 0x00001B, + mSCRIPT_KEY_DELETE = 0x00007F, + + mSCRIPT_KEY_F1 = mSCRIPT_KEYBASE | 1, + mSCRIPT_KEY_F2, + mSCRIPT_KEY_F3, + mSCRIPT_KEY_F4, + mSCRIPT_KEY_F5, + mSCRIPT_KEY_F6, + mSCRIPT_KEY_F7, + mSCRIPT_KEY_F8, + mSCRIPT_KEY_F9, + mSCRIPT_KEY_F10, + mSCRIPT_KEY_F11, + mSCRIPT_KEY_F12, + mSCRIPT_KEY_F13, + mSCRIPT_KEY_F14, + mSCRIPT_KEY_F15, + mSCRIPT_KEY_F16, + mSCRIPT_KEY_F17, + mSCRIPT_KEY_F18, + mSCRIPT_KEY_F19, + mSCRIPT_KEY_F20, + mSCRIPT_KEY_F21, + mSCRIPT_KEY_F22, + mSCRIPT_KEY_F23, + mSCRIPT_KEY_F24, + + mSCRIPT_KEY_UP = mSCRIPT_KEYBASE | 0x20, + mSCRIPT_KEY_RIGHT, + mSCRIPT_KEY_DOWN, + mSCRIPT_KEY_LEFT, + mSCRIPT_KEY_PAGE_UP, + mSCRIPT_KEY_PAGE_DOWN, + mSCRIPT_KEY_HOME, + mSCRIPT_KEY_END, + mSCRIPT_KEY_INSERT, + mSCRIPT_KEY_BREAK, + mSCRIPT_KEY_CLEAR, + mSCRIPT_KEY_PRINT_SCREEN, + mSCRIPT_KEY_SYSRQ, + mSCRIPT_KEY_MENU, + mSCRIPT_KEY_HELP, + + mSCRIPT_KEY_LSHIFT = mSCRIPT_KEYBASE | 0x30, + mSCRIPT_KEY_RSHIFT, + mSCRIPT_KEY_SHIFT, + mSCRIPT_KEY_LCONTROL, + mSCRIPT_KEY_RCONTROL, + mSCRIPT_KEY_CONTROL, + mSCRIPT_KEY_LALT, + mSCRIPT_KEY_RALT, + mSCRIPT_KEY_ALT, + mSCRIPT_KEY_LSUPER, + mSCRIPT_KEY_RSUPER, + mSCRIPT_KEY_SUPER, + mSCRIPT_KEY_CAPS_LOCK, + mSCRIPT_KEY_NUM_LOCK, + mSCRIPT_KEY_SCROLL_LOCK, + + mSCRIPT_KEY_KP_0 = mSCRIPT_KEYBASE | 0x40, + mSCRIPT_KEY_KP_1, + mSCRIPT_KEY_KP_2, + mSCRIPT_KEY_KP_3, + mSCRIPT_KEY_KP_4, + mSCRIPT_KEY_KP_5, + mSCRIPT_KEY_KP_6, + mSCRIPT_KEY_KP_7, + mSCRIPT_KEY_KP_8, + mSCRIPT_KEY_KP_9, + mSCRIPT_KEY_KP_PLUS, + mSCRIPT_KEY_KP_MINUS, + mSCRIPT_KEY_KP_MULTIPLY, + mSCRIPT_KEY_KP_DIVIDE, + mSCRIPT_KEY_KP_COMMA, + mSCRIPT_KEY_KP_POINT, + mSCRIPT_KEY_KP_ENTER, +}; + +enum mScriptMouseButton { + mSCRIPT_MOUSE_BUTTON_PRIMARY = 0, + mSCRIPT_MOUSE_BUTTON_SECONDARY = 1, + mSCRIPT_MOUSE_BUTTON_MIDDLE = 2, +}; + +struct mScriptEvent { + int32_t type; + int32_t reserved; + uint64_t seq; +}; + +struct mScriptKeyEvent { + struct mScriptEvent d; + uint8_t state; + uint16_t modifiers; + uint32_t key; +}; + +struct mScriptMouseButtonEvent { + struct mScriptEvent d; + uint8_t mouse; + uint8_t context; + uint8_t state; + uint8_t button; +}; + +struct mScriptMouseMoveEvent { + struct mScriptEvent d; + uint8_t mouse; + uint8_t context; + int32_t x; + int32_t y; +}; + +struct mScriptMouseWheelEvent { + struct mScriptEvent d; + uint8_t mouse; + int16_t x; + int16_t y; +}; + +struct mScriptGamepadButtonEvent { + struct mScriptEvent d; + uint8_t state; + uint8_t pad; + uint16_t button; +}; + +struct mScriptGamepadHatEvent { + struct mScriptEvent d; + uint8_t pad; + uint8_t hat; + uint8_t direction; +}; + +struct mScriptTriggerEvent { + struct mScriptEvent d; + uint8_t trigger; + bool state; +}; + +struct mScriptGamepad { + unsigned pad; + + char visibleName[128]; + char internalName[64]; + + struct mScriptList axes; + struct mScriptList buttons; + struct mScriptList hats; +}; + +mSCRIPT_DECLARE_STRUCT(mScriptEvent); +mSCRIPT_DECLARE_STRUCT(mScriptKeyEvent); +mSCRIPT_DECLARE_STRUCT(mScriptMouseButtonEvent); +mSCRIPT_DECLARE_STRUCT(mScriptMouseMoveEvent); +mSCRIPT_DECLARE_STRUCT(mScriptMouseWheelEvent); +mSCRIPT_DECLARE_STRUCT(mScriptGamepadButtonEvent); +mSCRIPT_DECLARE_STRUCT(mScriptGamepadHatEvent); +mSCRIPT_DECLARE_STRUCT(mScriptSensorEvent); +mSCRIPT_DECLARE_STRUCT(mScriptTriggerEvent); + +mSCRIPT_DECLARE_STRUCT(mScriptGamepad); + +void mScriptContextAttachInput(struct mScriptContext* context); + +void mScriptContextFireEvent(struct mScriptContext*, struct mScriptEvent*); + +int mScriptContextGamepadAttach(struct mScriptContext*, struct mScriptGamepad*); +bool mScriptContextGamepadDetach(struct mScriptContext*, int pad); +struct mScriptGamepad* mScriptContextGamepadLookup(struct mScriptContext*, int pad); + +void mScriptGamepadInit(struct mScriptGamepad*); +void mScriptGamepadDeinit(struct mScriptGamepad*); +void mScriptGamepadSetAxisCount(struct mScriptGamepad*, unsigned); +void mScriptGamepadSetButtonCount(struct mScriptGamepad*, unsigned); +void mScriptGamepadSetHatCount(struct mScriptGamepad*, unsigned); +void mScriptGamepadSetAxis(struct mScriptGamepad*, unsigned, int16_t value); +void mScriptGamepadSetButton(struct mScriptGamepad*, unsigned, bool down); +void mScriptGamepadSetHat(struct mScriptGamepad*, unsigned, int direction); +int16_t mScriptGamepadGetAxis(struct mScriptGamepad*, unsigned); +bool mScriptGamepadGetButton(struct mScriptGamepad*, unsigned); +int mScriptGamepadGetHat(struct mScriptGamepad*, unsigned); + +CXX_GUARD_END + +#endif diff --git a/include/mgba/script/types.h b/include/mgba/script/types.h index 556fff57b..ed8ae02e3 100644 --- a/include/mgba/script/types.h +++ b/include/mgba/script/types.h @@ -304,6 +304,8 @@ void mScriptValueWrap(struct mScriptValue* val, struct mScriptValue* out); struct mScriptValue* mScriptValueUnwrap(struct mScriptValue* val); const struct mScriptValue* mScriptValueUnwrapConst(const struct mScriptValue* val); +void mScriptValueFollowPointer(struct mScriptValue* ptr, struct mScriptValue* out); + struct mScriptValue* mScriptStringCreateEmpty(size_t size); struct mScriptValue* mScriptStringCreateFromBytes(const void* string, size_t size); struct mScriptValue* mScriptStringCreateFromUTF8(const char* string); diff --git a/res/scripts/gamepad-demo.lua b/res/scripts/gamepad-demo.lua new file mode 100644 index 000000000..90327c11c --- /dev/null +++ b/res/scripts/gamepad-demo.lua @@ -0,0 +1,33 @@ +inputBuffer = console:createBuffer("Input") + +function readPad() + inputBuffer:clear() + + if not input.activeGamepad then + inputBuffer:print("No gamepad detected\n") + return + end + + local gamepad = input.activeGamepad + local axes = gamepad.axes + local buttons = gamepad.buttons + local hats = gamepad.hats + + inputBuffer:print(gamepad.visibleName .. "\n") + inputBuffer:print(string.format("%i buttons, %i axes, %i hats\n", #buttons, #axes, #hats)) + + local sbuttons = {} + for k, v in ipairs(buttons) do + if v then + sbuttons[k] = "down" + else + sbuttons[k] = " up" + end + end + + inputBuffer:print(string.format("Buttons: %s\n", table.concat(sbuttons, ", "))) + inputBuffer:print(string.format("Axes: %s\n", table.concat(axes, ", "))) + inputBuffer:print(string.format("Hats: %s\n", table.concat(hats, ", "))) +end + +callbacks:add("frame", readPad) diff --git a/src/core/scripting.c b/src/core/scripting.c index 1eca1159b..a67297598 100644 --- a/src/core/scripting.c +++ b/src/core/scripting.c @@ -651,7 +651,7 @@ static struct mScriptValue* _mScriptCoreAdapterGet(struct mScriptCoreAdapter* ad static void _mScriptCoreAdapterReset(struct mScriptCoreAdapter* adapter) { adapter->core->reset(adapter->core); - mScriptContextTriggerCallback(adapter->context, "reset"); + mScriptContextTriggerCallback(adapter->context, "reset", NULL); } mSCRIPT_DECLARE_STRUCT(mScriptCoreAdapter); diff --git a/src/core/serialize.c b/src/core/serialize.c index 4e9302b5a..1a92262a0 100644 --- a/src/core/serialize.c +++ b/src/core/serialize.c @@ -261,8 +261,18 @@ static void* _loadPNGState(struct mCore* core, struct VFile* vf, struct mStateEx PNGReadClose(png, info, end); return false; } - unsigned width, height; - core->desiredVideoDimensions(core, &width, &height); + + if (!PNGReadHeader(png, info)) { + PNGReadClose(png, info, end); + return false; + } + unsigned width = png_get_image_width(png, info); + unsigned height = png_get_image_height(png, info); + if (width > 0x4000 || height > 0x4000) { + // These images are ridiculously large...let's assume a DOS attempt and reject + PNGReadClose(png, info, end); + return false; + } uint32_t* pixels = malloc(width * height * 4); if (!pixels) { PNGReadClose(png, info, end); @@ -277,8 +287,8 @@ static void* _loadPNGState(struct mCore* core, struct VFile* vf, struct mStateEx .extdata = extdata }; + bool success = true; PNGInstallChunkHandler(png, &bundle, _loadPNGChunkHandler, "gbAs gbAx"); - bool success = PNGReadHeader(png, info); success = success && PNGReadPixels(png, info, pixels, width, height, width); success = success && PNGReadFooter(png, end); PNGReadClose(png, info, end); @@ -294,6 +304,12 @@ static void* _loadPNGState(struct mCore* core, struct VFile* vf, struct mStateEx .clean = free }; mStateExtdataPut(extdata, EXTDATA_SCREENSHOT, &item); + + uint16_t dims[2] = { width, height }; + item.size = sizeof(dims); + item.data = malloc(item.size); + memcpy(item.data, dims, item.size); + mStateExtdataPut(extdata, EXTDATA_SCREENSHOT_DIMENSIONS, &item); } else { free(pixels); } diff --git a/src/core/test/scripting.c b/src/core/test/scripting.c index 2e26b096f..b9cfa03e8 100644 --- a/src/core/test/scripting.c +++ b/src/core/test/scripting.c @@ -17,7 +17,7 @@ #ifdef M_CORE_GBA #include #define TEST_PLATFORM mPLATFORM_GBA -#define RAM_BASE BASE_WORKING_IRAM +#define RAM_BASE GBA_BASE_IWRAM #elif defined(M_CORE_GB) #include #define TEST_PLATFORM mPLATFORM_GB diff --git a/src/core/thread.c b/src/core/thread.c index 7101b5a54..9f4be082b 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -58,8 +58,19 @@ static void _waitOnInterrupt(struct mCoreThreadInternal* threadContext) { } static void _pokeRequest(struct mCoreThreadInternal* threadContext) { - if (threadContext->state == mTHREAD_RUNNING || threadContext->state == mTHREAD_PAUSED) { + switch (threadContext->state) { + case mTHREAD_RUNNING: + case mTHREAD_PAUSED: + case mTHREAD_CRASHED: threadContext->state = mTHREAD_REQUEST; + break; + case mTHREAD_INITIALIZED: + case mTHREAD_REQUEST: + case mTHREAD_INTERRUPTED: + case mTHREAD_INTERRUPTING: + case mTHREAD_EXITING: + case mTHREAD_SHUTDOWN: + break; } } @@ -194,7 +205,7 @@ void _script_ ## NAME(void* context) { \ if (!threadContext->scriptContext) { \ return; \ } \ - mScriptContextTriggerCallback(threadContext->scriptContext, #NAME); \ + mScriptContextTriggerCallback(threadContext->scriptContext, #NAME, NULL); \ } ADD_CALLBACK(frame) @@ -283,7 +294,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } } if (scriptContext) { - mScriptContextTriggerCallback(scriptContext, "start"); + mScriptContextTriggerCallback(scriptContext, "start", NULL); } #endif @@ -304,7 +315,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } } if (scriptContext) { - mScriptContextTriggerCallback(scriptContext, "reset"); + mScriptContextTriggerCallback(scriptContext, "reset", NULL); } #endif @@ -404,7 +415,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } #ifdef ENABLE_SCRIPTING if (scriptContext) { - mScriptContextTriggerCallback(scriptContext, "reset"); + mScriptContextTriggerCallback(scriptContext, "reset", NULL); } #endif } @@ -428,7 +439,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { } #ifdef ENABLE_SCRIPTING if (scriptContext) { - mScriptContextTriggerCallback(scriptContext, "shutdown"); + mScriptContextTriggerCallback(scriptContext, "shutdown", NULL); mScriptContextDetachCore(scriptContext); } #endif diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c index 2e837891f..33146ef88 100644 --- a/src/feature/gui/gui-runner.c +++ b/src/feature/gui/gui-runner.c @@ -123,34 +123,39 @@ static void _drawState(struct GUIBackground* background, void* id) { struct mGUIBackground* gbaBackground = (struct mGUIBackground*) background; unsigned stateId = ((uint32_t) id) >> 16; if (gbaBackground->p->drawScreenshot) { - unsigned w, h; - gbaBackground->p->core->desiredVideoDimensions(gbaBackground->p->core, &w, &h); - 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); + color_t* pixels = gbaBackground->image; + if (pixels && gbaBackground->screenshotId == (stateId | SCREENSHOT_VALID)) { + gbaBackground->p->drawScreenshot(gbaBackground->p, pixels, gbaBackground->w, gbaBackground->h, true); return; } 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) { + unsigned w, h; + if (vf && isPNG(vf)) { 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); + success = png && info && end; + success = success && PNGReadHeader(png, info); + w = png_get_image_width(png, info); + h = png_get_image_height(png, info); + size_t size = w * h * BYTES_PER_PIXEL; + success = success && (w < 0x4000) && (h < 0x4000); + if (success) { + if (size != gbaBackground->imageSize) { + mappedMemoryFree(pixels, gbaBackground->imageSize); + pixels = anonymousMemoryMap(size); + gbaBackground->image = pixels; + gbaBackground->imageSize = size; + } + success = pixels; } + success = success && PNGReadPixels(png, info, pixels, w, h, w); + if (success) { + gbaBackground->w = w; + gbaBackground->h = h; + } + success = success && PNGReadFooter(png, end); PNGReadClose(png, info, end); } if (vf) { diff --git a/src/feature/gui/gui-runner.h b/src/feature/gui/gui-runner.h index fc8e85227..0dc412838 100644 --- a/src/feature/gui/gui-runner.h +++ b/src/feature/gui/gui-runner.h @@ -33,6 +33,8 @@ struct mGUIBackground { color_t* image; size_t imageSize; + uint16_t w; + uint16_t h; unsigned screenshotId; }; diff --git a/src/gb/audio.c b/src/gb/audio.c index d2d6a9260..078f93358 100644 --- a/src/gb/audio.c +++ b/src/gb/audio.c @@ -1089,6 +1089,8 @@ void GBAudioPSGDeserialize(struct GBAudio* audio, const struct GBSerializedPSGSt audio->ch4.lastEvent = currentTime + (when & (cycles - 1)) - cycles; } } + audio->ch4.nSamples = 0; + audio->ch4.samples = 0; } void GBAudioSerialize(const struct GBAudio* audio, struct GBSerializedState* state) { diff --git a/src/gba/audio.c b/src/gba/audio.c index 5d7dd347b..2c61aa1ce 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -118,10 +118,10 @@ void GBAAudioScheduleFifoDma(struct GBAAudio* audio, int number, struct GBADMA* info->reg = GBADMARegisterSetDestControl(info->reg, GBA_DMA_FIXED); info->reg = GBADMARegisterSetWidth(info->reg, 1); switch (info->dest) { - case BASE_IO | REG_FIFO_A_LO: + case GBA_BASE_IO | REG_FIFO_A_LO: audio->chA.dmaSource = number; break; - case BASE_IO | REG_FIFO_B_LO: + case GBA_BASE_IO | REG_FIFO_B_LO: audio->chB.dmaSource = number; break; default: @@ -506,6 +506,16 @@ void GBAAudioSerialize(const struct GBAAudio* audio, struct GBASerializedState* void GBAAudioDeserialize(struct GBAAudio* audio, const struct GBASerializedState* state) { GBAudioPSGDeserialize(&audio->psg, &state->audio.psg, &state->audio.flags); + uint16_t reg; + LOAD_16(reg, REG_SOUND1CNT_X, state->io); + GBAIOWrite(audio->p, REG_SOUND1CNT_X, reg & 0x7FFF); + LOAD_16(reg, REG_SOUND2CNT_HI, state->io); + GBAIOWrite(audio->p, REG_SOUND2CNT_HI, reg & 0x7FFF); + LOAD_16(reg, REG_SOUND3CNT_X, state->io); + GBAIOWrite(audio->p, REG_SOUND3CNT_X, reg & 0x7FFF); + LOAD_16(reg, REG_SOUND4CNT_HI, state->io); + GBAIOWrite(audio->p, REG_SOUND4CNT_HI, reg & 0x7FFF); + LOAD_32(audio->chA.internalSample, 0, &state->audio.internalA); LOAD_32(audio->chB.internalSample, 0, &state->audio.internalB); memcpy(audio->chA.samples, state->samples.chA, sizeof(audio->chA.samples)); diff --git a/src/gba/bios.c b/src/gba/bios.c index 1d0c0dd10..ad610a287 100644 --- a/src/gba/bios.c +++ b/src/gba/bios.c @@ -49,11 +49,11 @@ static void _SoftReset(struct GBA* gba) { cpu->gprs[ARM_LR] = 0; cpu->gprs[ARM_SP] = GBA_SP_BASE_SYSTEM; int8_t flag = ((int8_t*) gba->memory.iwram)[0x7FFA]; - memset(((int8_t*) gba->memory.iwram) + SIZE_WORKING_IRAM - 0x200, 0, 0x200); + memset(((int8_t*) gba->memory.iwram) + GBA_SIZE_IWRAM - 0x200, 0, 0x200); if (flag) { - cpu->gprs[ARM_PC] = BASE_WORKING_RAM; + cpu->gprs[ARM_PC] = GBA_BASE_EWRAM; } else { - cpu->gprs[ARM_PC] = BASE_CART0; + cpu->gprs[ARM_PC] = GBA_BASE_ROM0; } _ARMSetMode(cpu, MODE_ARM); ARMWritePC(cpu); @@ -62,120 +62,120 @@ static void _SoftReset(struct GBA* gba) { static void _RegisterRamReset(struct GBA* gba) { uint32_t registers = gba->cpu->gprs[0]; struct ARMCore* cpu = gba->cpu; - cpu->memory.store16(cpu, BASE_IO | REG_DISPCNT, 0x0080, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DISPCNT, 0x0080, 0); if (registers & 0x01) { - memset(gba->memory.wram, 0, SIZE_WORKING_RAM); + memset(gba->memory.wram, 0, GBA_SIZE_EWRAM); } if (registers & 0x02) { - memset(gba->memory.iwram, 0, SIZE_WORKING_IRAM - 0x200); + memset(gba->memory.iwram, 0, GBA_SIZE_IWRAM - 0x200); } if (registers & 0x04) { - memset(gba->video.palette, 0, SIZE_PALETTE_RAM); + memset(gba->video.palette, 0, GBA_SIZE_PALETTE_RAM); } if (registers & 0x08) { - memset(gba->video.vram, 0, SIZE_VRAM); + memset(gba->video.vram, 0, GBA_SIZE_VRAM); } if (registers & 0x10) { - memset(gba->video.oam.raw, 0, SIZE_OAM); + memset(gba->video.oam.raw, 0, GBA_SIZE_OAM); } if (registers & 0x20) { - cpu->memory.store16(cpu, BASE_IO | REG_SIOCNT, 0x0000, 0); - cpu->memory.store16(cpu, BASE_IO | REG_RCNT, RCNT_INITIAL, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SIOMLT_SEND, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_JOYCNT, 0, 0); - cpu->memory.store32(cpu, BASE_IO | REG_JOY_RECV_LO, 0, 0); - cpu->memory.store32(cpu, BASE_IO | REG_JOY_TRANS_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SIOCNT, 0x0000, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_RCNT, RCNT_INITIAL, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SIOMLT_SEND, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_JOYCNT, 0, 0); + cpu->memory.store32(cpu, GBA_BASE_IO | REG_JOY_RECV_LO, 0, 0); + cpu->memory.store32(cpu, GBA_BASE_IO | REG_JOY_TRANS_LO, 0, 0); } if (registers & 0x40) { - cpu->memory.store16(cpu, BASE_IO | REG_SOUND1CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND1CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND1CNT_X, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND2CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND2CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND3CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND3CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND3CNT_X, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND4CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUND4CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUNDCNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUNDCNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUNDCNT_X, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_SOUNDBIAS, 0x200, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND1CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND1CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND1CNT_X, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND2CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND2CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND3CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND3CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND3CNT_X, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND4CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUND4CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUNDCNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUNDCNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUNDCNT_X, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_SOUNDBIAS, 0x200, 0); memset(gba->audio.psg.ch3.wavedata32, 0, sizeof(gba->audio.psg.ch3.wavedata32)); } if (registers & 0x80) { - cpu->memory.store16(cpu, BASE_IO | REG_DISPSTAT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_VCOUNT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG0CNT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG1CNT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG2CNT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG3CNT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG0HOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG0VOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG1HOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG1VOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG2HOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG2VOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG3HOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG3VOFS, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG2PA, 0x100, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG2PB, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG2PC, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG2PD, 0x100, 0); - cpu->memory.store32(cpu, BASE_IO | REG_BG2X_LO, 0, 0); - cpu->memory.store32(cpu, BASE_IO | REG_BG2Y_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG3PA, 0x100, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG3PB, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG3PC, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BG3PD, 0x100, 0); - cpu->memory.store32(cpu, BASE_IO | REG_BG3X_LO, 0, 0); - cpu->memory.store32(cpu, BASE_IO | REG_BG3Y_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_WIN0H, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_WIN1H, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_WIN0V, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_WIN1V, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_WININ, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_WINOUT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_MOSAIC, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BLDCNT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BLDALPHA, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_BLDY, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA0SAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA0SAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA0DAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA0DAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA0CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA0CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA1SAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA1SAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA1DAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA1DAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA1CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA1CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA2SAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA2SAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA2DAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA2DAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA2CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA2CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA3SAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA3SAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA3DAD_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA3DAD_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA3CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_DMA3CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM0CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM0CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM1CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM1CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM2CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM2CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM3CNT_LO, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_TM3CNT_HI, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_IE, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_IF, 0xFFFF, 0); - cpu->memory.store16(cpu, BASE_IO | REG_WAITCNT, 0, 0); - cpu->memory.store16(cpu, BASE_IO | REG_IME, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DISPSTAT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_VCOUNT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG0CNT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG1CNT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG2CNT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG3CNT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG0HOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG0VOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG1HOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG1VOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG2HOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG2VOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG3HOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG3VOFS, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG2PA, 0x100, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG2PB, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG2PC, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG2PD, 0x100, 0); + cpu->memory.store32(cpu, GBA_BASE_IO | REG_BG2X_LO, 0, 0); + cpu->memory.store32(cpu, GBA_BASE_IO | REG_BG2Y_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG3PA, 0x100, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG3PB, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG3PC, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BG3PD, 0x100, 0); + cpu->memory.store32(cpu, GBA_BASE_IO | REG_BG3X_LO, 0, 0); + cpu->memory.store32(cpu, GBA_BASE_IO | REG_BG3Y_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_WIN0H, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_WIN1H, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_WIN0V, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_WIN1V, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_WININ, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_WINOUT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_MOSAIC, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BLDCNT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BLDALPHA, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_BLDY, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA0SAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA0SAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA0DAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA0DAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA0CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA0CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA1SAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA1SAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA1DAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA1DAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA1CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA1CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA2SAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA2SAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA2DAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA2DAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA2CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA2CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA3SAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA3SAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA3DAD_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA3DAD_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA3CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_DMA3CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM0CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM0CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM1CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM1CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM2CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM2CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM3CNT_LO, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_TM3CNT_HI, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_IE, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_IF, 0xFFFF, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_WAITCNT, 0, 0); + cpu->memory.store16(cpu, GBA_BASE_IO | REG_IME, 0, 0); } if (registers & 0x9C) { gba->video.renderer->reset(gba->video.renderer); @@ -267,7 +267,7 @@ static void _MidiKey2Freq(struct GBA* gba) { struct ARMCore* cpu = gba->cpu; int oldRegion = gba->memory.activeRegion; - gba->memory.activeRegion = REGION_BIOS; + gba->memory.activeRegion = GBA_REGION_BIOS; uint32_t key = cpu->memory.load32(cpu, cpu->gprs[0] + 4, 0); gba->memory.activeRegion = oldRegion; @@ -486,7 +486,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { break; case GBA_SWI_CPU_SET: case GBA_SWI_CPU_FAST_SET: - if (cpu->gprs[0] >> BASE_OFFSET < REGION_WORKING_RAM) { + if (cpu->gprs[0] >> BASE_OFFSET < GBA_REGION_EWRAM) { mLOG(GBA_BIOS, GAME_ERROR, "Cannot CpuSet from BIOS"); break; } @@ -501,7 +501,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { case GBA_SWI_GET_BIOS_CHECKSUM: cpu->gprs[0] = GBA_BIOS_CHECKSUM; cpu->gprs[1] = 1; - cpu->gprs[3] = SIZE_BIOS; + cpu->gprs[3] = GBA_SIZE_BIOS; break; case GBA_SWI_BG_AFFINE_SET: _BgAffineSet(gba); @@ -510,7 +510,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { _ObjAffineSet(gba); break; case GBA_SWI_BIT_UNPACK: - if (cpu->gprs[0] < BASE_WORKING_RAM) { + if (cpu->gprs[0] < GBA_BASE_EWRAM) { mLOG(GBA_BIOS, GAME_ERROR, "Bad BitUnPack source"); break; } @@ -518,9 +518,9 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { default: mLOG(GBA_BIOS, GAME_ERROR, "Bad BitUnPack destination"); // Fall through - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_VRAM: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_VRAM: _unBitPack(gba); break; } @@ -535,9 +535,9 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { default: mLOG(GBA_BIOS, GAME_ERROR, "Bad LZ77 destination"); // Fall through - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_VRAM: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_VRAM: useStall = true; _unLz77(gba, immediate == GBA_SWI_LZ77_UNCOMP_WRAM ? 1 : 2); break; @@ -552,9 +552,9 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { default: mLOG(GBA_BIOS, GAME_ERROR, "Bad Huffman destination"); // Fall through - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_VRAM: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_VRAM: _unHuffman(gba); break; } @@ -569,9 +569,9 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { default: mLOG(GBA_BIOS, GAME_ERROR, "Bad RL destination"); // Fall through - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_VRAM: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_VRAM: _unRl(gba, immediate == GBA_SWI_RL_UNCOMP_WRAM ? 1 : 2); break; } @@ -587,9 +587,9 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { default: mLOG(GBA_BIOS, GAME_ERROR, "Bad UnFilter destination"); // Fall through - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_VRAM: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_VRAM: _unFilter(gba, immediate == GBA_SWI_DIFF_16BIT_UNFILTER ? 2 : 1, immediate == GBA_SWI_DIFF_8BIT_UNFILTER_WRAM ? 1 : 2); break; } diff --git a/src/gba/cart/vfame.c b/src/gba/cart/vfame.c index 57b6d903b..aedcf5d3e 100644 --- a/src/gba/cart/vfame.c +++ b/src/gba/cart/vfame.c @@ -246,7 +246,7 @@ void GBAVFameSramWrite(struct GBAVFameCart* cart, uint32_t address, uint8_t valu // if mode has been set - the address and value of the SRAM write will be modified address = _modifySramAddress(cart->cartType, address, cart->sramMode); value = _modifySramValue(cart->cartType, value, cart->sramMode); - address &= (SIZE_CART_SRAM - 1); + address &= (GBA_SIZE_SRAM - 1); sramData[address] = value; } diff --git a/src/gba/cheats.c b/src/gba/cheats.c index 04082d48a..d055194be 100644 --- a/src/gba/cheats.c +++ b/src/gba/cheats.c @@ -323,49 +323,49 @@ static void GBACheatDumpDirectives(struct mCheatSet* set, struct StringList* dir int GBACheatAddressIsReal(uint32_t address) { switch (address >> BASE_OFFSET) { - case REGION_BIOS: + case GBA_REGION_BIOS: return -0x80; break; - case REGION_WORKING_RAM: - if ((address & OFFSET_MASK) > SIZE_WORKING_RAM) { + case GBA_REGION_EWRAM: + if ((address & OFFSET_MASK) > GBA_SIZE_EWRAM) { return -0x40; } return 0x20; - case REGION_WORKING_IRAM: - if ((address & OFFSET_MASK) > SIZE_WORKING_IRAM) { + case GBA_REGION_IWRAM: + if ((address & OFFSET_MASK) > GBA_SIZE_IWRAM) { return -0x40; } return 0x20; - case REGION_IO: - if ((address & OFFSET_MASK) > SIZE_IO) { + case GBA_REGION_IO: + if ((address & OFFSET_MASK) > GBA_SIZE_IO) { return -0x80; } return 0x10; - case REGION_OAM: - if ((address & OFFSET_MASK) > SIZE_OAM) { + case GBA_REGION_OAM: + if ((address & OFFSET_MASK) > GBA_SIZE_OAM) { return -0x80; } return -0x8; - case REGION_VRAM: - if ((address & OFFSET_MASK) > SIZE_VRAM) { + case GBA_REGION_VRAM: + if ((address & OFFSET_MASK) > GBA_SIZE_VRAM) { return -0x80; } return -0x8; - case REGION_PALETTE_RAM: - if ((address & OFFSET_MASK) > SIZE_PALETTE_RAM) { + case GBA_REGION_PALETTE_RAM: + if ((address & OFFSET_MASK) > GBA_SIZE_PALETTE_RAM) { return -0x80; } return -0x8; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: return -0x8; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: - if ((address & OFFSET_MASK) > SIZE_CART_FLASH512) { + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: + if ((address & OFFSET_MASK) > GBA_SIZE_FLASH512) { return -0x80; } return -0x8; diff --git a/src/gba/cheats/codebreaker.c b/src/gba/cheats/codebreaker.c index 0ba5c80ea..611222425 100644 --- a/src/gba/cheats/codebreaker.c +++ b/src/gba/cheats/codebreaker.c @@ -215,7 +215,7 @@ bool GBACheatAddCodeBreaker(struct GBACheatSet* cheats, uint32_t op1, uint16_t o return false; } cheats->hook = malloc(sizeof(*cheats->hook)); - cheats->hook->address = BASE_CART0 | (op1 & (SIZE_CART0 - 1)); + cheats->hook->address = GBA_BASE_ROM0 | (op1 & (GBA_SIZE_ROM0 - 1)); cheats->hook->mode = MODE_THUMB; cheats->hook->refs = 1; cheats->hook->reentries = 0; @@ -278,7 +278,7 @@ bool GBACheatAddCodeBreaker(struct GBACheatSet* cheats, uint32_t op1, uint16_t o cheat = mCheatListAppend(&cheats->d.list); cheat->type = CHEAT_IF_NAND; cheat->width = 2; - cheat->address = BASE_IO | REG_KEYINPUT; + cheat->address = GBA_BASE_IO | REG_KEYINPUT; cheat->operand = op2; cheat->repeat = 1; return true; diff --git a/src/gba/cheats/gameshark.c b/src/gba/cheats/gameshark.c index 88f48ab49..72071d962 100644 --- a/src/gba/cheats/gameshark.c +++ b/src/gba/cheats/gameshark.c @@ -150,7 +150,7 @@ bool GBACheatAddGameSharkRaw(struct GBACheatSet* cheats, uint32_t op1, uint32_t break; case GSA_PATCH: romPatch = mCheatPatchListAppend(&cheats->d.romPatches); - romPatch->address = BASE_CART0 | ((op1 & 0xFFFFFF) << 1); + romPatch->address = GBA_BASE_ROM0 | ((op1 & 0xFFFFFF) << 1); romPatch->value = op2; romPatch->applied = false; romPatch->width = 2; @@ -207,7 +207,7 @@ bool GBACheatAddGameSharkRaw(struct GBACheatSet* cheats, uint32_t op1, uint32_t return false; } cheats->hook = malloc(sizeof(*cheats->hook)); - cheats->hook->address = BASE_CART0 | (op1 & (SIZE_CART0 - 1)); + cheats->hook->address = GBA_BASE_ROM0 | (op1 & (GBA_SIZE_ROM0 - 1)); cheats->hook->mode = MODE_THUMB; cheats->hook->refs = 1; cheats->hook->reentries = 0; diff --git a/src/gba/cheats/parv3.c b/src/gba/cheats/parv3.c index 30cc5515b..e254ac94d 100644 --- a/src/gba/cheats/parv3.c +++ b/src/gba/cheats/parv3.c @@ -233,7 +233,7 @@ static bool _addPAR3Special(struct GBACheatSet* cheats, uint32_t op2) { } if (romPatch >= 0) { struct mCheatPatch* patch = mCheatPatchListAppend(&cheats->d.romPatches); - patch->address = BASE_CART0 | ((op2 & 0xFFFFFF) << 1); + patch->address = GBA_BASE_ROM0 | ((op2 & 0xFFFFFF) << 1); patch->applied = false; patch->check = false; patch->width = 2; @@ -282,7 +282,7 @@ bool GBACheatAddProActionReplayRaw(struct GBACheatSet* cheats, uint32_t op1, uin return false; } cheats->hook = malloc(sizeof(*cheats->hook)); - cheats->hook->address = BASE_CART0 | (op1 & (SIZE_CART0 - 2)); + cheats->hook->address = GBA_BASE_ROM0 | (op1 & (GBA_SIZE_ROM0 - 2)); cheats->hook->mode = MODE_THUMB; cheats->hook->refs = 1; cheats->hook->reentries = 0; @@ -320,7 +320,7 @@ bool GBACheatAddProActionReplayRaw(struct GBACheatSet* cheats, uint32_t op1, uin case PAR3_BASE_OTHER: width = ((op1 >> 24) & 1) + 1; cheat->type = CHEAT_ASSIGN; - cheat->address = BASE_IO | (op1 & OFFSET_MASK); + cheat->address = GBA_BASE_IO | (op1 & OFFSET_MASK); break; } if (op1 & 0x01000000 && (op1 & 0xFE000000) != 0xC6000000) { diff --git a/src/gba/core.c b/src/gba/core.c index 73c9b6385..46dea505f 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -61,76 +61,76 @@ static const struct mCoreChannelInfo _GBAAudioChannels[] = { static const struct mCoreMemoryBlock _GBAMemoryBlocks[] = { { -1, "mem", "All", "All", 0, 0x10000000, 0x10000000, mCORE_MEMORY_VIRTUAL }, - { REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", BASE_BIOS, SIZE_BIOS, SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_RAM, "wram", "EWRAM", "Working RAM (256kiB)", BASE_WORKING_RAM, BASE_WORKING_RAM + SIZE_WORKING_RAM, SIZE_WORKING_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_IRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", BASE_WORKING_IRAM, BASE_WORKING_IRAM + SIZE_WORKING_IRAM, SIZE_WORKING_IRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_IO, "io", "MMIO", "Memory-Mapped I/O", BASE_IO, BASE_IO + SIZE_IO, SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", BASE_PALETTE_RAM, BASE_PALETTE_RAM + SIZE_PALETTE_RAM, SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", BASE_VRAM, BASE_VRAM + SIZE_VRAM, SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", BASE_OAM, BASE_OAM + SIZE_OAM, SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_CART0, "cart0", "ROM", "Game Pak (32MiB)", BASE_CART0, BASE_CART0 + SIZE_CART0, SIZE_CART0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", BASE_CART1, BASE_CART1 + SIZE_CART1, SIZE_CART1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", BASE_CART2, BASE_CART2 + SIZE_CART2, SIZE_CART2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", GBA_BASE_BIOS, GBA_SIZE_BIOS, GBA_SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, + { GBA_REGION_EWRAM, "wram", "EWRAM", "Working RAM (256kiB)", GBA_BASE_EWRAM, GBA_BASE_EWRAM + GBA_SIZE_EWRAM, GBA_SIZE_EWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IWRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", GBA_BASE_IWRAM, GBA_BASE_IWRAM + GBA_SIZE_IWRAM, GBA_SIZE_IWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IO, "io", "MMIO", "Memory-Mapped I/O", GBA_BASE_IO, GBA_BASE_IO + GBA_SIZE_IO, GBA_SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", GBA_BASE_PALETTE_RAM, GBA_BASE_PALETTE_RAM + GBA_SIZE_PALETTE_RAM, GBA_SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", GBA_BASE_VRAM, GBA_BASE_VRAM + GBA_SIZE_VRAM, GBA_SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", GBA_BASE_OAM, GBA_BASE_OAM + GBA_SIZE_OAM, GBA_SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM0, "cart0", "ROM", "Game Pak (32MiB)", GBA_BASE_ROM0, GBA_BASE_ROM0 + GBA_SIZE_ROM0, GBA_SIZE_ROM0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", GBA_BASE_ROM1, GBA_BASE_ROM1 + GBA_SIZE_ROM1, GBA_SIZE_ROM1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", GBA_BASE_ROM2, GBA_BASE_ROM2 + GBA_SIZE_ROM2, GBA_SIZE_ROM2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, }; static const struct mCoreMemoryBlock _GBAMemoryBlocksSRAM[] = { { -1, "mem", "All", "All", 0, 0x10000000, 0x10000000, mCORE_MEMORY_VIRTUAL }, - { REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", BASE_BIOS, SIZE_BIOS, SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_RAM, "wram", "EWRAM", "Working RAM (256kiB)", BASE_WORKING_RAM, BASE_WORKING_RAM + SIZE_WORKING_RAM, SIZE_WORKING_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_IRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", BASE_WORKING_IRAM, BASE_WORKING_IRAM + SIZE_WORKING_IRAM, SIZE_WORKING_IRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_IO, "io", "MMIO", "Memory-Mapped I/O", BASE_IO, BASE_IO + SIZE_IO, SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", BASE_PALETTE_RAM, BASE_PALETTE_RAM + SIZE_PALETTE_RAM, SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", BASE_VRAM, BASE_VRAM + SIZE_VRAM, SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", BASE_OAM, BASE_OAM + SIZE_OAM, SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_CART0, "cart0", "ROM", "Game Pak (32MiB)", BASE_CART0, BASE_CART0 + SIZE_CART0, SIZE_CART0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", BASE_CART1, BASE_CART1 + SIZE_CART1, SIZE_CART1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", BASE_CART2, BASE_CART2 + SIZE_CART2, SIZE_CART2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART_SRAM, "sram", "SRAM", "Static RAM (64kiB)", BASE_CART_SRAM, BASE_CART_SRAM + SIZE_CART_SRAM, SIZE_CART_SRAM, true }, + { GBA_REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", GBA_BASE_BIOS, GBA_SIZE_BIOS, GBA_SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, + { GBA_REGION_EWRAM, "wram", "EWRAM", "Working RAM (256kiB)", GBA_BASE_EWRAM, GBA_BASE_EWRAM + GBA_SIZE_EWRAM, GBA_SIZE_EWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IWRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", GBA_BASE_IWRAM, GBA_BASE_IWRAM + GBA_SIZE_IWRAM, GBA_SIZE_IWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IO, "io", "MMIO", "Memory-Mapped I/O", GBA_BASE_IO, GBA_BASE_IO + GBA_SIZE_IO, GBA_SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", GBA_BASE_PALETTE_RAM, GBA_BASE_PALETTE_RAM + GBA_SIZE_PALETTE_RAM, GBA_SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", GBA_BASE_VRAM, GBA_BASE_VRAM + GBA_SIZE_VRAM, GBA_SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", GBA_BASE_OAM, GBA_BASE_OAM + GBA_SIZE_OAM, GBA_SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM0, "cart0", "ROM", "Game Pak (32MiB)", GBA_BASE_ROM0, GBA_BASE_ROM0 + GBA_SIZE_ROM0, GBA_SIZE_ROM0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", GBA_BASE_ROM1, GBA_BASE_ROM1 + GBA_SIZE_ROM1, GBA_SIZE_ROM1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", GBA_BASE_ROM2, GBA_BASE_ROM2 + GBA_SIZE_ROM2, GBA_SIZE_ROM2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_SRAM, "sram", "SRAM", "Static RAM (64kiB)", GBA_BASE_SRAM, GBA_BASE_SRAM + GBA_SIZE_SRAM, GBA_SIZE_SRAM, true }, }; static const struct mCoreMemoryBlock _GBAMemoryBlocksFlash512[] = { { -1, "mem", "All", "All", 0, 0x10000000, 0x10000000, mCORE_MEMORY_VIRTUAL }, - { REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", BASE_BIOS, SIZE_BIOS, SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_RAM, "wram", "EWRAM", "Working RAM (256kiB)", BASE_WORKING_RAM, BASE_WORKING_RAM + SIZE_WORKING_RAM, SIZE_WORKING_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_IRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", BASE_WORKING_IRAM, BASE_WORKING_IRAM + SIZE_WORKING_IRAM, SIZE_WORKING_IRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_IO, "io", "MMIO", "Memory-Mapped I/O", BASE_IO, BASE_IO + SIZE_IO, SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", BASE_PALETTE_RAM, BASE_PALETTE_RAM + SIZE_PALETTE_RAM, SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", BASE_VRAM, BASE_VRAM + SIZE_VRAM, SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", BASE_OAM, BASE_OAM + SIZE_OAM, SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_CART0, "cart0", "ROM", "Game Pak (32MiB)", BASE_CART0, BASE_CART0 + SIZE_CART0, SIZE_CART0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", BASE_CART1, BASE_CART1 + SIZE_CART1, SIZE_CART1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", BASE_CART2, BASE_CART2 + SIZE_CART2, SIZE_CART2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART_SRAM, "sram", "Flash", "Flash Memory (64kiB)", BASE_CART_SRAM, BASE_CART_SRAM + SIZE_CART_FLASH512, SIZE_CART_FLASH512, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", GBA_BASE_BIOS, GBA_SIZE_BIOS, GBA_SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, + { GBA_REGION_EWRAM, "wram", "EWRAM", "Working RAM (256kiB)", GBA_BASE_EWRAM, GBA_BASE_EWRAM + GBA_SIZE_EWRAM, GBA_SIZE_EWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IWRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", GBA_BASE_IWRAM, GBA_BASE_IWRAM + GBA_SIZE_IWRAM, GBA_SIZE_IWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IO, "io", "MMIO", "Memory-Mapped I/O", GBA_BASE_IO, GBA_BASE_IO + GBA_SIZE_IO, GBA_SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", GBA_BASE_PALETTE_RAM, GBA_BASE_PALETTE_RAM + GBA_SIZE_PALETTE_RAM, GBA_SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", GBA_BASE_VRAM, GBA_BASE_VRAM + GBA_SIZE_VRAM, GBA_SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", GBA_BASE_OAM, GBA_BASE_OAM + GBA_SIZE_OAM, GBA_SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM0, "cart0", "ROM", "Game Pak (32MiB)", GBA_BASE_ROM0, GBA_BASE_ROM0 + GBA_SIZE_ROM0, GBA_SIZE_ROM0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", GBA_BASE_ROM1, GBA_BASE_ROM1 + GBA_SIZE_ROM1, GBA_SIZE_ROM1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", GBA_BASE_ROM2, GBA_BASE_ROM2 + GBA_SIZE_ROM2, GBA_SIZE_ROM2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_SRAM, "sram", "Flash", "Flash Memory (64kiB)", GBA_BASE_SRAM, GBA_BASE_SRAM + GBA_SIZE_FLASH512, GBA_SIZE_FLASH512, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, }; static const struct mCoreMemoryBlock _GBAMemoryBlocksFlash1M[] = { { -1, "mem", "All", "All", 0, 0x10000000, 0x10000000, mCORE_MEMORY_VIRTUAL }, - { REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", BASE_BIOS, SIZE_BIOS, SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_RAM, "wram", "EWRAM", "Working RAM (256kiB)", BASE_WORKING_RAM, BASE_WORKING_RAM + SIZE_WORKING_RAM, SIZE_WORKING_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_IRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", BASE_WORKING_IRAM, BASE_WORKING_IRAM + SIZE_WORKING_IRAM, SIZE_WORKING_IRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_IO, "io", "MMIO", "Memory-Mapped I/O", BASE_IO, BASE_IO + SIZE_IO, SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", BASE_PALETTE_RAM, BASE_PALETTE_RAM + SIZE_PALETTE_RAM, SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", BASE_VRAM, BASE_VRAM + SIZE_VRAM, SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", BASE_OAM, BASE_OAM + SIZE_OAM, SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_CART0, "cart0", "ROM", "Game Pak (32MiB)", BASE_CART0, BASE_CART0 + SIZE_CART0, SIZE_CART0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", BASE_CART1, BASE_CART1 + SIZE_CART1, SIZE_CART1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", BASE_CART2, BASE_CART2 + SIZE_CART2, SIZE_CART2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART_SRAM, "sram", "Flash", "Flash Memory (64kiB)", BASE_CART_SRAM, BASE_CART_SRAM + SIZE_CART_FLASH512, SIZE_CART_FLASH1M, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED, 1 }, + { GBA_REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", GBA_BASE_BIOS, GBA_SIZE_BIOS, GBA_SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, + { GBA_REGION_EWRAM, "wram", "EWRAM", "Working RAM (256kiB)", GBA_BASE_EWRAM, GBA_BASE_EWRAM + GBA_SIZE_EWRAM, GBA_SIZE_EWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IWRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", GBA_BASE_IWRAM, GBA_BASE_IWRAM + GBA_SIZE_IWRAM, GBA_SIZE_IWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IO, "io", "MMIO", "Memory-Mapped I/O", GBA_BASE_IO, GBA_BASE_IO + GBA_SIZE_IO, GBA_SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", GBA_BASE_PALETTE_RAM, GBA_BASE_PALETTE_RAM + GBA_SIZE_PALETTE_RAM, GBA_SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", GBA_BASE_VRAM, GBA_BASE_VRAM + GBA_SIZE_VRAM, GBA_SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", GBA_BASE_OAM, GBA_BASE_OAM + GBA_SIZE_OAM, GBA_SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM0, "cart0", "ROM", "Game Pak (32MiB)", GBA_BASE_ROM0, GBA_BASE_ROM0 + GBA_SIZE_ROM0, GBA_SIZE_ROM0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", GBA_BASE_ROM1, GBA_BASE_ROM1 + GBA_SIZE_ROM1, GBA_SIZE_ROM1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", GBA_BASE_ROM2, GBA_BASE_ROM2 + GBA_SIZE_ROM2, GBA_SIZE_ROM2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_SRAM, "sram", "Flash", "Flash Memory (64kiB)", GBA_BASE_SRAM, GBA_BASE_SRAM + GBA_SIZE_FLASH512, GBA_SIZE_FLASH1M, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED, 1 }, }; static const struct mCoreMemoryBlock _GBAMemoryBlocksEEPROM[] = { { -1, "mem", "All", "All", 0, 0x10000000, 0x10000000, mCORE_MEMORY_VIRTUAL }, - { REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", BASE_BIOS, SIZE_BIOS, SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_RAM, "wram", "EWRAM", "Working RAM (256kiB)", BASE_WORKING_RAM, BASE_WORKING_RAM + SIZE_WORKING_RAM, SIZE_WORKING_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_WORKING_IRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", BASE_WORKING_IRAM, BASE_WORKING_IRAM + SIZE_WORKING_IRAM, SIZE_WORKING_IRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_IO, "io", "MMIO", "Memory-Mapped I/O", BASE_IO, BASE_IO + SIZE_IO, SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", BASE_PALETTE_RAM, BASE_PALETTE_RAM + SIZE_PALETTE_RAM, SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", BASE_VRAM, BASE_VRAM + SIZE_VRAM, SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", BASE_OAM, BASE_OAM + SIZE_OAM, SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, - { REGION_CART0, "cart0", "ROM", "Game Pak (32MiB)", BASE_CART0, BASE_CART0 + SIZE_CART0, SIZE_CART0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", BASE_CART1, BASE_CART1 + SIZE_CART1, SIZE_CART1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", BASE_CART2, BASE_CART2 + SIZE_CART2, SIZE_CART2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, - { REGION_CART_SRAM_MIRROR, "eeprom", "EEPROM", "EEPROM (8kiB)", 0, SIZE_CART_EEPROM, SIZE_CART_EEPROM, mCORE_MEMORY_RW }, + { GBA_REGION_BIOS, "bios", "BIOS", "BIOS (16kiB)", GBA_BASE_BIOS, GBA_SIZE_BIOS, GBA_SIZE_BIOS, mCORE_MEMORY_READ | mCORE_MEMORY_MAPPED }, + { GBA_REGION_EWRAM, "wram", "EWRAM", "Working RAM (256kiB)", GBA_BASE_EWRAM, GBA_BASE_EWRAM + GBA_SIZE_EWRAM, GBA_SIZE_EWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IWRAM, "iwram", "IWRAM", "Internal Working RAM (32kiB)", GBA_BASE_IWRAM, GBA_BASE_IWRAM + GBA_SIZE_IWRAM, GBA_SIZE_IWRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_IO, "io", "MMIO", "Memory-Mapped I/O", GBA_BASE_IO, GBA_BASE_IO + GBA_SIZE_IO, GBA_SIZE_IO, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_PALETTE_RAM, "palette", "Palette", "Palette RAM (1kiB)", GBA_BASE_PALETTE_RAM, GBA_BASE_PALETTE_RAM + GBA_SIZE_PALETTE_RAM, GBA_SIZE_PALETTE_RAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_VRAM, "vram", "VRAM", "Video RAM (96kiB)", GBA_BASE_VRAM, GBA_BASE_VRAM + GBA_SIZE_VRAM, GBA_SIZE_VRAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_OAM, "oam", "OAM", "OBJ Attribute Memory (1kiB)", GBA_BASE_OAM, GBA_BASE_OAM + GBA_SIZE_OAM, GBA_SIZE_OAM, mCORE_MEMORY_RW | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM0, "cart0", "ROM", "Game Pak (32MiB)", GBA_BASE_ROM0, GBA_BASE_ROM0 + GBA_SIZE_ROM0, GBA_SIZE_ROM0, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM1, "cart1", "ROM WS1", "Game Pak (Waitstate 1)", GBA_BASE_ROM1, GBA_BASE_ROM1 + GBA_SIZE_ROM1, GBA_SIZE_ROM1, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_ROM2, "cart2", "ROM WS2", "Game Pak (Waitstate 2)", GBA_BASE_ROM2, GBA_BASE_ROM2 + GBA_SIZE_ROM2, GBA_SIZE_ROM2, mCORE_MEMORY_READ | mCORE_MEMORY_WORM | mCORE_MEMORY_MAPPED }, + { GBA_REGION_SRAM_MIRROR, "eeprom", "EEPROM", "EEPROM (8kiB)", 0, GBA_SIZE_EEPROM, GBA_SIZE_EEPROM, mCORE_MEMORY_RW }, }; static const struct mCoreRegisterInfo _GBARegisters[] = { @@ -523,7 +523,7 @@ static bool _GBACoreLoadROM(struct mCore* core, struct VFile* vf) { #ifdef USE_ELF struct ELF* elf = ELFOpen(vf); if (elf) { - if (GBAVerifyELFEntry(elf, BASE_CART0)) { + if (GBAVerifyELFEntry(elf, GBA_BASE_ROM0)) { GBALoadNull(core->board); } bool success = mCoreLoadELF(core, elf); @@ -929,36 +929,36 @@ void* _GBACoreGetMemoryBlock(struct mCore* core, size_t id, size_t* sizeOut) { switch (id) { default: return NULL; - case REGION_BIOS: - *sizeOut = SIZE_BIOS; + case GBA_REGION_BIOS: + *sizeOut = GBA_SIZE_BIOS; return gba->memory.bios; - case REGION_WORKING_RAM: - *sizeOut = SIZE_WORKING_RAM; + case GBA_REGION_EWRAM: + *sizeOut = GBA_SIZE_EWRAM; return gba->memory.wram; - case REGION_WORKING_IRAM: - *sizeOut = SIZE_WORKING_IRAM; + case GBA_REGION_IWRAM: + *sizeOut = GBA_SIZE_IWRAM; return gba->memory.iwram; - case REGION_PALETTE_RAM: - *sizeOut = SIZE_PALETTE_RAM; + case GBA_REGION_PALETTE_RAM: + *sizeOut = GBA_SIZE_PALETTE_RAM; return gba->video.palette; - case REGION_VRAM: - *sizeOut = SIZE_VRAM; + case GBA_REGION_VRAM: + *sizeOut = GBA_SIZE_VRAM; return gba->video.vram; - case REGION_OAM: - *sizeOut = SIZE_OAM; + case GBA_REGION_OAM: + *sizeOut = GBA_SIZE_OAM; return gba->video.oam.raw; - case REGION_CART0: - case REGION_CART1: - case REGION_CART2: + case GBA_REGION_ROM0: + case GBA_REGION_ROM1: + case GBA_REGION_ROM2: *sizeOut = gba->memory.romSize; return gba->memory.rom; - case REGION_CART_SRAM: + case GBA_REGION_SRAM: if (gba->memory.savedata.type == SAVEDATA_FLASH1M) { - *sizeOut = SIZE_CART_FLASH1M; + *sizeOut = GBA_SIZE_FLASH1M; return gba->memory.savedata.currentBank; } // Fall through - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM_MIRROR: *sizeOut = GBASavedataSize(&gba->memory.savedata); return gba->memory.savedata.data; } @@ -1175,7 +1175,7 @@ static bool _GBACoreLookupIdentifier(struct mCore* core, const char* name, int32 for (i = 0; i < REG_MAX; i += 2) { const char* reg = GBAIORegisterNames[i >> 1]; if (reg && strcasecmp(reg, name) == 0) { - *value = BASE_IO | i; + *value = GBA_BASE_IO | i; return true; } } @@ -1343,7 +1343,7 @@ static void _GBACoreStartVideoLog(struct mCore* core, struct mVideoLogContext* c struct GBASerializedState* state = mVideoLogContextInitialState(context, NULL); state->id = 0; - state->cpu.gprs[ARM_PC] = BASE_WORKING_RAM; + state->cpu.gprs[ARM_PC] = GBA_BASE_EWRAM; int channelId = mVideoLoggerAddChannel(context); gbacore->vlProxy.logger = malloc(sizeof(struct mVideoLogger)); @@ -1514,8 +1514,8 @@ static void _GBAVLPReset(struct mCore* core) { // Make sure CPU loop never spins GBAHalt(gba); - gba->cpu->memory.store16(gba->cpu, BASE_IO | REG_IME, 0, NULL); - gba->cpu->memory.store16(gba->cpu, BASE_IO | REG_IE, 0, NULL); + gba->cpu->memory.store16(gba->cpu, GBA_BASE_IO | REG_IME, 0, NULL); + gba->cpu->memory.store16(gba->cpu, GBA_BASE_IO | REG_IE, 0, NULL); } static bool _GBAVLPLoadROM(struct mCore* core, struct VFile* vf) { @@ -1534,13 +1534,13 @@ static bool _GBAVLPLoadState(struct mCore* core, const void* state) { struct GBA* gba = (struct GBA*) core->board; gba->timing.root = NULL; - gba->cpu->gprs[ARM_PC] = BASE_WORKING_RAM; + gba->cpu->gprs[ARM_PC] = GBA_BASE_EWRAM; gba->cpu->memory.setActiveRegion(gba->cpu, gba->cpu->gprs[ARM_PC]); // Make sure CPU loop never spins GBAHalt(gba); - gba->cpu->memory.store16(gba->cpu, BASE_IO | REG_IME, 0, NULL); - gba->cpu->memory.store16(gba->cpu, BASE_IO | REG_IE, 0, NULL); + gba->cpu->memory.store16(gba->cpu, GBA_BASE_IO | REG_IME, 0, NULL); + gba->cpu->memory.store16(gba->cpu, GBA_BASE_IO | REG_IE, 0, NULL); GBAVideoDeserialize(&gba->video, state); GBAIODeserialize(gba, state); GBAAudioReset(&gba->audio); diff --git a/src/gba/dma.c b/src/gba/dma.c index 60a8eb056..a5d94dd26 100644 --- a/src/gba/dma.c +++ b/src/gba/dma.c @@ -33,14 +33,14 @@ void GBADMAReset(struct GBA* gba) { gba->memory.activeDMA = -1; } static bool _isValidDMASAD(int dma, uint32_t address) { - if (dma == 0 && address >= BASE_CART0 && address < BASE_CART_SRAM) { + if (dma == 0 && address >= GBA_BASE_ROM0 && address < GBA_BASE_SRAM) { return false; } - return address >= BASE_WORKING_RAM; + return address >= GBA_BASE_EWRAM; } static bool _isValidDMADAD(int dma, uint32_t address) { - return dma == 3 || address < BASE_CART0; + return dma == 3 || address < GBA_BASE_ROM0; } uint32_t GBADMAWriteSAD(struct GBA* gba, int dma, uint32_t address) { @@ -274,14 +274,14 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) { } cpu->memory.store32(cpu, dest, memory->dmaTransferRegister, 0); } else { - if (sourceRegion == REGION_CART2_EX && (memory->savedata.type == SAVEDATA_EEPROM || memory->savedata.type == SAVEDATA_EEPROM512)) { + if (sourceRegion == GBA_REGION_ROM2_EX && (memory->savedata.type == SAVEDATA_EEPROM || memory->savedata.type == SAVEDATA_EEPROM512)) { memory->dmaTransferRegister = GBASavedataReadEEPROM(&memory->savedata); memory->dmaTransferRegister |= memory->dmaTransferRegister << 16; } else if (source) { memory->dmaTransferRegister = cpu->memory.load16(cpu, source, 0); memory->dmaTransferRegister |= memory->dmaTransferRegister << 16; } - if (destRegion == REGION_CART2_EX) { + if (destRegion == GBA_REGION_ROM2_EX) { if (memory->savedata.type == SAVEDATA_AUTODETECT) { mLOG(GBA_MEM, INFO, "Detected EEPROM savegame"); GBASavedataInitEEPROM(&memory->savedata); @@ -296,7 +296,7 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) { gba->bus = memory->dmaTransferRegister; int sourceOffset; - if (info->nextSource >= BASE_CART0 && info->nextSource < BASE_CART_SRAM && GBADMARegisterGetSrcControl(info->reg) < 3) { + if (info->nextSource >= GBA_BASE_ROM0 && info->nextSource < GBA_BASE_SRAM && GBADMARegisterGetSrcControl(info->reg) < 3) { sourceOffset = width; } else { sourceOffset = DMA_OFFSET[GBADMARegisterGetSrcControl(info->reg)] * width; @@ -321,7 +321,7 @@ void GBADMAService(struct GBA* gba, int number, struct GBADMA* info) { if (!info->nextCount) { info->nextCount |= 0x80000000; - if (sourceRegion < REGION_CART0 || destRegion < REGION_CART0) { + if (sourceRegion < GBA_REGION_ROM0 || destRegion < GBA_REGION_ROM0) { info->when += 2; } } diff --git a/src/gba/extra/audio-mixer.c b/src/gba/extra/audio-mixer.c index 503fdc8ad..0bb9b5b35 100644 --- a/src/gba/extra/audio-mixer.c +++ b/src/gba/extra/audio-mixer.c @@ -245,7 +245,7 @@ static void _mp2kReload(struct GBAAudioMixer* mixer) { } bool _mp2kEngage(struct GBAAudioMixer* mixer, uint32_t address) { - if (address < BASE_WORKING_RAM) { + if (address < GBA_BASE_EWRAM) { return false; } if (address != mixer->contextAddress) { diff --git a/src/gba/extra/proxy.c b/src/gba/extra/proxy.c index 3bce4b9b1..d78a815f9 100644 --- a/src/gba/extra/proxy.c +++ b/src/gba/extra/proxy.c @@ -63,9 +63,9 @@ void GBAVideoProxyRendererCreate(struct GBAVideoProxyRenderer* renderer, struct renderer->logger->parsePacket = _parsePacket; renderer->logger->handleEvent = _handleEvent; renderer->logger->vramBlock = _vramBlock; - renderer->logger->paletteSize = SIZE_PALETTE_RAM; - renderer->logger->vramSize = SIZE_VRAM; - renderer->logger->oamSize = SIZE_OAM; + renderer->logger->paletteSize = GBA_SIZE_PALETTE_RAM; + renderer->logger->vramSize = GBA_SIZE_VRAM; + renderer->logger->oamSize = GBA_SIZE_OAM; renderer->backend = backend; } @@ -89,8 +89,8 @@ static void _init(struct GBAVideoProxyRenderer* proxyRenderer) { } static void _reset(struct GBAVideoProxyRenderer* proxyRenderer) { - memcpy(proxyRenderer->logger->oam, &proxyRenderer->d.oam->raw, SIZE_OAM); - memcpy(proxyRenderer->logger->palette, proxyRenderer->d.palette, SIZE_PALETTE_RAM); + memcpy(proxyRenderer->logger->oam, &proxyRenderer->d.oam->raw, GBA_SIZE_OAM); + memcpy(proxyRenderer->logger->palette, proxyRenderer->d.palette, GBA_SIZE_PALETTE_RAM); memcpy(&proxyRenderer->logger->vram[0x0000], proxyRenderer->d.vramBG[0], 0x4000); memcpy(&proxyRenderer->logger->vram[0x2000], proxyRenderer->d.vramBG[1], 0x4000); memcpy(&proxyRenderer->logger->vram[0x4000], proxyRenderer->d.vramBG[2], 0x4000); @@ -213,19 +213,19 @@ static bool _parsePacket(struct mVideoLogger* logger, const struct mVideoLoggerD proxyRenderer->backend->writeVideoRegister(proxyRenderer->backend, item->address, item->value); break; case DIRTY_PALETTE: - if (item->address < SIZE_PALETTE_RAM) { + if (item->address < GBA_SIZE_PALETTE_RAM) { STORE_16LE(item->value, item->address, logger->palette); proxyRenderer->backend->writePalette(proxyRenderer->backend, item->address, item->value); } break; case DIRTY_OAM: - if (item->address < SIZE_OAM) { + if (item->address < GBA_SIZE_OAM) { STORE_16LE(item->value, item->address << 1, logger->oam); proxyRenderer->backend->writeOAM(proxyRenderer->backend, item->address); } break; case DIRTY_VRAM: - if (item->address <= SIZE_VRAM - 0x1000) { + if (item->address <= GBA_SIZE_VRAM - 0x1000) { logger->readData(logger, &logger->vram[item->address >> 1], 0x1000, true); proxyRenderer->backend->writeVRAM(proxyRenderer->backend, item->address); } else { diff --git a/src/gba/gba.c b/src/gba/gba.c index 37408bf6c..578aebc9a 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -108,7 +108,7 @@ static void GBAInit(void* cpu, struct mCPUComponent* component) { gba->keyCallback = NULL; mCoreCallbacksListInit(&gba->coreCallbacks, 0); - gba->biosChecksum = GBAChecksum(gba->memory.bios, SIZE_BIOS); + gba->biosChecksum = GBAChecksum(gba->memory.bios, GBA_SIZE_BIOS); gba->idleOptimization = IDLE_LOOP_REMOVE; gba->idleLoop = IDLE_LOOP_NONE; @@ -137,7 +137,7 @@ void GBAUnloadROM(struct GBA* gba) { gba->yankedRomSize = 0; } #ifndef FIXED_ROM_BUFFER - mappedMemoryFree(gba->memory.rom, SIZE_CART0); + mappedMemoryFree(gba->memory.rom, GBA_SIZE_ROM0); #endif } @@ -172,7 +172,7 @@ void GBADestroy(struct GBA* gba) { GBAUnloadMB(gba); if (gba->biosVf) { - gba->biosVf->unmap(gba->biosVf, gba->memory.bios, SIZE_BIOS); + gba->biosVf->unmap(gba->biosVf, gba->memory.bios, GBA_SIZE_BIOS); gba->biosVf->close(gba->biosVf); gba->biosVf = 0; } @@ -247,7 +247,7 @@ void GBAReset(struct ARMCore* cpu) { if (GBAIsMB(gba->mbVf) && !isELF) { gba->mbVf->seek(gba->mbVf, 0, SEEK_SET); - gba->mbVf->read(gba->mbVf, gba->memory.wram, SIZE_WORKING_RAM); + gba->mbVf->read(gba->mbVf, gba->memory.wram, GBA_SIZE_EWRAM); } gba->lastJump = 0; @@ -259,7 +259,7 @@ void GBAReset(struct ARMCore* cpu) { memset(gba->debugString, 0, sizeof(gba->debugString)); - if (gba->romVf && gba->romVf->size(gba->romVf) > SIZE_CART0) { + if (gba->romVf && gba->romVf->size(gba->romVf) > GBA_SIZE_ROM0) { char ident; gba->romVf->seek(gba->romVf, 0xAC, SEEK_SET); gba->romVf->read(gba->romVf, &ident, 1); @@ -274,11 +274,11 @@ void GBASkipBIOS(struct GBA* gba) { struct ARMCore* cpu = gba->cpu; if (cpu->gprs[ARM_PC] == BASE_RESET + WORD_SIZE_ARM) { if (gba->memory.rom) { - cpu->gprs[ARM_PC] = BASE_CART0; + cpu->gprs[ARM_PC] = GBA_BASE_ROM0; } else if (gba->memory.wram[0x30]) { - cpu->gprs[ARM_PC] = BASE_WORKING_RAM + 0xC0; + cpu->gprs[ARM_PC] = GBA_BASE_EWRAM + 0xC0; } else { - cpu->gprs[ARM_PC] = BASE_WORKING_RAM; + cpu->gprs[ARM_PC] = GBA_BASE_EWRAM; } gba->video.vcount = 0x7E; gba->memory.io[REG_VCOUNT >> 1] = 0x7E; @@ -360,14 +360,14 @@ bool GBALoadNull(struct GBA* gba) { gba->romVf = NULL; gba->pristineRomSize = 0; #ifndef FIXED_ROM_BUFFER - gba->memory.rom = anonymousMemoryMap(SIZE_CART0); + gba->memory.rom = anonymousMemoryMap(GBA_SIZE_ROM0); #else gba->memory.rom = romBuffer; #endif gba->isPristine = false; gba->yankedRomSize = 0; - gba->memory.romSize = SIZE_CART0; - gba->memory.romMask = SIZE_CART0 - 1; + gba->memory.romSize = GBA_SIZE_ROM0; + gba->memory.romMask = GBA_SIZE_ROM0 - 1; gba->romCrc32 = 0; if (gba->cpu) { @@ -381,9 +381,9 @@ bool GBALoadMB(struct GBA* gba, struct VFile* vf) { GBAUnloadMB(gba); gba->mbVf = vf; vf->seek(vf, 0, SEEK_SET); - memset(gba->memory.wram, 0, SIZE_WORKING_RAM); - vf->read(vf, gba->memory.wram, SIZE_WORKING_RAM); - if (gba->cpu && gba->memory.activeRegion == REGION_WORKING_RAM) { + memset(gba->memory.wram, 0, GBA_SIZE_EWRAM); + vf->read(vf, gba->memory.wram, GBA_SIZE_EWRAM); + if (gba->cpu && gba->memory.activeRegion == GBA_REGION_IWRAM) { gba->cpu->memory.setActiveRegion(gba->cpu, gba->cpu->gprs[ARM_PC]); } return true; @@ -405,7 +405,7 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) { gba->isPristine = true; gba->pristineRomSize = vf->size(vf); vf->seek(vf, 0, SEEK_SET); - if (gba->pristineRomSize > SIZE_CART0) { + if (gba->pristineRomSize > GBA_SIZE_ROM0) { char ident; vf->seek(vf, 0xAC, SEEK_SET); vf->read(vf, &ident, 1); @@ -415,13 +415,13 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) { #ifdef FIXED_ROM_BUFFER gba->memory.rom = romBuffer; #else - gba->memory.rom = anonymousMemoryMap(SIZE_CART0); + gba->memory.rom = anonymousMemoryMap(GBA_SIZE_ROM0); #endif } else { - gba->memory.rom = vf->map(vf, SIZE_CART0, MAP_READ); - gba->memory.romSize = SIZE_CART0; + gba->memory.rom = vf->map(vf, GBA_SIZE_ROM0, MAP_READ); + gba->memory.romSize = GBA_SIZE_ROM0; } - gba->pristineRomSize = SIZE_CART0; + gba->pristineRomSize = GBA_SIZE_ROM0; } else if (gba->pristineRomSize == 0x00100000) { // 1 MiB ROMs (e.g. Classic NES) all appear as 4x mirrored, but not more gba->isPristine = false; @@ -429,7 +429,7 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) { #ifdef FIXED_ROM_BUFFER gba->memory.rom = romBuffer; #else - gba->memory.rom = anonymousMemoryMap(SIZE_CART0); + gba->memory.rom = anonymousMemoryMap(GBA_SIZE_ROM0); #endif vf->read(vf, gba->memory.rom, gba->pristineRomSize); memcpy(&gba->memory.rom[0x40000], gba->memory.rom, 0x00100000); @@ -450,15 +450,15 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) { if (popcount32(gba->memory.romSize) != 1) { // This ROM is either a bad dump or homebrew. Emulate flash cart behavior. #ifndef FIXED_ROM_BUFFER - void* newRom = anonymousMemoryMap(SIZE_CART0); + void* newRom = anonymousMemoryMap(GBA_SIZE_ROM0); memcpy(newRom, gba->memory.rom, gba->pristineRomSize); gba->memory.rom = newRom; #endif - gba->memory.romSize = SIZE_CART0; - gba->memory.romMask = SIZE_CART0 - 1; + gba->memory.romSize = GBA_SIZE_ROM0; + gba->memory.romMask = GBA_SIZE_ROM0 - 1; gba->isPristine = false; } - if (gba->cpu && gba->memory.activeRegion >= REGION_CART0) { + if (gba->cpu && gba->memory.activeRegion >= GBA_REGION_ROM0) { gba->cpu->memory.setActiveRegion(gba->cpu, gba->cpu->gprs[ARM_PC]); } GBAHardwareInit(&gba->memory.hw, &((uint16_t*) gba->memory.rom)[GPIO_REG_DATA >> 1]); @@ -485,23 +485,23 @@ void GBAYankROM(struct GBA* gba) { } void GBALoadBIOS(struct GBA* gba, struct VFile* vf) { - if (vf->size(vf) != SIZE_BIOS) { + if (vf->size(vf) != GBA_SIZE_BIOS) { mLOG(GBA, WARN, "Incorrect BIOS size"); return; } - uint32_t* bios = vf->map(vf, SIZE_BIOS, MAP_READ); + uint32_t* bios = vf->map(vf, GBA_SIZE_BIOS, MAP_READ); if (!bios) { mLOG(GBA, WARN, "Couldn't map BIOS"); return; } if (gba->biosVf) { - gba->biosVf->unmap(gba->biosVf, gba->memory.bios, SIZE_BIOS); + gba->biosVf->unmap(gba->biosVf, gba->memory.bios, GBA_SIZE_BIOS); gba->biosVf->close(gba->biosVf); } gba->biosVf = vf; gba->memory.bios = bios; gba->memory.fullBios = 1; - uint32_t checksum = GBAChecksum(gba->memory.bios, SIZE_BIOS); + uint32_t checksum = GBAChecksum(gba->memory.bios, GBA_SIZE_BIOS); mLOG(GBA, DEBUG, "BIOS Checksum: 0x%X", checksum); if (checksum == GBA_BIOS_CHECKSUM) { mLOG(GBA, INFO, "Official GBA BIOS detected"); @@ -511,7 +511,7 @@ void GBALoadBIOS(struct GBA* gba, struct VFile* vf) { mLOG(GBA, WARN, "BIOS checksum incorrect"); } gba->biosChecksum = checksum; - if (gba->memory.activeRegion == REGION_BIOS) { + if (gba->memory.activeRegion == GBA_REGION_BIOS) { gba->cpu->memory.activeRegion = gba->memory.bios; } // TODO: error check @@ -519,18 +519,18 @@ void GBALoadBIOS(struct GBA* gba, struct VFile* vf) { void GBAApplyPatch(struct GBA* gba, struct Patch* patch) { size_t patchedSize = patch->outputSize(patch, gba->memory.romSize); - if (!patchedSize || patchedSize > SIZE_CART0) { + if (!patchedSize || patchedSize > GBA_SIZE_ROM0) { return; } - void* newRom = anonymousMemoryMap(SIZE_CART0); + void* newRom = anonymousMemoryMap(GBA_SIZE_ROM0); if (!patch->applyPatch(patch, gba->memory.rom, gba->pristineRomSize, newRom, patchedSize)) { - mappedMemoryFree(newRom, SIZE_CART0); + mappedMemoryFree(newRom, GBA_SIZE_ROM0); return; } if (gba->romVf) { #ifndef FIXED_ROM_BUFFER if (!gba->isPristine) { - mappedMemoryFree(gba->memory.rom, SIZE_CART0); + mappedMemoryFree(gba->memory.rom, GBA_SIZE_ROM0); } else { gba->romVf->unmap(gba->romVf, gba->memory.rom, gba->pristineRomSize); } @@ -665,7 +665,7 @@ bool GBAIsROM(struct VFile* vf) { uint32_t entry = ELFEntry(elf); bool isGBA = true; isGBA = isGBA && ELFMachine(elf) == EM_ARM; - isGBA = isGBA && (GBAVerifyELFEntry(elf, BASE_CART0) || GBAVerifyELFEntry(elf, BASE_WORKING_RAM + 0xC0)); + isGBA = isGBA && (GBAVerifyELFEntry(elf, GBA_BASE_ROM0) || GBAVerifyELFEntry(elf, GBA_BASE_EWRAM + 0xC0)); ELFClose(elf); return isGBA; } @@ -721,12 +721,12 @@ bool GBAIsMB(struct VFile* vf) { #ifdef USE_ELF struct ELF* elf = ELFOpen(vf); if (elf) { - bool isMB = GBAVerifyELFEntry(elf, BASE_WORKING_RAM + 0xC0); + bool isMB = GBAVerifyELFEntry(elf, GBA_BASE_EWRAM + 0xC0); ELFClose(elf); return isMB; } #endif - if (vf->size(vf) > SIZE_WORKING_RAM) { + if (vf->size(vf) > GBA_SIZE_EWRAM) { return false; } if (vf->seek(vf, GBA_MB_MAGIC_OFFSET, SEEK_SET) < 0) { @@ -763,10 +763,10 @@ bool GBAIsMB(struct VFile* vf) { } pc += 4; LOAD_32(opcode, 0, &signature); - if ((opcode & ~0x1FFFF) == BASE_WORKING_RAM) { + if ((opcode & ~0x1FFFF) == GBA_BASE_EWRAM) { ++wramAddrs; } - if ((opcode & ~0x1FFFF) == BASE_CART0) { + if ((opcode & ~0x1FFFF) == GBA_BASE_ROM0) { ++romAddrs; } ARMDecodeARM(opcode, &info); @@ -789,10 +789,10 @@ bool GBAIsMB(struct VFile* vf) { if (vf->seek(vf, pc, SEEK_SET) < 0) { break; } - if ((immediate & ~0x1FFFF) == BASE_WORKING_RAM) { + if ((immediate & ~0x1FFFF) == GBA_BASE_EWRAM) { ++wramLoads; } - if ((immediate & ~0x1FFFF) == BASE_CART0) { + if ((immediate & ~0x1FFFF) == GBA_BASE_ROM0) { ++romLoads; } } diff --git a/src/gba/hle-bios.c b/src/gba/hle-bios.c index b68d063a3..84737afd4 100644 --- a/src/gba/hle-bios.c +++ b/src/gba/hle-bios.c @@ -2,7 +2,7 @@ #include -const uint8_t hleBios[SIZE_BIOS] = { +const uint8_t hleBios[GBA_SIZE_BIOS] = { 0xd3, 0x00, 0x00, 0xea, 0x66, 0x00, 0x00, 0xea, 0x0c, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0xa0, 0xe1, 0x59, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0x00, 0x00, diff --git a/src/gba/hle-bios.make b/src/gba/hle-bios.make index b890b43ef..5ac7f1e9b 100644 --- a/src/gba/hle-bios.make +++ b/src/gba/hle-bios.make @@ -15,4 +15,4 @@ hle-bios.c: hle-bios.bin echo >> $@ echo '#include ' >> $@ echo >> $@ - xxd -i $< | sed -e 's/unsigned char hle_bios_bin\[\]/const uint8_t hleBios[SIZE_BIOS]/' -e 's/^ \+/\t/' | grep -v hle_bios_bin_len >> $@ + xxd -i $< | sed -e 's/unsigned char hle_bios_bin\[\]/const uint8_t hleBios[GBA_SIZE_BIOS]/' -e 's/^ \+/\t/' | grep -v hle_bios_bin_len >> $@ diff --git a/src/gba/io.c b/src/gba/io.c index 26f9ad631..d1f7aad22 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -296,8 +296,8 @@ static const int _isWSpecialRegister[REG_INTERNAL_MAX >> 1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Audio - 1, 1, 1, 0, 1, 0, 1, 0, - 1, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, @@ -625,18 +625,18 @@ void GBAIOWrite8(struct GBA* gba, uint32_t address, uint8_t value) { return; } if (address == REG_POSTFLG) { - gba->memory.io[(address & (SIZE_IO - 1)) >> 1] = value; + gba->memory.io[(address & (GBA_SIZE_IO - 1)) >> 1] = value; return; } if (address >= REG_DEBUG_STRING && address - REG_DEBUG_STRING < sizeof(gba->debugString)) { gba->debugString[address - REG_DEBUG_STRING] = value; return; } - if (address > SIZE_IO) { + if (address > GBA_SIZE_IO) { return; } uint16_t value16 = value << (8 * (address & 1)); - value16 |= (gba->memory.io[(address & (SIZE_IO - 1)) >> 1]) & ~(0xFF << (8 * (address & 1))); + value16 |= (gba->memory.io[(address & (GBA_SIZE_IO - 1)) >> 1]) & ~(0xFF << (8 * (address & 1))); GBAIOWrite(gba, address & 0xFFFFFFFE, value16); } diff --git a/src/gba/memory.c b/src/gba/memory.c index fe33fc1cc..1fe273314 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -89,8 +89,8 @@ void GBAMemoryInit(struct GBA* gba) { gba->memory.agbPrintBuffer = NULL; gba->memory.agbPrintBufferBackup = NULL; - gba->memory.wram = anonymousMemoryMap(SIZE_WORKING_RAM + SIZE_WORKING_IRAM); - gba->memory.iwram = &gba->memory.wram[SIZE_WORKING_RAM >> 2]; + gba->memory.wram = anonymousMemoryMap(GBA_SIZE_EWRAM + GBA_SIZE_IWRAM); + gba->memory.iwram = &gba->memory.wram[GBA_SIZE_EWRAM >> 2]; GBADMAInit(gba); GBAVFameInit(&gba->memory.vfame); @@ -101,15 +101,15 @@ void GBAMemoryInit(struct GBA* gba) { } void GBAMemoryDeinit(struct GBA* gba) { - mappedMemoryFree(gba->memory.wram, SIZE_WORKING_RAM + SIZE_WORKING_IRAM); + mappedMemoryFree(gba->memory.wram, GBA_SIZE_EWRAM + GBA_SIZE_IWRAM); if (gba->memory.rom) { mappedMemoryFree(gba->memory.rom, gba->memory.romSize); } if (gba->memory.agbPrintBuffer) { - mappedMemoryFree(gba->memory.agbPrintBuffer, SIZE_AGB_PRINT); + mappedMemoryFree(gba->memory.agbPrintBuffer, GBA_SIZE_AGB_PRINT); } if (gba->memory.agbPrintBufferBackup) { - mappedMemoryFree(gba->memory.agbPrintBufferBackup, SIZE_AGB_PRINT); + mappedMemoryFree(gba->memory.agbPrintBufferBackup, GBA_SIZE_AGB_PRINT); } GBACartEReaderDeinit(&gba->memory.ereader); @@ -117,11 +117,11 @@ void GBAMemoryDeinit(struct GBA* gba) { void GBAMemoryReset(struct GBA* gba) { if (gba->memory.wram && gba->memory.rom) { - memset(gba->memory.wram, 0, SIZE_WORKING_RAM); + memset(gba->memory.wram, 0, GBA_SIZE_EWRAM); } if (gba->memory.iwram) { - memset(gba->memory.iwram, 0, SIZE_WORKING_IRAM); + memset(gba->memory.iwram, 0, GBA_SIZE_IWRAM); } memset(gba->memory.io, 0, sizeof(gba->memory.io)); @@ -133,11 +133,11 @@ void GBAMemoryReset(struct GBA* gba) { gba->memory.agbPrintBase = 0; memset(&gba->memory.agbPrintCtx, 0, sizeof(gba->memory.agbPrintCtx)); if (gba->memory.agbPrintBuffer) { - mappedMemoryFree(gba->memory.agbPrintBuffer, SIZE_AGB_PRINT); + mappedMemoryFree(gba->memory.agbPrintBuffer, GBA_SIZE_AGB_PRINT); gba->memory.agbPrintBuffer = NULL; } if (gba->memory.agbPrintBufferBackup) { - mappedMemoryFree(gba->memory.agbPrintBufferBackup, SIZE_AGB_PRINT); + mappedMemoryFree(gba->memory.agbPrintBufferBackup, GBA_SIZE_AGB_PRINT); gba->memory.agbPrintBufferBackup = NULL; } @@ -186,11 +186,11 @@ static void _analyzeForIdleLoop(struct GBA* gba, struct ARMCore* cpu, uint32_t a } else { loadAddress += offset; } - if ((loadAddress >> BASE_OFFSET) == REGION_IO && !GBAIOIsReadConstant(loadAddress)) { + if ((loadAddress >> BASE_OFFSET) == GBA_REGION_IO && !GBAIOIsReadConstant(loadAddress)) { gba->idleDetectionStep = -1; return; } - if ((loadAddress >> BASE_OFFSET) < REGION_CART0 || (loadAddress >> BASE_OFFSET) > REGION_CART2_EX) { + if ((loadAddress >> BASE_OFFSET) < GBA_REGION_ROM0 || (loadAddress >> BASE_OFFSET) > GBA_REGION_ROM2_EX) { gba->taintedRegisters[info.op1.reg] = true; } else { switch (info.memory.width) { @@ -232,7 +232,7 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { struct GBAMemory* memory = &gba->memory; int newRegion = address >> BASE_OFFSET; - if (gba->idleOptimization >= IDLE_LOOP_REMOVE && memory->activeRegion != REGION_BIOS) { + if (gba->idleOptimization >= IDLE_LOOP_REMOVE && memory->activeRegion != GBA_REGION_BIOS) { if (address == gba->idleLoop) { if (gba->haltPending) { gba->haltPending = false; @@ -273,33 +273,33 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { } else { cpu->memory.activeMask &= -WORD_SIZE_ARM; } - if (newRegion < REGION_CART0 || (address & (SIZE_CART0 - 1)) < memory->romSize) { + if (newRegion < GBA_REGION_ROM0 || (address & (GBA_SIZE_ROM0 - 1)) < memory->romSize) { return; } } - if (memory->activeRegion == REGION_BIOS) { + if (memory->activeRegion == GBA_REGION_BIOS) { memory->biosPrefetch = cpu->prefetch[1]; } memory->activeRegion = newRegion; switch (newRegion) { - case REGION_BIOS: + case GBA_REGION_BIOS: cpu->memory.activeRegion = memory->bios; - cpu->memory.activeMask = SIZE_BIOS - 1; + cpu->memory.activeMask = GBA_SIZE_BIOS - 1; break; - case REGION_WORKING_RAM: + case GBA_REGION_EWRAM: cpu->memory.activeRegion = memory->wram; - cpu->memory.activeMask = SIZE_WORKING_RAM - 1; + cpu->memory.activeMask = GBA_SIZE_EWRAM - 1; break; - case REGION_WORKING_IRAM: + case GBA_REGION_IWRAM: cpu->memory.activeRegion = memory->iwram; - cpu->memory.activeMask = SIZE_WORKING_IRAM - 1; + cpu->memory.activeMask = GBA_SIZE_IWRAM - 1; break; - case REGION_PALETTE_RAM: + case GBA_REGION_PALETTE_RAM: cpu->memory.activeRegion = (uint32_t*) gba->video.palette; - cpu->memory.activeMask = SIZE_PALETTE_RAM - 1; + cpu->memory.activeMask = GBA_SIZE_PALETTE_RAM - 1; break; - case REGION_VRAM: + case GBA_REGION_VRAM: if (address & 0x10000) { cpu->memory.activeRegion = (uint32_t*) &gba->video.vram[0x8000]; cpu->memory.activeMask = 0x00007FFF; @@ -308,19 +308,19 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { cpu->memory.activeMask = 0x0000FFFF; } break; - case REGION_OAM: + case GBA_REGION_OAM: cpu->memory.activeRegion = (uint32_t*) gba->video.oam.raw; - cpu->memory.activeMask = SIZE_OAM - 1; + cpu->memory.activeMask = GBA_SIZE_OAM - 1; break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: cpu->memory.activeRegion = memory->rom; cpu->memory.activeMask = memory->romMask; - if ((address & (SIZE_CART0 - 1)) < memory->romSize) { + if ((address & (GBA_SIZE_ROM0 - 1)) < memory->romSize) { break; } if ((address & 0x00FFFFFE) == AGB_PRINT_FLUSH_ADDR && memory->agbPrintProtect == 0x20) { @@ -362,8 +362,8 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { value = GBALoadBad(cpu); #define LOAD_BIOS \ - if (address < SIZE_BIOS) { \ - if (memory->activeRegion == REGION_BIOS) { \ + if (address < GBA_SIZE_BIOS) { \ + if (memory->activeRegion == GBA_REGION_BIOS) { \ LOAD_32(value, address & -4, memory->bios); \ } else { \ mLOG(GBA_MEM, GAME_ERROR, "Bad BIOS Load32: 0x%08X", address); \ @@ -374,20 +374,20 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { value = GBALoadBad(cpu); \ } -#define LOAD_WORKING_RAM \ - LOAD_32(value, address & (SIZE_WORKING_RAM - 4), memory->wram); \ - wait += waitstatesRegion[REGION_WORKING_RAM]; +#define LOAD_EWRAM \ + LOAD_32(value, address & (GBA_SIZE_EWRAM - 4), memory->wram); \ + wait += waitstatesRegion[GBA_REGION_EWRAM]; -#define LOAD_WORKING_IRAM LOAD_32(value, address & (SIZE_WORKING_IRAM - 4), memory->iwram); +#define LOAD_IWRAM LOAD_32(value, address & (GBA_SIZE_IWRAM - 4), memory->iwram); #define LOAD_IO value = GBAIORead(gba, address & OFFSET_MASK & ~3) | (GBAIORead(gba, (address & OFFSET_MASK & ~1) | 2) << 16); #define LOAD_PALETTE_RAM \ - LOAD_32(value, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); \ - wait += waitstatesRegion[REGION_PALETTE_RAM]; + LOAD_32(value, address & (GBA_SIZE_PALETTE_RAM - 4), gba->video.palette); \ + wait += waitstatesRegion[GBA_REGION_PALETTE_RAM]; #define LOAD_VRAM \ - if ((address & 0x0001FFFF) >= SIZE_VRAM) { \ - if ((address & (SIZE_VRAM | 0x00014000)) == SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { \ + if ((address & 0x0001FFFF) >= GBA_SIZE_VRAM) { \ + if ((address & (GBA_SIZE_VRAM | 0x00014000)) == GBA_SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { \ mLOG(GBA_MEM, GAME_ERROR, "Bad VRAM Load32: 0x%08X", address); \ value = 0; \ } else { \ @@ -401,12 +401,12 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { wait += GBAMemoryStallVRAM(gba, wait, 1); \ } -#define LOAD_OAM LOAD_32(value, address & (SIZE_OAM - 4), gba->video.oam.raw); +#define LOAD_OAM LOAD_32(value, address & (GBA_SIZE_OAM - 4), gba->video.oam.raw); #define LOAD_CART \ wait += waitstatesRegion[address >> BASE_OFFSET]; \ - if ((address & (SIZE_CART0 - 1)) < memory->romSize) { \ - LOAD_32(value, address & (SIZE_CART0 - 4), memory->rom); \ + if ((address & (GBA_SIZE_ROM0 - 1)) < memory->romSize) { \ + LOAD_32(value, address & (GBA_SIZE_ROM0 - 4), memory->rom); \ } else if (memory->vfame.cartType) { \ value = GBAVFameGetPatternValue(address, 32); \ } else { \ @@ -431,13 +431,13 @@ uint32_t GBALoadBad(struct ARMCore* cpu) { if (cpu->executionMode == MODE_THUMB) { /* http://ngemu.com/threads/gba-open-bus.170809/ */ switch (cpu->gprs[ARM_PC] >> BASE_OFFSET) { - case REGION_BIOS: - case REGION_OAM: + case GBA_REGION_BIOS: + case GBA_REGION_OAM: /* This isn't right half the time, but we don't have $+6 handy */ value <<= 16; value |= cpu->prefetch[0]; break; - case REGION_WORKING_IRAM: + case GBA_REGION_IWRAM: /* This doesn't handle prefetch clobbering */ if (cpu->gprs[ARM_PC] & 2) { value <<= 16; @@ -462,37 +462,37 @@ uint32_t GBALoad32(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { char* waitstatesRegion = memory->waitstatesNonseq32; switch (address >> BASE_OFFSET) { - case REGION_BIOS: + case GBA_REGION_BIOS: LOAD_BIOS; break; - case REGION_WORKING_RAM: - LOAD_WORKING_RAM; + case GBA_REGION_EWRAM: + LOAD_EWRAM; break; - case REGION_WORKING_IRAM: - LOAD_WORKING_IRAM; + case GBA_REGION_IWRAM: + LOAD_IWRAM; break; - case REGION_IO: + case GBA_REGION_IO: LOAD_IO; break; - case REGION_PALETTE_RAM: + case GBA_REGION_PALETTE_RAM: LOAD_PALETTE_RAM; break; - case REGION_VRAM: + case GBA_REGION_VRAM: LOAD_VRAM; break; - case REGION_OAM: + case GBA_REGION_OAM: LOAD_OAM; break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: LOAD_CART; break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: LOAD_SRAM; break; default: @@ -503,7 +503,7 @@ uint32_t GBALoad32(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (cycleCounter) { wait += 2; - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -520,9 +520,9 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { int wait = 0; switch (address >> BASE_OFFSET) { - case REGION_BIOS: - if (address < SIZE_BIOS) { - if (memory->activeRegion == REGION_BIOS) { + case GBA_REGION_BIOS: + if (address < GBA_SIZE_BIOS) { + if (memory->activeRegion == GBA_REGION_BIOS) { LOAD_16(value, address & -2, memory->bios); } else { mLOG(GBA_MEM, GAME_ERROR, "Bad BIOS Load16: 0x%08X", address); @@ -533,22 +533,22 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { value = (GBALoadBad(cpu) >> ((address & 2) * 8)) & 0xFFFF; } break; - case REGION_WORKING_RAM: - LOAD_16(value, address & (SIZE_WORKING_RAM - 2), memory->wram); - wait = memory->waitstatesNonseq16[REGION_WORKING_RAM]; + case GBA_REGION_EWRAM: + LOAD_16(value, address & (GBA_SIZE_EWRAM - 2), memory->wram); + wait = memory->waitstatesNonseq16[GBA_REGION_EWRAM]; break; - case REGION_WORKING_IRAM: - LOAD_16(value, address & (SIZE_WORKING_IRAM - 2), memory->iwram); + case GBA_REGION_IWRAM: + LOAD_16(value, address & (GBA_SIZE_IWRAM - 2), memory->iwram); break; - case REGION_IO: + case GBA_REGION_IO: value = GBAIORead(gba, address & (OFFSET_MASK - 1)); break; - case REGION_PALETTE_RAM: - LOAD_16(value, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); + case GBA_REGION_PALETTE_RAM: + LOAD_16(value, address & (GBA_SIZE_PALETTE_RAM - 2), gba->video.palette); break; - case REGION_VRAM: - if ((address & 0x0001FFFF) >= SIZE_VRAM) { - if ((address & (SIZE_VRAM | 0x00014000)) == SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { + case GBA_REGION_VRAM: + if ((address & 0x0001FFFF) >= GBA_SIZE_VRAM) { + if ((address & (GBA_SIZE_VRAM | 0x00014000)) == GBA_SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { mLOG(GBA_MEM, GAME_ERROR, "Bad VRAM Load16: 0x%08X", address); value = 0; break; @@ -561,20 +561,20 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { wait += GBAMemoryStallVRAM(gba, wait, 0); } break; - case REGION_OAM: - LOAD_16(value, address & (SIZE_OAM - 2), gba->video.oam.raw); + case GBA_REGION_OAM: + LOAD_16(value, address & (GBA_SIZE_OAM - 2), gba->video.oam.raw); break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: wait = memory->waitstatesNonseq16[address >> BASE_OFFSET]; - if ((address & (SIZE_CART0 - 1)) < memory->romSize) { - LOAD_16(value, address & (SIZE_CART0 - 2), memory->rom); + if ((address & (GBA_SIZE_ROM0 - 1)) < memory->romSize) { + LOAD_16(value, address & (GBA_SIZE_ROM0 - 2), memory->rom); } else if (memory->vfame.cartType) { value = GBAVFameGetPatternValue(address, 16); - } else if ((address & (SIZE_CART0 - 1)) >= AGB_PRINT_BASE) { + } else if ((address & (GBA_SIZE_ROM0 - 1)) >= AGB_PRINT_BASE) { uint32_t agbPrintAddr = address & 0x00FFFFFF; if (agbPrintAddr == AGB_PRINT_PROTECT) { value = memory->agbPrintProtect; @@ -589,14 +589,14 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { value = (address >> 1) & 0xFFFF; } break; - case REGION_CART2_EX: + case GBA_REGION_ROM2_EX: wait = memory->waitstatesNonseq16[address >> BASE_OFFSET]; if (memory->savedata.type == SAVEDATA_EEPROM || memory->savedata.type == SAVEDATA_EEPROM512) { value = GBASavedataReadEEPROM(&memory->savedata); } else if ((address & 0x0DFC0000) >= 0x0DF80000 && memory->hw.devices & HW_EREADER) { value = GBACartEReaderRead(&memory->ereader, address); - } else if ((address & (SIZE_CART0 - 1)) < memory->romSize) { - LOAD_16(value, address & (SIZE_CART0 - 2), memory->rom); + } else if ((address & (GBA_SIZE_ROM0 - 1)) < memory->romSize) { + LOAD_16(value, address & (GBA_SIZE_ROM0 - 2), memory->rom); } else if (memory->vfame.cartType) { value = GBAVFameGetPatternValue(address, 16); } else { @@ -604,8 +604,8 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { value = (address >> 1) & 0xFFFF; } break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: wait = memory->waitstatesNonseq16[address >> BASE_OFFSET]; value = GBALoad8(cpu, address, 0); value |= value << 8; @@ -618,7 +618,7 @@ uint32_t GBALoad16(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (cycleCounter) { wait += 2; - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -635,9 +635,9 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { int wait = 0; switch (address >> BASE_OFFSET) { - case REGION_BIOS: - if (address < SIZE_BIOS) { - if (memory->activeRegion == REGION_BIOS) { + case GBA_REGION_BIOS: + if (address < GBA_SIZE_BIOS) { + if (memory->activeRegion == GBA_REGION_BIOS) { value = ((uint8_t*) memory->bios)[address]; } else { mLOG(GBA_MEM, GAME_ERROR, "Bad BIOS Load8: 0x%08X", address); @@ -648,22 +648,22 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { value = (GBALoadBad(cpu) >> ((address & 3) * 8)) & 0xFF; } break; - case REGION_WORKING_RAM: - value = ((uint8_t*) memory->wram)[address & (SIZE_WORKING_RAM - 1)]; - wait = memory->waitstatesNonseq16[REGION_WORKING_RAM]; + case GBA_REGION_EWRAM: + value = ((uint8_t*) memory->wram)[address & (GBA_SIZE_EWRAM - 1)]; + wait = memory->waitstatesNonseq16[GBA_REGION_EWRAM]; break; - case REGION_WORKING_IRAM: - value = ((uint8_t*) memory->iwram)[address & (SIZE_WORKING_IRAM - 1)]; + case GBA_REGION_IWRAM: + value = ((uint8_t*) memory->iwram)[address & (GBA_SIZE_IWRAM - 1)]; break; - case REGION_IO: + case GBA_REGION_IO: value = (GBAIORead(gba, address & 0xFFFE) >> ((address & 0x0001) << 3)) & 0xFF; break; - case REGION_PALETTE_RAM: - value = ((uint8_t*) gba->video.palette)[address & (SIZE_PALETTE_RAM - 1)]; + case GBA_REGION_PALETTE_RAM: + value = ((uint8_t*) gba->video.palette)[address & (GBA_SIZE_PALETTE_RAM - 1)]; break; - case REGION_VRAM: - if ((address & 0x0001FFFF) >= SIZE_VRAM) { - if ((address & (SIZE_VRAM | 0x00014000)) == SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { + case GBA_REGION_VRAM: + if ((address & 0x0001FFFF) >= GBA_SIZE_VRAM) { + if ((address & (GBA_SIZE_VRAM | 0x00014000)) == GBA_SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { mLOG(GBA_MEM, GAME_ERROR, "Bad VRAM Load8: 0x%08X", address); value = 0; break; @@ -676,18 +676,18 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { wait += GBAMemoryStallVRAM(gba, wait, 0); } break; - case REGION_OAM: - value = ((uint8_t*) gba->video.oam.raw)[address & (SIZE_OAM - 1)]; + case GBA_REGION_OAM: + value = ((uint8_t*) gba->video.oam.raw)[address & (GBA_SIZE_OAM - 1)]; break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: wait = memory->waitstatesNonseq16[address >> BASE_OFFSET]; - if ((address & (SIZE_CART0 - 1)) < memory->romSize) { - value = ((uint8_t*) memory->rom)[address & (SIZE_CART0 - 1)]; + if ((address & (GBA_SIZE_ROM0 - 1)) < memory->romSize) { + value = ((uint8_t*) memory->rom)[address & (GBA_SIZE_ROM0 - 1)]; } else if (memory->vfame.cartType) { value = GBAVFameGetPatternValue(address, 8); } else { @@ -695,8 +695,8 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { value = ((address >> 1) >> ((address & 1) * 8)) & 0xFF; } break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: wait = memory->waitstatesNonseq16[address >> BASE_OFFSET]; if (memory->savedata.type == SAVEDATA_AUTODETECT) { mLOG(GBA_MEM, INFO, "Detected SRAM savegame"); @@ -708,13 +708,13 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (memory->hw.devices & HW_EREADER && (address & 0xE00FF80) >= 0xE00FF80) { value = GBACartEReaderReadFlash(&memory->ereader, address); } else if (memory->savedata.type == SAVEDATA_SRAM) { - value = memory->savedata.data[address & (SIZE_CART_SRAM - 1)]; + value = memory->savedata.data[address & (GBA_SIZE_SRAM - 1)]; } else if (memory->savedata.type == SAVEDATA_FLASH512 || memory->savedata.type == SAVEDATA_FLASH1M) { 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)]; + value = memory->savedata.data[address & (GBA_SIZE_SRAM512 - 1)]; } else { mLOG(GBA_MEM, GAME_ERROR, "Reading from non-existent SRAM: 0x%08X", address); value = 0xFF; @@ -729,7 +729,7 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { if (cycleCounter) { wait += 2; - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -737,28 +737,28 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { return value; } -#define STORE_WORKING_RAM \ - STORE_32(value, address & (SIZE_WORKING_RAM - 4), memory->wram); \ - wait += waitstatesRegion[REGION_WORKING_RAM]; +#define STORE_EWRAM \ + STORE_32(value, address & (GBA_SIZE_EWRAM - 4), memory->wram); \ + wait += waitstatesRegion[GBA_REGION_EWRAM]; -#define STORE_WORKING_IRAM \ - STORE_32(value, address & (SIZE_WORKING_IRAM - 4), memory->iwram); +#define STORE_IWRAM \ + STORE_32(value, address & (GBA_SIZE_IWRAM - 4), memory->iwram); #define STORE_IO \ GBAIOWrite32(gba, address & (OFFSET_MASK - 3), value); #define STORE_PALETTE_RAM \ - LOAD_32(oldValue, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); \ + LOAD_32(oldValue, address & (GBA_SIZE_PALETTE_RAM - 4), gba->video.palette); \ if (oldValue != value) { \ - STORE_32(value, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); \ - gba->video.renderer->writePalette(gba->video.renderer, (address & (SIZE_PALETTE_RAM - 4)) + 2, value >> 16); \ - gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 4), value); \ + STORE_32(value, address & (GBA_SIZE_PALETTE_RAM - 4), gba->video.palette); \ + gba->video.renderer->writePalette(gba->video.renderer, (address & (GBA_SIZE_PALETTE_RAM - 4)) + 2, value >> 16); \ + gba->video.renderer->writePalette(gba->video.renderer, address & (GBA_SIZE_PALETTE_RAM - 4), value); \ } \ - wait += waitstatesRegion[REGION_PALETTE_RAM]; + wait += waitstatesRegion[GBA_REGION_PALETTE_RAM]; #define STORE_VRAM \ - if ((address & 0x0001FFFF) >= SIZE_VRAM) { \ - if ((address & (SIZE_VRAM | 0x00014000)) == SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { \ + if ((address & 0x0001FFFF) >= GBA_SIZE_VRAM) { \ + if ((address & (GBA_SIZE_VRAM | 0x00014000)) == GBA_SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { \ mLOG(GBA_MEM, GAME_ERROR, "Bad VRAM Store32: 0x%08X", address); \ } else { \ LOAD_32(oldValue, address & 0x00017FFC, gba->video.vram); \ @@ -782,11 +782,11 @@ uint32_t GBALoad8(struct ARMCore* cpu, uint32_t address, int* cycleCounter) { } #define STORE_OAM \ - LOAD_32(oldValue, address & (SIZE_OAM - 4), gba->video.oam.raw); \ + LOAD_32(oldValue, address & (GBA_SIZE_OAM - 4), gba->video.oam.raw); \ if (oldValue != value) { \ - STORE_32(value, address & (SIZE_OAM - 4), gba->video.oam.raw); \ - gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 4)) >> 1); \ - gba->video.renderer->writeOAM(gba->video.renderer, ((address & (SIZE_OAM - 4)) >> 1) + 1); \ + STORE_32(value, address & (GBA_SIZE_OAM - 4), gba->video.oam.raw); \ + gba->video.renderer->writeOAM(gba->video.renderer, (address & (GBA_SIZE_OAM - 4)) >> 1); \ + gba->video.renderer->writeOAM(gba->video.renderer, ((address & (GBA_SIZE_OAM - 4)) >> 1) + 1); \ } #define STORE_CART \ @@ -818,34 +818,34 @@ void GBAStore32(struct ARMCore* cpu, uint32_t address, int32_t value, int* cycle char* waitstatesRegion = memory->waitstatesNonseq32; switch (address >> BASE_OFFSET) { - case REGION_WORKING_RAM: - STORE_WORKING_RAM; + case GBA_REGION_EWRAM: + STORE_EWRAM; break; - case REGION_WORKING_IRAM: - STORE_WORKING_IRAM + case GBA_REGION_IWRAM: + STORE_IWRAM break; - case REGION_IO: + case GBA_REGION_IO: STORE_IO; break; - case REGION_PALETTE_RAM: + case GBA_REGION_PALETTE_RAM: STORE_PALETTE_RAM; break; - case REGION_VRAM: + case GBA_REGION_VRAM: STORE_VRAM; break; - case REGION_OAM: + case GBA_REGION_OAM: STORE_OAM; break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: STORE_CART; break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: STORE_SRAM; break; default: @@ -855,7 +855,7 @@ void GBAStore32(struct ARMCore* cpu, uint32_t address, int32_t value, int* cycle if (cycleCounter) { ++wait; - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -869,26 +869,26 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle int16_t oldValue; switch (address >> BASE_OFFSET) { - case REGION_WORKING_RAM: - STORE_16(value, address & (SIZE_WORKING_RAM - 2), memory->wram); - wait = memory->waitstatesNonseq16[REGION_WORKING_RAM]; + case GBA_REGION_EWRAM: + STORE_16(value, address & (GBA_SIZE_EWRAM - 2), memory->wram); + wait = memory->waitstatesNonseq16[GBA_REGION_EWRAM]; break; - case REGION_WORKING_IRAM: - STORE_16(value, address & (SIZE_WORKING_IRAM - 2), memory->iwram); + case GBA_REGION_IWRAM: + STORE_16(value, address & (GBA_SIZE_IWRAM - 2), memory->iwram); break; - case REGION_IO: + case GBA_REGION_IO: GBAIOWrite(gba, address & (OFFSET_MASK - 1), value); break; - case REGION_PALETTE_RAM: - LOAD_16(oldValue, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); + case GBA_REGION_PALETTE_RAM: + LOAD_16(oldValue, address & (GBA_SIZE_PALETTE_RAM - 2), gba->video.palette); if (oldValue != value) { - STORE_16(value, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); - gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 2), value); + STORE_16(value, address & (GBA_SIZE_PALETTE_RAM - 2), gba->video.palette); + gba->video.renderer->writePalette(gba->video.renderer, address & (GBA_SIZE_PALETTE_RAM - 2), value); } break; - case REGION_VRAM: - if ((address & 0x0001FFFF) >= SIZE_VRAM) { - if ((address & (SIZE_VRAM | 0x00014000)) == SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { + case GBA_REGION_VRAM: + if ((address & 0x0001FFFF) >= GBA_SIZE_VRAM) { + if ((address & (GBA_SIZE_VRAM | 0x00014000)) == GBA_SIZE_VRAM && (GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3)) { mLOG(GBA_MEM, GAME_ERROR, "Bad VRAM Store16: 0x%08X", address); break; } @@ -908,14 +908,14 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle wait += GBAMemoryStallVRAM(gba, wait, 0); } break; - case REGION_OAM: - LOAD_16(oldValue, address & (SIZE_OAM - 2), gba->video.oam.raw); + case GBA_REGION_OAM: + LOAD_16(oldValue, address & (GBA_SIZE_OAM - 2), gba->video.oam.raw); if (value != oldValue) { - STORE_16(value, address & (SIZE_OAM - 2), gba->video.oam.raw); - gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 2)) >> 1); + STORE_16(value, address & (GBA_SIZE_OAM - 2), gba->video.oam.raw); + gba->video.renderer->writeOAM(gba->video.renderer, (address & (GBA_SIZE_OAM - 2)) >> 1); } break; - case REGION_CART0: + case GBA_REGION_ROM0: if (IS_GPIO_REGISTER(address & 0xFFFFFE)) { if (memory->hw.devices == HW_NONE) { mLOG(GBA_HW, WARN, "Write to GPIO address %08X on cartridge without GPIO", address); @@ -930,22 +930,22 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle break; } // Fall through - case REGION_CART0_EX: + case GBA_REGION_ROM0_EX: if ((address & 0x00FFFFFF) >= AGB_PRINT_BASE) { uint32_t agbPrintAddr = address & 0x00FFFFFF; if (agbPrintAddr == AGB_PRINT_PROTECT) { memory->agbPrintProtect = value; if (!memory->agbPrintBuffer) { - memory->agbPrintBuffer = anonymousMemoryMap(SIZE_AGB_PRINT); - if (memory->romSize >= SIZE_CART0 / 2) { + memory->agbPrintBuffer = anonymousMemoryMap(GBA_SIZE_AGB_PRINT); + if (memory->romSize >= GBA_SIZE_ROM0 / 2) { int base = 0; - if (memory->romSize == SIZE_CART0) { + if (memory->romSize == GBA_SIZE_ROM0) { base = address & 0x01000000; } memory->agbPrintBase = base; - memory->agbPrintBufferBackup = anonymousMemoryMap(SIZE_AGB_PRINT); - memcpy(memory->agbPrintBufferBackup, &memory->rom[(AGB_PRINT_TOP | base) >> 2], SIZE_AGB_PRINT); + memory->agbPrintBufferBackup = anonymousMemoryMap(GBA_SIZE_AGB_PRINT); + memcpy(memory->agbPrintBufferBackup, &memory->rom[(AGB_PRINT_TOP | base) >> 2], GBA_SIZE_AGB_PRINT); LOAD_16(memory->agbPrintProtectBackup, AGB_PRINT_PROTECT | base, memory->rom); LOAD_16(memory->agbPrintCtxBackup.request, AGB_PRINT_STRUCT | base, memory->rom); LOAD_16(memory->agbPrintCtxBackup.bank, (AGB_PRINT_STRUCT | base) + 2, memory->rom); @@ -967,7 +967,7 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle } mLOG(GBA_MEM, GAME_ERROR, "Bad cartridge Store16: 0x%08X", address); break; - case REGION_CART2_EX: + case GBA_REGION_ROM2_EX: if ((address & 0x0DFC0000) >= 0x0DF80000 && memory->hw.devices & HW_EREADER) { GBACartEReaderWrite(&memory->ereader, address, value); break; @@ -981,8 +981,8 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle } mLOG(GBA_MEM, GAME_ERROR, "Bad memory Store16: 0x%08X", address); break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: if (address & 1) { mLOG(GBA_MEM, GAME_ERROR, "Unaligned SRAM Store16: 0x%08X", address); break; @@ -997,7 +997,7 @@ void GBAStore16(struct ARMCore* cpu, uint32_t address, int16_t value, int* cycle if (cycleCounter) { ++wait; - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -1011,20 +1011,20 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo uint16_t oldValue; switch (address >> BASE_OFFSET) { - case REGION_WORKING_RAM: - ((int8_t*) memory->wram)[address & (SIZE_WORKING_RAM - 1)] = value; - wait = memory->waitstatesNonseq16[REGION_WORKING_RAM]; + case GBA_REGION_EWRAM: + ((int8_t*) memory->wram)[address & (GBA_SIZE_EWRAM - 1)] = value; + wait = memory->waitstatesNonseq16[GBA_REGION_EWRAM]; break; - case REGION_WORKING_IRAM: - ((int8_t*) memory->iwram)[address & (SIZE_WORKING_IRAM - 1)] = value; + case GBA_REGION_IWRAM: + ((int8_t*) memory->iwram)[address & (GBA_SIZE_IWRAM - 1)] = value; break; - case REGION_IO: + case GBA_REGION_IO: GBAIOWrite8(gba, address & OFFSET_MASK, value); break; - case REGION_PALETTE_RAM: + case GBA_REGION_PALETTE_RAM: GBAStore16(cpu, address & ~1, ((uint8_t) value) | ((uint8_t) value << 8), cycleCounter); break; - case REGION_VRAM: + case GBA_REGION_VRAM: if ((address & 0x0001FFFF) >= ((GBARegisterDISPCNTGetMode(gba->memory.io[REG_DISPCNT >> 1]) >= 3) ? 0x00014000 : 0x00010000)) { mLOG(GBA_MEM, GAME_ERROR, "Cannot Store8 to OBJ: 0x%08X", address); break; @@ -1038,14 +1038,14 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo wait += GBAMemoryStallVRAM(gba, wait, 0); } break; - case REGION_OAM: + case GBA_REGION_OAM: mLOG(GBA_MEM, GAME_ERROR, "Cannot Store8 to OAM: 0x%08X", address); break; - case REGION_CART0: + case GBA_REGION_ROM0: mLOG(GBA_MEM, STUB, "Unimplemented memory Store8: 0x%08X", address); break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: if (memory->savedata.type == SAVEDATA_AUTODETECT) { if (address == SAVEDATA_FLASH_BASE) { mLOG(GBA_MEM, INFO, "Detected Flash savegame"); @@ -1063,18 +1063,18 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo if (memory->vfame.cartType) { GBAVFameSramWrite(&memory->vfame, address, value, memory->savedata.data); } else { - memory->savedata.data[address & (SIZE_CART_SRAM - 1)] = value; + memory->savedata.data[address & (GBA_SIZE_SRAM - 1)] = value; } memory->savedata.dirty |= mSAVEDATA_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.data[address & (GBA_SIZE_SRAM512 - 1)] = value; memory->savedata.dirty |= mSAVEDATA_DIRT_NEW; } else { mLOG(GBA_MEM, GAME_ERROR, "Writing to non-existent SRAM: 0x%08X", address); } - wait = memory->waitstatesNonseq16[REGION_CART_SRAM]; + wait = memory->waitstatesNonseq16[GBA_REGION_SRAM]; break; default: mLOG(GBA_MEM, GAME_ERROR, "Bad memory Store8: 0x%08X", address); @@ -1083,7 +1083,7 @@ void GBAStore8(struct ARMCore* cpu, uint32_t address, int8_t value, int* cycleCo if (cycleCounter) { ++wait; - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -1095,31 +1095,31 @@ uint32_t GBAView32(struct ARMCore* cpu, uint32_t address) { uint32_t value = 0; address &= ~3; switch (address >> BASE_OFFSET) { - case REGION_BIOS: - if (address < SIZE_BIOS) { + case GBA_REGION_BIOS: + if (address < GBA_SIZE_BIOS) { LOAD_32(value, address, gba->memory.bios); } break; - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_PALETTE_RAM: - case REGION_VRAM: - case REGION_OAM: - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_PALETTE_RAM: + case GBA_REGION_VRAM: + case GBA_REGION_OAM: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: value = GBALoad32(cpu, address, 0); break; - case REGION_IO: + case GBA_REGION_IO: if ((address & OFFSET_MASK) < REG_MAX) { value = gba->memory.io[(address & OFFSET_MASK) >> 1]; value |= gba->memory.io[((address & OFFSET_MASK) >> 1) + 1] << 16; } break; - case REGION_CART_SRAM: + case GBA_REGION_SRAM: value = GBALoad8(cpu, address, 0); value |= GBALoad8(cpu, address + 1, 0) << 8; value |= GBALoad8(cpu, address + 2, 0) << 16; @@ -1136,30 +1136,30 @@ uint16_t GBAView16(struct ARMCore* cpu, uint32_t address) { uint16_t value = 0; address &= ~1; switch (address >> BASE_OFFSET) { - case REGION_BIOS: - if (address < SIZE_BIOS) { + case GBA_REGION_BIOS: + if (address < GBA_SIZE_BIOS) { LOAD_16(value, address, gba->memory.bios); } break; - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_PALETTE_RAM: - case REGION_VRAM: - case REGION_OAM: - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_PALETTE_RAM: + case GBA_REGION_VRAM: + case GBA_REGION_OAM: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: value = GBALoad16(cpu, address, 0); break; - case REGION_IO: + case GBA_REGION_IO: if ((address & OFFSET_MASK) < REG_MAX) { value = gba->memory.io[(address & OFFSET_MASK) >> 1]; } break; - case REGION_CART_SRAM: + case GBA_REGION_SRAM: value = GBALoad8(cpu, address, 0); value |= GBALoad8(cpu, address + 1, 0) << 8; break; @@ -1173,26 +1173,26 @@ uint8_t GBAView8(struct ARMCore* cpu, uint32_t address) { struct GBA* gba = (struct GBA*) cpu->master; uint8_t value = 0; switch (address >> BASE_OFFSET) { - case REGION_BIOS: - if (address < SIZE_BIOS) { + case GBA_REGION_BIOS: + if (address < GBA_SIZE_BIOS) { value = ((uint8_t*) gba->memory.bios)[address]; } break; - case REGION_WORKING_RAM: - case REGION_WORKING_IRAM: - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: - case REGION_CART_SRAM: + case GBA_REGION_EWRAM: + case GBA_REGION_IWRAM: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: + case GBA_REGION_SRAM: value = GBALoad8(cpu, address, 0); break; - case REGION_IO: - case REGION_PALETTE_RAM: - case REGION_VRAM: - case REGION_OAM: + case GBA_REGION_IO: + case GBA_REGION_PALETTE_RAM: + case GBA_REGION_VRAM: + case GBA_REGION_OAM: value = GBAView16(cpu, address) >> ((address & 1) * 8); break; default: @@ -1207,25 +1207,25 @@ void GBAPatch32(struct ARMCore* cpu, uint32_t address, int32_t value, int32_t* o int32_t oldValue = -1; switch (address >> BASE_OFFSET) { - case REGION_WORKING_RAM: - LOAD_32(oldValue, address & (SIZE_WORKING_RAM - 4), memory->wram); - STORE_32(value, address & (SIZE_WORKING_RAM - 4), memory->wram); + case GBA_REGION_EWRAM: + LOAD_32(oldValue, address & (GBA_SIZE_EWRAM - 4), memory->wram); + STORE_32(value, address & (GBA_SIZE_EWRAM - 4), memory->wram); break; - case REGION_WORKING_IRAM: - LOAD_32(oldValue, address & (SIZE_WORKING_IRAM - 4), memory->iwram); - STORE_32(value, address & (SIZE_WORKING_IRAM - 4), memory->iwram); + case GBA_REGION_IWRAM: + LOAD_32(oldValue, address & (GBA_SIZE_IWRAM - 4), memory->iwram); + STORE_32(value, address & (GBA_SIZE_IWRAM - 4), memory->iwram); break; - case REGION_IO: + case GBA_REGION_IO: mLOG(GBA_MEM, STUB, "Unimplemented memory Patch32: 0x%08X", address); break; - case REGION_PALETTE_RAM: - LOAD_32(oldValue, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); - STORE_32(value, address & (SIZE_PALETTE_RAM - 4), gba->video.palette); - gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 4), value); - gba->video.renderer->writePalette(gba->video.renderer, (address & (SIZE_PALETTE_RAM - 4)) + 2, value >> 16); + case GBA_REGION_PALETTE_RAM: + LOAD_32(oldValue, address & (GBA_SIZE_PALETTE_RAM - 1), gba->video.palette); + STORE_32(value, address & (GBA_SIZE_PALETTE_RAM - 4), gba->video.palette); + gba->video.renderer->writePalette(gba->video.renderer, address & (GBA_SIZE_PALETTE_RAM - 4), value); + gba->video.renderer->writePalette(gba->video.renderer, (address & (GBA_SIZE_PALETTE_RAM - 4)) + 2, value >> 16); break; - case REGION_VRAM: - if ((address & 0x0001FFFF) < SIZE_VRAM) { + case GBA_REGION_VRAM: + if ((address & 0x0001FFFF) < GBA_SIZE_VRAM) { LOAD_32(oldValue, address & 0x0001FFFC, gba->video.vram); STORE_32(value, address & 0x0001FFFC, gba->video.vram); gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x0001FFFC); @@ -1237,31 +1237,31 @@ void GBAPatch32(struct ARMCore* cpu, uint32_t address, int32_t value, int32_t* o gba->video.renderer->writeVRAM(gba->video.renderer, (address & 0x00017FFC) | 2); } break; - case REGION_OAM: - LOAD_32(oldValue, address & (SIZE_OAM - 4), gba->video.oam.raw); - STORE_32(value, address & (SIZE_OAM - 4), gba->video.oam.raw); - gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 4)) >> 1); - gba->video.renderer->writeOAM(gba->video.renderer, ((address & (SIZE_OAM - 4)) + 2) >> 1); + case GBA_REGION_OAM: + LOAD_32(oldValue, address & (GBA_SIZE_OAM - 4), gba->video.oam.raw); + STORE_32(value, address & (GBA_SIZE_OAM - 4), gba->video.oam.raw); + gba->video.renderer->writeOAM(gba->video.renderer, (address & (GBA_SIZE_OAM - 4)) >> 1); + gba->video.renderer->writeOAM(gba->video.renderer, ((address & (GBA_SIZE_OAM - 4)) + 2) >> 1); break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: _pristineCow(gba); - if ((address & (SIZE_CART0 - 4)) >= gba->memory.romSize) { - gba->memory.romSize = (address & (SIZE_CART0 - 4)) + 4; + if ((address & (GBA_SIZE_ROM0 - 4)) >= gba->memory.romSize) { + gba->memory.romSize = (address & (GBA_SIZE_ROM0 - 4)) + 4; gba->memory.romMask = toPow2(gba->memory.romSize) - 1; } - LOAD_32(oldValue, address & (SIZE_CART0 - 4), gba->memory.rom); - STORE_32(value, address & (SIZE_CART0 - 4), gba->memory.rom); + LOAD_32(oldValue, address & (GBA_SIZE_ROM0 - 4), gba->memory.rom); + STORE_32(value, address & (GBA_SIZE_ROM0 - 4), gba->memory.rom); break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: if (memory->savedata.type == SAVEDATA_SRAM) { - LOAD_32(oldValue, address & (SIZE_CART_SRAM - 4), memory->savedata.data); - STORE_32(value, address & (SIZE_CART_SRAM - 4), memory->savedata.data); + LOAD_32(oldValue, address & (GBA_SIZE_SRAM - 4), memory->savedata.data); + STORE_32(value, address & (GBA_SIZE_SRAM - 4), memory->savedata.data); } else { mLOG(GBA_MEM, GAME_ERROR, "Writing to non-existent SRAM: 0x%08X", address); } @@ -1281,24 +1281,24 @@ void GBAPatch16(struct ARMCore* cpu, uint32_t address, int16_t value, int16_t* o int16_t oldValue = -1; switch (address >> BASE_OFFSET) { - case REGION_WORKING_RAM: - LOAD_16(oldValue, address & (SIZE_WORKING_RAM - 2), memory->wram); - STORE_16(value, address & (SIZE_WORKING_RAM - 2), memory->wram); + case GBA_REGION_EWRAM: + LOAD_16(oldValue, address & (GBA_SIZE_EWRAM - 2), memory->wram); + STORE_16(value, address & (GBA_SIZE_EWRAM - 2), memory->wram); break; - case REGION_WORKING_IRAM: - LOAD_16(oldValue, address & (SIZE_WORKING_IRAM - 2), memory->iwram); - STORE_16(value, address & (SIZE_WORKING_IRAM - 2), memory->iwram); + case GBA_REGION_IWRAM: + LOAD_16(oldValue, address & (GBA_SIZE_IWRAM - 2), memory->iwram); + STORE_16(value, address & (GBA_SIZE_IWRAM - 2), memory->iwram); break; - case REGION_IO: + case GBA_REGION_IO: mLOG(GBA_MEM, STUB, "Unimplemented memory Patch16: 0x%08X", address); break; - case REGION_PALETTE_RAM: - LOAD_16(oldValue, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); - STORE_16(value, address & (SIZE_PALETTE_RAM - 2), gba->video.palette); - gba->video.renderer->writePalette(gba->video.renderer, address & (SIZE_PALETTE_RAM - 2), value); + case GBA_REGION_PALETTE_RAM: + LOAD_16(oldValue, address & (GBA_SIZE_PALETTE_RAM - 2), gba->video.palette); + STORE_16(value, address & (GBA_SIZE_PALETTE_RAM - 2), gba->video.palette); + gba->video.renderer->writePalette(gba->video.renderer, address & (GBA_SIZE_PALETTE_RAM - 2), value); break; - case REGION_VRAM: - if ((address & 0x0001FFFF) < SIZE_VRAM) { + case GBA_REGION_VRAM: + if ((address & 0x0001FFFF) < GBA_SIZE_VRAM) { LOAD_16(oldValue, address & 0x0001FFFE, gba->video.vram); STORE_16(value, address & 0x0001FFFE, gba->video.vram); gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x0001FFFE); @@ -1308,30 +1308,30 @@ void GBAPatch16(struct ARMCore* cpu, uint32_t address, int16_t value, int16_t* o gba->video.renderer->writeVRAM(gba->video.renderer, address & 0x00017FFE); } break; - case REGION_OAM: - LOAD_16(oldValue, address & (SIZE_OAM - 2), gba->video.oam.raw); - STORE_16(value, address & (SIZE_OAM - 2), gba->video.oam.raw); - gba->video.renderer->writeOAM(gba->video.renderer, (address & (SIZE_OAM - 2)) >> 1); + case GBA_REGION_OAM: + LOAD_16(oldValue, address & (GBA_SIZE_OAM - 2), gba->video.oam.raw); + STORE_16(value, address & (GBA_SIZE_OAM - 2), gba->video.oam.raw); + gba->video.renderer->writeOAM(gba->video.renderer, (address & (GBA_SIZE_OAM - 2)) >> 1); break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: _pristineCow(gba); - if ((address & (SIZE_CART0 - 1)) >= gba->memory.romSize) { - gba->memory.romSize = (address & (SIZE_CART0 - 2)) + 2; + if ((address & (GBA_SIZE_ROM0 - 1)) >= gba->memory.romSize) { + gba->memory.romSize = (address & (GBA_SIZE_ROM0 - 2)) + 2; gba->memory.romMask = toPow2(gba->memory.romSize) - 1; } - LOAD_16(oldValue, address & (SIZE_CART0 - 2), gba->memory.rom); - STORE_16(value, address & (SIZE_CART0 - 2), gba->memory.rom); + LOAD_16(oldValue, address & (GBA_SIZE_ROM0 - 2), gba->memory.rom); + STORE_16(value, address & (GBA_SIZE_ROM0 - 2), gba->memory.rom); break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: if (memory->savedata.type == SAVEDATA_SRAM) { - LOAD_16(oldValue, address & (SIZE_CART_SRAM - 2), memory->savedata.data); - STORE_16(value, address & (SIZE_CART_SRAM - 2), memory->savedata.data); + LOAD_16(oldValue, address & (GBA_SIZE_SRAM - 2), memory->savedata.data); + STORE_16(value, address & (GBA_SIZE_SRAM - 2), memory->savedata.data); } else { mLOG(GBA_MEM, GAME_ERROR, "Writing to non-existent SRAM: 0x%08X", address); } @@ -1351,45 +1351,45 @@ void GBAPatch8(struct ARMCore* cpu, uint32_t address, int8_t value, int8_t* old) int8_t oldValue = -1; switch (address >> BASE_OFFSET) { - case REGION_WORKING_RAM: - oldValue = ((int8_t*) memory->wram)[address & (SIZE_WORKING_RAM - 1)]; - ((int8_t*) memory->wram)[address & (SIZE_WORKING_RAM - 1)] = value; + case GBA_REGION_EWRAM: + oldValue = ((int8_t*) memory->wram)[address & (GBA_SIZE_EWRAM - 1)]; + ((int8_t*) memory->wram)[address & (GBA_SIZE_EWRAM - 1)] = value; break; - case REGION_WORKING_IRAM: - oldValue = ((int8_t*) memory->iwram)[address & (SIZE_WORKING_IRAM - 1)]; - ((int8_t*) memory->iwram)[address & (SIZE_WORKING_IRAM - 1)] = value; + case GBA_REGION_IWRAM: + oldValue = ((int8_t*) memory->iwram)[address & (GBA_SIZE_IWRAM - 1)]; + ((int8_t*) memory->iwram)[address & (GBA_SIZE_IWRAM - 1)] = value; break; - case REGION_IO: + case GBA_REGION_IO: mLOG(GBA_MEM, STUB, "Unimplemented memory Patch8: 0x%08X", address); break; - case REGION_PALETTE_RAM: + case GBA_REGION_PALETTE_RAM: mLOG(GBA_MEM, STUB, "Unimplemented memory Patch8: 0x%08X", address); break; - case REGION_VRAM: + case GBA_REGION_VRAM: mLOG(GBA_MEM, STUB, "Unimplemented memory Patch8: 0x%08X", address); break; - case REGION_OAM: + case GBA_REGION_OAM: mLOG(GBA_MEM, STUB, "Unimplemented memory Patch8: 0x%08X", address); break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: _pristineCow(gba); - if ((address & (SIZE_CART0 - 1)) >= gba->memory.romSize) { - gba->memory.romSize = (address & (SIZE_CART0 - 2)) + 2; + if ((address & (GBA_SIZE_ROM0 - 1)) >= gba->memory.romSize) { + gba->memory.romSize = (address & (GBA_SIZE_ROM0 - 2)) + 2; gba->memory.romMask = toPow2(gba->memory.romSize) - 1; } - oldValue = ((int8_t*) memory->rom)[address & (SIZE_CART0 - 1)]; - ((int8_t*) memory->rom)[address & (SIZE_CART0 - 1)] = value; + oldValue = ((int8_t*) memory->rom)[address & (GBA_SIZE_ROM0 - 1)]; + ((int8_t*) memory->rom)[address & (GBA_SIZE_ROM0 - 1)] = value; break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: if (memory->savedata.type == SAVEDATA_SRAM) { - oldValue = ((int8_t*) memory->savedata.data)[address & (SIZE_CART_SRAM - 1)]; - ((int8_t*) memory->savedata.data)[address & (SIZE_CART_SRAM - 1)] = value; + oldValue = ((int8_t*) memory->savedata.data)[address & (GBA_SIZE_SRAM - 1)]; + ((int8_t*) memory->savedata.data)[address & (GBA_SIZE_SRAM - 1)] = value; } else { mLOG(GBA_MEM, GAME_ERROR, "Writing to non-existent SRAM: 0x%08X", address); } @@ -1458,43 +1458,43 @@ uint32_t GBALoadMultiple(struct ARMCore* cpu, uint32_t address, int mask, enum L uint32_t addressMisalign = address & 0x3; int region = address >> BASE_OFFSET; - if (region < REGION_CART_SRAM) { + if (region < GBA_REGION_SRAM) { address &= 0xFFFFFFFC; } int wait = memory->waitstatesSeq32[region] - memory->waitstatesNonseq32[region]; switch (region) { - case REGION_BIOS: + case GBA_REGION_BIOS: LDM_LOOP(LOAD_BIOS); break; - case REGION_WORKING_RAM: - LDM_LOOP(LOAD_WORKING_RAM); + case GBA_REGION_EWRAM: + LDM_LOOP(LOAD_EWRAM); break; - case REGION_WORKING_IRAM: - LDM_LOOP(LOAD_WORKING_IRAM); + case GBA_REGION_IWRAM: + LDM_LOOP(LOAD_IWRAM); break; - case REGION_IO: + case GBA_REGION_IO: LDM_LOOP(LOAD_IO); break; - case REGION_PALETTE_RAM: + case GBA_REGION_PALETTE_RAM: LDM_LOOP(LOAD_PALETTE_RAM); break; - case REGION_VRAM: + case GBA_REGION_VRAM: LDM_LOOP(LOAD_VRAM); break; - case REGION_OAM: + case GBA_REGION_OAM: LDM_LOOP(LOAD_OAM); break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: LDM_LOOP(LOAD_CART); break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: LDM_LOOP(LOAD_SRAM); break; default: @@ -1504,7 +1504,7 @@ uint32_t GBALoadMultiple(struct ARMCore* cpu, uint32_t address, int mask, enum L if (cycleCounter) { ++wait; - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -1580,40 +1580,40 @@ uint32_t GBAStoreMultiple(struct ARMCore* cpu, uint32_t address, int mask, enum uint32_t addressMisalign = address & 0x3; int region = address >> BASE_OFFSET; - if (region < REGION_CART_SRAM) { + if (region < GBA_REGION_SRAM) { address &= 0xFFFFFFFC; } int wait = memory->waitstatesSeq32[region] - memory->waitstatesNonseq32[region]; switch (region) { - case REGION_WORKING_RAM: - STM_LOOP(STORE_WORKING_RAM); + case GBA_REGION_EWRAM: + STM_LOOP(STORE_EWRAM); break; - case REGION_WORKING_IRAM: - STM_LOOP(STORE_WORKING_IRAM); + case GBA_REGION_IWRAM: + STM_LOOP(STORE_IWRAM); break; - case REGION_IO: + case GBA_REGION_IO: STM_LOOP(STORE_IO); break; - case REGION_PALETTE_RAM: + case GBA_REGION_PALETTE_RAM: STM_LOOP(STORE_PALETTE_RAM); break; - case REGION_VRAM: + case GBA_REGION_VRAM: STM_LOOP(STORE_VRAM); break; - case REGION_OAM: + case GBA_REGION_OAM: STM_LOOP(STORE_OAM); break; - case REGION_CART0: - case REGION_CART0_EX: - case REGION_CART1: - case REGION_CART1_EX: - case REGION_CART2: - case REGION_CART2_EX: + case GBA_REGION_ROM0: + case GBA_REGION_ROM0_EX: + case GBA_REGION_ROM1: + case GBA_REGION_ROM1_EX: + case GBA_REGION_ROM2: + case GBA_REGION_ROM2_EX: STM_LOOP(STORE_CART); break; - case REGION_CART_SRAM: - case REGION_CART_SRAM_MIRROR: + case GBA_REGION_SRAM: + case GBA_REGION_SRAM_MIRROR: STM_LOOP(STORE_SRAM); break; default: @@ -1622,7 +1622,7 @@ uint32_t GBAStoreMultiple(struct ARMCore* cpu, uint32_t address, int mask, enum } if (cycleCounter) { - if (address < BASE_CART0) { + if (address < GBA_BASE_ROM0) { wait = GBAMemoryStall(cpu, wait); } *cycleCounter += wait; @@ -1651,26 +1651,26 @@ void GBAAdjustWaitstates(struct GBA* gba, uint16_t parameters) { int ws2seq = (parameters & 0x0400) >> 10; int prefetch = parameters & 0x4000; - memory->waitstatesNonseq16[REGION_CART_SRAM] = memory->waitstatesNonseq16[REGION_CART_SRAM_MIRROR] = GBA_ROM_WAITSTATES[sram]; - memory->waitstatesSeq16[REGION_CART_SRAM] = memory->waitstatesSeq16[REGION_CART_SRAM_MIRROR] = GBA_ROM_WAITSTATES[sram]; - memory->waitstatesNonseq32[REGION_CART_SRAM] = memory->waitstatesNonseq32[REGION_CART_SRAM_MIRROR] = 2 * GBA_ROM_WAITSTATES[sram] + 1; - memory->waitstatesSeq32[REGION_CART_SRAM] = memory->waitstatesSeq32[REGION_CART_SRAM_MIRROR] = 2 * GBA_ROM_WAITSTATES[sram] + 1; + memory->waitstatesNonseq16[GBA_REGION_SRAM] = memory->waitstatesNonseq16[GBA_REGION_SRAM_MIRROR] = GBA_ROM_WAITSTATES[sram]; + memory->waitstatesSeq16[GBA_REGION_SRAM] = memory->waitstatesSeq16[GBA_REGION_SRAM_MIRROR] = GBA_ROM_WAITSTATES[sram]; + memory->waitstatesNonseq32[GBA_REGION_SRAM] = memory->waitstatesNonseq32[GBA_REGION_SRAM_MIRROR] = 2 * GBA_ROM_WAITSTATES[sram] + 1; + memory->waitstatesSeq32[GBA_REGION_SRAM] = memory->waitstatesSeq32[GBA_REGION_SRAM_MIRROR] = 2 * GBA_ROM_WAITSTATES[sram] + 1; - memory->waitstatesNonseq16[REGION_CART0] = memory->waitstatesNonseq16[REGION_CART0_EX] = GBA_ROM_WAITSTATES[ws0]; - memory->waitstatesNonseq16[REGION_CART1] = memory->waitstatesNonseq16[REGION_CART1_EX] = GBA_ROM_WAITSTATES[ws1]; - memory->waitstatesNonseq16[REGION_CART2] = memory->waitstatesNonseq16[REGION_CART2_EX] = GBA_ROM_WAITSTATES[ws2]; + memory->waitstatesNonseq16[GBA_REGION_ROM0] = memory->waitstatesNonseq16[GBA_REGION_ROM0_EX] = GBA_ROM_WAITSTATES[ws0]; + memory->waitstatesNonseq16[GBA_REGION_ROM1] = memory->waitstatesNonseq16[GBA_REGION_ROM1_EX] = GBA_ROM_WAITSTATES[ws1]; + memory->waitstatesNonseq16[GBA_REGION_ROM2] = memory->waitstatesNonseq16[GBA_REGION_ROM2_EX] = GBA_ROM_WAITSTATES[ws2]; - memory->waitstatesSeq16[REGION_CART0] = memory->waitstatesSeq16[REGION_CART0_EX] = GBA_ROM_WAITSTATES_SEQ[ws0seq]; - memory->waitstatesSeq16[REGION_CART1] = memory->waitstatesSeq16[REGION_CART1_EX] = GBA_ROM_WAITSTATES_SEQ[ws1seq + 2]; - memory->waitstatesSeq16[REGION_CART2] = memory->waitstatesSeq16[REGION_CART2_EX] = GBA_ROM_WAITSTATES_SEQ[ws2seq + 4]; + memory->waitstatesSeq16[GBA_REGION_ROM0] = memory->waitstatesSeq16[GBA_REGION_ROM0_EX] = GBA_ROM_WAITSTATES_SEQ[ws0seq]; + memory->waitstatesSeq16[GBA_REGION_ROM1] = memory->waitstatesSeq16[GBA_REGION_ROM1_EX] = GBA_ROM_WAITSTATES_SEQ[ws1seq + 2]; + memory->waitstatesSeq16[GBA_REGION_ROM2] = memory->waitstatesSeq16[GBA_REGION_ROM2_EX] = GBA_ROM_WAITSTATES_SEQ[ws2seq + 4]; - memory->waitstatesNonseq32[REGION_CART0] = memory->waitstatesNonseq32[REGION_CART0_EX] = memory->waitstatesNonseq16[REGION_CART0] + 1 + memory->waitstatesSeq16[REGION_CART0]; - memory->waitstatesNonseq32[REGION_CART1] = memory->waitstatesNonseq32[REGION_CART1_EX] = memory->waitstatesNonseq16[REGION_CART1] + 1 + memory->waitstatesSeq16[REGION_CART1]; - memory->waitstatesNonseq32[REGION_CART2] = memory->waitstatesNonseq32[REGION_CART2_EX] = memory->waitstatesNonseq16[REGION_CART2] + 1 + memory->waitstatesSeq16[REGION_CART2]; + memory->waitstatesNonseq32[GBA_REGION_ROM0] = memory->waitstatesNonseq32[GBA_REGION_ROM0_EX] = memory->waitstatesNonseq16[GBA_REGION_ROM0] + 1 + memory->waitstatesSeq16[GBA_REGION_ROM0]; + memory->waitstatesNonseq32[GBA_REGION_ROM1] = memory->waitstatesNonseq32[GBA_REGION_ROM1_EX] = memory->waitstatesNonseq16[GBA_REGION_ROM1] + 1 + memory->waitstatesSeq16[GBA_REGION_ROM1]; + memory->waitstatesNonseq32[GBA_REGION_ROM2] = memory->waitstatesNonseq32[GBA_REGION_ROM2_EX] = memory->waitstatesNonseq16[GBA_REGION_ROM2] + 1 + memory->waitstatesSeq16[GBA_REGION_ROM2]; - memory->waitstatesSeq32[REGION_CART0] = memory->waitstatesSeq32[REGION_CART0_EX] = 2 * memory->waitstatesSeq16[REGION_CART0] + 1; - memory->waitstatesSeq32[REGION_CART1] = memory->waitstatesSeq32[REGION_CART1_EX] = 2 * memory->waitstatesSeq16[REGION_CART1] + 1; - memory->waitstatesSeq32[REGION_CART2] = memory->waitstatesSeq32[REGION_CART2_EX] = 2 * memory->waitstatesSeq16[REGION_CART2] + 1; + memory->waitstatesSeq32[GBA_REGION_ROM0] = memory->waitstatesSeq32[GBA_REGION_ROM0_EX] = 2 * memory->waitstatesSeq16[GBA_REGION_ROM0] + 1; + memory->waitstatesSeq32[GBA_REGION_ROM1] = memory->waitstatesSeq32[GBA_REGION_ROM1_EX] = 2 * memory->waitstatesSeq16[GBA_REGION_ROM1] + 1; + memory->waitstatesSeq32[GBA_REGION_ROM2] = memory->waitstatesSeq32[GBA_REGION_ROM2_EX] = 2 * memory->waitstatesSeq16[GBA_REGION_ROM2] + 1; memory->prefetch = prefetch; @@ -1684,7 +1684,7 @@ void GBAAdjustWaitstates(struct GBA* gba, uint16_t parameters) { int phi = (parameters >> 11) & 3; uint32_t base = memory->agbPrintBase; if (phi == 3) { - memcpy(&memory->rom[(AGB_PRINT_TOP | base) >> 2], memory->agbPrintBuffer, SIZE_AGB_PRINT); + memcpy(&memory->rom[(AGB_PRINT_TOP | base) >> 2], memory->agbPrintBuffer, GBA_SIZE_AGB_PRINT); STORE_16(memory->agbPrintProtect, AGB_PRINT_PROTECT | base, memory->rom); STORE_16(memory->agbPrintCtx.request, AGB_PRINT_STRUCT | base, memory->rom); STORE_16(memory->agbPrintCtx.bank, (AGB_PRINT_STRUCT | base) + 2, memory->rom); @@ -1692,7 +1692,7 @@ void GBAAdjustWaitstates(struct GBA* gba, uint16_t parameters) { STORE_16(memory->agbPrintCtx.put, (AGB_PRINT_STRUCT | base) + 6, memory->rom); STORE_32(_agbPrintFunc, AGB_PRINT_FLUSH_ADDR | base, memory->rom); } else { - memcpy(&memory->rom[(AGB_PRINT_TOP | base) >> 2], memory->agbPrintBufferBackup, SIZE_AGB_PRINT); + memcpy(&memory->rom[(AGB_PRINT_TOP | base) >> 2], memory->agbPrintBufferBackup, GBA_SIZE_AGB_PRINT); STORE_16(memory->agbPrintProtectBackup, AGB_PRINT_PROTECT | base, memory->rom); STORE_16(memory->agbPrintCtxBackup.request, AGB_PRINT_STRUCT | base, memory->rom); STORE_16(memory->agbPrintCtxBackup.bank, (AGB_PRINT_STRUCT | base) + 2, memory->rom); @@ -1709,10 +1709,10 @@ void GBAAdjustEWRAMWaitstates(struct GBA* gba, uint16_t parameters) { int wait = 15 - ((parameters >> 8) & 0xF); if (wait) { - memory->waitstatesNonseq16[REGION_WORKING_RAM] = wait; - memory->waitstatesSeq16[REGION_WORKING_RAM] = wait; - memory->waitstatesNonseq32[REGION_WORKING_RAM] = 2 * wait + 1; - memory->waitstatesSeq32[REGION_WORKING_RAM] = 2 * wait + 1; + memory->waitstatesNonseq16[GBA_REGION_EWRAM] = wait; + memory->waitstatesSeq16[GBA_REGION_EWRAM] = wait; + memory->waitstatesNonseq32[GBA_REGION_EWRAM] = 2 * wait + 1; + memory->waitstatesSeq32[GBA_REGION_EWRAM] = 2 * wait + 1; cpu->memory.activeSeqCycles32 = memory->waitstatesSeq32[memory->activeRegion]; cpu->memory.activeSeqCycles16 = memory->waitstatesSeq16[memory->activeRegion]; @@ -1732,7 +1732,7 @@ int32_t GBAMemoryStall(struct ARMCore* cpu, int32_t wait) { struct GBA* gba = (struct GBA*) cpu->master; struct GBAMemory* memory = &gba->memory; - if (memory->activeRegion < REGION_CART0 || !memory->prefetch) { + if (memory->activeRegion < GBA_REGION_ROM0 || !memory->prefetch) { // The wait is the stall return wait; } @@ -1797,13 +1797,13 @@ int32_t GBAMemoryStallVRAM(struct GBA* gba, int32_t wait, int extra) { } void GBAMemorySerialize(const struct GBAMemory* memory, struct GBASerializedState* state) { - memcpy(state->wram, memory->wram, SIZE_WORKING_RAM); - memcpy(state->iwram, memory->iwram, SIZE_WORKING_IRAM); + memcpy(state->wram, memory->wram, GBA_SIZE_EWRAM); + memcpy(state->iwram, memory->iwram, GBA_SIZE_IWRAM); } void GBAMemoryDeserialize(struct GBAMemory* memory, const struct GBASerializedState* state) { - memcpy(memory->wram, state->wram, SIZE_WORKING_RAM); - memcpy(memory->iwram, state->iwram, SIZE_WORKING_IRAM); + memcpy(memory->wram, state->wram, GBA_SIZE_EWRAM); + memcpy(memory->iwram, state->iwram, GBA_SIZE_IWRAM); } void _pristineCow(struct GBA* gba) { @@ -1811,9 +1811,9 @@ void _pristineCow(struct GBA* gba) { return; } #if !defined(FIXED_ROM_BUFFER) && !defined(__wii__) - void* newRom = anonymousMemoryMap(SIZE_CART0); + void* newRom = anonymousMemoryMap(GBA_SIZE_ROM0); memcpy(newRom, gba->memory.rom, gba->memory.romSize); - memset(((uint8_t*) newRom) + gba->memory.romSize, 0xFF, SIZE_CART0 - gba->memory.romSize); + memset(((uint8_t*) newRom) + gba->memory.romSize, 0xFF, GBA_SIZE_ROM0 - gba->memory.romSize); if (gba->cpu->memory.activeRegion == gba->memory.rom) { gba->cpu->memory.activeRegion = newRom; } @@ -1855,16 +1855,16 @@ void GBAPrintFlush(struct GBA* gba) { static void _agbPrintStore(struct GBA* gba, uint32_t address, int16_t value) { struct GBAMemory* memory = &gba->memory; if ((address & 0x00FFFFFF) < AGB_PRINT_TOP) { - STORE_16(value, address & (SIZE_AGB_PRINT - 2), memory->agbPrintBuffer); + STORE_16(value, address & (GBA_SIZE_AGB_PRINT - 2), memory->agbPrintBuffer); } else if ((address & 0x00FFFFF8) == AGB_PRINT_STRUCT) { (&memory->agbPrintCtx.request)[(address & 7) >> 1] = value; } - if (memory->romSize == SIZE_CART0) { + if (memory->romSize == GBA_SIZE_ROM0) { _pristineCow(gba); - STORE_16(value, address & (SIZE_CART0 - 2), memory->rom); - } else if (memory->agbPrintCtx.bank == 0xFD && memory->romSize >= SIZE_CART0 / 2) { + STORE_16(value, address & (GBA_SIZE_ROM0 - 2), memory->rom); + } else if (memory->agbPrintCtx.bank == 0xFD && memory->romSize >= GBA_SIZE_ROM0 / 2) { _pristineCow(gba); - STORE_16(value, address & (SIZE_CART0 / 2 - 2), memory->rom); + STORE_16(value, address & (GBA_SIZE_ROM0 / 2 - 2), memory->rom); } } @@ -1872,7 +1872,7 @@ static int16_t _agbPrintLoad(struct GBA* gba, uint32_t address) { struct GBAMemory* memory = &gba->memory; int16_t value = address >> 1; if (address < AGB_PRINT_TOP && memory->agbPrintBuffer) { - LOAD_16(value, address & (SIZE_AGB_PRINT - 1), memory->agbPrintBuffer); + LOAD_16(value, address & (GBA_SIZE_AGB_PRINT - 1), memory->agbPrintBuffer); } else if ((address & 0x00FFFFF8) == AGB_PRINT_STRUCT) { value = (&memory->agbPrintCtx.request)[(address & 7) >> 1]; } diff --git a/src/gba/renderers/cache-set.c b/src/gba/renderers/cache-set.c index 51512721d..40272bedd 100644 --- a/src/gba/renderers/cache-set.c +++ b/src/gba/renderers/cache-set.c @@ -61,7 +61,7 @@ void GBAVideoCacheAssociate(struct mCacheSet* cache, struct GBAVideo* video) { mCacheSetAssignVRAM(cache, video->vram); video->renderer->cache = cache; size_t i; - for (i = 0; i < SIZE_PALETTE_RAM / 2; ++i) { + for (i = 0; i < GBA_SIZE_PALETTE_RAM / 2; ++i) { mCacheSetWritePalette(cache, i, mColorFrom555(video->palette[i])); } GBAVideoCacheWriteVideoRegister(cache, REG_DISPCNT, video->p->memory.io[REG_DISPCNT >> 1]); diff --git a/src/gba/savedata.c b/src/gba/savedata.c index 443e8015d..455ee0802 100644 --- a/src/gba/savedata.c +++ b/src/gba/savedata.c @@ -69,22 +69,22 @@ void GBASavedataDeinit(struct GBASavedata* savedata) { } else { switch (savedata->type) { case SAVEDATA_SRAM: - mappedMemoryFree(savedata->data, SIZE_CART_SRAM); + mappedMemoryFree(savedata->data, GBA_SIZE_SRAM); break; case SAVEDATA_SRAM512: - mappedMemoryFree(savedata->data, SIZE_CART_SRAM512); + mappedMemoryFree(savedata->data, GBA_SIZE_SRAM512); break; case SAVEDATA_FLASH512: - mappedMemoryFree(savedata->data, SIZE_CART_FLASH512); + mappedMemoryFree(savedata->data, GBA_SIZE_FLASH512); break; case SAVEDATA_FLASH1M: - mappedMemoryFree(savedata->data, SIZE_CART_FLASH1M); + mappedMemoryFree(savedata->data, GBA_SIZE_FLASH1M); break; case SAVEDATA_EEPROM: - mappedMemoryFree(savedata->data, SIZE_CART_EEPROM); + mappedMemoryFree(savedata->data, GBA_SIZE_EEPROM); break; case SAVEDATA_EEPROM512: - mappedMemoryFree(savedata->data, SIZE_CART_EEPROM512); + mappedMemoryFree(savedata->data, GBA_SIZE_EEPROM512); break; case SAVEDATA_FORCE_NONE: case SAVEDATA_AUTODETECT: @@ -129,17 +129,17 @@ bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out) { if (savedata->data) { switch (savedata->type) { case SAVEDATA_SRAM: - return out->write(out, savedata->data, SIZE_CART_SRAM) == SIZE_CART_SRAM; + return out->write(out, savedata->data, GBA_SIZE_SRAM) == GBA_SIZE_SRAM; case SAVEDATA_SRAM512: - return out->write(out, savedata->data, SIZE_CART_SRAM512) == SIZE_CART_SRAM512; + return out->write(out, savedata->data, GBA_SIZE_SRAM512) == GBA_SIZE_SRAM512; case SAVEDATA_FLASH512: - return out->write(out, savedata->data, SIZE_CART_FLASH512) == SIZE_CART_FLASH512; + return out->write(out, savedata->data, GBA_SIZE_FLASH512) == GBA_SIZE_FLASH512; case SAVEDATA_FLASH1M: - return out->write(out, savedata->data, SIZE_CART_FLASH1M) == SIZE_CART_FLASH1M; + return out->write(out, savedata->data, GBA_SIZE_FLASH1M) == GBA_SIZE_FLASH1M; case SAVEDATA_EEPROM: - return out->write(out, savedata->data, SIZE_CART_EEPROM) == SIZE_CART_EEPROM; + return out->write(out, savedata->data, GBA_SIZE_EEPROM) == GBA_SIZE_EEPROM; case SAVEDATA_EEPROM512: - return out->write(out, savedata->data, SIZE_CART_EEPROM512) == SIZE_CART_EEPROM512; + return out->write(out, savedata->data, GBA_SIZE_EEPROM512) == GBA_SIZE_EEPROM512; case SAVEDATA_AUTODETECT: case SAVEDATA_FORCE_NONE: return true; @@ -160,17 +160,17 @@ bool GBASavedataClone(struct GBASavedata* savedata, struct VFile* out) { size_t GBASavedataSize(const struct GBASavedata* savedata) { switch (savedata->type) { case SAVEDATA_SRAM: - return SIZE_CART_SRAM; + return GBA_SIZE_SRAM; case SAVEDATA_SRAM512: - return SIZE_CART_SRAM512; + return GBA_SIZE_SRAM512; case SAVEDATA_FLASH512: - return SIZE_CART_FLASH512; + return GBA_SIZE_FLASH512; case SAVEDATA_FLASH1M: - return SIZE_CART_FLASH1M; + return GBA_SIZE_FLASH1M; case SAVEDATA_EEPROM: - return SIZE_CART_EEPROM; + return GBA_SIZE_EEPROM; case SAVEDATA_EEPROM512: - return SIZE_CART_EEPROM512; + return GBA_SIZE_EEPROM512; case SAVEDATA_FORCE_NONE: return 0; case SAVEDATA_AUTODETECT: @@ -262,14 +262,14 @@ void GBASavedataInitFlash(struct GBASavedata* savedata) { mLOG(GBA_SAVE, WARN, "Can't re-initialize savedata"); return; } - int32_t flashSize = SIZE_CART_FLASH512; + int32_t flashSize = GBA_SIZE_FLASH512; if (savedata->type == SAVEDATA_FLASH1M) { - flashSize = SIZE_CART_FLASH1M; + flashSize = GBA_SIZE_FLASH1M; } off_t end; if (!savedata->vf) { end = 0; - savedata->data = anonymousMemoryMap(SIZE_CART_FLASH1M); + savedata->data = anonymousMemoryMap(GBA_SIZE_FLASH1M); } else { end = savedata->vf->size(savedata->vf); if (end < flashSize) { @@ -279,7 +279,7 @@ void GBASavedataInitFlash(struct GBASavedata* savedata) { } savedata->currentBank = savedata->data; - if (end < SIZE_CART_FLASH512) { + if (end < GBA_SIZE_FLASH512) { memset(&savedata->data[end], 0xFF, flashSize - end); } } @@ -291,14 +291,14 @@ void GBASavedataInitEEPROM(struct GBASavedata* savedata) { mLOG(GBA_SAVE, WARN, "Can't re-initialize savedata"); return; } - int32_t eepromSize = SIZE_CART_EEPROM512; + int32_t eepromSize = GBA_SIZE_EEPROM512; if (savedata->type == SAVEDATA_EEPROM) { - eepromSize = SIZE_CART_EEPROM; + eepromSize = GBA_SIZE_EEPROM; } off_t end; if (!savedata->vf) { end = 0; - savedata->data = anonymousMemoryMap(SIZE_CART_EEPROM); + savedata->data = anonymousMemoryMap(GBA_SIZE_EEPROM); } else { end = savedata->vf->size(savedata->vf); if (end < eepromSize) { @@ -306,8 +306,8 @@ void GBASavedataInitEEPROM(struct GBASavedata* savedata) { } savedata->data = savedata->vf->map(savedata->vf, eepromSize, savedata->mapMode); } - if (end < SIZE_CART_EEPROM512) { - memset(&savedata->data[end], 0xFF, SIZE_CART_EEPROM512 - end); + if (end < GBA_SIZE_EEPROM512) { + memset(&savedata->data[end], 0xFF, GBA_SIZE_EEPROM512 - end); } } @@ -321,17 +321,17 @@ void GBASavedataInitSRAM(struct GBASavedata* savedata) { off_t end; if (!savedata->vf) { end = 0; - savedata->data = anonymousMemoryMap(SIZE_CART_SRAM); + savedata->data = anonymousMemoryMap(GBA_SIZE_SRAM); } else { end = savedata->vf->size(savedata->vf); - if (end < SIZE_CART_SRAM) { - savedata->vf->truncate(savedata->vf, SIZE_CART_SRAM); + if (end < GBA_SIZE_SRAM) { + savedata->vf->truncate(savedata->vf, GBA_SIZE_SRAM); } - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_SRAM, savedata->mapMode); + savedata->data = savedata->vf->map(savedata->vf, GBA_SIZE_SRAM, savedata->mapMode); } - if (end < SIZE_CART_SRAM) { - memset(&savedata->data[end], 0xFF, SIZE_CART_SRAM - end); + if (end < GBA_SIZE_SRAM) { + memset(&savedata->data[end], 0xFF, GBA_SIZE_SRAM - end); } } @@ -345,17 +345,17 @@ void GBASavedataInitSRAM512(struct GBASavedata* savedata) { off_t end; if (!savedata->vf) { end = 0; - savedata->data = anonymousMemoryMap(SIZE_CART_SRAM512); + savedata->data = anonymousMemoryMap(GBA_SIZE_SRAM512); } else { end = savedata->vf->size(savedata->vf); - if (end < SIZE_CART_SRAM512) { - savedata->vf->truncate(savedata->vf, SIZE_CART_SRAM512); + if (end < GBA_SIZE_SRAM512) { + savedata->vf->truncate(savedata->vf, GBA_SIZE_SRAM512); } - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_SRAM512, savedata->mapMode); + savedata->data = savedata->vf->map(savedata->vf, GBA_SIZE_SRAM512, savedata->mapMode); } - if (end < SIZE_CART_SRAM512) { - memset(&savedata->data[end], 0xFF, SIZE_CART_SRAM512 - end); + if (end < GBA_SIZE_SRAM512) { + memset(&savedata->data[end], 0xFF, GBA_SIZE_SRAM512 - end); } } @@ -465,7 +465,7 @@ void GBASavedataWriteFlash(struct GBASavedata* savedata, uint16_t address, uint8 } static void _ensureEeprom(struct GBASavedata* savedata, uint32_t size) { - if (size < SIZE_CART_EEPROM512) { + if (size < GBA_SIZE_EEPROM512) { return; } if (savedata->type == SAVEDATA_EEPROM) { @@ -475,13 +475,13 @@ static void _ensureEeprom(struct GBASavedata* savedata, uint32_t size) { if (!savedata->vf) { return; } - savedata->vf->unmap(savedata->vf, savedata->data, SIZE_CART_EEPROM512); - if (savedata->vf->size(savedata->vf) < SIZE_CART_EEPROM) { - savedata->vf->truncate(savedata->vf, SIZE_CART_EEPROM); - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_EEPROM, savedata->mapMode); - memset(&savedata->data[SIZE_CART_EEPROM512], 0xFF, SIZE_CART_EEPROM - SIZE_CART_EEPROM512); + savedata->vf->unmap(savedata->vf, savedata->data, GBA_SIZE_EEPROM512); + if (savedata->vf->size(savedata->vf) < GBA_SIZE_EEPROM) { + savedata->vf->truncate(savedata->vf, GBA_SIZE_EEPROM); + savedata->data = savedata->vf->map(savedata->vf, GBA_SIZE_EEPROM, savedata->mapMode); + memset(&savedata->data[GBA_SIZE_EEPROM512], 0xFF, GBA_SIZE_EEPROM - GBA_SIZE_EEPROM512); } else { - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_EEPROM, savedata->mapMode); + savedata->data = savedata->vf->map(savedata->vf, GBA_SIZE_EEPROM, savedata->mapMode); } } @@ -509,7 +509,7 @@ void GBASavedataWriteEEPROM(struct GBASavedata* savedata, uint16_t value, uint32 savedata->writeAddress |= (value & 0x1) << 6; } else if (writeSize == 1) { savedata->command = EEPROM_COMMAND_NULL; - } else if ((savedata->writeAddress >> 3) < SIZE_CART_EEPROM) { + } else if ((savedata->writeAddress >> 3) < GBA_SIZE_EEPROM) { _ensureEeprom(savedata, savedata->writeAddress >> 3); uint8_t current = savedata->data[savedata->writeAddress >> 3]; current &= ~(1 << (0x7 - (savedata->writeAddress & 0x7))); @@ -551,7 +551,7 @@ uint16_t GBASavedataReadEEPROM(struct GBASavedata* savedata) { int step = 63 - savedata->readBitsRemaining; uint32_t address = (savedata->readAddress + step) >> 3; _ensureEeprom(savedata, address); - if (address >= SIZE_CART_EEPROM) { + if (address >= GBA_SIZE_EEPROM) { mLOG(GBA_SAVE, GAME_ERROR, "Reading beyond end of EEPROM: %08X", address); return 0xFF; } @@ -699,13 +699,13 @@ void _flashSwitchBank(struct GBASavedata* savedata, int bank) { mLOG(GBA_SAVE, INFO, "Updating flash chip from 512kb to 1Mb"); savedata->type = SAVEDATA_FLASH1M; if (savedata->vf) { - savedata->vf->unmap(savedata->vf, savedata->data, SIZE_CART_FLASH512); - if (savedata->vf->size(savedata->vf) < SIZE_CART_FLASH1M) { - savedata->vf->truncate(savedata->vf, SIZE_CART_FLASH1M); - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_FLASH1M, MAP_WRITE); - memset(&savedata->data[SIZE_CART_FLASH512], 0xFF, SIZE_CART_FLASH512); + savedata->vf->unmap(savedata->vf, savedata->data, GBA_SIZE_FLASH512); + if (savedata->vf->size(savedata->vf) < GBA_SIZE_FLASH1M) { + savedata->vf->truncate(savedata->vf, GBA_SIZE_FLASH1M); + savedata->data = savedata->vf->map(savedata->vf, GBA_SIZE_FLASH1M, MAP_WRITE); + memset(&savedata->data[GBA_SIZE_FLASH512], 0xFF, GBA_SIZE_FLASH512); } else { - savedata->data = savedata->vf->map(savedata->vf, SIZE_CART_FLASH1M, MAP_WRITE); + savedata->data = savedata->vf->map(savedata->vf, GBA_SIZE_FLASH1M, MAP_WRITE); } } } @@ -715,9 +715,9 @@ void _flashSwitchBank(struct GBASavedata* savedata, int bank) { void _flashErase(struct GBASavedata* savedata) { mLOG(GBA_SAVE, DEBUG, "Performing flash chip erase"); savedata->dirty |= mSAVEDATA_DIRT_NEW; - size_t size = SIZE_CART_FLASH512; + size_t size = GBA_SIZE_FLASH512; if (savedata->type == SAVEDATA_FLASH1M) { - size = SIZE_CART_FLASH1M; + size = GBA_SIZE_FLASH1M; } memset(savedata->data, 0xFF, size); } diff --git a/src/gba/serialize.c b/src/gba/serialize.c index 1079932be..7e6ed36f8 100644 --- a/src/gba/serialize.c +++ b/src/gba/serialize.c @@ -102,7 +102,7 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) { mLOG(GBA_STATE, WARN, "Savestate created using a different version of the BIOS: expected %08X, got %08X", gba->biosChecksum, ucheck); uint32_t pc; LOAD_32(pc, ARM_PC * sizeof(state->cpu.gprs[0]), state->cpu.gprs); - if ((ucheck == GBA_BIOS_CHECKSUM || gba->biosChecksum == GBA_BIOS_CHECKSUM) && pc < SIZE_BIOS && pc >= 0x20) { + if ((ucheck == GBA_BIOS_CHECKSUM || gba->biosChecksum == GBA_BIOS_CHECKSUM) && pc < GBA_SIZE_BIOS && pc >= 0x20) { error = true; } } @@ -128,7 +128,7 @@ bool GBADeserialize(struct GBA* gba, const struct GBASerializedState* state) { } LOAD_32(check, ARM_PC * sizeof(state->cpu.gprs[0]), state->cpu.gprs); int region = (check >> BASE_OFFSET); - if ((region == REGION_CART0 || region == REGION_CART1 || region == REGION_CART2) && ((check - WORD_SIZE_ARM) & SIZE_CART0) >= gba->memory.romSize - WORD_SIZE_ARM) { + if ((region == GBA_REGION_ROM0 || region == GBA_REGION_ROM1 || region == GBA_REGION_ROM2) && ((check - WORD_SIZE_ARM) & GBA_SIZE_ROM0) >= gba->memory.romSize - WORD_SIZE_ARM) { mLOG(GBA_STATE, WARN, "Savestate created using a differently sized version of the ROM"); error = true; } diff --git a/src/gba/sharkport.c b/src/gba/sharkport.c index 9922f425f..9e1e64518 100644 --- a/src/gba/sharkport.c +++ b/src/gba/sharkport.c @@ -19,7 +19,7 @@ static bool _importSavedata(struct GBA* gba, void* payload, size_t size) { bool success = false; switch (gba->memory.savedata.type) { case SAVEDATA_FLASH512: - if (size > SIZE_CART_FLASH512) { + if (size > GBA_SIZE_FLASH512) { GBASavedataForceType(&gba->memory.savedata, SAVEDATA_FLASH1M); } // Fall through @@ -33,7 +33,7 @@ static bool _importSavedata(struct GBA* gba, void* payload, size_t size) { goto cleanup; } - if (size == SIZE_CART_EEPROM || size == SIZE_CART_EEPROM512) { + if (size == GBA_SIZE_EEPROM || size == GBA_SIZE_EEPROM512) { size_t i; for (i = 0; i < size; i += 8) { uint32_t lo, hi; @@ -119,7 +119,7 @@ int GBASavedataSharkPortPayloadSize(struct VFile* vf) { void* GBASavedataSharkPortGetPayload(struct VFile* vf, size_t* osize, uint8_t* oheader, bool testChecksum) { int32_t size = GBASavedataSharkPortPayloadSize(vf); - if (size < 0x1C || size > SIZE_CART_FLASH1M + 0x1C) { + if (size < 0x1C || size > GBA_SIZE_FLASH1M + 0x1C) { return NULL; } size -= 0x1C; @@ -336,15 +336,15 @@ int GBASavedataGSVPayloadSize(struct VFile* vf) { LOAD_32(type, 0, &header.type); switch (type) { case 2: - return SIZE_CART_SRAM; + return GBA_SIZE_SRAM; case 3: - return SIZE_CART_EEPROM512; + return GBA_SIZE_EEPROM512; case 4: - return SIZE_CART_EEPROM; + return GBA_SIZE_EEPROM; case 5: - return SIZE_CART_FLASH512; + return GBA_SIZE_FLASH512; case 6: - return SIZE_CART_FLASH1M; // Unconfirmed + return GBA_SIZE_FLASH1M; // Unconfirmed default: return vf->size(vf) - GSV_PAYLOAD_OFFSET; } @@ -352,7 +352,7 @@ int GBASavedataGSVPayloadSize(struct VFile* vf) { void* GBASavedataGSVGetPayload(struct VFile* vf, size_t* osize, uint8_t* ident, bool testChecksum) { int32_t size = GBASavedataGSVPayloadSize(vf); - if (!size || size > SIZE_CART_FLASH1M) { + if (!size || size > GBA_SIZE_FLASH1M) { return NULL; } diff --git a/src/gba/sio/lockstep.c b/src/gba/sio/lockstep.c index bc5a5fd33..a03e88e30 100644 --- a/src/gba/sio/lockstep.c +++ b/src/gba/sio/lockstep.c @@ -111,6 +111,18 @@ bool GBASIOLockstepNodeLoad(struct GBASIODriver* driver) { if (node->id) { node->d.p->rcnt |= 4; node->d.p->siocnt = GBASIOMultiplayerFillSlave(node->d.p->siocnt); + + int try; + for (try = 0; try < 3; ++try) { + uint16_t masterSiocnt; + ATOMIC_LOAD(masterSiocnt, node->p->players[0]->d.p->siocnt); + if (ATOMIC_CMPXCHG(node->p->players[0]->d.p->siocnt, masterSiocnt, GBASIOMultiplayerClearSlave(masterSiocnt))) { + break; + } + } + } else { + node->d.p->rcnt &= ~4; + node->d.p->siocnt = GBASIOMultiplayerClearSlave(node->d.p->siocnt); } break; case SIO_NORMAL_8: diff --git a/src/gba/video.c b/src/gba/video.c index 983976173..52cbabd7e 100644 --- a/src/gba/video.c +++ b/src/gba/video.c @@ -56,7 +56,7 @@ MGBA_EXPORT const int GBAVideoObjSizes[16][2] = { void GBAVideoInit(struct GBAVideo* video) { video->renderer = NULL; - video->vram = anonymousMemoryMap(SIZE_VRAM); + video->vram = anonymousMemoryMap(GBA_SIZE_VRAM); video->frameskip = 0; video->event.name = "GBA Video"; video->event.callback = NULL; @@ -107,7 +107,7 @@ void GBAVideoReset(struct GBAVideo* video) { void GBAVideoDeinit(struct GBAVideo* video) { video->renderer->deinit(video->renderer); - mappedMemoryFree(video->vram, SIZE_VRAM); + mappedMemoryFree(video->vram, GBA_SIZE_VRAM); } void GBAVideoDummyRendererCreate(struct GBAVideoRenderer* renderer) { @@ -348,9 +348,9 @@ static void GBAVideoDummyRendererPutPixels(struct GBAVideoRenderer* renderer, si } void GBAVideoSerialize(const struct GBAVideo* video, struct GBASerializedState* state) { - memcpy(state->vram, video->vram, SIZE_VRAM); - memcpy(state->oam, video->oam.raw, SIZE_OAM); - memcpy(state->pram, video->palette, SIZE_PALETTE_RAM); + memcpy(state->vram, video->vram, GBA_SIZE_VRAM); + memcpy(state->oam, video->oam.raw, GBA_SIZE_OAM); + memcpy(state->pram, video->palette, GBA_SIZE_PALETTE_RAM); STORE_32(video->event.when - mTimingCurrentTime(&video->p->timing), 0, &state->video.nextEvent); int32_t flags = 0; if (video->event.callback == _startHdraw) { @@ -363,16 +363,16 @@ void GBAVideoSerialize(const struct GBAVideo* video, struct GBASerializedState* } void GBAVideoDeserialize(struct GBAVideo* video, const struct GBASerializedState* state) { - memcpy(video->vram, state->vram, SIZE_VRAM); + memcpy(video->vram, state->vram, GBA_SIZE_VRAM); uint16_t value; int i; - for (i = 0; i < SIZE_OAM; i += 2) { + for (i = 0; i < GBA_SIZE_OAM; i += 2) { LOAD_16(value, i, state->oam); - GBAStore16(video->p->cpu, BASE_OAM | i, value, 0); + GBAStore16(video->p->cpu, GBA_BASE_OAM | i, value, 0); } - for (i = 0; i < SIZE_PALETTE_RAM; i += 2) { + for (i = 0; i < GBA_SIZE_PALETTE_RAM; i += 2) { LOAD_16(value, i, state->pram); - GBAStore16(video->p->cpu, BASE_PALETTE_RAM | i, value, 0); + GBAStore16(video->p->cpu, GBA_BASE_PALETTE_RAM | i, value, 0); } LOAD_32(video->frameCounter, 0, &state->video.frameCounter); diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index 7d6cbee83..55a70cb2c 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -677,66 +677,66 @@ static void _setupMaps(struct mCore* core) { /* Map internal working RAM */ descs[0].ptr = gba->memory.iwram; - descs[0].start = BASE_WORKING_IRAM; - descs[0].len = SIZE_WORKING_IRAM; + descs[0].start = GBA_BASE_IWRAM; + descs[0].len = GBA_SIZE_IWRAM; descs[0].select = 0xFF000000; /* Map working RAM */ descs[1].ptr = gba->memory.wram; - descs[1].start = BASE_WORKING_RAM; - descs[1].len = SIZE_WORKING_RAM; + descs[1].start = GBA_BASE_EWRAM; + descs[1].len = GBA_SIZE_EWRAM; descs[1].select = 0xFF000000; /* Map save RAM */ /* TODO: if SRAM is flash, use start=0 addrspace="S" instead */ descs[2].ptr = savedataSize ? savedata : NULL; - descs[2].start = BASE_CART_SRAM; + descs[2].start = GBA_BASE_SRAM; descs[2].len = savedataSize; /* Map ROM */ descs[3].ptr = gba->memory.rom; - descs[3].start = BASE_CART0; + descs[3].start = GBA_BASE_ROM0; descs[3].len = romSize; descs[3].flags = RETRO_MEMDESC_CONST; descs[4].ptr = gba->memory.rom; - descs[4].start = BASE_CART1; + descs[4].start = GBA_BASE_ROM1; descs[4].len = romSize; descs[4].flags = RETRO_MEMDESC_CONST; descs[5].ptr = gba->memory.rom; - descs[5].start = BASE_CART2; + descs[5].start = GBA_BASE_ROM2; descs[5].len = romSize; descs[5].flags = RETRO_MEMDESC_CONST; /* Map BIOS */ descs[6].ptr = gba->memory.bios; - descs[6].start = BASE_BIOS; - descs[6].len = SIZE_BIOS; + descs[6].start = GBA_BASE_BIOS; + descs[6].len = GBA_SIZE_BIOS; descs[6].flags = RETRO_MEMDESC_CONST; /* Map VRAM */ descs[7].ptr = gba->video.vram; - descs[7].start = BASE_VRAM; - descs[7].len = SIZE_VRAM; + descs[7].start = GBA_BASE_VRAM; + descs[7].len = GBA_SIZE_VRAM; descs[7].select = 0xFF000000; /* Map palette RAM */ descs[8].ptr = gba->video.palette; - descs[8].start = BASE_PALETTE_RAM; - descs[8].len = SIZE_PALETTE_RAM; + descs[8].start = GBA_BASE_PALETTE_RAM; + descs[8].len = GBA_SIZE_PALETTE_RAM; descs[8].select = 0xFF000000; /* Map OAM */ descs[9].ptr = &gba->video.oam; /* video.oam is a structure */ - descs[9].start = BASE_OAM; - descs[9].len = SIZE_OAM; + descs[9].start = GBA_BASE_OAM; + descs[9].len = GBA_SIZE_OAM; descs[9].select = 0xFF000000; /* Map mmapped I/O */ descs[10].ptr = gba->memory.io; - descs[10].start = BASE_IO; - descs[10].len = SIZE_IO; + descs[10].start = GBA_BASE_IO; + descs[10].len = GBA_SIZE_IO; mmaps.descriptors = descs; mmaps.num_descriptors = sizeof(descs) / sizeof(descs[0]); diff --git a/src/platform/python/mgba/gba.py b/src/platform/python/mgba/gba.py index 09deafc6c..a0c86ac84 100644 --- a/src/platform/python/mgba/gba.py +++ b/src/platform/python/mgba/gba.py @@ -123,19 +123,19 @@ class GBAMemory(Memory): def __init__(self, core, romSize=lib.SIZE_CART0): super(GBAMemory, self).__init__(core, 0x100000000) - self.bios = Memory(core, lib.SIZE_BIOS, lib.BASE_BIOS) - self.wram = Memory(core, lib.SIZE_WORKING_RAM, lib.BASE_WORKING_RAM) - self.iwram = Memory(core, lib.SIZE_WORKING_IRAM, lib.BASE_WORKING_IRAM) - self.io = Memory(core, lib.SIZE_IO, lib.BASE_IO) # pylint: disable=invalid-name - self.palette = Memory(core, lib.SIZE_PALETTE_RAM, lib.BASE_PALETTE_RAM) - self.vram = Memory(core, lib.SIZE_VRAM, lib.BASE_VRAM) - self.oam = Memory(core, lib.SIZE_OAM, lib.BASE_OAM) + self.bios = Memory(core, lib.GBA_SIZE_BIOS, lib.GBA_BASE_BIOS) + self.wram = Memory(core, lib.GBA_SIZE_EWRAM, lib.GBA_BASE_EWRAM) + self.iwram = Memory(core, lib.GBA_SIZE_IWRAM, lib.GBA_BASE_IWRAM) + self.io = Memory(core, lib.GBA_SIZE_IO, lib.GBA_BASE_IO) # pylint: disable=invalid-name + self.palette = Memory(core, lib.GBA_SIZE_PALETTE_RAM, lib.GBA_BASE_PALETTE_RAM) + self.vram = Memory(core, lib.GBA_SIZE_VRAM, lib.GBA_BASE_VRAM) + self.oam = Memory(core, lib.GBA_SIZE_OAM, lib.GBA_BASE_OAM) self.cart0 = Memory(core, romSize, lib.BASE_CART0) self.cart1 = Memory(core, romSize, lib.BASE_CART1) self.cart2 = Memory(core, romSize, lib.BASE_CART2) self.cart = self.cart0 self.rom = self.cart0 - self.sram = Memory(core, lib.SIZE_CART_SRAM, lib.BASE_CART_SRAM) + self.sram = Memory(core, lib.GBA_SIZE_SRAM, lib.GBA_BASE_SRAM) class GBASprite(Sprite): diff --git a/src/platform/qt/AboutScreen.cpp b/src/platform/qt/AboutScreen.cpp index c0baa4b47..e5d2b261f 100644 --- a/src/platform/qt/AboutScreen.cpp +++ b/src/platform/qt/AboutScreen.cpp @@ -74,7 +74,7 @@ AboutScreen::AboutScreen(QWidget* parent) { QString copyright = m_ui.copyright->text(); - copyright.replace("{year}", QLatin1String("2022")); + copyright.replace("{year}", QLatin1String("2023")); m_ui.copyright->setText(copyright); } } diff --git a/src/platform/qt/AssetTile.cpp b/src/platform/qt/AssetTile.cpp index bd9f3a188..78db4ccd9 100644 --- a/src/platform/qt/AssetTile.cpp +++ b/src/platform/qt/AssetTile.cpp @@ -51,8 +51,8 @@ void AssetTile::setController(std::shared_ptr controller) { #ifdef M_CORE_GBA case mPLATFORM_GBA: m_addressWidth = 8; - m_addressBase = BASE_VRAM; - m_boundaryBase = BASE_VRAM | 0x10000; + m_addressBase = GBA_BASE_VRAM; + m_boundaryBase = GBA_BASE_VRAM | 0x10000; break; #endif #ifdef M_CORE_GB diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 720c5b0ce..9baef24a8 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -225,7 +225,7 @@ if(${QT}Multimedia_FOUND) list(APPEND SOURCE_FILES VideoDumper.cpp) if (WIN32 AND QT_STATIC) - list(APPEND QT_LIBRARIES ${QT}::QWindowsAudioPlugin ${QT}::DSServicePlugin ${QT}::QWindowsVistaStylePlugin + list(APPEND QT_LIBRARIES ${QT}::QWindowsAudioPlugin ${QT}::DSServicePlugin ${QT}::QWindowsVistaStylePlugin ${QT}::QJpegPlugin strmiids mfuuid mfplat mf ksguid dxva2 evr d3d9) endif() list(APPEND QT_LIBRARIES ${QT}::Multimedia) diff --git a/src/platform/qt/Display.cpp b/src/platform/qt/Display.cpp index 9d91b23ea..23952acb4 100644 --- a/src/platform/qt/Display.cpp +++ b/src/platform/qt/Display.cpp @@ -10,6 +10,7 @@ #include "DisplayGL.h" #include "DisplayQt.h" #include "LogController.h" +#include "utils.h" #include @@ -192,3 +193,32 @@ void QGBA::Display::setSystemDimensions(int width, int height) { m_coreWidth = width; m_coreHeight = height; } + +QPoint QGBA::Display::normalizedPoint(CoreController* controller, const QPoint& localRef) { + QSize screen(controller->screenDimensions()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) + QSize newSize((QSizeF(size()) * devicePixelRatioF()).toSize()); +#else + QSize newSize((QSizeF(size()) * devicePixelRatio()).toSize()); +#endif + + if (m_lockAspectRatio) { + QGBA::lockAspectRatio(screen, newSize); + } + + if (m_lockIntegerScaling) { + QGBA::lockIntegerScaling(screen, newSize); + } + + QPointF newPos(localRef); + newPos -= QPointF(width() / 2.0, height() / 2.0); + newPos = QPointF(newPos.x() * screen.width(), newPos.y() * screen.height()); + newPos = QPointF(newPos.x() / newSize.width(), newPos.y() / newSize.height()); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) + newPos *= devicePixelRatioF(); +#else + newPos *= devicePixelRatio(); +#endif + newPos += QPointF(screen.width() / 2.0, screen.height() / 2.0); + return newPos.toPoint(); +} diff --git a/src/platform/qt/Display.h b/src/platform/qt/Display.h index 9e20c092f..b5b69d5ee 100644 --- a/src/platform/qt/Display.h +++ b/src/platform/qt/Display.h @@ -44,6 +44,8 @@ public: bool isShowOSD() const { return m_showOSD; } bool isShowFrameCounter() const { return m_showFrameCounter; } + QPoint normalizedPoint(CoreController*, const QPoint& localRef); + virtual void attach(std::shared_ptr); virtual void configure(ConfigController*); virtual void startDrawing(std::shared_ptr) = 0; diff --git a/src/platform/qt/ForwarderView.cpp b/src/platform/qt/ForwarderView.cpp index 0546e7180..922ef7c16 100644 --- a/src/platform/qt/ForwarderView.cpp +++ b/src/platform/qt/ForwarderView.cpp @@ -15,7 +15,7 @@ using namespace QGBA; ForwarderView::ForwarderView(QWidget* parent) - : QDialog(parent) + : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) { m_ui.setupUi(this); @@ -189,7 +189,7 @@ void ForwarderView::connectBrowseButton(QAbstractButton* button, QLineEdit* line } void ForwarderView::selectImage() { - QString filename = GBAApp::app()->getOpenFileName(this, tr("Select an image"), {}); + QString filename = GBAApp::app()->getOpenFileName(this, tr("Select an image"), tr("Image files (*.png *.jpg *.bmp)")); if (filename.isEmpty()) { return; } diff --git a/src/platform/qt/IOViewer.cpp b/src/platform/qt/IOViewer.cpp index 46c0d8dbb..f89b6c091 100644 --- a/src/platform/qt/IOViewer.cpp +++ b/src/platform/qt/IOViewer.cpp @@ -1580,7 +1580,7 @@ IOViewer::IOViewer(std::shared_ptr controller, QWidget* parent) case mPLATFORM_GBA: regs = GBAIORegisterNames; maxRegs = REG_MAX >> 1; - m_base = BASE_IO; + m_base = GBA_BASE_IO; m_width = 1; break; #endif diff --git a/src/platform/qt/LoadSaveState.cpp b/src/platform/qt/LoadSaveState.cpp index 89cc7f65a..f5dad2336 100644 --- a/src/platform/qt/LoadSaveState.cpp +++ b/src/platform/qt/LoadSaveState.cpp @@ -43,13 +43,12 @@ LoadSaveState::LoadSaveState(std::shared_ptr controller, QWidget m_slots[7] = m_ui.state8; m_slots[8] = m_ui.state9; - unsigned width, height; - controller->thread()->core->desiredVideoDimensions(controller->thread()->core, &width, &height); + QSize size = controller->screenDimensions(); int i; for (i = 0; i < NUM_SLOTS; ++i) { loadState(i + 1); m_slots[i]->installEventFilter(this); - m_slots[i]->setMaximumSize(width + 2, height + 2); + m_slots[i]->setMaximumSize(size.width() + 2, size.height() + 2); connect(m_slots[i], &QAbstractButton::clicked, this, [this, i]() { triggerState(i + 1); }); } @@ -199,11 +198,17 @@ void LoadSaveState::loadState(int slot) { QDateTime creation; QImage stateImage; - unsigned width, height; - thread->core->desiredVideoDimensions(thread->core, &width, &height); + QSize size = m_controller->screenDimensions(); mStateExtdataItem item; - if (mStateExtdataGet(&extdata, EXTDATA_SCREENSHOT, &item) && item.size >= static_cast(width * height * 4)) { - stateImage = QImage((uchar*) item.data, width, height, QImage::Format_ARGB32).rgbSwapped(); + if (mStateExtdataGet(&extdata, EXTDATA_SCREENSHOT, &item)) { + mStateExtdataItem dims; + if (mStateExtdataGet(&extdata, EXTDATA_SCREENSHOT_DIMENSIONS, &dims) && dims.size == sizeof(uint16_t[2])) { + size.setWidth(static_cast(dims.data)[0]); + size.setHeight(static_cast(dims.data)[1]); + } + if (item.size >= static_cast(size.width() * size.height() * 4)) { + stateImage = QImage((uchar*) item.data, size.width(), size.height(), QImage::Format_ARGB32).rgbSwapped(); + } } if (mStateExtdataGet(&extdata, EXTDATA_META_TIME, &item) && item.size == sizeof(uint64_t)) { diff --git a/src/platform/qt/MapView.cpp b/src/platform/qt/MapView.cpp index ba2255ee9..da65abf9d 100644 --- a/src/platform/qt/MapView.cpp +++ b/src/platform/qt/MapView.cpp @@ -43,7 +43,7 @@ MapView::MapView(std::shared_ptr controller, QWidget* parent) case mPLATFORM_GBA: m_boundary = 2048; m_ui.tile->setMaxTile(3096); - m_addressBase = BASE_VRAM; + m_addressBase = GBA_BASE_VRAM; m_addressWidth = 8; m_ui.bgInfo->addCustomProperty("priority", tr("Priority")); m_ui.bgInfo->addCustomProperty("screenBase", tr("Map base")); diff --git a/src/platform/qt/ObjView.cpp b/src/platform/qt/ObjView.cpp index f1b605c0d..f4482aba6 100644 --- a/src/platform/qt/ObjView.cpp +++ b/src/platform/qt/ObjView.cpp @@ -157,7 +157,7 @@ void ObjView::updateTilesGBA(bool force) { m_ui.w->setText(QString::number(newInfo.width * 8)); m_ui.h->setText(QString::number(newInfo.height * 8)); - m_ui.address->setText(tr("0x%0").arg(BASE_OAM + m_objId * sizeof(*obj), 8, 16, QChar('0'))); + m_ui.address->setText(tr("0x%0").arg(GBA_BASE_OAM + m_objId * sizeof(*obj), 8, 16, QChar('0'))); m_ui.priority->setText(QString::number(newInfo.priority)); m_ui.flippedH->setChecked(newInfo.hflip); m_ui.flippedV->setChecked(newInfo.vflip); diff --git a/src/platform/qt/SaveConverter.cpp b/src/platform/qt/SaveConverter.cpp index fd242af98..712396517 100644 --- a/src/platform/qt/SaveConverter.cpp +++ b/src/platform/qt/SaveConverter.cpp @@ -197,20 +197,20 @@ void SaveConverter::detectFromSavestate(VFile* vf) { void SaveConverter::detectFromSize(std::shared_ptr vf) { #ifdef M_CORE_GBA switch (vf->size()) { - case SIZE_CART_SRAM: + case GBA_SIZE_SRAM: m_validSaves.append(AnnotatedSave{SAVEDATA_SRAM, vf}); break; - case SIZE_CART_FLASH512: + case GBA_SIZE_FLASH512: m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH512, vf}); break; - case SIZE_CART_FLASH1M: + case GBA_SIZE_FLASH1M: m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH1M, vf}); break; - case SIZE_CART_EEPROM: + case GBA_SIZE_EEPROM: m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, vf, Endian::LITTLE}); m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, vf, Endian::BIG}); break; - case SIZE_CART_EEPROM512: + case GBA_SIZE_EEPROM512: m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, vf, Endian::LITTLE}); m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, vf, Endian::BIG}); break; @@ -267,13 +267,13 @@ void SaveConverter::detectFromHeaders(std::shared_ptr vf) { if (data) { QByteArray bytes = QByteArray::fromRawData(static_cast(data), size); bytes.data(); // Trigger a deep copy before we delete the backing - if (size == SIZE_CART_FLASH1M) { + if (size == GBA_SIZE_FLASH1M) { m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH1M, std::make_shared(bytes), Endian::NONE, Container::SHARKPORT}); } else { - m_validSaves.append(AnnotatedSave{SAVEDATA_SRAM, std::make_shared(bytes.left(SIZE_CART_SRAM)), Endian::NONE, Container::SHARKPORT}); - m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH512, std::make_shared(bytes.left(SIZE_CART_FLASH512)), Endian::NONE, Container::SHARKPORT}); - m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, std::make_shared(bytes.left(SIZE_CART_EEPROM)), Endian::BIG, Container::SHARKPORT}); - m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, std::make_shared(bytes.left(SIZE_CART_EEPROM512)), Endian::BIG, Container::SHARKPORT}); + m_validSaves.append(AnnotatedSave{SAVEDATA_SRAM, std::make_shared(bytes.left(GBA_SIZE_SRAM)), Endian::NONE, Container::SHARKPORT}); + m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH512, std::make_shared(bytes.left(GBA_SIZE_FLASH512)), Endian::NONE, Container::SHARKPORT}); + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, std::make_shared(bytes.left(GBA_SIZE_EEPROM)), Endian::BIG, Container::SHARKPORT}); + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, std::make_shared(bytes.left(GBA_SIZE_EEPROM512)), Endian::BIG, Container::SHARKPORT}); } free(data); } @@ -284,21 +284,21 @@ void SaveConverter::detectFromHeaders(std::shared_ptr vf) { QByteArray bytes = QByteArray::fromRawData(static_cast(data), size); bytes.data(); // Trigger a deep copy before we delete the backing switch (size) { - case SIZE_CART_FLASH1M: + case GBA_SIZE_FLASH1M: m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH1M, std::make_shared(bytes), Endian::NONE, Container::GSV}); break; - case SIZE_CART_FLASH512: + case GBA_SIZE_FLASH512: m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH512, std::make_shared(bytes), Endian::NONE, Container::GSV}); m_validSaves.append(AnnotatedSave{SAVEDATA_FLASH1M, std::make_shared(bytes), Endian::NONE, Container::GSV}); break; - case SIZE_CART_SRAM: - m_validSaves.append(AnnotatedSave{SAVEDATA_SRAM, std::make_shared(bytes.left(SIZE_CART_SRAM)), Endian::NONE, Container::GSV}); + case GBA_SIZE_SRAM: + m_validSaves.append(AnnotatedSave{SAVEDATA_SRAM, std::make_shared(bytes.left(GBA_SIZE_SRAM)), Endian::NONE, Container::GSV}); break; - case SIZE_CART_EEPROM: - m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, std::make_shared(bytes.left(SIZE_CART_EEPROM)), Endian::BIG, Container::GSV}); + case GBA_SIZE_EEPROM: + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM, std::make_shared(bytes.left(GBA_SIZE_EEPROM)), Endian::BIG, Container::GSV}); break; - case SIZE_CART_EEPROM512: - m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, std::make_shared(bytes.left(SIZE_CART_EEPROM512)), Endian::BIG, Container::GSV}); + case GBA_SIZE_EEPROM512: + m_validSaves.append(AnnotatedSave{SAVEDATA_EEPROM512, std::make_shared(bytes.left(GBA_SIZE_EEPROM512)), Endian::BIG, Container::GSV}); break; } free(data); diff --git a/src/platform/qt/ShortcutController.cpp b/src/platform/qt/ShortcutController.cpp index 50211bcb1..82ba1eac1 100644 --- a/src/platform/qt/ShortcutController.cpp +++ b/src/platform/qt/ShortcutController.cpp @@ -7,7 +7,9 @@ #include "ConfigController.h" #include "input/GamepadButtonEvent.h" +#include "input/GamepadHatEvent.h" #include "InputProfile.h" +#include "scripting/ScriptingController.h" #include #include @@ -32,6 +34,10 @@ void ShortcutController::setActionMapper(ActionMapper* actions) { rebuildItems(); } +void ShortcutController::setScriptingController(ScriptingController* controller) { + m_scripting = controller; +} + void ShortcutController::updateKey(const QString& name, int keySequence) { auto item = m_items[name]; if (!item) { @@ -132,9 +138,14 @@ void ShortcutController::rebuildItems() { onSubitems({}, std::bind(&ShortcutController::generateItem, this, std::placeholders::_1)); } -bool ShortcutController::eventFilter(QObject*, QEvent* event) { +bool ShortcutController::eventFilter(QObject* obj, QEvent* event) { if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) { QKeyEvent* keyEvent = static_cast(event); +#ifdef ENABLE_SCRIPTING + if (m_scripting) { + m_scripting->event(obj, event); + } +#endif if (keyEvent->isAutoRepeat()) { return false; } @@ -149,10 +160,14 @@ bool ShortcutController::eventFilter(QObject*, QEvent* event) { Action::BooleanFunction fn = item.value()->action()->booleanAction(); fn(event->type() == QEvent::KeyPress); event->accept(); - return true; } } if (event->type() == GamepadButtonEvent::Down()) { +#ifdef ENABLE_SCRIPTING + if (m_scripting) { + m_scripting->event(obj, event); + } +#endif auto item = m_buttons.find(static_cast(event)->value()); if (item == m_buttons.end()) { return false; @@ -169,6 +184,11 @@ bool ShortcutController::eventFilter(QObject*, QEvent* event) { return true; } if (event->type() == GamepadButtonEvent::Up()) { +#ifdef ENABLE_SCRIPTING + if (m_scripting) { + m_scripting->event(obj, event); + } +#endif auto item = m_buttons.find(static_cast(event)->value()); if (item == m_buttons.end()) { return false; @@ -201,6 +221,13 @@ bool ShortcutController::eventFilter(QObject*, QEvent* event) { event->accept(); return true; } +#ifdef ENABLE_SCRIPTING + if (event->type() == GamepadHatEvent::Type()) { + if (m_scripting) { + m_scripting->event(obj, event); + } + } +#endif return false; } diff --git a/src/platform/qt/ShortcutController.h b/src/platform/qt/ShortcutController.h index c4db4241e..7eed7e1d7 100644 --- a/src/platform/qt/ShortcutController.h +++ b/src/platform/qt/ShortcutController.h @@ -21,6 +21,7 @@ namespace QGBA { class ConfigController; class InputProfile; +class ScriptingController; class Shortcut : public QObject { Q_OBJECT @@ -74,6 +75,7 @@ public: void setConfigController(ConfigController* controller); void setActionMapper(ActionMapper* actionMapper); + void setScriptingController(ScriptingController* scriptingController); void setProfile(const QString& profile); @@ -121,6 +123,7 @@ private: QHash> m_heldKeys; ActionMapper* m_actions = nullptr; ConfigController* m_config = nullptr; + ScriptingController* m_scripting = nullptr; QString m_profileName; const InputProfile* m_profile = nullptr; }; diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 75b1b39b7..447fd5570 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -651,8 +651,11 @@ void Window::consoleOpen() { void Window::scriptingOpen() { if (!m_scripting) { m_scripting = std::make_unique(); + m_scripting->setInputController(&m_inputController); + m_shortcutController->setScriptingController(m_scripting.get()); if (m_controller) { m_scripting->setController(m_controller); + m_display->installEventFilter(m_scripting.get()); } } ScriptingView* view = new ScriptingView(m_scripting.get(), m_config); @@ -1757,7 +1760,7 @@ void Window::setupMenu(QMenuBar* menubar) { if (m_controller) { mCheatPressButton(m_controller->cheatDevice(), held); } - }, "tools", QKeySequence(Qt::Key_Apostrophe)); + }, "tools"); for (Action* action : m_gameActions) { action->setEnabled(false); @@ -2140,6 +2143,12 @@ void Window::attachDisplay() { m_display->attach(m_controller); connect(m_display.get(), &QGBA::Display::drawingStarted, this, &Window::changeRenderer); m_display->startDrawing(m_controller); + +#ifdef ENABLE_SCRIPTING + if (m_scripting) { + m_display->installEventFilter(m_scripting.get()); + } +#endif } void Window::updateMute() { diff --git a/src/platform/qt/input/InputController.cpp b/src/platform/qt/input/InputController.cpp index 43614a675..ac86a32da 100644 --- a/src/platform/qt/input/InputController.cpp +++ b/src/platform/qt/input/InputController.cpp @@ -46,7 +46,7 @@ InputController::InputController(int playerId, QWidget* topLevel, QObject* paren } }); - m_gamepadTimer.setInterval(50); + m_gamepadTimer.setInterval(15); m_gamepadTimer.start(); #ifdef BUILD_QT_MULTIMEDIA @@ -332,6 +332,7 @@ void InputController::update() { loadProfile(driver->type(), newProfile); } } + emit updated(); } int InputController::pollEvents() { diff --git a/src/platform/qt/input/InputController.h b/src/platform/qt/input/InputController.h index 8c1e8104c..f551b1020 100644 --- a/src/platform/qt/input/InputController.h +++ b/src/platform/qt/input/InputController.h @@ -64,6 +64,8 @@ public: void addInputDriver(std::shared_ptr); + int playerId() const { return m_playerId; } + void setConfiguration(ConfigController* config); void saveConfiguration(); bool loadConfiguration(uint32_t type); @@ -111,6 +113,7 @@ public: GBALuminanceSource* luminance() { return &m_lux; } signals: + void updated(); void profileLoaded(const QString& profile); void luminanceValueChanged(int value); diff --git a/src/platform/qt/input/SDLInputDriver.cpp b/src/platform/qt/input/SDLInputDriver.cpp index ca9e30b25..5b68462d1 100644 --- a/src/platform/qt/input/SDLInputDriver.cpp +++ b/src/platform/qt/input/SDLInputDriver.cpp @@ -89,6 +89,7 @@ QString SDLInputDriver::currentProfile() const { } void SDLInputDriver::loadConfiguration(ConfigController* config) { + m_config = config; mSDLEventsLoadConfig(&s_sdlEvents, config->input()); if (!m_playerAttached) { m_playerAttached = mSDLAttachPlayer(&s_sdlEvents, &m_sdlPlayer); @@ -126,7 +127,7 @@ mRotationSource* SDLInputDriver::rotationSource() { bool SDLInputDriver::update() { - if (!m_playerAttached || !m_sdlPlayer.joystick) { + if (!m_playerAttached) { return false; } @@ -148,6 +149,9 @@ QList SDLInputDriver::connectedGamepads() const { #if SDL_VERSION_ATLEAST(2, 0, 0) void SDLInputDriver::updateGamepads() { + if (m_config) { + mSDLUpdateJoysticks(&s_sdlEvents, m_config->input()); + } for (int i = 0; i < m_gamepads.size(); ++i) { if (m_gamepads.at(i)->updateIndex()) { continue; @@ -160,10 +164,12 @@ void SDLInputDriver::updateGamepads() { }); for (size_t i = 0, j = 0; i < SDL_JoystickListSize(&s_sdlEvents.joysticks); ++i) { - std::shared_ptr gamepad = m_gamepads.at(j); - if (gamepad->m_index == i) { - ++j; - continue; + if ((ssize_t) j < m_gamepads.size()) { + std::shared_ptr gamepad = m_gamepads.at(j); + if (gamepad->m_index == i) { + ++j; + continue; + } } m_gamepads.append(std::make_shared(this, i)); } diff --git a/src/platform/qt/input/SDLInputDriver.h b/src/platform/qt/input/SDLInputDriver.h index 09f4b9555..0ca2f4030 100644 --- a/src/platform/qt/input/SDLInputDriver.h +++ b/src/platform/qt/input/SDLInputDriver.h @@ -62,6 +62,7 @@ public: mRotationSource* rotationSource() override; private: + ConfigController* m_config = nullptr; InputController* m_controller; mSDLPlayer m_sdlPlayer{}; bool m_playerAttached = false; diff --git a/src/platform/qt/main.cpp b/src/platform/qt/main.cpp index c53408e8e..4343168a7 100644 --- a/src/platform/qt/main.cpp +++ b/src/platform/qt/main.cpp @@ -28,6 +28,7 @@ #ifdef QT_STATIC #include #ifdef Q_OS_WIN +Q_IMPORT_PLUGIN(QJpegPlugin); Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin); Q_IMPORT_PLUGIN(QWindowsVistaStylePlugin); #ifdef BUILD_QT_MULTIMEDIA diff --git a/src/platform/qt/scripting/ScriptingController.cpp b/src/platform/qt/scripting/ScriptingController.cpp index cd1e716d4..d8babf06d 100644 --- a/src/platform/qt/scripting/ScriptingController.cpp +++ b/src/platform/qt/scripting/ScriptingController.cpp @@ -5,10 +5,24 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "scripting/ScriptingController.h" +#include +#include +#include +#include + #include "CoreController.h" +#include "Display.h" +#include "input/Gamepad.h" +#include "input/GamepadButtonEvent.h" +#include "input/GamepadHatEvent.h" +#include "InputController.h" #include "scripting/ScriptingTextBuffer.h" #include "scripting/ScriptingTextBufferModel.h" +#include +#include +#include + using namespace QGBA; ScriptingController::ScriptingController(QObject* parent) @@ -37,12 +51,15 @@ ScriptingController::ScriptingController(QObject* parent) m_bufferModel = new ScriptingTextBufferModel(this); QObject::connect(m_bufferModel, &ScriptingTextBufferModel::textBufferCreated, this, &ScriptingController::textBufferCreated); + mScriptGamepadInit(&m_gamepad); + init(); } ScriptingController::~ScriptingController() { clearController(); mScriptContextDeinit(&m_scriptContext); + mScriptGamepadDeinit(&m_gamepad); } void ScriptingController::setController(std::shared_ptr controller) { @@ -59,6 +76,14 @@ void ScriptingController::setController(std::shared_ptr controll connect(m_controller.get(), &CoreController::stopping, this, &ScriptingController::clearController); } +void ScriptingController::setInputController(InputController* input) { + if (m_inputController) { + m_inputController->disconnect(this); + } + m_inputController = input; + connect(m_inputController, &InputController::updated, this, &ScriptingController::updateGamepad); +} + bool ScriptingController::loadFile(const QString& path) { VFileDevice vf(path, QIODevice::ReadOnly); if (!vf.isOpen()) { @@ -73,11 +98,20 @@ bool ScriptingController::load(VFileDevice& vf, const QString& name) { } QByteArray utf8 = name.toUtf8(); CoreController::Interrupter interrupter(m_controller); + if (m_controller) { + m_controller->setSync(false); + m_controller->unpaused(); + } + bool ok = true; if (!m_activeEngine->load(m_activeEngine, utf8.constData(), vf) || !m_activeEngine->run(m_activeEngine)) { emit error(QString::fromUtf8(m_activeEngine->getError(m_activeEngine))); - return false; + ok = false; } - return true; + if (m_controller && m_controller->isPaused()) { + m_controller->setSync(true); + m_controller->paused(); + } + return ok; } void ScriptingController::clearController() { @@ -110,10 +144,153 @@ void ScriptingController::runCode(const QString& code) { load(vf, "*prompt"); } +bool ScriptingController::eventFilter(QObject* obj, QEvent* ev) { + event(obj, ev); + return false; +} + +void ScriptingController::event(QObject* obj, QEvent* event) { + if (!m_controller) { + return; + } + + switch (event->type()) { + case QEvent::KeyPress: + case QEvent::KeyRelease: { + struct mScriptKeyEvent ev{mSCRIPT_EV_TYPE_KEY}; + auto keyEvent = static_cast(event); + ev.state = event->type() == QEvent::KeyRelease ? mSCRIPT_INPUT_STATE_UP : + static_cast(event)->isAutoRepeat() ? mSCRIPT_INPUT_STATE_HELD : mSCRIPT_INPUT_STATE_DOWN; + ev.key = qtToScriptingKey(keyEvent); + ev.modifiers = qtToScriptingModifiers(keyEvent->modifiers()); + mScriptContextFireEvent(&m_scriptContext, &ev.d); + return; + } + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: { + struct mScriptMouseButtonEvent ev{mSCRIPT_EV_TYPE_MOUSE_BUTTON}; + auto mouseEvent = static_cast(event); + ev.mouse = 0; + ev.state = event->type() == QEvent::MouseButtonPress ? mSCRIPT_INPUT_STATE_DOWN : mSCRIPT_INPUT_STATE_UP; + ev.button = 31 - clz32(mouseEvent->button()); + mScriptContextFireEvent(&m_scriptContext, &ev.d); + return; + } + case QEvent::MouseMove: { + struct mScriptMouseMoveEvent ev{mSCRIPT_EV_TYPE_MOUSE_MOVE}; + auto mouseEvent = static_cast(event); + QPoint pos = mouseEvent->pos(); + pos = static_cast(obj)->normalizedPoint(m_controller.get(), pos); + ev.mouse = 0; + ev.x = pos.x(); + ev.y = pos.y(); + mScriptContextFireEvent(&m_scriptContext, &ev.d); + return; + } + case QEvent::Wheel: { + struct mScriptMouseWheelEvent ev{mSCRIPT_EV_TYPE_MOUSE_WHEEL}; + auto wheelEvent = static_cast(event); + QPoint adelta = wheelEvent->angleDelta(); + QPoint pdelta = wheelEvent->pixelDelta(); + ev.mouse = 0; + if (!pdelta.isNull()) { + ev.x = pdelta.x(); + ev.y = pdelta.y(); + } else { + ev.x = adelta.x(); + ev.y = adelta.y(); + } + mScriptContextFireEvent(&m_scriptContext, &ev.d); + return; + } + default: + break; + } + + auto type = event->type(); + if (type == GamepadButtonEvent::Down() || type == GamepadButtonEvent::Up()) { + struct mScriptGamepadButtonEvent ev{mSCRIPT_EV_TYPE_GAMEPAD_BUTTON}; + auto gamepadEvent = static_cast(event); + ev.pad = 0; + ev.state = event->type() == GamepadButtonEvent::Down() ? mSCRIPT_INPUT_STATE_DOWN : mSCRIPT_INPUT_STATE_UP; + ev.button = gamepadEvent->value(); + mScriptContextFireEvent(&m_scriptContext, &ev.d); + } + if (type == GamepadHatEvent::Type()) { + struct mScriptGamepadHatEvent ev{mSCRIPT_EV_TYPE_GAMEPAD_HAT}; + updateGamepad(); + auto gamepadEvent = static_cast(event); + ev.pad = 0; + ev.hat = gamepadEvent->hatId(); + ev.direction = gamepadEvent->direction(); + mScriptContextFireEvent(&m_scriptContext, &ev.d); + } +} + +void ScriptingController::updateGamepad() { + InputDriver* driver = m_inputController->gamepadDriver(); + if (!driver) { + detachGamepad(); + return; + } + Gamepad* gamepad = driver->activeGamepad(); + if (!gamepad) { + detachGamepad(); + return; + } + + QString name = gamepad->name(); + strlcpy(m_gamepad.internalName, name.toUtf8().constData(), sizeof(m_gamepad.internalName)); + name = gamepad->visibleName(); + strlcpy(m_gamepad.visibleName, name.toUtf8().constData(), sizeof(m_gamepad.visibleName)); + attachGamepad(); + + QList buttons = gamepad->currentButtons(); + int nButtons = gamepad->buttonCount(); + mScriptGamepadSetButtonCount(&m_gamepad, nButtons); + for (int i = 0; i < nButtons; ++i) { + mScriptGamepadSetButton(&m_gamepad, i, buttons.at(i)); + } + + QList axes = gamepad->currentAxes(); + int nAxes = gamepad->axisCount(); + mScriptGamepadSetAxisCount(&m_gamepad, nAxes); + for (int i = 0; i < nAxes; ++i) { + mScriptGamepadSetAxis(&m_gamepad, i, axes.at(i)); + } + + QList hats = gamepad->currentHats(); + int nHats = gamepad->hatCount(); + mScriptGamepadSetHatCount(&m_gamepad, nHats); + for (int i = 0; i < nHats; ++i) { + mScriptGamepadSetHat(&m_gamepad, i, hats.at(i)); + } +} + +void ScriptingController::attachGamepad() { + mScriptGamepad* pad = mScriptContextGamepadLookup(&m_scriptContext, 0); + if (pad == &m_gamepad) { + return; + } + if (pad) { + mScriptContextGamepadDetach(&m_scriptContext, 0); + } + mScriptContextGamepadAttach(&m_scriptContext, &m_gamepad); +} + +void ScriptingController::detachGamepad() { + mScriptGamepad* pad = mScriptContextGamepadLookup(&m_scriptContext, 0); + if (pad != &m_gamepad) { + return; + } + mScriptContextGamepadDetach(&m_scriptContext, 0); +} + void ScriptingController::init() { mScriptContextInit(&m_scriptContext); mScriptContextAttachStdlib(&m_scriptContext); mScriptContextAttachSocket(&m_scriptContext); + mScriptContextAttachInput(&m_scriptContext); mScriptContextRegisterEngines(&m_scriptContext); mScriptContextAttachLogger(&m_scriptContext, &m_logger); @@ -128,3 +305,130 @@ void ScriptingController::init() { m_activeEngine = *m_engines.begin(); } } + +uint32_t ScriptingController::qtToScriptingKey(const QKeyEvent* event) { + QString text(event->text()); + int key = event->key(); + + static const QHash keypadMap{ + {'0', mSCRIPT_KEY_KP_0}, + {'1', mSCRIPT_KEY_KP_1}, + {'2', mSCRIPT_KEY_KP_2}, + {'3', mSCRIPT_KEY_KP_3}, + {'4', mSCRIPT_KEY_KP_4}, + {'5', mSCRIPT_KEY_KP_5}, + {'6', mSCRIPT_KEY_KP_6}, + {'7', mSCRIPT_KEY_KP_7}, + {'8', mSCRIPT_KEY_KP_8}, + {'9', mSCRIPT_KEY_KP_9}, + {'+', mSCRIPT_KEY_KP_PLUS}, + {'-', mSCRIPT_KEY_KP_MINUS}, + {'*', mSCRIPT_KEY_KP_MULTIPLY}, + {'/', mSCRIPT_KEY_KP_DIVIDE}, + {',', mSCRIPT_KEY_KP_COMMA}, + {'.', mSCRIPT_KEY_KP_POINT}, + {Qt::Key_Enter, mSCRIPT_KEY_KP_ENTER}, + }; + static const QHash extraKeyMap{ + {Qt::Key_Escape, mSCRIPT_KEY_ESCAPE}, + {Qt::Key_Tab, mSCRIPT_KEY_TAB}, + {Qt::Key_Backtab, mSCRIPT_KEY_BACKSPACE}, + {Qt::Key_Backspace, mSCRIPT_KEY_BACKSPACE}, + {Qt::Key_Return, mSCRIPT_KEY_ENTER}, + {Qt::Key_Enter, mSCRIPT_KEY_ENTER}, + {Qt::Key_Insert, mSCRIPT_KEY_INSERT}, + {Qt::Key_Delete, mSCRIPT_KEY_DELETE}, + {Qt::Key_Pause, mSCRIPT_KEY_BREAK}, + {Qt::Key_Print, mSCRIPT_KEY_PRINT_SCREEN}, + {Qt::Key_SysReq, mSCRIPT_KEY_SYSRQ}, + {Qt::Key_Clear, mSCRIPT_KEY_CLEAR}, + {Qt::Key_Home, mSCRIPT_KEY_HOME}, + {Qt::Key_End, mSCRIPT_KEY_END}, + {Qt::Key_Left, mSCRIPT_KEY_LEFT}, + {Qt::Key_Up, mSCRIPT_KEY_UP}, + {Qt::Key_Right, mSCRIPT_KEY_RIGHT}, + {Qt::Key_Down, mSCRIPT_KEY_DOWN}, + {Qt::Key_PageUp, mSCRIPT_KEY_PAGE_UP}, + {Qt::Key_PageDown, mSCRIPT_KEY_DOWN}, + {Qt::Key_Shift, mSCRIPT_KEY_SHIFT}, + {Qt::Key_Control, mSCRIPT_KEY_CONTROL}, + {Qt::Key_Meta, mSCRIPT_KEY_SUPER}, + {Qt::Key_Alt, mSCRIPT_KEY_ALT}, + {Qt::Key_CapsLock, mSCRIPT_KEY_CAPS_LOCK}, + {Qt::Key_NumLock, mSCRIPT_KEY_NUM_LOCK}, + {Qt::Key_ScrollLock, mSCRIPT_KEY_SCROLL_LOCK}, + {Qt::Key_F1, mSCRIPT_KEY_F1}, + {Qt::Key_F2, mSCRIPT_KEY_F2}, + {Qt::Key_F3, mSCRIPT_KEY_F3}, + {Qt::Key_F4, mSCRIPT_KEY_F4}, + {Qt::Key_F5, mSCRIPT_KEY_F5}, + {Qt::Key_F6, mSCRIPT_KEY_F6}, + {Qt::Key_F7, mSCRIPT_KEY_F7}, + {Qt::Key_F8, mSCRIPT_KEY_F8}, + {Qt::Key_F9, mSCRIPT_KEY_F9}, + {Qt::Key_F10, mSCRIPT_KEY_F10}, + {Qt::Key_F11, mSCRIPT_KEY_F11}, + {Qt::Key_F12, mSCRIPT_KEY_F12}, + {Qt::Key_F13, mSCRIPT_KEY_F13}, + {Qt::Key_F14, mSCRIPT_KEY_F14}, + {Qt::Key_F15, mSCRIPT_KEY_F15}, + {Qt::Key_F16, mSCRIPT_KEY_F16}, + {Qt::Key_F17, mSCRIPT_KEY_F17}, + {Qt::Key_F18, mSCRIPT_KEY_F18}, + {Qt::Key_F19, mSCRIPT_KEY_F19}, + {Qt::Key_F20, mSCRIPT_KEY_F20}, + {Qt::Key_F21, mSCRIPT_KEY_F21}, + {Qt::Key_F22, mSCRIPT_KEY_F22}, + {Qt::Key_F23, mSCRIPT_KEY_F23}, + {Qt::Key_F24, mSCRIPT_KEY_F24}, + {Qt::Key_Menu, mSCRIPT_KEY_MENU}, + {Qt::Key_Super_L, mSCRIPT_KEY_SUPER}, + {Qt::Key_Super_R, mSCRIPT_KEY_SUPER}, + {Qt::Key_Help, mSCRIPT_KEY_HELP}, + {Qt::Key_Hyper_L, mSCRIPT_KEY_SUPER}, + {Qt::Key_Hyper_R, mSCRIPT_KEY_SUPER}, + }; + + if (event->modifiers() & Qt::KeypadModifier && keypadMap.contains(key)) { + return keypadMap[key]; + } + if (key >= 0 && key < 0x100) { + return key; + } + if (key < 0x01000000) { + if (text.isEmpty()) { + return 0; + } + QChar high = text[0]; + if (!high.isSurrogate()) { + return high.unicode(); + } + if (text.size() < 2) { + return 0; + } + return QChar::surrogateToUcs4(high, text[1]); + } + + if (extraKeyMap.contains(key)) { + return extraKeyMap[key]; + } + return 0; +} + + +uint16_t ScriptingController::qtToScriptingModifiers(Qt::KeyboardModifiers modifiers) { + uint16_t mod = 0; + if (modifiers & Qt::ShiftModifier) { + mod |= mSCRIPT_KMOD_SHIFT; + } + if (modifiers & Qt::ControlModifier) { + mod |= mSCRIPT_KMOD_CONTROL; + } + if (modifiers & Qt::AltModifier) { + mod |= mSCRIPT_KMOD_ALT; + } + if (modifiers & Qt::MetaModifier) { + mod |= mSCRIPT_KMOD_SUPER; + } + return mod; +} diff --git a/src/platform/qt/scripting/ScriptingController.h b/src/platform/qt/scripting/ScriptingController.h index 03e40f7cf..0e275561d 100644 --- a/src/platform/qt/scripting/ScriptingController.h +++ b/src/platform/qt/scripting/ScriptingController.h @@ -9,17 +9,20 @@ #include #include +#include #include #include "VFileDevice.h" #include +class QKeyEvent; class QTextDocument; namespace QGBA { class CoreController; +class InputController; class ScriptingTextBuffer; class ScriptingTextBufferModel; @@ -31,10 +34,13 @@ public: ~ScriptingController(); void setController(std::shared_ptr controller); + void setInputController(InputController* controller); bool loadFile(const QString& path); bool load(VFileDevice& vf, const QString& name); + void event(QObject* obj, QEvent* ev); + mScriptContext* context() { return &m_scriptContext; } ScriptingTextBufferModel* textBufferModel() const { return m_bufferModel; } @@ -49,10 +55,20 @@ public slots: void reset(); void runCode(const QString& code); +protected: + bool eventFilter(QObject*, QEvent*) override; + +private slots: + void updateGamepad(); + private: void init(); - static mScriptTextBuffer* createTextBuffer(void* context); + void attachGamepad(); + void detachGamepad(); + + static uint32_t qtToScriptingKey(const QKeyEvent*); + static uint16_t qtToScriptingModifiers(Qt::KeyboardModifiers); struct Logger : mLogger { ScriptingController* p; @@ -64,7 +80,10 @@ private: QHash m_engines; ScriptingTextBufferModel* m_bufferModel; + mScriptGamepad m_gamepad; + std::shared_ptr m_controller; + InputController* m_inputController = nullptr; }; } diff --git a/src/platform/qt/ts/medusa-emu-de.ts b/src/platform/qt/ts/medusa-emu-de.ts index 94b876186..ae9a31181 100644 --- a/src/platform/qt/ts/medusa-emu-de.ts +++ b/src/platform/qt/ts/medusa-emu-de.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + Game Boy Advance-ROMs (%1) + + + + Game Boy ROMs (%1) + Game Boy-ROMs (%1) + + + + All ROMs (%1) + Alle ROMs (%1) + + + + %1 Video Logs (*.mvl) + %1 Video-Logs (*.mvl) + + QGBA::AboutScreen @@ -107,22 +130,22 @@ Download-Größe: %3 QGBA::ApplicationUpdater - + Stable Stabil - + Development Entwicklung - + Unknown Unbekannt - + (None) (keiner) @@ -415,12 +438,12 @@ Download-Größe: %3 Das GamePak kann nur auf unterstützten Plattformen herausgezogen werden! - + Failed to open snapshot file for reading: %1 Konnte Snapshot-Datei %1 nicht zum Lesen öffnen - + Failed to open snapshot file for writing: %1 Konnte Snapshot-Datei %1 nicht zum Schreiben öffnen @@ -428,17 +451,17 @@ Download-Größe: %3 QGBA::CoreManager - + Failed to open game file: %1 Fehler beim Öffnen der Spieldatei: %1 - + Could not load game. Are you sure it's in the correct format? Konnte das Spiel nicht laden. Bist Du sicher, dass es im korrekten Format vorliegt? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). Fehler beim Laden der Spielstand-Datei; Speicherdaten können nicht aktualisiert werden. Bitte stelle sicher, dass das Speicherdaten-Verzeichnis ohne zusätzliche Berechtigungen (z.B. UAC in Windows) beschreibbar ist. @@ -517,6 +540,195 @@ Download-Größe: %3 Verbindung zu Dolphin konnte nicht hergestellt werden. + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Hintergrund + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Durchsuchen + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -608,7 +820,7 @@ Download-Größe: %3 QGBA::GBAApp - + Enable Discord Rich Presence Discord-Integration aktivieren @@ -616,22 +828,22 @@ Download-Größe: %3 QGBA::GBAKeyEditor - + Clear Button Button löschen - + Clear Analog Analog löschen - + Refresh Aktualisieren - + Set all Alle belegen @@ -765,148 +977,168 @@ Download-Größe: %3 QGBA::GameBoy - - + + Autodetect Automatisch erkennen - + Game Boy (DMG) Game Boy (DMG) - + Game Boy Pocket (MGB) Game Boy Pocket (MGB) - + Super Game Boy (SGB) Super Game Boy (SGB) - + Super Game Boy 2 (SGB) Super Game Boy 2 (SGB) - + Game Boy Color (CGB) Game Boy Color (CGB) - + Game Boy Advance (AGB) Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) Super Game Boy Color (SGB + CGB) - + ROM Only Nur ROM - + MBC1 MBC1 - + MBC2 MBC2 - + MBC3 MBC3 - + MBC3 + RTC MBC3 + RTC - + MBC5 MBC5 - + MBC5 + Rumble MBC5 + Rumble - + MBC6 MBC6 - + MBC7 (Tilt) MBC7 (Tilt) - + MMM01 MMM01 - + HuC-1 HuC-1 - + HuC-3 HuC-3 - + Pocket Cam Pocket Cam - + TAMA5 TAMA5 - + Wisdom Tree Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) NT (neu) - + Pokémon Jade/Diamond Pokémon Jade/Diamond - + BBD BBD - + Hitek Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) Sachen (MMC1) - + Sachen (MMC2) Sachen (MMC2) @@ -2956,7 +3188,7 @@ Download-Größe: %3 Defekt - + Slot %1 Speicherplatz %1 @@ -4116,12 +4348,12 @@ Download-Größe: %3 QGBA::ReportView - + Bug report archive Fehlerbericht speichern - + ZIP archive (*.zip) ZIP-Archiv (*.zip) @@ -4133,7 +4365,7 @@ Download-Größe: %3 <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>Um einen Fehler zu melden, erstelle bitte zuerst eine berichtsdatei, welche Du an deinen Fehlerbericht anhängen kannst. Es wird empfohlen, dass du in dem Archiv auch eine Spielstand-Datei beilegst, da diese häufig bei der Fehlersuche behilflich ist. Der Fehlerbericht wird einige Informationen über die verwendete Version von {projectName}, dein System, deinen Computer und das derzeit geöffnete Spiel. Sobald die Sammlung vollständig ist, kannst du alle gesammelten Informationen einsehen und in eine ZIP-Datei speichern. Wir versuchen automatisch, so viele persönlichen Daten wie möglich zu entfernen. Nachdem du den Bericht erstellt und abgespeichert hast, klicke bitte auf den untenstehenden Button oder besuche <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> um einen Fehlerbericht auf GitHub zu erzeugen. </p></body></html> + <html><head/><body><p>Um einen Fehler zu melden, erstelle bitte zuerst eine Berichtsdatei, welche Du an deinen Fehlerbericht anhängen kannst. Es wird empfohlen, dass du in dem Archiv auch eine Spielstand-Datei beilegst, da diese häufig bei der Fehlersuche behilflich ist. Der Fehlerbericht wird einige Informationen über die verwendete Version von {projectName}, dein System, deinen Computer und das derzeit geöffnete Spiel. Sobald die Sammlung vollständig ist, kannst du alle gesammelten Informationen einsehen und in eine ZIP-Datei speichern. Wir versuchen automatisch, so viele persönlichen Daten wie möglich zu entfernen. Nachdem du den Bericht erstellt und abgespeichert hast, klicke bitte auf den untenstehenden Button oder besuche <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> um einen Fehlerbericht auf GitHub zu erzeugen. </p></body></html> @@ -5646,95 +5878,95 @@ Download-Größe: %3 QGBA::SettingsView - - + + Qt Multimedia Qt Multimedia - + SDL SDL - + Software (Qt) Software (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (erzwinge Version 1.x) - + None Keiner - + None (Still Image) Keiner (Standbild) - + Keyboard Tastatur - + Controllers Gamepads - + Shortcuts Tastenkürzel - - + + Shaders Shader - + Select BIOS BIOS auswählen - + Select directory Verzeichnis auswählen - + (%1×%2) (%1×%2) - + Never Nie - + Just now Gerade eben - + Less than an hour ago Vor weniger als einer Stunde - + %n hour(s) ago Vor %n Stunde @@ -5742,7 +5974,7 @@ Download-Größe: %3 - + %n day(s) ago Vor %n Tag @@ -6059,37 +6291,37 @@ Download-Größe: %3 Jetzt überprüfen - + 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: @@ -6831,7 +7063,7 @@ Download-Größe: %3 WavPack - + WavPack @@ -6907,105 +7139,85 @@ Download-Größe: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - Game Boy Advance-ROMs (%1) - - - - Game Boy ROMs (%1) - Game Boy-ROMs (%1) - - - - All ROMs (%1) - Alle ROMs (%1) - - - - %1 Video Logs (*.mvl) - %1 Video-Logs (*.mvl) - - - + Archives (%1) Archive (%1) - - - + + + Select ROM ROM auswählen - - + + Select save Speicherdatei wählen - + Select patch Patch wählen - + Patches (*.ips *.ups *.bps) Korrekturen (*.ips *.ups *.bps) - + Select e-Reader card images Bilder der Lesegerät-Karte auswählen - + Image file (*.png *.jpg *.jpeg) Bilddatei (*.png *.jpg *.jpeg) - + Conversion finished Konvertierung abgeschlossen - + %1 of %2 e-Reader cards converted successfully. %1 von %2 Lesegerät-Karten erfolgreich konvertiert. - + Select image Bild auswählen - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Bild-Datei (*.png *.gif *.jpg *.jpeg);;Alle Dateien (*) - + GameShark saves (*.sps *.xps) GameShark-Speicherdaten (*.sps *.xps) - + Select video log Video-Log auswählen - + Video logs (*.mvl) Video-Logs (*.mvl) - + Crash Absturz - + The game has crashed with the following error: %1 @@ -7014,679 +7226,684 @@ Download-Größe: %3 %1 - + Unimplemented BIOS call Nicht implementierter BIOS-Aufruf - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Dieses Spiel verwendet einen BIOS-Aufruf, der nicht implementiert ist. Bitte verwenden Sie für die beste Spielerfahrung das offizielle BIOS. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Es konnte kein geeignetes Ausgabegerät erstellt werden, stattdessen wird Software-Rendering als Rückfalloption genutzt. Spiele laufen möglicherweise langsamer, besonders innerhalb großer Fenster. - + Really make portable? Portablen Modus wirklich aktivieren? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Diese Einstellung wird den Emulator so konfigurieren, dass er seine Konfiguration aus dem gleichen Verzeichnis wie die Programmdatei lädt. Möchten Sie fortfahren? - + Restart needed Neustart benötigt - + Some changes will not take effect until the emulator is restarted. Einige Änderungen werden erst übernommen, wenn der Emulator neu gestartet wurde. - + - Player %1 of %2 - Spieler %1 von %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 Bilder/Sekunde) - %4 - + &File &Datei - + Load &ROM... &ROM laden... - + Load ROM in archive... ROM aus Archiv laden... - + Save games Spielstände - + Automatically determine Automatisch erkennen - + Use player %0 save game Verwende Spielstand von Spieler %0 - + Load &patch... &Patch laden... - + Boot BIOS BIOS booten - + Replace ROM... ROM ersetzen... - + Convert e-Reader card image to raw... Lesegerät-Kartenbild in Rohdaten umwandeln … - + ROM &info... ROM-&Informationen... - + Recent Zuletzt verwendet - + Make portable Portablen Modus aktivieren - + &Load state Savestate (aktueller Zustand) &laden - + Load state file... Savestate-Datei laden... - + &Save state Savestate (aktueller Zustand) &speichern - + Save state file... Savestate-Datei speichern... - + Quick load Schnell laden - + Quick save Schnell speichern - + Load recent Lade zuletzt gespeicherten Savestate - + Save recent Speichere aktuellen Zustand - + Undo load state Laden des Savestate rückgängig machen - + Undo save state Speichern des Savestate rückgängig machen - - + + State &%1 Savestate &%1 - + Load camera image... Lade Kamerabild... - + Convert save game... Spielstand konvertieren... - + Reset needed Zurücksetzen erforderlich - + Some changes will not take effect until the game is reset. Einige Änderungen werden erst dann wirksam, wenn das Spiel zurückgesetzt wird. - + New multiplayer window Neues Multiplayer-Fenster - + Connect to Dolphin... Mit Dolphin verbinden... - + Report bug... Fehler melden... - + E&xit &Beenden - + &Emulation &Emulation - + &Reset Zu&rücksetzen - + Sh&utdown Schli&eßen - + Yank game pak Spielmodul herausziehen - + &Pause &Pause - + &Next frame &Nächstes Bild - + Fast forward (held) Schneller Vorlauf (gehalten) - + &Fast forward Schneller &Vorlauf - + Fast forward speed Vorlauf-Geschwindigkeit - + Unbounded Unbegrenzt - + %0x %0x - + Rewind (held) Zurückspulen (gehalten) - + Re&wind Zur&ückspulen - + Step backwards Schrittweiser Rücklauf - + Solar sensor Sonnen-Sensor - + Increase solar level Sonnen-Level erhöhen - + Decrease solar level Sonnen-Level verringern - + Brightest solar level Hellster Sonnen-Level - + Darkest solar level Dunkelster Sonnen-Level - + Brightness %1 Helligkeit %1 - + BattleChip Gate... BattleChip Gate... - + Audio/&Video Audio/&Video - + Frame size Bildgröße - + Toggle fullscreen Vollbildmodus umschalten - + Lock aspect ratio Seitenverhältnis korrigieren - + Force integer scaling Pixelgenaue Skalierung (Integer scaling) - + Interframe blending Interframe-Überblendung - + Frame&skip Frame&skip - + Mute Stummschalten - + FPS target Bildwiederholrate - + Take &screenshot &Screenshot erstellen - + F12 F12 - + Scripting... Scripting... - + + Create forwarder... + + + + Game state views Spiel-Zustände ansehen - + Clear Leeren - + Game Boy Printer... Game Boy Printer... - + Video layers Video-Ebenen - + Audio channels Audio-Kanäle - + Adjust layer placement... Lage der Bildebenen anpassen... - + &Tools &Werkzeuge - + View &logs... &Logs ansehen... - + Game &overrides... Spiel-&Überschreibungen... - + &Cheats... &Cheats... - + Open debugger console... Debugger-Konsole öffnen... - + Start &GDB server... &GDB-Server starten... - + Settings... Einstellungen... - + Select folder Ordner auswählen - + Save games (%1) Spielstände (%1) - + Select save game Spielstand auswählen - + mGBA save state files (%1) mGBA-Savestates (%1) - - + + Select save state Savestate auswählen - + Select e-Reader dotcode e-Reader-Code auswählen - + e-Reader card (*.raw *.bin *.bmp) e-Reader-Karte (*.raw *.bin *.bmp) - + GameShark saves (*.gsv *.sps *.xps) GameShark-Spielstände (*.gsv *.sps *.xps) - + Couldn't Start Konnte nicht gestartet werden - + Could not start game. Spiel konnte nicht gestartet werden. - + Add folder to library... Ordner zur Bibliothek hinzufügen... - + Load alternate save game... Alternativen Spielstand laden... - + Load temporary save game... Temporären Spielstand laden... - + Scan e-Reader dotcodes... e-Reader-Code einlesen... - + Import GameShark Save... GameShare-Speicherstand importieren... - + Export GameShark Save... GameShark-Speicherstand exportieren... - + About... Über... - + %1× %1x - + Bilinear filtering Bilineare Filterung - + Native (59.7275) Nativ (59.7275) - + Record A/V... Audio/Video aufzeichnen... - + Record GIF/WebP/APNG... GIF/WebP/APNG aufzeichnen... - + Game Pak sensors... Spielmodul-Sensoren... - + View &palette... &Palette betrachten... - + View &sprites... &Sprites betrachten... - + View &tiles... &Tiles betrachten... - + View &map... &Map betrachten... - + &Frame inspector... &Bildbetrachter... - + View memory... Speicher betrachten... - + Search memory... Speicher durchsuchen... - + View &I/O registers... &I/O-Register betrachten... - + Record debug video log... Video-Protokoll aufzeichnen... - + Stop debug video log Aufzeichnen des Video-Protokolls beenden - + Exit fullscreen Vollbildmodus beenden - + GameShark Button (held) GameShark-Taste (gehalten) - + Autofire Autofeuer - + Autofire A Autofeuer A - + Autofire B Autofeuer B - + Autofire L Autofeuer L - + Autofire R Autofeuer R - + Autofire Start Autofeuer Start - + Autofire Select Autofeuer Select - + Autofire Up Autofeuer nach oben - + Autofire Right Autofeuer rechts - + Autofire Down Autofeuer nach unten - + Autofire Left Autofeuer links @@ -7694,32 +7911,32 @@ Download-Größe: %3 QObject - + %1 byte %1 Byte - + %1 kiB %1 KiB - + %1 MiB %1 MiB - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/medusa-emu-es.ts b/src/platform/qt/ts/medusa-emu-es.ts index 8cf07904c..994566710 100644 --- a/src/platform/qt/ts/medusa-emu-es.ts +++ b/src/platform/qt/ts/medusa-emu-es.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + ROMs de Game Boy Advance (%1) + + + + Game Boy ROMs (%1) + ROMs de Game Boy (%1) + + + + All ROMs (%1) + Todas las ROMs (%1) + + + + %1 Video Logs (*.mvl) + Registros de vídeo de %1 (*.mvl) + + QGBA::AboutScreen @@ -21,7 +44,7 @@ {projectName} would like to thank the following patrons from Patreon: - {projectName} desea agradecer a los siguientes patrocinadores desde Patreon: + {projectName} desea agradecer a los siguientes patrocinadores de Patreon: @@ -55,14 +78,14 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Do you want to download and install it now? You will need to restart the emulator when the download is complete. -¿Quieres descargarlo e instalarlo ahora? Deberá reiniciar el emulador cuando se complete la descarga. +¿Quieres descargarlo e instalarlo ahora? Deberás reiniciar el emulador cuando se complete la descarga. Auto-update is not available on this platform. If you wish to update you will need to do it manually. -La actualización automática no está disponible en esta plataforma. Si desea actualizar, deberá hacerlo manualmente. +La actualización automática no está disponible en esta plataforma. Si deseas actualizar, deberás hacerlo manualmente. @@ -71,7 +94,7 @@ New version: %2 Download size: %3 Versión actual: %1 Nueva versión: %2 -Tamaño de la descarga: %3 +Tamaño de descarga: %3 @@ -92,22 +115,22 @@ Tamaño de la descarga: %3 QGBA::ApplicationUpdater - + Stable Estable - + Development Desarrollo - + Unknown - Desconocido + Desconocido - + (None) (Ninguno) @@ -117,7 +140,7 @@ Tamaño de la descarga: %3 Open in archive... - Abrir desde contenedor... + Abrir desde archivo comprimido... @@ -130,12 +153,12 @@ Tamaño de la descarga: %3 Tile # - Tile Nº + Tesela nº Palette # - Paleta Nº + Paleta nº @@ -170,12 +193,12 @@ Tamaño de la descarga: %3 Can't set format of context-less audio device - + No se puede establecer el formato de un dispositivo de audio sin contexto Audio device is missing its core - + No se encuentra el sistema del dispositivo de audio @@ -188,7 +211,7 @@ Tamaño de la descarga: %3 Can't start an audio processor without input - Sin entrada no se puede iniciar un procesador de audio + No se puede iniciar el procesador de audio sin entrada @@ -196,7 +219,7 @@ Tamaño de la descarga: %3 Can't start an audio processor without input - Sin entrada no se puede iniciar un procesador de audio + No se puede iniciar el procesador de audio sin entrada @@ -229,7 +252,7 @@ Tamaño de la descarga: %3 Add - Agregar + Añadir @@ -259,7 +282,7 @@ Tamaño de la descarga: %3 Show advanced - Mostrar ajustes avanzados + Mostrar configuración avanzada @@ -269,23 +292,23 @@ Tamaño de la descarga: %3 BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? - Faltan los datos de BattleChip. BattleChip Gates seguirán funcionando, pero faltarán algunos gráficos. ¿Quiere descargar los datos ahora? + Faltan los datos de BattleChip. Los BattleChip Gates seguirán funcionando pero faltarán algunos gráficos. ¿Quieres descargar los datos ahora? Select deck file - + Seleccionar fichero de baraja Incompatible deck - + Baraja no compatible The selected deck is not compatible with this Chip Gate - + La baraja seleccionada no es compatible con este Chip Gate @@ -358,7 +381,7 @@ Tamaño de la descarga: %3 Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. - Algunos trucos no se pudieron añadir. Asegúrese de que están en el formato correcto y/o pruebe otro tipo de trucos. + Algunos trucos no se pudieron añadir. Asegúrate de que están en el formato correcto y/o prueba otro tipo de trucos. @@ -397,15 +420,15 @@ Tamaño de la descarga: %3 Can't yank pack in unexpected platform! - ¡No se puede remover el cartucho en esta plataforma! + ¡No se puede quitar el cartucho en esta plataforma! - + Failed to open snapshot file for reading: %1 Error al leer del archivo de captura: %1 - + Failed to open snapshot file for writing: %1 Error al escribir al archivo de captura: %1 @@ -413,19 +436,19 @@ Tamaño de la descarga: %3 QGBA::CoreManager - + Failed to open game file: %1 Error al abrir el archivo del juego: %1 - + Could not load game. Are you sure it's in the correct format? No se pudo cargar el juego. ¿Estás seguro de que está en el formato correcto? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). - Error al abrir el archivo de guardado; las partidas guardadas no se pueden actualizar. Por favor, asegúrese de que es posible escribir en el directorio de partidas guardadas sin necesidad de privilegios adicionales (Por ejemplo, UAC en Windows). + Error al abrir el archivo de guardado; las partidas guardadas no se pueden actualizar. Por favor, asegúrate de que es posible escribir en el directorio de partidas guardadas sin necesidad de privilegios adicionales (por ejemplo, UAC en Windows). @@ -451,7 +474,7 @@ Tamaño de la descarga: %3 Could not open CLI history for writing - No se ha podido abrir el historial de la linea de comandos para escritura + No se ha podido abrir el historial de la línea de comandos para escritura @@ -464,7 +487,7 @@ Tamaño de la descarga: %3 Local computer - Computadora local + Ordenador local @@ -494,11 +517,200 @@ Tamaño de la descarga: %3 Couldn't Connect - + No se pudo conectar Could not connect to Dolphin. + No se pudo conectar a Dolphin. + + + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Fondo + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Examinar + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image @@ -522,12 +734,12 @@ Tamaño de la descarga: %3 Backdrop color - Color de telón de fondo (backdrop) + Color de telón de fondo Disable scanline effects - Desactivar efectos de línea de trazado + Desactivar efectos de scanline @@ -537,7 +749,7 @@ Tamaño de la descarga: %3 Reset - Reinicializar + Reiniciar @@ -557,12 +769,12 @@ Tamaño de la descarga: %3 Background - Fondo (BG) + Fondo Window - Ventana (WIN) + Ventana @@ -593,7 +805,7 @@ Tamaño de la descarga: %3 QGBA::GBAApp - + Enable Discord Rich Presence Habilitar Rich Presence en Discord @@ -601,22 +813,22 @@ Tamaño de la descarga: %3 QGBA::GBAKeyEditor - + Clear Button - Limpiar botones + Reestablecer botones - + Clear Analog - Limpiar análogo + Reestablecer sticks analógicos - + Refresh Actualizar - + Set all Configurar todo @@ -641,7 +853,7 @@ Tamaño de la descarga: %3 Write watchpoints behavior - + Guardar el comportamiento de las expresiones vigiladas @@ -749,152 +961,172 @@ Tamaño de la descarga: %3 QGBA::GameBoy - - - - Autodetect - Detección automática - - - - Game Boy (DMG) - - - - - Game Boy Pocket (MGB) - - - - - Super Game Boy (SGB) - - - - - Super Game Boy 2 (SGB) - - - Game Boy Color (CGB) - + + Autodetect + Detección automática - Game Boy Advance (AGB) - + Game Boy (DMG) + Game Boy (DMG) - Super Game Boy Color (SGB + CGB) - + Game Boy Pocket (MGB) + Game Boy Pocket (MGB) - + + Super Game Boy (SGB) + Super Game Boy (SGB) + + + + Super Game Boy 2 (SGB) + Super Game Boy 2 (SGB) + + + + Game Boy Color (CGB) + Game Boy Color (CGB) + + + + Game Boy Advance (AGB) + Game Boy Advance (AGB) + + + + Super Game Boy Color (SGB + CGB) + Super Game Boy Color (SGB + CGB) + + + ROM Only Solo ROM - - - MBC1 - - - - - MBC2 - - - - - MBC3 - - - - - MBC3 + RTC - - - - - MBC5 - - - MBC5 + Rumble - + MBC1 + MBC1 - MBC6 - + MBC2 + MBC2 - MBC7 (Tilt) - + MBC3 + MBC3 - MMM01 - + MBC3 + RTC + MBC3 + RTC - HuC-1 - + MBC5 + MBC5 - HuC-3 - + MBC5 + Rumble + MBC5 + Vibración - Pocket Cam - + MBC6 + MBC6 - TAMA5 - TAMA5 + MBC7 (Tilt) + MBC7 (Ladeado) - Wisdom Tree - + MMM01 + MMM01 - NT (new) - + HuC-1 + HuC-1 - Pokémon Jade/Diamond - + HuC-3 + HuC-3 - BBD - + Pocket Cam + Pocket Cam - Hitek - + TAMA5 + TAMA5 - Sachen (MMC1) - + Wisdom Tree + Wisdom Tree - Sachen (MMC2) + NT (old 1) + + + NT (old 2) + + + + + NT (new) + NT (nuevo) + + + + Pokémon Jade/Diamond + Pokémon Jade/Diamante + + + + BBD + BBD + + + + Hitek + Hitek + + + + GGB-81 + + + + + Li Cheng + + + + + Sachen (MMC1) + Sachen (MMC1) + + + + Sachen (MMC2) + Sachen (MMC2) + QGBA::IOViewer @@ -918,22 +1150,22 @@ Tamaño de la descarga: %3 Background mode - Modo de fondo (BG) + Modo de fondo Mode 0: 4 tile layers - Modo 0: 4 capas de tiles + Modo 0: 4 capas de tesela Mode 1: 2 tile layers + 1 rotated/scaled tile layer - Modo 1: 2 capas de tiles + 1 capa de tiles con rotación/escalado + Modo 1: 2 capas de teselas + 1 capa de tesela con rotación/escalado Mode 2: 2 rotated/scaled tile layers - Modo 2: 2 capas de tiles con rotación/escalado + Modo 2: 2 capas de teselas con rotación/escalado @@ -968,7 +1200,7 @@ Tamaño de la descarga: %3 Linear OBJ tile mapping - Asignación de tiles OBJ lineal + Asignación de teselas OBJ lineal @@ -978,22 +1210,22 @@ Tamaño de la descarga: %3 Enable background 0 - Habilitar BG 0 + Habilitar fondo 0 Enable background 1 - Habilitar BG 1 + Habilitar fondo 1 Enable background 2 - Habilitar BG 2 + Habilitar fondo 2 Enable background 3 - Habilitar BG 3 + Habilitar fondo 3 @@ -1023,17 +1255,17 @@ Tamaño de la descarga: %3 Currently in VBlank - En VBlank ahora + Ahora en VBlank Currently in HBlank - En HBlank ahora + Ahora en HBlank Currently in VCounter - En VCounter ahora + Ahora en VCounter @@ -1053,12 +1285,12 @@ Tamaño de la descarga: %3 VCounter scanline - Línea de exploración VCounter + Scanline VCounter Current scanline - Línea de exploración actual + Scanline actual @@ -1074,7 +1306,7 @@ Tamaño de la descarga: %3 Tile data base (* 16kB) - Dirección base de tiles (* 16kB) + Dirección base de tesela (* 16kB) @@ -1098,7 +1330,7 @@ Tamaño de la descarga: %3 Tile map base (* 2kB) - Dirección base de asignación de tiles (* 2kB) + Dirección base de asignación de tesela (* 2kB) @@ -1106,13 +1338,13 @@ Tamaño de la descarga: %3 Background dimensions - Dimensiones de BG + Dimensiones de fondo Overflow wraps - Envolver en desbordamiento + Envolver desbordamiento @@ -1160,7 +1392,7 @@ Tamaño de la descarga: %3 Integer part - Parte entera + Parte de entero @@ -1168,7 +1400,7 @@ Tamaño de la descarga: %3 Integer part (low) - Parte entera (baja) + Parte de entero (baja) @@ -1176,7 +1408,7 @@ Tamaño de la descarga: %3 Integer part (high) - Parte entera (alta) + Parte de entero (alta) @@ -1205,112 +1437,112 @@ Tamaño de la descarga: %3 Window 0 enable BG 0 - Window 0 habilitar BG 0 + Ventana 0 habilitar fondo 0 Window 0 enable BG 1 - Window 0 habilitar BG 1 + Ventana 0 habilitar fondo 1 Window 0 enable BG 2 - Window 0 habilitar BG 2 + Ventana 0 habilitar fondo 2 Window 0 enable BG 3 - Window 0 habilitar BG 3 + Ventana 0 habilitar fondo 3 Window 0 enable OBJ - Window 0 habilitar OBJ + Ventana 0 habilitar OBJ Window 0 enable blend - Window 0 habilitar mezcla + Ventana 0 habilitar mezcla Window 1 enable BG 0 - Window 1 habilitar BG 0 + Ventana 1 habilitar fondo 0 Window 1 enable BG 1 - Window 1 habilitar BG 1 + Ventana 1 habilitar fondo 1 Window 1 enable BG 2 - Window 1 habilitar BG 2 + Ventana 1 habilitar fondo 2 Window 1 enable BG 3 - Window 1 habilitar BG 3 + Ventana 1 habilitar fondo 3 Window 1 enable OBJ - Window 1 habilitar OBJ + Ventana 1 habilitar OBJ Window 1 enable blend - Window 1 habilitar mezcla + Ventana 1 habilitar mezcla Outside window enable BG 0 - Window externa habilitar BG 0 + Ventana externa habilitar fondo 0 Outside window enable BG 1 - Window externa habilitar BG 1 + Ventana externa habilitar fondo 1 Outside window enable BG 2 - Window externa habilitar BG 2 + Ventana externa habilitar fondo 2 Outside window enable BG 3 - Window externa habilitar BG 3 + Ventana externa habilitar fondo 3 Outside window enable OBJ - Window externa habilitar OBJ + Ventana externa habilitar OBJ Outside window enable blend - Outside window habilitar mezcla + Ventana externa habilitar mezcla OBJ window enable BG 0 - OBJ window habilitar BG 0 + Ventana OBJ habilitar fondo 0 OBJ window enable BG 1 - OBJ window habilitar BG 1 + Ventana OBJ habilitar fondo 1 OBJ window enable BG 2 - OBJ window habilitar BG 2 + Ventana OBJ habilitar fondo 2 OBJ window enable BG 3 - OBJ window habilitar BG 3 + Ventana OBJ habilitar fondo 3 @@ -1325,42 +1557,42 @@ Tamaño de la descarga: %3 Background mosaic size vertical - Tamaño vertical mosaico BG + Tamaño vertical de mosaico de fondo Background mosaic size horizontal - Tamaño horizontal mosaico BG + Tamaño horizontal de mosaico de fondo Object mosaic size vertical - Tamaño vertical mosaico OBJ + Tamaño vertical de mosaico de objeto Object mosaic size horizontal - Tamaño horizontal mosaico OBJ + Tamaño horizontal de mosaico de objeto BG 0 target 1 - BG 0 objetivo 1 + Fondo 0 objetivo 1 BG 1 target 1 - BG 1 objetivo 1 + Fondo 1 objetivo 1 BG 2 target 1 - BG 2 objetivo 1 + Fondo 2 objetivo 1 BG 3 target 1 - BG 3 objetivo 1 + Fondo 3 objetivo 1 @@ -1400,22 +1632,22 @@ Tamaño de la descarga: %3 BG 0 target 2 - BG 0 objetivo 2 + Fondo 0 objetivo 2 BG 1 target 2 - BG 1 objetivo 2 + Fondo 1 objetivo 2 BG 2 target 2 - BG 2 objetivo 2 + Fondo 2 objetivo 2 BG 3 target 2 - BG 3 objetivo 2 + Fondo 3 objetivo 2 @@ -1539,7 +1771,7 @@ Tamaño de la descarga: %3 Reset - Reinicializar + Reiniciar @@ -1738,7 +1970,7 @@ Tamaño de la descarga: %3 Channel A reset - Canal A reinicializar + Reiniciar canal A @@ -1758,7 +1990,7 @@ Tamaño de la descarga: %3 Channel B reset - Canal B reinicializar + Reiniciar canal B @@ -2108,7 +2340,7 @@ Tamaño de la descarga: %3 Video Capture - Captura de video + Captura de vídeo @@ -2543,7 +2775,7 @@ Tamaño de la descarga: %3 Background tile map - Mapa de tiles en fondo (BG) + Mapa de tesela de fondo @@ -2560,7 +2792,7 @@ Tamaño de la descarga: %3 Background tile data - Datos de tiles de fondo + Datos de tesela de fondo @@ -2580,7 +2812,7 @@ Tamaño de la descarga: %3 Window tile map - Mapa de tiles en window + Mapa de tesela en pantalla @@ -2910,7 +3142,7 @@ Tamaño de la descarga: %3 Dañado - + Slot %1 Espacio %1 @@ -3107,7 +3339,7 @@ Tamaño de la descarga: %3 Tile base - Base tiles + Base de tesela @@ -3550,7 +3782,7 @@ Tamaño de la descarga: %3 Transform - Transform + Transformar @@ -3631,7 +3863,7 @@ Tamaño de la descarga: %3 Tile - Tile + Tesela @@ -3909,7 +4141,7 @@ Tamaño de la descarga: %3 Export BG - Exportar BG + Exportar fondo @@ -4008,12 +4240,12 @@ Tamaño de la descarga: %3 Save Printout - + Guardar impresión Portable Network Graphics (*.png) - + Portable Network Graphics (*.png) @@ -4070,24 +4302,24 @@ Tamaño de la descarga: %3 QGBA::ReportView - + Bug report archive - Archivo del reporte de bugs + Archivo del informe de errores - + ZIP archive (*.zip) Archivo ZIP (*.zip) Generate Bug Report - Generar informe de defecto + Generar informe de error <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>Antes de enviar un reporte de errores, primero genera un archivo de reporte para enviarlo como adjunto. Recomendamos adjuntar los archivos de guardado ya que puede ayudar con la investigación de reportes. Esto recopilara alguna información sobre la versión de {projectName} que corres, su configuración, su computadora, y el juego que tiene abierto (si alguno). Cuando esta colección termine, puede visualizar toda la información y guardarla a un archivo ZIP. Este proceso intentara eliminar automáticamente sus datos personales (como su usuario, si se encuentra en algunas de las rutas de directorio generadas), pero las puede modificar luego por si acaso. Luego generar y guardar el reporte, pulse el botón inferior o visite <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> para presentar el reporte en GitHub. ¡Asegúrese de agregar el archivo del reporte que ha generado!</p></body></html> + <html><head/><body><p>Antes de enviar un informe de errores, por favor primero genera un archivo de reporte para enviarlo como adjunto. Recomendamos adjuntar los archivos de guardado ya que puede ayudar con la investigación de reportes. Esto recopilará información sobre la versión de {projectName} que estás ejecutando y su configuración, tu ordenador, y el juego que tienes abierto (si hay alguno). Cuando esto termine, puedes ver toda la información y guardarla en un archivo ZIP. Este proceso intentará eliminar automáticamente tus datos personales (como tu usuario, si se encuentra en algunas de las rutas de directorio generadas), pero siempre se puede modificiar luego. Tras generar y guardar el reporte, pulsa el botón inferior o visita <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> para subirlo a GitHub. ¡Asegúrate de adjuntar el informe que has generado!</p></body></html> @@ -4107,12 +4339,12 @@ Tamaño de la descarga: %3 Include save file - Incluir archivo de guardado + Incluir partida guardada Create and include savestate - Crear y incluir archivo de estado + Crear e incluir archivo de estado @@ -4294,7 +4526,7 @@ Tamaño de la descarga: %3 Untitled buffer - + Búfer sin nombre @@ -4302,52 +4534,52 @@ Tamaño de la descarga: %3 Scripting - + Scripts Run - + Ejecutar File - + Archivo Load recent script - + Cargar script reciente Load script... - + Cargar script... &Reset - &Reinicializar + &Reiniciar 0 - 0 + 0 Select script to load - + Elegir script Lua scripts (*.lua) - + Scripts de Lua (*.lua) All files (*.*) - + Todos los archivos (*.*) @@ -4385,12 +4617,12 @@ Tamaño de la descarga: %3 Offset time - + Tiempo de compensación sec - + seg @@ -4438,95 +4670,95 @@ Tamaño de la descarga: %3 QGBA::SettingsView - - + + Qt Multimedia Qt Multimedia - + SDL SDL - + Software (Qt) Software (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (forzar versión 1.x) - + None - Ninguno + Ninguno - + None (Still Image) Nada (imagen estática) - + Keyboard Teclado - + Controllers - Controladores + Mandos - + Shortcuts Atajos de teclado - - + + Shaders Shaders - + Select BIOS Seleccionar BIOS - + Select directory Elegir carpeta - + (%1×%2) - + Never Nunca - + Just now Ahora mismo - + Less than an hour ago Hace menos de una hora - + %n hour(s) ago Hace %n hora @@ -4534,7 +4766,7 @@ Tamaño de la descarga: %3 - + %n day(s) ago Hace %n dia @@ -4549,12 +4781,12 @@ Tamaño de la descarga: %3 Audio/Video - Audio/video + Audio/vídeo Gameplay - + Jugabilidad @@ -4599,7 +4831,7 @@ Tamaño de la descarga: %3 Audio driver: - Sistema de audio: + Controlador de audio: @@ -4719,7 +4951,7 @@ Tamaño de la descarga: %3 Display driver: - Sistema de video: + Controlador de vídeo: @@ -4756,7 +4988,7 @@ Tamaño de la descarga: %3 Video - Video + Vídeo @@ -4777,7 +5009,7 @@ Tamaño de la descarga: %3 Show filename instead of ROM name in library view - Mostrar el nombre del archivo en vez del nombre de la ROM en la vista de librería + Mostrar nombre del archivo en la vista de biblioteca @@ -4788,32 +5020,32 @@ Tamaño de la descarga: %3 When inactive: - Cuando este inactivo: + Cuando esté inactiva: On loading a game: - + Al guardar la partida: Load last state - + Cargar último estado Load cheats - + Cargar trucos Save entered cheats - + Guardar trucos introducidos When minimized: - Cuando este minimizada: + Cuando esté minimizada: @@ -4838,7 +5070,7 @@ Tamaño de la descarga: %3 Update channel: - Actualizar canal: + Canal de actualizaciones: @@ -4853,7 +5085,7 @@ Tamaño de la descarga: %3 Last checked: - Ultima vez comprobado: + Comprobado por última vez: @@ -4866,37 +5098,37 @@ Tamaño de la descarga: %3 Comprobar ahora - + 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: @@ -4913,7 +5145,7 @@ Tamaño de la descarga: %3 Dynamically update window title - Actualizar titulo de ventana dinámicamente + Actualizar título de ventana dinámicamente @@ -4949,7 +5181,7 @@ Tamaño de la descarga: %3 Show filename instead of ROM name in title bar - Enseñar el nombre de archivo en lugar del nombre de ROM en el titulo de la ventana + Mostrar nombre de archivo en el título de ventana @@ -4964,12 +5196,12 @@ Tamaño de la descarga: %3 Log to file - Guardar a archivo + Guardar en archivo Log to console - Guardar a consola + Escribir en consola @@ -5014,7 +5246,7 @@ Tamaño de la descarga: %3 Allow opposing input directions - Permitir direcciones opuestas al mismo tiempo + Permitir introducir teclas opuestas al mismo tiempo @@ -5050,7 +5282,7 @@ Tamaño de la descarga: %3 Rewind history: - Hist. de rebobinado: + Historial de rebobinado: @@ -5076,7 +5308,7 @@ Tamaño de la descarga: %3 Screenshot - Pantallazo + Captura de pantalla @@ -5087,7 +5319,7 @@ Tamaño de la descarga: %3 Preload entire ROM into memory - Cargar ROM completa a la memoria + Cargar ROM completa en la memoria @@ -5102,7 +5334,7 @@ Tamaño de la descarga: %3 Video renderer: - Renderizador de video: + Renderizador de vídeo: @@ -5145,12 +5377,12 @@ Tamaño de la descarga: %3 Use BIOS file if found - Usar archivo BIOS si fue encontrado + Usar archivo BIOS si está disponible Skip BIOS intro - Saltar animación de entrada del BIOS + Saltar animación de entrada de la BIOS @@ -5170,7 +5402,7 @@ Tamaño de la descarga: %3 Periodically autosave state - + Guardar estado automáticamente @@ -5184,7 +5416,7 @@ Tamaño de la descarga: %3 Same directory as the ROM - Al mismo directorio que la ROM + En el mismo directorio que la ROM @@ -5194,7 +5426,7 @@ Tamaño de la descarga: %3 Screenshots - Pantallazos + Capturas de pantalla @@ -5376,7 +5608,7 @@ Tamaño de la descarga: %3 Export tiles - Exportar tiles + Exportar teselas @@ -5392,7 +5624,7 @@ Tamaño de la descarga: %3 Tiles - Tiles + Teselas @@ -5412,7 +5644,7 @@ Tamaño de la descarga: %3 Palette - Paleta + Paleta @@ -5422,7 +5654,7 @@ Tamaño de la descarga: %3 Tiles per row - Tiles por fila + Teselas por fila @@ -5432,22 +5664,22 @@ Tamaño de la descarga: %3 Displayed tiles - + Teselas mostradas Only BG tiles - Solo BG tiles + Sólo teselas de fondo Only OBJ tiles - Solo OBJ tiles + Sólo teselas de objeto Both - Ambos + Ambos @@ -5465,12 +5697,12 @@ Tamaño de la descarga: %3 Failed to open output video file: %1 - Error al abrir el archivo de video de salida: %1 + Error al abrir el archivo de vídeo de salida: %1 Native (%0x%1) - Native (%0x%1) + Nativo (%0x%1) @@ -5480,7 +5712,7 @@ Tamaño de la descarga: %3 Record Video - Grabar video + Grabar vídeo @@ -5567,7 +5799,7 @@ Tamaño de la descarga: %3 &Native - &NAtivo + &Nativo @@ -5608,7 +5840,7 @@ Tamaño de la descarga: %3 WavPack - + WavPack @@ -5684,100 +5916,80 @@ Tamaño de la descarga: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - ROMs de Game Boy Advance (%1) - - - - Game Boy ROMs (%1) - ROMs de Game Boy (%1) - - - - All ROMs (%1) - Todas las ROMs (%1) - - - - %1 Video Logs (*.mvl) - Video-registros de %1 (*.mvl) - - - + Archives (%1) Contenedores (%1) - - - + + + Select ROM Seleccionar ROM - + Select folder Seleccionar carpeta - - + + Select save Seleccionar guardado - + Select patch Seleccionar parche - + Patches (*.ips *.ups *.bps) Parches (*.ips *.ups *.bps) - + Select e-Reader dotcode Seleccionar dotcode del e-Reader - + e-Reader card (*.raw *.bin *.bmp) Tarjeta e-Reader (*.raw *.bin *.bmp) - + Select image Seleccionar imagen - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Archivo de imagen (*.png *.gif *.jpg *.jpeg);;Todos los archivos (*) - + GameShark saves (*.sps *.xps) Guardados de GameShark (*.sps *.xps) - + Select video log - Seleccionar video-registro + Seleccionar registro de vídeo - + Video logs (*.mvl) - Video-registros (*.mvl) + Registros de vídeo (*.mvl) - + Crash Cierre inesperado - + The game has crashed with the following error: %1 @@ -5786,717 +5998,722 @@ Tamaño de la descarga: %3 %1 - + Unimplemented BIOS call Llamada a BIOS no implementada - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Este juego utiliza una llamada al BIOS que no se ha implementado. Utiliza el BIOS oficial para obtener la mejor experiencia. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. No se pudo crear un dispositivo de pantalla apropiado, recurriendo a software. Los juegos pueden funcionar lentamente, especialmente con ventanas grandes. - + Really make portable? ¿Hacer "portable"? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Esto hará que el emulador cargue su configuración desde el mismo directorio que el ejecutable. ¿Quieres continuar? - + Restart needed Reinicio necesario - + Some changes will not take effect until the emulator is restarted. Algunos cambios no surtirán efecto hasta que se reinicie el emulador. - + - Player %1 of %2 - Jugador %1 de %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Archivo - + Load &ROM... Cargar &ROM... - + Load ROM in archive... Cargar ROM desde contenedor... - + Add folder to library... Agregar carpeta a la biblioteca... - + Save games - Datos de guardado + Datos de guardado - + Automatically determine Determinar automáticamente - + Use player %0 save game Usar la partida guardada del jugador %0 - + Load &patch... Cargar &parche... - + Boot BIOS Arrancar BIOS - + Replace ROM... Reemplazar ROM... - + ROM &info... &Información de la ROM... - + Recent - Recientes + Cargar reciente - + Make portable - Hacer "portable" + Crear instalación portable - + &Load state Ca&rgar estado - + Report bug... - Reportar bug... + Reportar error... - + About... Acerca de... - + Game Pak sensors... Sensores del cartucho... - + Clear Limpiar - + Load state file... Cargar archivo de estado... - + Save games (%1) Juegos guardados (%1) - + Select save game Elegir juego guardado - + mGBA save state files (%1) Archivos estados guardados mGBA (%1) - - + + Select save state Elegir estado guardado - + Select e-Reader card images Elegir imágenes de tarjeta e-Reader - + Image file (*.png *.jpg *.jpeg) Archivo de imagen (*.png *.jpg *.jpeg) - + Conversion finished Conversión terminada - + %1 of %2 e-Reader cards converted successfully. %1 de %2 tarjetas e-Reader convertidas con éxito. - + Load alternate save game... - Elegir juego guardado alterno... + Cargar partida guardada alternativa... - + Load temporary save game... - Elegir juego guardado temporal... + Cargar partida guardada temporal... - + Convert e-Reader card image to raw... - Convertir imagen de tarjeta e-Reader a raw... + Convertir imagen de tarjeta e-Reader a archivo en bruto... - + &Save state Guardar e&stado - + Save state file... Guardar archivo de estado... - + Quick load Cargado rápido - + Quick save Guardado rápido - + Load recent Cargar reciente - + Save recent Guardar reciente - + Undo load state Deshacer cargar estado - + Undo save state Deshacer guardar estado - - + + State &%1 Estado &%1 - + Load camera image... - Cargar imagen para la cámara... + Cargar imagen para cámara... - + Convert save game... Convertir juego guardado... - + GameShark saves (*.gsv *.sps *.xps) Partidas guardadas de GameShark (*.gsv *.sps *.xps) - + Reset needed Reinicio necesario - + Some changes will not take effect until the game is reset. Algunos cambios no tendrán efecto hasta que se reinicie el juego. - + New multiplayer window Nueva ventana multijugador - + Connect to Dolphin... Conectar a Dolphin... - + E&xit Salir (&X) - + &Emulation &Emulación - + &Reset - &Reinicializar + &Reiniciar - + Sh&utdown Apagar (&U) - + Yank game pak - Tirar del cartucho + Sacar cartucho - + &Pause &Pausar - + &Next frame Cuadro siguie&nte - + Fast forward (held) Avance rápido (mantener) - + &Fast forward &Avance rápido - + Fast forward speed Velocidad de avance rápido - + Unbounded Sin límite - + %0x %0x - + Rewind (held) Rebobinar (mantener) - + Re&wind Re&bobinar - + Step backwards Paso hacia atrás - + Solar sensor Sensor solar - + Increase solar level Subir nivel - + Decrease solar level Bajar nivel - + Brightest solar level Más claro - + Darkest solar level Más oscuro - + Brightness %1 Brillo %1 - + Audio/&Video - Audio/&video + Audio/&vídeo - + Frame size Tamaño del cuadro - + Toggle fullscreen Pantalla completa - + Lock aspect ratio Bloquear proporción de aspecto - + Force integer scaling Forzar escala a enteros - + Bilinear filtering Filtro bilineal - + Frame&skip &Salto de cuadros - + Mute Silenciar - + FPS target Objetivo de FPS - + Native (59.7275) Nativo (59,7275) - + Take &screenshot Tomar pan&tallazo - + F12 F12 - + Game Boy Printer... Game Boy Printer... - + BattleChip Gate... BattleChip Gate... - + %1× %1× - + Interframe blending Mezcla entre cuadros - + Record A/V... Grabar A/V... - + Video layers - Capas de video + Capas de vídeo - + Audio channels Canales de audio - + Adjust layer placement... Ajustar ubicación de capas... - + &Tools Herramien&tas - + View &logs... Ver re&gistros... - + Game &overrides... Ajustes específic&os por juego... - + Couldn't Start No se pudo iniciar - + Could not start game. No se pudo iniciar el juego. - + Scan e-Reader dotcodes... Escanear dotcodes del e-Reader... - + Import GameShark Save... Importar desde GameShark... - + Export GameShark Save... Exportar a GameShark... - + Record GIF/WebP/APNG... Grabar GIF/WebP/APNG... - + &Cheats... Tru&cos... - + Settings... Ajustes... - + Open debugger console... Abrir consola de depuración... - + Start &GDB server... Iniciar servidor &GDB... - + Scripting... + Scripts... + + + + Create forwarder... - + Game state views - + Estado del juego - + View &palette... Ver &paleta... - + View &sprites... Ver &sprites... - + View &tiles... Ver m&osaicos... - + View &map... Ver &mapa... - + &Frame inspector... Inspec&tor de cuadros... - + View memory... Ver memoria... - + Search memory... Buscar memoria... - + View &I/O registers... Ver registros &I/O... - + Record debug video log... - Grabar registro de depuración de video... + Grabar registro de depuración de vídeo... - + Stop debug video log - Detener registro de depuración de video + Detener registro de depuración de vídeo - + Exit fullscreen Salir de pantalla completa - + GameShark Button (held) Botón GameShark (mantener) - + Autofire Disparo automático - + Autofire A Disparo automático A - + Autofire B Disparo automático B - + Autofire L Disparo automático L - + Autofire R Disparo automático R - + Autofire Start Disparo automático Start - + Autofire Select Disparo automático Select - + Autofire Up - Disparo automático Arriba + Disparo automático arriba - + Autofire Right - Disparo automático Derecha + Disparo automático derecha - + Autofire Down - Disparo automático Abajo + Disparo automático abajo - + Autofire Left - Disparo automático Izquierda + Disparo automático izquierda QObject - + %1 byte %1 byte - + %1 kiB %1 kiB - + %1 MiB %1 MiB - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/medusa-emu-it.ts b/src/platform/qt/ts/medusa-emu-it.ts index 45092ddac..7be66f1c1 100644 --- a/src/platform/qt/ts/medusa-emu-it.ts +++ b/src/platform/qt/ts/medusa-emu-it.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + ROM per Game Boy Advance (%1) + + + + Game Boy ROMs (%1) + ROM per Game Boy (%1) + + + + All ROMs (%1) + Tutte le ROM (%1) + + + + %1 Video Logs (*.mvl) + %1 log Video (*.mvl) + + QGBA::AboutScreen @@ -92,22 +115,22 @@ Dimensione del download: %3 QGBA::ApplicationUpdater - + Stable Stabile - + Development Sviluppo - + Unknown Sconosciuto - + (None) (Nessuno) @@ -400,12 +423,12 @@ Dimensione del download: %3 Non riesco a strappare il pacchetto in una piattaforma inaspettata! - + Failed to open snapshot file for reading: %1 Impossibile aprire il file snapshot per la lettura: %1 - + Failed to open snapshot file for writing: %1 Impossibile aprire il file snapshot per la scrittura: %1 @@ -413,17 +436,17 @@ Dimensione del download: %3 QGBA::CoreManager - + Failed to open game file: %1 Impossibile aprire il file di gioco: %1 - + Could not load game. Are you sure it's in the correct format? Impossibile caricare il gioco. Sei sicuro che sia nel formato corretto? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). Impossibile aprire il file di salvataggio; i salvataggi in gioco non possono essere aggiornati. Assicurati che la directory di salvataggio sia scrivibile senza privilegi aggiuntivi (ad esempio UAC su Windows). @@ -502,6 +525,195 @@ Dimensione del download: %3 Impossibile collegarsi a Dolphin. + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Sfondo + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Sfoglia + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -593,7 +805,7 @@ Dimensione del download: %3 QGBA::GBAApp - + Enable Discord Rich Presence Abilita Discord Rich Presence @@ -601,22 +813,22 @@ Dimensione del download: %3 QGBA::GBAKeyEditor - + Clear Button Svuota i pulsanti - + Clear Analog Svuota Analogici - + Refresh Aggiorna - + Set all Imposta tutti @@ -750,148 +962,168 @@ Dimensione del download: %3 QGBA::GameBoy - - + + Autodetect Rilevamento automatico - + Game Boy (DMG) Game Boy (DMG) - + Game Boy Pocket (MGB) Game Boy Pocket (MGB) - + Super Game Boy (SGB) Super Game Boy (SGB) - + Super Game Boy 2 (SGB) Super Game Boy 2 (SGB) - + Game Boy Color (CGB) Game Boy Color (CGB) - + Game Boy Advance (AGB) Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) Super Game Boy Color (SGB + CGB) - + ROM Only Solo ROM - + MBC1 MBC1 - + MBC2 MBC2 - + MBC3 MBC3 - + MBC3 + RTC MBC3 + RTC - + MBC5 MBC5 - + MBC5 + Rumble MBC5 + Tremolio - + MBC6 MBC6 - + MBC7 (Tilt) MBC7 (Tilt) - + MMM01 MMM01 - + HuC-1 HuC-1 - + HuC-3 HuC-3 - + Pocket Cam Pocket Cam - + TAMA5 TAMA5 - + Wisdom Tree Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) NT (nuovo) - + Pokémon Jade/Diamond Pokemon Giada/Diamante - + BBD BBD - + Hitek Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) Sachen (MMC1) - + Sachen (MMC2) Sachen (MMC2) @@ -2910,7 +3142,7 @@ Dimensione del download: %3 Corrotto - + Slot %1 Slot %1 @@ -4070,12 +4302,12 @@ Dimensione del download: %3 QGBA::ReportView - + Bug report archive Archivio delle segnalazioni di bug - + ZIP archive (*.zip) Archivio ZIP (*.zip) @@ -4438,95 +4670,95 @@ Dimensione del download: %3 QGBA::SettingsView - - + + Qt Multimedia Qt Multimedia - + SDL SDL - + Software (Qt) Software (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (forza la versione 1.x) - + None Nessuno - + None (Still Image) nessuno (immagine fissa) - + Keyboard Tastiera - + Controllers Controller - + Shortcuts Scorciatoie - - + + Shaders Shader - + Select BIOS Seleziona BIOS - + Select directory Seleziona directory - + (%1×%2) (%1×%2) - + Never Mai - + Just now Solo adesso - + Less than an hour ago Meno di un ora fa - + %n hour(s) ago %n ora fa @@ -4534,7 +4766,7 @@ Dimensione del download: %3 - + %n day(s) ago %n giorno fa @@ -4891,37 +5123,37 @@ Dimensione del download: %3 Tavolozza Game Boy - + Default color palette only Solo tavolozza colori predefinita - + SGB color palette if available Tavolozza colori SGB se disponibile - + GBC color palette if available Tavolozza colori GBC se disponibile - + SGB (preferred) or GBC color palette if available Tavolozza colori SGB (preferita) o GBC se disponibile - + Game Boy Camera Videocamera Game Boy - + Driver: Driver: - + Source: Sorgente: @@ -5684,115 +5916,95 @@ Dimensione del download: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - ROM per Game Boy Advance (%1) - - - - Game Boy ROMs (%1) - ROM per Game Boy (%1) - - - - All ROMs (%1) - Tutte le ROM (%1) - - - - %1 Video Logs (*.mvl) - %1 log Video (*.mvl) - - - + Archives (%1) Archivi (%1) - - - + + + Select ROM Seleziona ROM - - + + Select save Seleziona salvataggio - + Select patch Seleziona patch - + Patches (*.ips *.ups *.bps) Patch (*.ips *.ups *.bps) - + Select e-Reader dotcode Selezione e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) Scheda e-Reader (*.raw *.bin *.bmp) - + Select e-Reader card images Seleziona immagini carte e-Reader - + Image file (*.png *.jpg *.jpeg) File immagine (*.png *.jpg *.jpeg) - + Conversion finished Conversione terminata - + %1 of %2 e-Reader cards converted successfully. %1 di %2 carte e-Reader convertite con successo. - + Select image Seleziona immagine - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) File immagine (*.png *.gif *.jpg *.jpeg);;Tutti i file (*) - + GameShark saves (*.sps *.xps) Salvataggi GameShark (*.sps *.xps) - + Select video log Seleziona log video - + Video logs (*.mvl) Log video (*.mvl) - + Crash Errore fatale - + The game has crashed with the following error: %1 @@ -5801,669 +6013,674 @@ Dimensione del download: %3 %1 - + Unimplemented BIOS call BIOS non implementato - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Questo gioco utilizza una chiamata BIOS non implementata. Utilizza il BIOS ufficiale per una migliore esperienza. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Impossibile creare un dispositivo di visualizzazione appropriato, tornando alla visualizzazione software. I giochi possono funzionare lentamente, specialmente con finestre più grandi. - + Really make portable? Vuoi davvero rendere portatile l'applicazione? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? In questo modo l'emulatore carica la propria configurazione dalla stessa cartella dell'eseguibile. Vuoi continuare? - + Restart needed È necessario riavviare - + Some changes will not take effect until the emulator is restarted. Alcune modifiche non avranno effetto finché l'emulatore non verrà riavviato. - + - Player %1 of %2 - Giocatore %1 di %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... Carica ROM... - + Load ROM in archive... Carica la ROM in archivio... - + Load &patch... Carica patch... - + Boot BIOS Avvia BIOS - + Replace ROM... Sostituisci la ROM... - + Scan e-Reader dotcodes... Scansiona e-Reader dotcode... - + Convert e-Reader card image to raw... Converti immagini carte e-Reader in raw... - + ROM &info... Informazioni ROM... - + Recent Recenti - + Make portable Rendi portatile - + &Load state Carica stato - + &Save state Salva stato - + Quick load Caricamento rapido - + Quick save Salvataggio rapido - + Load recent Carica recente - + Save recent Salva recente - + Undo load state Annulla il caricamento dello stato - + Undo save state Annulla salvataggio stato - - + + State &%1 Stato %1 - + Load camera image... Carica immagine fotocamera... - + Convert save game... Converti salvataggi... - + GameShark saves (*.gsv *.sps *.xps) Salvataggi GameShark (*.gsv *.sps *.xps) - + Reset needed Reset necessario - + Some changes will not take effect until the game is reset. Alcune modifiche non si applicheranno finché il gioco non viene resettato. - + New multiplayer window Nuova finestra multigiocatore - + Connect to Dolphin... Connessione a Dolphin... - + Report bug... Segnala bug... - + E&xit Esci (&X) - + &Emulation Emulazione - + &Reset Reset - + Sh&utdown Spegni (&U) - + Yank game pak Stacca game pak - + &Pause Pausa - + &Next frame Salta il prossimo frame (&N) - + Fast forward (held) Avanzamento rapido (tieni premuto) - + &Fast forward Avanzamento rapido (&F) - + Fast forward speed Velocità di avanzamento rapido - + Unbounded Illimitata - + %0x %0x - + Rewind (held) Riavvolgimento (tieni premuto) - + Re&wind Riavvolgimento (&W) - + Step backwards Torna indietro - + Solar sensor Sensore solare - + Increase solar level Incrementa il livello solare - + Decrease solar level Riduci il livello solare - + Brightest solar level Livello solare massimo - + Darkest solar level Livello solare minimo - + Brightness %1 Luminosità %1 - + Audio/&Video Audio/Video - + Frame size Dimensione frame - + Toggle fullscreen Abilita schermo Intero - + Lock aspect ratio Blocca rapporti aspetto - + Frame&skip Salto frame - + Mute Muto - + FPS target FPS finali - + Take &screenshot Acquisisci schermata - + F12 F12 - + Record GIF/WebP/APNG... Registra GIF / WebP / APNG ... - + Video layers Layers video - + Audio channels Canali audio - + &Tools Strumenti - + View &logs... Visualizza registri (&log)... - + Game &overrides... Valore specifico per il gioco... - + &Cheats... Trucchi... - + + Create forwarder... + + + + Open debugger console... Apri console debugger... - + Start &GDB server... Avvia server GDB... - + Settings... Impostazioni... - + Select folder Seleziona cartella - + Couldn't Start Non è stato possibile avviare - + Could not start game. Non è stato possibile avviare il gioco. - + Add folder to library... Aggiungi cartella alla libreria... - + Load state file... Carica stato di salvataggio... - + Save state file... Salva stato di salvataggio... - + Import GameShark Save... Importa Salvataggio GameShark... - + Export GameShark Save... Esporta Salvataggio GameShark... - + About... Informazioni… - + Force integer scaling Forza ridimensionamento a interi - + Bilinear filtering Filtro bilineare - + Game Boy Printer... Stampante Game Boy... - + Save games (%1) Salvataggi (%1) - + Select save game Seleziona salvataggio - + mGBA save state files (%1) file di stati di salvataggio mGBA (%1) - - + + Select save state Seleziona stato di salvataggio - + Save games Salvataggi - + Load alternate save game... Carica stato di salvataggio alternativo... - + Load temporary save game... Carica salvataggio temporaneo... - + Automatically determine Determina automaticamente - + Use player %0 save game Usa il salvataggio del giocatore %0 - + BattleChip Gate... BattleChip Gate... - + %1× %1x - + Interframe blending Miscelazione dei frame - + Native (59.7275) Nativo (59.7) - + Record A/V... Registra A/V... - + Adjust layer placement... Regola posizionamento layer... - + Game Pak sensors... Sensori Game Pak... - + Scripting... Scripting... - + Game state views Viste degli stati del gioco - + View &palette... Mostra palette... - + View &sprites... Mostra sprites... - + View &tiles... Mostra tiles... - + View &map... Mostra mappa... - + &Frame inspector... &Frame inspector... - + View memory... Mostra memoria... - + Search memory... Ricerca memoria... - + View &I/O registers... Mostra registri I/O... - + Record debug video log... Registra video log di debug... - + Stop debug video log Ferma video log di debug - + Exit fullscreen Esci da Schermo Intero - + GameShark Button (held) Pulsante GameShark (tieni premuto) - + Autofire Pulsanti Autofire - + Autofire A Autofire A - + Autofire B Autofire B - + Autofire L Autofire L - + Autofire R Autofire R - + Autofire Start Autofire Start - + Autofire Select Autofire Select - + Autofire Up Autofire Su - + Autofire Right AAutofire Destra - + Autofire Down Autofire Giù - + Autofire Left Autofire Sinistra - + Clear Pulisci @@ -6471,32 +6688,32 @@ Dimensione del download: %3 QObject - + %1 byte %1 byte - + %1 kiB %1 kiB - + %1 MiB %1 MiB - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index ec361c5dc..43a29402c 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -86,22 +109,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -394,12 +417,12 @@ Download size: %3 - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -407,17 +430,17 @@ Download size: %3 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; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -496,6 +519,195 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -587,7 +799,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence @@ -595,22 +807,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh - + Set all @@ -744,148 +956,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2904,7 +3136,7 @@ Download size: %3 - + Slot %1 @@ -4064,12 +4296,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -4432,95 +4664,95 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) - + OpenGL - + OpenGL (force version 1.x) - + None - + None (Still Image) - + Keyboard - + Controllers - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -4528,7 +4760,7 @@ Download size: %3 - + %n day(s) ago @@ -4855,37 +5087,37 @@ Download size: %3 - + 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: @@ -5678,784 +5910,769 @@ Download size: %3 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... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Import GameShark Save... - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + 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 - + 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... - + + Create forwarder... + + + + Settings... - + Open debugger console... - + Start &GDB server... - + Scripting... - + Game state views - + 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 @@ -6463,32 +6680,32 @@ Download size: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index df40af0a7..60d84bbd7 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + ROMs de Game Boy Advance (%1) + + + + Game Boy ROMs (%1) + ROMs de Game Boy (%1) + + + + All ROMs (%1) + Toutes les ROM (%1) + + + + %1 Video Logs (*.mvl) + %1 Journaux vidéo (*.mvl) + + QGBA::AboutScreen @@ -92,22 +115,22 @@ Taille du téléchargement : %3 QGBA::ApplicationUpdater - + Stable Stable - + Development Développement - + Unknown Inconnue - + (None) (Aucune) @@ -401,12 +424,12 @@ Taille du téléchargement : %3 - + Failed to open snapshot file for reading: %1 Échec de l'ouverture de l'instantané pour lire : %1 - + Failed to open snapshot file for writing: %1 Échec de l'ouverture de l'instantané pour écrire : %1 @@ -414,17 +437,17 @@ Taille du téléchargement : %3 QGBA::CoreManager - + Failed to open game file: %1 Échec de l'ouverture du fichier de jeu : %1 - + Could not load game. Are you sure it's in the correct format? Impossible de charger le jeu. Êtes-vous sûr qu'il est dans le bon format ? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). Impossible d'ouvrir le fichier de sauvegarde ; les sauvegardes en jeu ne peuvent pas être mises à jour. Veuillez vous assurer que le répertoire de sauvegarde est accessible en écriture sans privilèges supplémentaires (par exemple, UAC sous Windows). @@ -503,6 +526,195 @@ Taille du téléchargement : %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Arrière plan + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Parcourir + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -594,7 +806,7 @@ Taille du téléchargement : %3 QGBA::GBAApp - + Enable Discord Rich Presence Activer intégration avec Discord @@ -602,22 +814,22 @@ Taille du téléchargement : %3 QGBA::GBAKeyEditor - + Clear Button Bouton d'effacement - + Clear Analog Effacer l'analogique - + Refresh Rafraîchir - + Set all Tout définir @@ -751,148 +963,168 @@ Taille du téléchargement : %3 QGBA::GameBoy - - + + Autodetect Détection automatique - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2921,7 +3153,7 @@ Taille du téléchargement : %3 Corrompue - + Slot %1 Emplacement %1 @@ -4088,12 +4320,12 @@ Taille du téléchargement : %3 QGBA::ReportView - + Bug report archive Archive de signalement d'erreur - + ZIP archive (*.zip) Archive ZIP (*.zip) @@ -4457,95 +4689,95 @@ Taille du téléchargement : %3 QGBA::SettingsView - - + + Qt Multimedia Qt Multimédia - + SDL SDL - + Software (Qt) Software (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (version forcée 1.x) - + None Aucun - + None (Still Image) Aucun (Image fixe) - + Keyboard Clavier - + Controllers Contrôleurs - + Shortcuts Raccourcis - - + + Shaders Shaders - + Select BIOS Choisir le BIOS - + Select directory - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -4553,7 +4785,7 @@ Taille du téléchargement : %3 - + %n day(s) ago @@ -4951,37 +5183,37 @@ Taille du téléchargement : %3 - + 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: @@ -5703,120 +5935,100 @@ Taille du téléchargement : %3 QGBA::Window - - Game Boy Advance ROMs (%1) - ROMs de Game Boy Advance (%1) - - - - Game Boy ROMs (%1) - ROMs de Game Boy (%1) - - - - All ROMs (%1) - Toutes les ROM (%1) - - - - %1 Video Logs (*.mvl) - %1 Journaux vidéo (*.mvl) - - - + Archives (%1) Archives (%1) - - - + + + Select ROM Choisir une ROM - + Select folder Choisir un dossier - - + + Select save Choisir une sauvegarde - + Select patch Sélectionner un correctif - + Patches (*.ips *.ups *.bps) Correctifs/Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Sélectionnez le numéro de point du e-Reader - + e-Reader card (*.raw *.bin *.bmp) e-Reader carte (*.raw *.bin *.bmp) - + Select e-Reader card images - + Image file (*.png *.jpg *.jpeg) - + Conversion finished - + %1 of %2 e-Reader cards converted successfully. - + Select image Choisir une image - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Image (*.png *.gif *.jpg *.jpeg);;Tous les fichiers (*) - + GameShark saves (*.sps *.xps) Sauvegardes GameShark (*.sps *.xps) - + Select video log Sélectionner un journal vidéo - + Video logs (*.mvl) Journaux vidéo (*.mvl) - + Crash Plantage - + The game has crashed with the following error: %1 @@ -5825,664 +6037,669 @@ Taille du téléchargement : %3 %1 - + Unimplemented BIOS call Requête au BIOS non supporté - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Ce jeu utilise un appel BIOS qui n'est pas implémenté. Veuillez utiliser le BIOS officiel pour une meilleure expérience. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Échec de la création d'un périphérique d'affichage approprié, retour à l'affichage du logiciel. Les jeux peuvent fonctionner lentement, en particulier avec des fenêtres plus grandes. - + Really make portable? Vraiment rendre portable ? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Cela amènera l'émulateur à charger sa configuration depuis le même répertoire que l'exécutable. Souhaitez vous continuer ? - + Restart needed Un redémarrage est nécessaire - + Some changes will not take effect until the emulator is restarted. Certains changements ne prendront effet qu'après le redémarrage de l'émulateur. - + - Player %1 of %2 - Joueur %1 of %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Fichier - + Load &ROM... Charger une &ROM… - + Load ROM in archive... Charger la ROM d'une archive… - + Add folder to library... Ajouter un dossier à la bibliothèque… - + Load &patch... Charger un c&orrectif… - + Boot BIOS Démarrer le BIOS - + Replace ROM... Remplacer la ROM… - + + Create forwarder... + + + + Game state views - + Convert e-Reader card image to raw... - + ROM &info... &Infos sur la ROM… - + Recent Récent - + Make portable Rendre portable - + &Load state &Charger un état - + &Save state &Sauvegarder un état - + Quick load Chargement rapide - + Quick save Sauvegarde rapide - + Load recent Charger un fichier récent - + Save recent Sauvegarder un fichier récent - + Undo load state Annuler le chargement de l'état - + Undo save state Annuler la sauvegarde de l'état - - + + State &%1 État &%1 - + Load camera image... Charger une image de la caméra… - + Convert save game... - + New multiplayer window Nouvelle fenêtre multijoueur - + Connect to Dolphin... - + Report bug... Signalement de l'erreur… - + E&xit &Quitter - + &Emulation &Émulation - + &Reset &Réinitialiser - + Sh&utdown Extin&ction - + Yank game pak Yank game pak - + &Pause &Pause - + &Next frame &Image suivante - + Fast forward (held) Avance rapide (maintenir) - + &Fast forward A&vance rapide - + Fast forward speed Vitesse de l'avance rapide - + Unbounded Sans limites - + %0x %0x - + Rewind (held) Rembobiner (maintenir) - + Re&wind Rem&bobiner - + Step backwards Retour en arrière - + Solar sensor Capteur solaire - + Increase solar level Augmenter le niveau solaire - + Decrease solar level Diminuer le niveau solaire - + Brightest solar level Tester le niveau solaire - + Darkest solar level Assombrir le niveau solaire - + Brightness %1 Luminosité %1 - + Audio/&Video Audio/&Vidéo - + Frame size Taille de l'image - + Toggle fullscreen Basculer en plein écran - + Lock aspect ratio Bloquer les proportions - + Force integer scaling Forcer la mise à l'échelle par des nombres entiers - + Bilinear filtering Filtrage bilinèaire - + Frame&skip &Saut d'image - + Mute Muet - + FPS target FPS ciblé - + Take &screenshot Prendre une ca&pture d'écran - + F12 F12 - + Game Boy Printer... Imprimante GameBoy… - + Video layers Couches vidéo - + Audio channels Canaux audio - + Adjust layer placement... Ajuster la disposition… - + &Tools Ou&tils - + View &logs... Voir les &journaux… - + Game &overrides... - + Couldn't Start N'a pas pu démarrer - + Save games (%1) - + Select save game - + mGBA save state files (%1) - - + + Select save state - + GameShark saves (*.gsv *.sps *.xps) - + Could not start game. Impossible de démarrer le jeu. - + Load alternate save game... - + Load temporary save game... - + Scan e-Reader dotcodes... Scanner les dotcodes e-Reader... - + Load state file... Charger le fichier d'état... - + Save state file... Enregistrer le fichier d'état... - + Import GameShark Save... Importer la sauvegarde de GameShark... - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games Sauvegarder les jeux - + Export GameShark Save... Exporter la sauvegarde de GameShark... - + Automatically determine - + Use player %0 save game - + About... À propos de… - + BattleChip Gate... - + %1× %1× - + Interframe blending Mélange d'images - + Native (59.7275) Natif (59.7275) - + Record A/V... Enregistrer A/V... - + Record GIF/WebP/APNG... Enregistrer GIF/WebP/APNG... - + Game Pak sensors... Capteurs de la Game Pak... - + &Cheats... &Cheats… - + Settings... Paramètres… - + Open debugger console... Ouvrir la console de débug… - + Start &GDB server... Démarrer le serveur &GDB… - + Scripting... - + View &palette... Voir la &palette… - + View &sprites... Voir les &sprites… - + View &tiles... Voir les &tiles… - + View &map... Voir la &map… - + &Frame inspector... Inspecteur de &frame... - + View memory... Voir la mémoire… - + Search memory... Recherche dans la mémoire… - + View &I/O registers... Voir les registres d'&E/S... - + Record debug video log... Enregistrer le journal vidéo de débogage... - + Stop debug video log Arrêter le journal vidéo de débogage - + Exit fullscreen Quitter le plein écran - + GameShark Button (held) Bouton GameShark (maintenir) - + Autofire Tir automatique - + Autofire A Tir automatique A - + Autofire B Tir automatique B - + Autofire L Tir automatique L - + Autofire R Tir automatique R - + Autofire Start Tir automatique Start - + Autofire Select Tir automatique Select - + Autofire Up Tir automatique Up - + Autofire Right Tir automatique Right - + Autofire Down Tir automatique Down - + Autofire Left Tir automatique Gauche - + Clear Vider @@ -6490,32 +6707,32 @@ Taille du téléchargement : %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/mgba-hu.ts b/src/platform/qt/ts/mgba-hu.ts index 38b8bdd70..074576da6 100644 --- a/src/platform/qt/ts/mgba-hu.ts +++ b/src/platform/qt/ts/mgba-hu.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -87,22 +110,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -395,12 +418,12 @@ Download size: %3 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 @@ -408,17 +431,17 @@ Download size: %3 QGBA::CoreManager - + 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; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -497,6 +520,195 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Háttér + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -588,7 +800,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence Discord Rich Presence engedélyezése @@ -596,22 +808,22 @@ Download size: %3 QGBA::GBAKeyEditor - + 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 @@ -745,148 +957,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect Automatikus észlelés - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2905,7 +3137,7 @@ Download size: %3 - + Slot %1 @@ -4065,12 +4297,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -4433,102 +4665,102 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) - + OpenGL - + OpenGL (force version 1.x) - + None Nincs - + None (Still Image) - + Keyboard - + Controllers - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4793,37 +5025,37 @@ Download size: %3 - + 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: @@ -5677,784 +5909,769 @@ Download size: %3 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... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Import GameShark Save... - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + 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 %0x - + Rewind (held) - + Re&wind - + Step backwards - + 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× %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... - + + Create forwarder... + + + + Settings... - + Open debugger console... - + Start &GDB server... - + Scripting... - + Game state views - + 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 Napló törlése @@ -6462,32 +6679,32 @@ Download size: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index fb0cfb04c..b3c0cfbc1 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + ゲームボーイアドバンスファイル (%1) + + + + Game Boy ROMs (%1) + ゲームボーイファイル (%1) + + + + All ROMs (%1) + すべてのファイル (%1) + + + + %1 Video Logs (*.mvl) + %1ビデオログ (*.mvl) + + QGBA::AboutScreen @@ -41,70 +64,75 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. An update is available - + アップデートが利用可能です An update to %1 is available. - + %1 のアップデートが利用可能です。 + Do you want to download and install it now? You will need to restart the emulator when the download is complete. - + +今すぐダウンロードしてインストールしますか?ダウンロードが完了したら、エミュレータを再起動する必要があります。 Auto-update is not available on this platform. If you wish to update you will need to do it manually. - + +このプラットフォームでは自動アップデートは利用できません。アップデートしたい場合は手動で行う必要があります。 Current version: %1 New version: %2 Download size: %3 - + 現在のバージョン: %1 +新しいバージョン: %2 +ダウンロードサイズ: %3 Downloading update... - + アップデートをダウンロード中... Downloading failed. Please update manually. - + ダウンロードに失敗しました。手動で更新してください。 Downloading done. Press OK to restart %1 and install the update. - + ダウンロード完了。OKで%1 を再起動し、アップデートをインストールします。 QGBA::ApplicationUpdater - + Stable - - - - - Development - + 安定版 + Development + 開発版 + + + Unknown 不明 - + (None) - + (なし) @@ -170,7 +198,7 @@ Download size: %3 Audio device is missing its core - + オーディオ デバイスにコアがありません @@ -395,12 +423,12 @@ Download size: %3 予期しないプラットフォームでパックをヤンクすることはできません! - + Failed to open snapshot file for reading: %1 読み取り用のスナップショットファイルを開けませんでした: %1 - + Failed to open snapshot file for writing: %1 書き込み用のスナップショットファイルを開けませんでした: %1 @@ -408,17 +436,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 ゲームファイルを開けませんでした: %1 - + Could not load game. Are you sure it's in the correct format? ゲームをロードできませんでした。ゲームのフォーマットが正しいことを確認してください。 - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -497,6 +525,195 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + バックグラウンド + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + 参照 + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -588,7 +805,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence DiscordのRich Presence有効 @@ -596,22 +813,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button ボタンクリア - + Clear Analog アナログクリア - + Refresh 更新 - + Set all すべて設定 @@ -745,148 +962,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect 自動検出 - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2905,7 +3142,7 @@ Download size: %3 破損 - + Slot %1 スロット %1 @@ -4065,12 +4302,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive バグレポートアーカイブ - + ZIP archive (*.zip) ZIPアーカイブ (*.zip) @@ -4433,102 +4670,102 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia Qt Multimedia - + SDL SDL - + Software (Qt) ソフト(Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL(バージョン1.xを強制) - + None なし - + None (Still Image) なし(静止画) - + Keyboard キーボード - + Controllers コントローラー - + Shortcuts ショートカット - - + + Shaders シェーダー - + Select BIOS BIOSを選択 - + Select directory - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4859,37 +5096,37 @@ Download size: %3 - + 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: @@ -5677,100 +5914,80 @@ Download size: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - ゲームボーイアドバンスファイル (%1) - - - - Game Boy ROMs (%1) - ゲームボーイファイル (%1) - - - - All ROMs (%1) - すべてのファイル (%1) - - - - %1 Video Logs (*.mvl) - %1ビデオログ (*.mvl) - - - + Archives (%1) アーカイブファイル (%1) - - - + + + Select ROM ROMを開く - + Select folder フォルダを開く - - + + Select save セーブを開く - + Select patch パッチを開く - + Patches (*.ips *.ups *.bps) パッチファイル (*.ips *.ups *.bps) - + Select e-Reader dotcode カードeを開く - + e-Reader card (*.raw *.bin *.bmp) カードe (*.raw *.bin *.bmp) - + Select image 画像を開く - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 画像ファイル (*.png *.gif *.jpg *.jpeg);;すべてのファイル (*) - + GameShark saves (*.sps *.xps) GameSharkセーブファイル (*.sps *.xps) - + Select video log ビデオログを開く - + Video logs (*.mvl) ビデオログ (*.mvl) - + Crash クラッシュ - + The game has crashed with the following error: %1 @@ -5779,684 +5996,689 @@ Download size: %3 %1 - + Couldn't Start 起動失敗 - + Could not start game. ゲームを起動できませんでした。 - + Unimplemented BIOS call 未実装のBIOS呼び出し - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. このゲームは実装されていないBIOS呼び出しを使用します。最高のエクスペリエンスを得るには公式のBIOSを使用してください。 - + 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 of %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &ファイル (&F) - + Load &ROM... ROMをロード... - + Load ROM in archive... アーカイブにROMをロード... - + Add folder to library... ライブラリーにフォルダを追加... - + Load &patch... パッチをロード... (&P) - + Boot BIOS BIOSを起動 - + Replace ROM... ROMを交換... - + Scan e-Reader dotcodes... カードeをスキャン... - + ROM &info... ROM情報... (&I) - + Recent 最近開いたROM - + Make portable ポータブル化 - + &Load state ステートをロード (&L) - + Report bug... バグ報告 - + About... バージョン情報... - + Record GIF/WebP/APNG... GIF/WebP/APNGを記録 - + Game Pak sensors... カートリッジセンサー... - + Clear 消去 - + Load state file... ステートファイルをロード... - + 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... - + Convert e-Reader card image to raw... - + &Save state ステートをセーブ (&S) - + Save state file... ステートファイルをセーブ... - + Quick load クイックロード - + Quick save クイックセーブ - + Load recent 最近使ったクイックロットからロード - + Save recent 最近使ったクイックロットにセーブ - + Undo load state クイックロードを元に戻す - + Undo save state クイックセーブを元に戻す - - + + State &%1 クイックスロット &%1 - + Load camera image... カメラ画像をロード... - + Convert save game... - + GameShark saves (*.gsv *.sps *.xps) - + Import GameShark Save... GameSharkスナップショットを読み込む - + Export GameShark Save... GameSharkスナップショットを書き出す - + New multiplayer window 新しいウィンドウ(マルチプレイ) - + Connect to Dolphin... - + E&xit 終了 (&X) - + &Emulation エミュレーション (&E) - + &Reset リセット (&R) - + Sh&utdown 閉じる (&U) - + Yank game pak ゲームパックをヤンク - + &Pause 一時停止 (&P) - + &Next frame 次のフレーム (&N) - + Fast forward (held) 早送り(押し) - + &Fast forward 早送り (&F) - + Fast forward speed 早送り速度 - + Unbounded 制限なし - + %0x %0x - + Rewind (held) 巻戻し(押し) - + Re&wind 巻戻し (&R) - + Step backwards 1フレーム巻き戻す - + Solar sensor 太陽センサー - + Increase solar level 明るさを上げる - + Decrease solar level 明るさを下げる - + Brightest solar level 明るさ最高 - + Darkest solar level 明るさ最低 - + Brightness %1 明るさ %1 - + Audio/&Video オーディオ/ビデオ (&V) - + Frame size 画面サイズ - + Toggle fullscreen 全画面表示 - + Lock aspect ratio 縦横比を固定 - + Force integer scaling 整数スケーリングを強制 - + Bilinear filtering バイリニアフィルタリング - + Frame&skip フレームスキップ (&S) - + Mute ミュート - + FPS target FPS - + Native (59.7275) ネイティブ(59.7275) - + Take &screenshot スクリーンショット (&S) - + F12 F12 - + Game Boy Printer... ポケットプリンタ... - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games セーブデータ - + Automatically determine - + Use player %0 save game - + BattleChip Gate... チップゲート... - + %1× %1× - + Interframe blending フレーム間混合 - + Record A/V... ビデオ録画... - + Video layers ビデオレイヤー - + Audio channels オーディオチャンネル - + Adjust layer placement... レイヤーの配置を調整... - + &Tools ツール (&T) - + View &logs... ログビューアー... (&L) - + Game &overrides... ゲーム別設定... (&O) - + &Cheats... チート... (&C) - + Settings... 設定... - + Open debugger console... デバッガコンソールを開く... - + Start &GDB server... GDBサーバを起動... (&G) - + Scripting... - + + Create forwarder... + + + + Game state views - + View &palette... パレットビューアー... (&P) - + View &sprites... スプライトビューアー... (&S) - + View &tiles... タイルビューアー... (&T) - + View &map... マップビューアー... (&M) - + &Frame inspector... フレームインスペクタ... (&F) - + View memory... メモリビューアー... - + Search memory... メモリ検索... - + View &I/O registers... IOビューアー... (&I) - + Record debug video log... デバッグビデオログ... - + Stop debug video log デバッグビデオログを停止 - + Exit fullscreen 全画面表示を終了 - + GameShark Button (held) GameSharkボタン(押し) - + Autofire 連打 - + Autofire A 連打 A - + Autofire B 連打 B - + Autofire L 連打 L - + Autofire R 連打 R - + Autofire Start 連打 Start - + Autofire Select 連打 Select - + Autofire Up 連打 上 - + Autofire Right 連打 右 - + Autofire Down 連打 下 - + Autofire Left 連打 左 @@ -6464,32 +6686,32 @@ Download size: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index 4f47fe85e..567688861 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + 게임 보이 어드밴스 롬 (%1) + + + + Game Boy ROMs (%1) + 게임 보이 (%1) + + + + All ROMs (%1) + 모든 롬 (%1) + + + + %1 Video Logs (*.mvl) + %1 비디오 로그 (*.mvl) + + QGBA::AboutScreen @@ -92,22 +115,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable 안정적인 - + Development 개발 - + Unknown 미확인 - + (None) (없음) @@ -400,12 +423,12 @@ Download size: %3 예기치 않은 플랫폼에서 팩을 잡아당길 수 없습니다! - + Failed to open snapshot file for reading: %1 읽기 용 스냅샷 파일을 열지 못했습니다: %1 - + Failed to open snapshot file for writing: %1 쓰기 용 스냅샷 파일을 열지 못했습니다: %1 @@ -413,17 +436,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 게임 파일을 열지 못했습니다: %1 - + Could not load game. Are you sure it's in the correct format? 게임을 로드할 수 없습니다. 올바른 형식인지 확인했나요? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). 저장 파일을 열지 못했습니다. 게임 내 저장은 업데이트할 수 없습니다. 저장 디렉토리가 추가 권한 없이 쓰기 가능한지 확인하세요 (예: 윈도우즈의 UAC). @@ -502,6 +525,195 @@ Download size: %3 돌핀에 연결할 수 없습니다. + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + 배경 + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + 브라우저 + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -593,7 +805,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence 디스코드 Rich Presence 활성화 @@ -601,22 +813,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button 버튼 정리 - + Clear Analog 아날로그 정리 - + Refresh 새로 고침 - + Set all 모두 설정 @@ -750,148 +962,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect 자동 감지 - + Game Boy (DMG) 게임 보이 (DMG) - + Game Boy Pocket (MGB) 게임 보이 포켓 (MGB) - + Super Game Boy (SGB) 슈퍼 게임 보이 (SGB) - + Super Game Boy 2 (SGB) 슈퍼 게임 보이 2 (SGB) - + Game Boy Color (CGB) 게임 보이 컬러 (CGB) - + Game Boy Advance (AGB) 게임 보이 어드밴스 (AGB) - + Super Game Boy Color (SGB + CGB) 슈퍼 게임 보이 컬러 (SGB + CGB) - + ROM Only 롬 전용 - + MBC1 MBC1 - + MBC2 MBC2 - + MBC3 MBC3 - + MBC3 + RTC MBC3 + RTC - + MBC5 MBC5 - + MBC5 + Rumble MBC5 + 진동 - + MBC6 MBC6 - + MBC7 (Tilt) MBC7 (틸트) - + MMM01 MMM01 - + HuC-1 HuC-1 - + HuC-3 HuC-3 - + Pocket Cam 포켓 캠 - + TAMA5 TAMA5 - + Wisdom Tree 지혜의 나무 - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) NT (신규) - + Pokémon Jade/Diamond 포켓몬 제이드/다이아몬드 - + BBD BBD - + Hitek 하이텍 - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) 사첸 (MMC1) - + Sachen (MMC2) 사첸 (MMC2) @@ -2910,7 +3142,7 @@ Download size: %3 손상 - + Slot %1 슬롯 %1 @@ -4070,12 +4302,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive 버그 보고서 파일 - + ZIP archive (*.zip) ZIP 파일 (*.zip) @@ -4438,102 +4670,102 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia Qt 멀티미디어 - + SDL SDL - + Software (Qt) 소프트웨어 (Qt) - + OpenGL 오픈GL - + OpenGL (force version 1.x) 오픈GL (버전 1.x 강제) - + None 없음 - + None (Still Image) 없음 (정지 이미지) - + Keyboard 키보드 - + Controllers 컨트롤러 - + Shortcuts 단축키 - - + + Shaders 쉐이더 - + Select BIOS 바이오스 선택 - + Select directory 디렉토리 선택 - + (%1×%2) (%1×%2) - + Never 절대 - + Just now 방금 - + Less than an hour ago 1시간 미만 전 - + %n hour(s) ago %n 시간 전 - + %n day(s) ago %n 일 전 @@ -4844,37 +5076,37 @@ Download size: %3 지금 확인 - + Default color palette only 기본 색상 팔레트만 - + SGB color palette if available 가능한 경우 SGB 색상 팔레트 - + GBC color palette if available 가능한 경우 GBC 색상 팔레트 - + SGB (preferred) or GBC color palette if available 사용 가능한 경우 SGB (선호) 또는 GBC 색상 팔레트 - + Game Boy Camera 게임 보이 카메라 - + Driver: 드라이버: - + Source: 소스: @@ -5616,7 +5848,7 @@ Download size: %3 WavPack - + Wav팩 @@ -5682,115 +5914,95 @@ Download size: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - 게임 보이 어드밴스 롬 (%1) - - - - Game Boy ROMs (%1) - 게임 보이 (%1) - - - - All ROMs (%1) - 모든 롬 (%1) - - - - %1 Video Logs (*.mvl) - %1 비디오 로그 (*.mvl) - - - + Archives (%1) 아카이브 (%1) - - - + + + Select ROM 롬 선택 - - + + Select save 저장 파일 선택 - + Select patch 패치 선택 - + Patches (*.ips *.ups *.bps) 패치 (*.ips *.ups *.bps) - + Select e-Reader dotcode e-리더 도트코드 선택 - + e-Reader card (*.raw *.bin *.bmp) e-리더 카드 (*.raw *.bin *.bmp) - + Select e-Reader card images e-리더 카드 이미지 선택 - + Image file (*.png *.jpg *.jpeg) 이미지 파일 (*.png *.jpg *.jpeg) - + Conversion finished 변환 완료 - + %1 of %2 e-Reader cards converted successfully. %2 e-리더 카드 중 %1이(가) 성공적으로 변환되었습니다. - + Select image 이미지 선택 - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 이미지 파일 (*.png *.gif *.jpg *.jpeg);;모든 파일 (*) - + GameShark saves (*.sps *.xps) 게임샤크 저장 파일 (*.sps *.xps) - + Select video log 비디오 로그 선택 - + Video logs (*.mvl) 비디오 로그 (*.mvl) - + Crash 치명적인 오류 - + The game has crashed with the following error: %1 @@ -5799,669 +6011,674 @@ Download size: %3 %1 - + 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. 일부 변경 사항은 에뮬레이터가 다시 시작될 때까지 적용되지 않습니다. - + Reset needed 재설정 필요 - + Some changes will not take effect until the game is reset. 일부 변경 사항은 게임이 재설정될 때까지 적용되지 않습니다. - + - Player %1 of %2 - 플레이어 %1 의 %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &파일 - + Load &ROM... 로드 &롬... - + Load ROM in archive... 롬을 아카이브에 로드... - + Save games 게임 저장 - + Automatically determine 자동으로 결정 - + Use player %0 save game 플레이어 %0 저장 게임 사용 - + Load &patch... 로드 &패치... - + Boot BIOS BIOS 부팅 - + Replace ROM... 롬 교체... - + Scan e-Reader dotcodes... e-리더 도트코드 스캔... - + Game state views 게임 상태 보기 - + Convert e-Reader card image to raw... e-리더 카드 이미지를 원시 데이터로 변환... - + ROM &info... 롬 &정보... - + Recent 최근 실행 - + Make portable 휴대용 만들기 - + &Load state &로드 파일 상태 - + &Save state &저장 파일 상태 - + Quick load 빠른 로드 - + Quick save 빠른 저장 - + Load recent 최근 실행 로드 - + Save recent 최근 실행 저장 - + Undo load state 로드 파일 상태 복원 - + Undo save state 저장 파일 상태 복원 - - + + State &%1 상태 &%1 - + Load camera image... 카메라 이미지 로드... - + Convert save game... 저장 게임 변환... - + GameShark saves (*.gsv *.sps *.xps) 게임샤크 저장 (*.gsv *.sps *.xps) - + New multiplayer window 새로운 멀티 플레이어 창 - + Connect to Dolphin... 돌핀에 연결... - + E&xit 종&료 - + &Emulation &에뮬레이션 - + &Reset &재설정 - + Sh&utdown 종&료 - + Yank game pak 양키 게임 팩 - + &Pause &정지 - + &Next frame &다음 프레임 - + Fast forward (held) 빨리 감기 (누름) - + &Fast forward &빨리 감기 - + Fast forward speed 빨리 감기 속도 - + Unbounded 무제한 - + %0x %0x - + Rewind (held) 되김기 (누름) - + Re&wind 리&와인드 - + Step backwards 돌아가기 - + Brightest solar level 가장 밝은 태양 수준 - + Darkest solar level 가장 어두운 태양 수준 - + Brightness %1 밝기 %1 - + Audio/&Video 오디오/&비디오 - + Frame size 프레임 크기 - + Toggle fullscreen 전체화면 전환 - + Lock aspect ratio 화면비 잠금 - + Frame&skip 프레임&건너뛰기 - + Mute 무음 - + FPS target FPS 대상 - + Take &screenshot 스크린샷 &찍기 - + F12 F12 - + Video layers 비디오 레이어 - + Audio channels 오디오 채널 - + &Tools &도구 - + View &logs... 로그 &보기... - + Game &overrides... 게임 &오버라이드... - + &Cheats... &치트.. - + + Create forwarder... + + + + Open debugger console... 디버거 콘솔 열기... - + Start &GDB server... GDB 서버 &시작... - + Settings... 설정... - + Select folder 폴더 선택 - + Couldn't Start 시작할 수 없음 - + Could not start game. 게임을 시작할 수 없습니다. - + Add folder to library... 라이브러리에 폴더 추가... - + Load state file... 상태 파일 로드... - + Save state file... 상태 파일 저장... - + Import GameShark Save... 게임샤크 저장 가져오기... - + Export GameShark Save... 게임샤크 저장 내보내기... - + Report bug... 버그를 제보하기... - + About... 정보... - + Solar sensor 태양광 센서 - + Increase solar level 태양광 레벨 증가 - + Decrease solar level 태양광 레벨 감소 - + Force integer scaling 정수 스케일링 강제 수행 - + Bilinear filtering 이중선형 필터링 - + Game Boy Printer... 게임 보이 프린터... - + Save games (%1) 게임 (%1) 저장 - + Select save game 저장 게임 선택 - + mGBA save state files (%1) mGBA 저장 상태 파일 (%1) - - + + Select save state 저장 상태 선택 - + Load alternate save game... 대체 저장 게임 로드... - + Load temporary save game... 임시 저장 게임 로드... - + BattleChip Gate... 배틀칩 게이트... - + %1× %1× - + Interframe blending 프레임간 조합 - + Native (59.7275) 실기 (59.7275) - + Record A/V... A/V 녹화... - + Record GIF/WebP/APNG... GIF/WebP/APNG 녹화... - + Adjust layer placement... 레이어 배치 조정... - + Game Pak sensors... 게임 팩 센서... - + Scripting... 스크립팅... - + View &palette... 팔레트 &보기... - + View &sprites... 스프라이트 &보기... - + View &tiles... 타일 &보기... - + View &map... 지도 &보기... - + &Frame inspector... 프레임 검사기 (&F)... - + View memory... 메모리 보기... - + Search memory... 메모리 검색... - + View &I/O registers... I/O 레지스터 &보기... - + Record debug video log... 디버그 비디오 로그 녹화... - + Stop debug video log 디버그 비디오 로그 중지 - + Exit fullscreen 전체화면 종료 - + GameShark Button (held) 게임샤크 버튼 (누름) - + Autofire 연사 - + Autofire A 연사 A - + Autofire B 연사 B - + Autofire L 연사 L - + Autofire R 연사 R - + Autofire Start 연사 시작 - + Autofire Select 연사 선택 - + Clear 지움 - + Autofire Up 연사 위쪽 - + Autofire Right 연사 오른쪽 - + Autofire Down 연사 아래쪽 - + Autofire Left 연사 왼쪽 @@ -6469,32 +6686,32 @@ Download size: %3 QObject - + %1 byte %1 바이트 - + %1 kiB %1 키비바이트 - + %1 MiB %1 메비바이트 - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/mgba-ms.ts b/src/platform/qt/ts/mgba-ms.ts index 54a273a64..2e46c1d08 100644 --- a/src/platform/qt/ts/mgba-ms.ts +++ b/src/platform/qt/ts/mgba-ms.ts @@ -1,6 +1,29 @@ + + QGBA + + + 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) + + QGBA::AboutScreen @@ -86,22 +109,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -394,12 +417,12 @@ Download size: %3 - + 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 @@ -407,17 +430,17 @@ Download size: %3 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; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -496,6 +519,195 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Latar belakang + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Pilih fail + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -587,7 +799,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence Dayakan Discord Rich Presence @@ -595,22 +807,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh Segar Semula - + Set all @@ -744,148 +956,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect Autokesan - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2904,7 +3136,7 @@ Download size: %3 Rosak - + Slot %1 Slot %1 @@ -4064,12 +4296,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Arkib laporan pepijat - + ZIP archive (*.zip) Arkib ZIP (*.zip) @@ -4432,102 +4664,102 @@ Download size: %3 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 Tiada - + 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) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4853,37 +5085,37 @@ Download size: %3 - + 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: @@ -5676,100 +5908,80 @@ Download size: %3 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 @@ -5778,684 +5990,689 @@ Download size: %3 %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... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games Simpanan permainan - + Import GameShark Save... Import Simpanan GameShark... - + Export GameShark Save... Eksport Simpanan GameShark... - + Automatically determine - + Use player %0 save game - + 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 - + 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 Persebatian antarabingkai - + Bilinear filtering Penapisan bilinear - + 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... - + + Create forwarder... + + + + Settings... Tetapan... - + Open debugger console... Buka konsol penyahpepijat... - + Start &GDB server... Mula pelayan &GDB... - + Scripting... - + Game state views - + 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 @@ -6463,32 +6680,32 @@ Download size: %3 QObject - + %1 byte %1 bait - + %1 kiB %1 kiB - + %1 MiB %1 MiB - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts index 05bea134c..169a4bab3 100644 --- a/src/platform/qt/ts/mgba-nb_NO.ts +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -89,22 +112,22 @@ Nedlastningsstørrelse: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Ukjent - + (None) @@ -397,12 +420,12 @@ Nedlastningsstørrelse: %3 - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -410,17 +433,17 @@ Nedlastningsstørrelse: %3 QGBA::CoreManager - + Failed to open game file: %1 Klarte ikke å åpne spillfil: %1 - + Could not load game. Are you sure it's in the correct format? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -499,6 +522,195 @@ Nedlastningsstørrelse: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Bakgrunn + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -590,7 +802,7 @@ Nedlastningsstørrelse: %3 QGBA::GBAApp - + Enable Discord Rich Presence @@ -598,22 +810,22 @@ Nedlastningsstørrelse: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh Gjenoppfrisk - + Set all @@ -747,148 +959,168 @@ Nedlastningsstørrelse: %3 QGBA::GameBoy - - + + Autodetect - + Game Boy (DMG) Game Boy (DMG) - + Game Boy Pocket (MGB) Game Boy Pocket (MGB) - + Super Game Boy (SGB) Super Game Boy (SGB) - + Super Game Boy 2 (SGB) Super Game Boy 2 (SGB) - + Game Boy Color (CGB) Game Boy Color (CGB) - + Game Boy Advance (AGB) Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) Super Game Boy Color (SGB + CGB) - + ROM Only Kun ROM - + MBC1 MBC1 - + MBC2 MBC2 - + MBC3 MBC3 - + MBC3 + RTC MBC3 + RTC - + MBC5 MBC5 - + MBC5 + Rumble - + MBC6 MBC6 - + MBC7 (Tilt) - + MMM01 MMM01 - + HuC-1 HuC-1 - + HuC-3 HuC-3 - + Pocket Cam - + TAMA5 TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2907,7 +3139,7 @@ Nedlastningsstørrelse: %3 Skadet - + Slot %1 Plass %1 @@ -4067,12 +4299,12 @@ Nedlastningsstørrelse: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) ZIP-arkiv (*.zip) @@ -4435,95 +4667,95 @@ Nedlastningsstørrelse: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL SDL - + Software (Qt) Programvare (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) - + None Ingen - + None (Still Image) - + Keyboard Tastatur - + Controllers Kontrollere - + Shortcuts Snarveier - - + + Shaders Skyggeleggere - + Select BIOS Velg BIOS - + Select directory Velg mappe - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago @@ -4531,7 +4763,7 @@ Nedlastningsstørrelse: %3 - + %n day(s) ago @@ -4858,37 +5090,37 @@ Nedlastningsstørrelse: %3 - + 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: @@ -5681,784 +5913,769 @@ Nedlastningsstørrelse: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - - - - - Game Boy ROMs (%1) - - - - - All ROMs (%1) - - - - - %1 Video Logs (*.mvl) - - - - + Archives (%1) Arkiv (%1) - - - + + + Select ROM Velg ROM - + Select folder Velg mappe - - + + Select save - + Select patch Velg feilfiks - + Patches (*.ips *.ups *.bps) Feilfikser (*.ips *.ups *.bps) - + Select e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) - + Select image Velg bilde - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Bildefil (*.png *.gif *.jpg *.jpeg);;All filer (*) - + GameShark saves (*.sps *.xps) - + Select video log - + Video logs (*.mvl) - + Crash Krasj - + 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... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Import GameShark Save... - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + 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 %0x - + Rewind (held) - + Re&wind - + Step backwards - + 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× %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... - + + Create forwarder... + + + + Settings... - + Open debugger console... - + Start &GDB server... - + Scripting... - + Game state views - + 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 Tøm @@ -6466,32 +6683,32 @@ Nedlastningsstørrelse: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? diff --git a/src/platform/qt/ts/mgba-pl.ts b/src/platform/qt/ts/mgba-pl.ts index b1a95e463..046b0d294 100644 --- a/src/platform/qt/ts/mgba-pl.ts +++ b/src/platform/qt/ts/mgba-pl.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + ROMy Game Boy Advance (%1) + + + + Game Boy ROMs (%1) + ROMy Game Boy (%1) + + + + All ROMs (%1) + Wszystkie ROMy (%1) + + + + %1 Video Logs (*.mvl) + Dzienniki wideo %1 (*.mvl) + + QGBA::AboutScreen @@ -92,22 +115,22 @@ Rozmiar pobierania: %3 QGBA::ApplicationUpdater - + Stable Stabilna - + Development Rozwojowa - + Unknown Nieznana - + (None) (Żadna) @@ -400,12 +423,12 @@ Rozmiar pobierania: %3 Nie można wyciągnąć pack na nieoczekiwanej platformie! - + Failed to open snapshot file for reading: %1 Nie udało się otworzyć pliku snapshot do odczytu: %1 - + Failed to open snapshot file for writing: %1 Nie udało się otworzyć pliku snapshot do zapisu: %1 @@ -413,17 +436,17 @@ Rozmiar pobierania: %3 QGBA::CoreManager - + Failed to open game file: %1 Nie udało się otworzyć pliku gry: %1 - + Could not load game. Are you sure it's in the correct format? Nie udało się wczytać gry. Czy na pewno jest we właściwym formacie? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). Nie udało się otworzyć pliku zapisu; zapisy w grze nie mogą być aktualizowane. Upewnij się, że katalog zapisu jest zapisywalny bez dodatkowych uprawnień (np. UAC w systemie Windows). @@ -502,6 +525,195 @@ Rozmiar pobierania: %3 Nie udało się połączyć z Dolphinem. + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Tło + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Przeglądaj + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -593,7 +805,7 @@ Rozmiar pobierania: %3 QGBA::GBAApp - + Enable Discord Rich Presence Włącz Discord Rich Presence @@ -601,22 +813,22 @@ Rozmiar pobierania: %3 QGBA::GBAKeyEditor - + Clear Button Wyczyść Przycisk - + Clear Analog Wyczyść Analog - + Refresh Odśwież - + Set all Ustaw wszystko @@ -750,148 +962,168 @@ Rozmiar pobierania: %3 QGBA::GameBoy - - + + Autodetect Automatyczne wykrywanie - + Game Boy (DMG) Game Boy (DMG) - + Game Boy Pocket (MGB) Game Boy Pocket (MGB) - + Super Game Boy (SGB) Super Game Boy (SGB) - + Super Game Boy 2 (SGB) Super Game Boy 2 (SGB) - + Game Boy Color (CGB) Game Boy Color (CGB) - + Game Boy Advance (AGB) Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) Super Game Boy Color (SGB + CGB) - + ROM Only Tylko ROM - + MBC1 MBC1 - + MBC2 MBC2 - + MBC3 MBC3 - + MBC3 + RTC MBC3 + RTC - + MBC5 MBC5 - + MBC5 + Rumble MBC5 + Rumble - + MBC6 MBC6 - + MBC7 (Tilt) MBC7 (Przechylenie) - + MMM01 MMM01 - + HuC-1 HuC-1 - + HuC-3 HuC-3 - + Pocket Cam Pocket Cam - + TAMA5 TAMA5 - + Wisdom Tree Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) NT (nowy) - + Pokémon Jade/Diamond Pokémon Jade/Diamond - + BBD BBD - + Hitek Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) Sachen (MMC1) - + Sachen (MMC2) Sachen (MMC2) @@ -2910,7 +3142,7 @@ Rozmiar pobierania: %3 Uszkodzony - + Slot %1 Slot %1 @@ -4070,12 +4302,12 @@ Rozmiar pobierania: %3 QGBA::ReportView - + Bug report archive Archiwum raportów o błędach - + ZIP archive (*.zip) Archiwum ZIP (*.zip) @@ -4438,95 +4670,95 @@ Rozmiar pobierania: %3 QGBA::SettingsView - - + + Qt Multimedia Qt Multimedia - + SDL SDL - + Software (Qt) Software (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (wymuś wersję 1.x) - + None Nic - + None (Still Image) Brak (Obraz Nieruchomy) - + Keyboard Klawiatura - + Controllers Kontrolery - + Shortcuts Skróty - - + + Shaders Shadery - + Select BIOS Wybierz BIOS - + Select directory Wybierz katalog - + (%1×%2) (%1×%2) - + Never Nigdy - + Just now Właśnie teraz - + Less than an hour ago Mniej niż godzinę temu - + %n hour(s) ago %n godzinę temu @@ -4535,7 +4767,7 @@ Rozmiar pobierania: %3 - + %n day(s) ago %n dzień temu @@ -4863,37 +5095,37 @@ Rozmiar pobierania: %3 Sprawdź teraz - + Default color palette only Tylko domyślna paleta kolorów - + SGB color palette if available Paleta kolorów SGB, jeśli jest dostępna - + GBC color palette if available Paleta kolorów GBC, jeśli jest dostępna - + SGB (preferred) or GBC color palette if available Paleta kolorów SGB (preferowana) lub GBC, jeśli jest dostępna - + Game Boy Camera Game Boy Camera - + Driver: Sterownik: - + Source: Źródło: @@ -5610,7 +5842,7 @@ Rozmiar pobierania: %3 WavPack - + WavPack @@ -5686,100 +5918,80 @@ Rozmiar pobierania: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - ROMy Game Boy Advance (%1) - - - - Game Boy ROMs (%1) - ROMy Game Boy (%1) - - - - All ROMs (%1) - Wszystkie ROMy (%1) - - - - %1 Video Logs (*.mvl) - Dzienniki wideo %1 (*.mvl) - - - + Archives (%1) Archiwa (%1) - - - + + + Select ROM Wybierz ROM - + Select folder Wybierz katalog - - + + Select save Wybierz zapis - + Select patch Wybierz łatkę - + Patches (*.ips *.ups *.bps) Łatki (*.ips *.ups *.bps) - + Select e-Reader dotcode Wybierz kod kropki e-Reader - + e-Reader card (*.raw *.bin *.bmp) Karta e-Reader (*.raw *.bin *.bmp) - + Select image Wybierz obraz - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Plik obrazu (*.png *.gif *.jpg *.jpeg);;Wszystkie pliki (*) - + GameShark saves (*.sps *.xps) Zapisy GameShark (*.sps *.xps) - + Select video log Wybierz dziennik wideo - + Video logs (*.mvl) Dzienniki wideo (*.mvl) - + Crash Crash - + The game has crashed with the following error: %1 @@ -5788,684 +6000,689 @@ Rozmiar pobierania: %3 %1 - + Couldn't Start Nie udało się uruchomić - + Could not start game. Nie udało się rozpocząć gry. - + Unimplemented BIOS call Niewdrożone wywołanie BIOS - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Ta gra używa wywołania BIOS, które nie jest zaimplementowane. Aby uzyskać najlepsze wrażenia, użyj oficjalnego BIOS. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. Nie udało się utworzyć odpowiedniego urządzenia wyświetlającego, powracam do wyświetlania programowego. Gry mogą działać wolno, zwłaszcza w przypadku większych okien. - + Really make portable? Naprawdę stworzyć wersję portable? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? To sprawi, że emulator załaduje swoją konfigurację z tego samego katalogu, co plik wykonywalny. Czy chcesz kontynuować? - + Restart needed Wymagane ponowne uruchomienie - + Some changes will not take effect until the emulator is restarted. Niektóre zmiany nie zaczną obowiązywać, dopóki emulator nie zostanie ponownie uruchomiony. - + - Player %1 of %2 - Gracz %1 z %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 FPS) - %4 - + &File &Plik - + Load &ROM... Załaduj &ROM... - + Load ROM in archive... Załaduj ROM w archiwum... - + Add folder to library... Dodaj folder do biblioteki... - + Save games (%1) Zapisane gry (%1) - + Select save game Wybierz zapis gry - + mGBA save state files (%1) Pliki stanu gry mGBA (%1) - - + + Select save state Wybierz stan - + Select e-Reader card images Wybierz obrazy kart e-Reader - + Image file (*.png *.jpg *.jpeg) Plik graficzny (*.png *.jpg *.jpeg) - + Conversion finished Konwersja zakończona - + %1 of %2 e-Reader cards converted successfully. %1 z %2 kart czytnika e-Reader zostało pomyślnie przekonwertowanych. - + Load alternate save game... Załaduj alternatywny zapis gry... - + Load temporary save game... Załaduj tymczasowy zapis gry... - + Load &patch... Wczytaj &poprawkę... - + Boot BIOS BIOS startowy - + Replace ROM... Wymień ROM... - + Scan e-Reader dotcodes... Skanuj kody kropkowe czytnika e-Reader... - + Convert e-Reader card image to raw... Konwertuj obraz karty czytnika e-Reader na surowy... - + ROM &info... &Informacje o pamięci ROM... - + Recent Ostatnie - + Make portable Stwórz wersję portable - + &Load state &Załaduj stan - + Load state file... Załaduj plik stanu… - + &Save state &Zapisz stan - + Save state file... Zapisz plik stanu... - + Quick load Szybkie załadowanie - + Quick save Szybki zapis - + Load recent Załaduj ostatnie - + Save recent Zapisz ostatnie - + Undo load state Cofnij załadowanie stanu - + Undo save state Cofnij zapisanie stanu - - + + State &%1 Stan &%1 - + Load camera image... Załaduj obraz do kamery... - + Convert save game... Konwertuj zapisaną grę... - + GameShark saves (*.gsv *.sps *.xps) Zapisy GameShark (*.gsv *.sps *.xps) - + Reset needed Wymagane zresetowanie - + Some changes will not take effect until the game is reset. Niektóre zmiany nie zaczną obowiązywać, dopóki gra nie zostanie zresetowana. - + Save games Zapisy gry - + Import GameShark Save... Importuj Zapis GameShark... - + Export GameShark Save... Eksportuj Zapis GameShark... - + Automatically determine Wykryj automatycznie - + Use player %0 save game Użyj zapis gry gracza %0 - + New multiplayer window Nowe okno dla wielu graczy - + Connect to Dolphin... Połącz z Dolphinem... - + Report bug... Zgłoś błąd... - + About... O Aplikacji... - + E&xit Z&akończ - + &Emulation &Emulacja - + &Reset &Resetuj - + Sh&utdown Za&mknij - + Yank game pak Wyciągnij Game Pak - + &Pause &Pauza - + &Next frame &Następna klatka - + Fast forward (held) Przewijanie (przytrzymaj) - + &Fast forward &Przewijanie do przodu - + Fast forward speed Prędkość przewijania do przodu - + Unbounded Bez ograniczeń - + %0x %0x - + Rewind (held) Przewijanie (przytrzymaj) - + Re&wind Pr&zewijanie - + Step backwards Krok w tył - + Solar sensor Czujnik słoneczny - + Increase solar level Zwiększ poziom energii słonecznej - + Decrease solar level Zmniejsz poziom energii słonecznej - + Brightest solar level Najjaśniejszy poziom energii słonecznej - + Darkest solar level Najciemniejszy poziom energii słonecznej - + Brightness %1 Jasność %1 - + Game Boy Printer... Game Boy Printer... - + BattleChip Gate... BattleChip Gate... - + Audio/&Video Dźwięk/&Wideo - + Frame size Rozmiar klatki - + %1× %1× - + Toggle fullscreen Przełącz tryb pełnoekranowy - + Lock aspect ratio Zablokuj proporcje - + Force integer scaling Wymuś skalowanie całkowite - + Interframe blending Blendowanie międzyklatkowe - + Bilinear filtering Filtrowanie dwuliniowe - + Frame&skip Klatko&wanie - + Mute Wycisz - + FPS target Cel KL./S - + Native (59.7275) Natywny (59.7275) - + Take &screenshot Wykonaj &zrzut ekranu - + F12 F12 - + Record A/V... Nagraj A/W... - + Record GIF/WebP/APNG... Nagraj GIF/WebP/APNG... - + Video layers Warstwy wideo - + Audio channels Kanały audio - + Adjust layer placement... Dostosuj położenie warstw... - + &Tools &Narzędzia - + View &logs... Wyświetl &logi... - + Game &overrides... Nadpisania &ustawień gry... - + Game Pak sensors... Czujniki Game Pak... - + &Cheats... &Kody... - + + Create forwarder... + + + + Settings... Ustawienia... - + Open debugger console... Otwórz konsolę debugera... - + Start &GDB server... Uruchom serwer &GDB... - + Scripting... Skrypty... - + Game state views Widoki stanu gry - + View &palette... Wyświetl &paletę... - + View &sprites... Wyświetl &sprite'y... - + View &tiles... Wyświetl &kafelki... - + View &map... Wyświetl &mapę... - + &Frame inspector... Inspektor &klatek... - + View memory... Wyświetl pamięć... - + Search memory... Przeszukaj pamięć... - + View &I/O registers... Wyświetl rejestry &we/wy... - + Record debug video log... Nagraj dziennik wideo debugowania... - + Stop debug video log Zatrzymaj dziennik wideo debugowania - + Exit fullscreen Wyłączyć tryb pełnoekranowy - + GameShark Button (held) Przycisk GameShark (przytrzymany) - + Autofire Turbo - + Autofire A Turbo A - + Autofire B Turbo B - + Autofire L Turbo L - + Autofire R Turbo R - + Autofire Start Turbo Start - + Autofire Select Turbo Select - + Autofire Up Turbo Góra - + Autofire Right Turbo Prawo - + Autofire Down Turbo Dół - + Autofire Left Turbo Lewo - + Clear Wyczyść @@ -6473,32 +6690,32 @@ Rozmiar pobierania: %3 QObject - + %1 byte %1 bajt - + %1 kiB %1 kiB - + %1 MiB %1 MiB - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index d54c32360..c6d1cf783 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + ROMs do Game Boy Advance (%1) + + + + Game Boy ROMs (%1) + ROMs do Game Boy (%1) + + + + All ROMs (%1) + Todas as ROMs (%1) + + + + %1 Video Logs (*.mvl) + %1 Registros do Vídeo (*.mvl) + + QGBA::AboutScreen @@ -92,22 +115,22 @@ Tamanho do download: %3 QGBA::ApplicationUpdater - + Stable Estável - + Development Desenvolvimento - + Unknown Desconhecido - + (None) (Nenhum) @@ -259,7 +282,7 @@ Tamanho do download: %3 Show advanced - Mostrar opções avançadas + Mostrar as opções avançadas @@ -400,12 +423,12 @@ Tamanho do download: %3 Não pode arrancar o pacote numa plataforma inesperada! - + Failed to open snapshot file for reading: %1 Falhou em abrir o arquivo do snapshot pra leitura: %1 - + Failed to open snapshot file for writing: %1 Falhou em abrir o arquivo do snapshot pra gravação: %1 @@ -413,17 +436,17 @@ Tamanho do download: %3 QGBA::CoreManager - + Failed to open game file: %1 Falhou em abrir o arquivo do jogo: %1 - + Could not load game. Are you sure it's in the correct format? Não pôde carregar o jogo. Você tem certeza que está no formato correto? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). Falhou em abrir o abrir o arquivo de salvamento; Os salvamentos dentro do jogo não podem ser atualizados. Por favor tenha certeza que o diretório de salvamento seja gravável sem privilégios adicionais (ex: UAC no Windows). @@ -502,6 +525,195 @@ Tamanho do download: %3 Não pôde conectar com o Dolphin. + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + 2º plano + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Explorar + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -593,7 +805,7 @@ Tamanho do download: %3 QGBA::GBAApp - + Enable Discord Rich Presence Ativar o Discord Rich Presence @@ -601,22 +813,22 @@ Tamanho do download: %3 QGBA::GBAKeyEditor - + Clear Button Limpar Botão - + Clear Analog Limpar Analógico - + Refresh Atualizar - + Set all Definir todos @@ -729,7 +941,7 @@ Tamanho do download: %3 Frameskip - Pulo dos Frames + Frameskip @@ -750,148 +962,168 @@ Tamanho do download: %3 QGBA::GameBoy - - + + Autodetect Auto-detectar - + Game Boy (DMG) Game Boy (DMG) - + Game Boy Pocket (MGB) Game Boy Pocket (MGB) - + Super Game Boy (SGB) Super Game Boy (SGB) - + Super Game Boy 2 (SGB) Super Game Boy 2 (SGB) - + Game Boy Color (CGB) Game Boy Color (CGB) - + Game Boy Advance (AGB) Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) Super Game Boy Color (SGB + CGB) - + ROM Only So a ROM - + MBC1 MBC1 - + MBC2 MBC2 - + MBC3 MBC3 - + MBC3 + RTC MBC3 + RTC - + MBC5 MBC5 - + MBC5 + Rumble MBC5 + Rumble - + MBC6 MBC6 - + MBC7 (Tilt) MBC7 (Inclinação) - + MMM01 MMM01 - + HuC-1 HuC-1 - + HuC-3 HuC-3 - + Pocket Cam Câmara de Bolso - + TAMA5 TAMA5 - + Wisdom Tree Árvore da Sabedoria - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) NT (novo) - + Pokémon Jade/Diamond Pokémon Jade/Diamond - + BBD BBD - + Hitek Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) Sachen (MMC1) - + Sachen (MMC2) Sachen (MMC2) @@ -2910,7 +3142,7 @@ Tamanho do download: %3 Corrompido - + Slot %1 Slot %1 @@ -4070,12 +4302,12 @@ Tamanho do download: %3 QGBA::ReportView - + Bug report archive Arquivo compactado do relatório dos bugs - + ZIP archive (*.zip) Arquivo compactado ZIP (*.zip) @@ -4438,95 +4670,95 @@ Tamanho do download: %3 QGBA::SettingsView - - + + Qt Multimedia Multimídia do Qt - + SDL SDL - + Software (Qt) Software (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (forçar a versão 1.x) - + None Nenhum - + None (Still Image) Nenhum (Imagem Parada) - + Keyboard Teclado - + Controllers Controles - + Shortcuts Atalhos - - + + Shaders Shaders - + Select BIOS Selecionar BIOS - + Select directory Selecione o diretório - + (%1×%2) (%1×%2) - + Never Nunca - + Just now Aconteceu agora - + Less than an hour ago Menos do que uma hora atrás - + %n hour(s) ago %n hora atrás @@ -4534,7 +4766,7 @@ Tamanho do download: %3 - + %n day(s) ago %n dia atrás @@ -4783,7 +5015,7 @@ Tamanho do download: %3 Pause - Pausa + Pausar @@ -4866,37 +5098,37 @@ Tamanho do download: %3 Verificar agora - + Default color palette only Só a cor padrão da paleta - + SGB color palette if available Paleta das cores do 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: @@ -4979,7 +5211,7 @@ Tamanho do download: %3 Force integer scaling - Forçar dimensionamento do inteiro + Forçar o dimensionamento do inteiro @@ -5608,7 +5840,7 @@ Tamanho do download: %3 WavPack - + WavPack @@ -5678,106 +5910,86 @@ Tamanho do download: %3 Show advanced - Mostrar as opções avançadas + Mostrar opções avançadas QGBA::Window - - Game Boy Advance ROMs (%1) - ROMs do Game Boy Advance (%1) - - - - Game Boy ROMs (%1) - ROMs do Game Boy (%1) - - - - All ROMs (%1) - Todas as ROMs (%1) - - - - %1 Video Logs (*.mvl) - %1 Registros do Vídeo (*.mvl) - - - + Archives (%1) Arquivos Compactados (%1) - - - + + + Select ROM Selecionar ROM - + Select folder Selecionar pasta - - + + Select save Selecionar save - + Select patch Selecionar patch - + Patches (*.ips *.ups *.bps) Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Selecionar dotcode do e-Reader - + e-Reader card (*.raw *.bin *.bmp) Cartão do e-Reader (*.raw *.bin *.bmp) - + Select image Selecionar imagem - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Arquivo de imagem (*.png *.gif *.jpg *.jpeg);;Todos os arquivos (*) - + GameShark saves (*.sps *.xps) Saves do GameShark (*.sps *.xps) - + Select video log Selecionar registro do vídeo - + Video logs (*.mvl) Registros do vídeo (*.mvl) - + Crash Crash - + The game has crashed with the following error: %1 @@ -5786,684 +5998,689 @@ Tamanho do download: %3 %1 - + Unimplemented BIOS call 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 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. 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? 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á o emulador carregar sua configuração do mesmo diretório que o executável. Você quer continuar? - + Restart needed Reiniciar é necessário - + Some changes will not take effect until the emulator is restarted. Algumas mudanças não terão efeito até o emulador ser reiniciado. - + - Player %1 of %2 - Jogador %1 de %2 - + %1 - %2 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 %1 - %2 (%3 fps) - %4 - + &File &Arquivo - + Load &ROM... Carregar &ROM... - + Load ROM in archive... Carregar ROM no arquivo compactado... - + Add folder to library... Adicionar pasta a biblioteca... - + Save games Saves dos jogos - + Automatically determine Determinar automaticamente - + Use player %0 save game Usar o save do jogo %0 do jogador - + Load &patch... Carregar &patch... - + Boot BIOS Dar Boot na BIOS - + Replace ROM... Substituir a ROM... - + ROM &info... Informações da &ROM... - + Recent Recentes - + Make portable Tornar portátil - + &Load state &Carregar state - + Report bug... Reportar bug... - + About... Sobre... - + Game Pak sensors... Sensores do Game Pak... - + Clear Limpar - + Load state file... Carregar arquivo do state... - + Save games (%1) Saves dos jogos (%1) - + Select save game Selecione save do jogo - + mGBA save state files (%1) Arquivos do save state do mGBA (%1) - - + + Select save state Selecione um 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 save alternativo do jogo... - + Load temporary save game... 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 o state - + Save state file... Arquivo do save state... - + Quick load Carregamento rápido - + Quick save Salvamento rápido - + Load recent Carregar recentes - + Save recent Salvar recentes - + Undo load state Desfazer o carregamento do state - + Undo save state Desfazer o salvamento do state - - + + State &%1 State &%1 - + Load camera image... Carregar a imagem da câmera... - + Convert save game... Converter o save do jogo... - + GameShark saves (*.gsv *.sps *.xps) Saves do GameShark (*.gsv *.sps *.xps) - + Reset needed É necessário resetar - + Some changes will not take effect until the game is reset. Algumas mudanças não terão efeito até o jogo ser resetado. - + New multiplayer window Nova janela multi-jogador - + Connect to Dolphin... Conectar ao Dolphin... - + E&xit S&air - + &Emulation &Emulação - + &Reset &Resetar - + Sh&utdown De&sligar - + Yank game pak Arrancar o game pak - + &Pause &Pausar - + &Next frame &Próximo frame - + Fast forward (held) Avanço rápido (segurado) - + &Fast forward &Avanço rápido - + Fast forward speed Velocidade do avanço rápido - + Unbounded Ilimitado - + %0x %0x - + Rewind (held) Retroceder (segurado) - + Re&wind Re&troceder - + Step backwards Voltar um passo - + Solar sensor Sensor solar - + Increase solar level Aumentar nível solar - + Decrease solar level Diminuir nível solar - + Brightest solar level Nível solar mais brilhante - + Darkest solar level Nível solar mais escuro - + Brightness %1 Brilho %1 - + Audio/&Video Áudio/&Vídeo - + Frame size Tamanho do frame - + Toggle fullscreen Alternar tela cheia - + Lock aspect ratio Travar a proporção do aspecto - + Force integer scaling - Forçar o dimensionamento do inteiro + Forçar dimensionamento do inteiro - + Bilinear filtering Filtragem bilinear - + Frame&skip Frame&skip - + Mute Mudo - + FPS target FPS alvo - + Native (59.7275) Nativo (59,7275) - + Take &screenshot Tirar &screenshot - + F12 F12 - + Game Boy Printer... Impressora do Game Boy... - + BattleChip Gate... Portal do BattleChip... - + %1× %1× - + Interframe blending Mistura do interframe - + Record A/V... Gravar A/V... - + Video layers Camadas do vídeo - + Audio channels Canais de áudio - + Adjust layer placement... Ajustar posicionamento da camada... - + &Tools &Ferramentas - + View &logs... Visualizar &registros... - + Game &overrides... Substituições &do jogo... - + Couldn't Start Não Pôde Iniciar - + Could not start game. Não pôde iniciar o jogo. - + Scan e-Reader dotcodes... Escanear dotcodes do e-Reader... - + Import GameShark Save... Importar Save do GameShark... - + Export GameShark Save... Exportar Save do GameShark... - + Record GIF/WebP/APNG... Gravar GIF/WebP/APNG... - + &Cheats... &Trapaças... - + Settings... Configurações... - + Open debugger console... Abrir console do debugger... - + Start &GDB server... Iniciar servidor do &GDB... - + Scripting... Scripting... - + + Create forwarder... + + + + Game state views Visualizações do estado do jogo - + View &palette... Visualizar &paleta... - + View &sprites... Visualizar &imagens móveis... - + View &tiles... Visualizar &ladrilhos... - + View &map... Visualizar &mapa... - + &Frame inspector... Inspetor dos &frames... - + View memory... Visualizar memória... - + Search memory... Procurar na memória... - + View &I/O registers... Visualizar registros de &E/S... - + Record debug video log... Gravar registro do vídeo de debug... - + Stop debug video log Parar o registro do vídeo de debug - + Exit fullscreen Sair da tela cheia - + GameShark Button (held) Botão do GameShark (segurado) - + Autofire Auto-disparar - + Autofire A Auto-disparar A - + Autofire B Auto-disparar B - + Autofire L Auto-disparar L - + Autofire R Auto-disparar R - + Autofire Start Auto-disparar Start - + Autofire Select Auto-disparar Select - + Autofire Up Auto-disparar Pra Cima - + Autofire Right Auto-disparar Direita - + Autofire Down Auto-disparar Pra Baixo - + Autofire Left Auto-disparar Esquerda @@ -6471,32 +6688,32 @@ Tamanho do download: %3 QObject - + %1 byte %1 byte - + %1 kiB %1 kiBs - + %1 MiB %1 MiBs - + GBA GBA - + GB GBs - + ? ? diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 33874b707..0a3e0e6a7 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + Игры Game Boy Advance (%1) + + + + Game Boy ROMs (%1) + Игры Game Boy (%1) + + + + All ROMs (%1) + Все игры (%1) + + + + %1 Video Logs (*.mvl) + Журналы видео %1 (*.mvl) + + QGBA::AboutScreen @@ -92,22 +115,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable Стабильная - + Development В разработке - + Unknown Неизвестно - + (None) (Нет) @@ -400,12 +423,12 @@ Download size: %3 Невозможно пнуть картридж на неожиданной платформе! - + Failed to open snapshot file for reading: %1 Не удалось открыть файл изображения для считывания: %1 - + Failed to open snapshot file for writing: %1 Не удалось открыть файл изображения для записи: %1 @@ -413,17 +436,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 Не удалось открыть файл игры: %1 - + Could not load game. Are you sure it's in the correct format? Не удалось загрузить игру. Вы уверены, что она в правильном формате? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). Не удалось открыть файл с сохранениями; внутриигровые сохранения не могут быть обновлены. Убедитесь, что директория с сохранениями доступна на запись без повышения привилегий (например, UAC на Windows). @@ -502,6 +525,195 @@ Download size: %3 Не удалось соединиться с Dolphin. + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + Фон + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Открыть + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -593,7 +805,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence Вкл. расширенный статус в Discord @@ -601,22 +813,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button Сброс кнопки - + Clear Analog Сброс аналога - + Refresh Обновить - + Set all Назначить все @@ -651,7 +863,7 @@ Download size: %3 Internal change detection - + Обнаружение внутренних изменений @@ -749,149 +961,169 @@ Download size: %3 QGBA::GameBoy - - - - Autodetect - Автоопределение - - - - Game Boy (DMG) - - - - - Game Boy Pocket (MGB) - - - - - Super Game Boy (SGB) - - - - - Super Game Boy 2 (SGB) - - - Game Boy Color (CGB) - + + Autodetect + Автоопределение - Game Boy Advance (AGB) - + Game Boy (DMG) + Game Boy (DMG) - Super Game Boy Color (SGB + CGB) - + Game Boy Pocket (MGB) + Game Boy Pocket (MGB) - + + Super Game Boy (SGB) + Super Game Boy (SGB) + + + + Super Game Boy 2 (SGB) + Super Game Boy 2 (SGB) + + + + Game Boy Color (CGB) + Game Boy Color (CGB) + + + + Game Boy Advance (AGB) + Game Boy Advance (AGB) + + + + Super Game Boy Color (SGB + CGB) + Super Game Boy Color (SGB + CGB) + + + ROM Only Только ROM - - - MBC1 - - - - - MBC2 - - - - - MBC3 - - - - - MBC3 + RTC - - - - - MBC5 - - - MBC5 + Rumble - + MBC1 + MBC1 - MBC6 - + MBC2 + MBC2 - MBC7 (Tilt) - + MBC3 + MBC3 - MMM01 - + MBC3 + RTC + MBC3 + RTC - HuC-1 - + MBC5 + MBC5 - HuC-3 - + MBC5 + Rumble + MBC5 + Rumble + MBC6 + MBC6 + + + + MBC7 (Tilt) + MBC7 (Tilt) + + + + MMM01 + MMM01 + + + + HuC-1 + HuC-1 + + + + HuC-3 + HuC-3 + + + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2125,7 +2357,7 @@ Download size: %3 Value - Значение + Значение @@ -2142,7 +2374,7 @@ Download size: %3 1/64 - 1/64 + 1/64 @@ -2151,7 +2383,7 @@ Download size: %3 1/256 - 1/256 + 1/256 @@ -2160,7 +2392,7 @@ Download size: %3 1/1024 - 1/1024 + 1/1024 @@ -2479,7 +2711,7 @@ Download size: %3 1/16 - 1/16 + 1/16 @@ -2590,7 +2822,7 @@ Download size: %3 Mode - Режим + Режим @@ -2772,7 +3004,7 @@ Download size: %3 --- - + --- @@ -2910,7 +3142,7 @@ Download size: %3 Повреждено - + Slot %1 Слот %1 @@ -2926,12 +3158,12 @@ Download size: %3 Fatal - Фатальная ошибка + Фатальная ошибка Error - Ошибка + Ошибка @@ -2956,7 +3188,7 @@ Download size: %3 Game Error - Ошибка игры + Ошибка игры @@ -3123,7 +3355,7 @@ Download size: %3 Xform - + Xform @@ -3657,7 +3889,7 @@ Download size: %3 0x%0 - + 0x%0 @@ -3669,7 +3901,7 @@ Download size: %3 --- - + --- @@ -3679,7 +3911,7 @@ Download size: %3 OBJWIN - + OBJWIN @@ -3919,12 +4151,12 @@ Download size: %3 #%0 - + #%0 0x%0 - + 0x%0 @@ -3932,7 +4164,7 @@ Download size: %3 0x%0 (%1) - 0x%0 (%1) + 0x%0 (%1) @@ -4064,18 +4296,18 @@ Download size: %3 CRC32: - CRC32: + CRC32: QGBA::ReportView - + Bug report archive Архив отчётов об ошибках - + ZIP archive (*.zip) ZIP архив (*.zip) @@ -4097,7 +4329,7 @@ Download size: %3 Save - Сохранить + Сохранить @@ -4216,7 +4448,7 @@ Download size: %3 SRAM - SRAM + SRAM @@ -4332,7 +4564,7 @@ Download size: %3 0 - 0 + 0 @@ -4438,95 +4670,95 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + Qt Multimedia - + SDL - + SDL - + Software (Qt) Программный рендеринг (Qt) - + OpenGL - + OpenGL - + OpenGL (force version 1.x) - + None Нет - + None (Still Image) Нет (статичное изображение) - + Keyboard Клавиатура - + Controllers Контроллеры - + Shortcuts Сочетания клавиш - - + + Shaders Шейдеры - + Select BIOS Выбор BIOS - + Select directory Выбор папки - + (%1×%2) - + (%1×%2) - + Never Никогда - + Just now Только сейчас - + Less than an hour ago Менее часа назад - + %n hour(s) ago %n час назад @@ -4535,7 +4767,7 @@ Download size: %3 - + %n day(s) ago %n день назад @@ -4596,7 +4828,7 @@ Download size: %3 Game Boy - Game Boy + Game Boy @@ -4908,37 +5140,37 @@ Download size: %3 Палитра Game Boy - + Default color palette only Только цветовая палитра по умолчанию - + SGB color palette if available Цветовая палитра SGB (если доступна) - + GBC color palette if available Цветовая палитра GBC (если доступна) - + SGB (preferred) or GBC color palette if available Цветовая палитра SGB (предпочтительно) или GBC (если доступны) - + Game Boy Camera - + Driver: Драйвер: - + Source: Источник: @@ -5144,7 +5376,7 @@ Download size: %3 (240×160) - + (240×160) @@ -5518,7 +5750,7 @@ Download size: %3 WebM - + WebM @@ -5528,17 +5760,17 @@ Download size: %3 &1080p - + &1080p &720p - + &720p &480p - + &480p @@ -5553,18 +5785,18 @@ Download size: %3 MKV - + MKV AVI - + AVI MP4 - + MP4 @@ -5574,27 +5806,27 @@ Download size: %3 HEVC - + HEVC HEVC (NVENC) - + HEVC (NVENC) VP8 - + VP8 VP9 - + VP9 FFV1 - + FFV1 @@ -5605,17 +5837,17 @@ Download size: %3 FLAC - + FLAC WavPack - + WavPack Opus - + Opus @@ -5625,7 +5857,7 @@ Download size: %3 MP3 - + MP3 @@ -5686,100 +5918,80 @@ Download size: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - Игры Game Boy Advance (%1) - - - - Game Boy ROMs (%1) - Игры Game Boy (%1) - - - - All ROMs (%1) - Все игры (%1) - - - - %1 Video Logs (*.mvl) - Журналы видео %1 (*.mvl) - - - + Archives (%1) Архивы (%1) - - - + + + Select ROM Выбор игры - + Select folder Выбор папки - - + + Select save Выбор сохранения - + Select patch Выбор патча - + Patches (*.ips *.ups *.bps) Патчи (*.ips *.ups *.bps) - + Select e-Reader dotcode Выбор карточки e-Reader - + e-Reader card (*.raw *.bin *.bmp) Карточка e-Reader (*.raw *.bin *.bmp) - + Select image Выбор изображения - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Файл изображения (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) Сохранения GameShark (*.sps *.xps) - + Select video log Выбор видеолога - + Video logs (*.mvl) Видеологи (*.mvl) - + Crash Сбой - + The game has crashed with the following error: %1 @@ -5788,719 +6000,724 @@ Download size: %3 %1 - + Couldn't Start Запуск не удался - + Could not start game. Не удалось запустить игру. - + Unimplemented BIOS call Неизвестный вызов BIOS - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Игра использует нереализованный вызов BIOS. Пожалуйста, воспользуйтесь официальным BIOS для лучшей совместимости. - + 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 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File &Файл - + Load &ROM... Загрузить &ROM... - + Load ROM in archive... Загрузить игру из архива... - + Add folder to library... Добавить папку в библиотеку... - + Save games (%1) Игровые сохранения (%1) - + Select save game Выбор игрового сохранения - + mGBA save state files (%1) Файл сохранения состояния mGBA (%1) - - + + Select save state Выбор сохранения состояния - + Select e-Reader card images Выбор изображения карточки e-Reader - + Image file (*.png *.jpg *.jpeg) Файл изображения (*.png *.jpg *.jpeg) - + Conversion finished Конвертация завершена - + %1 of %2 e-Reader cards converted successfully. %1 из %2 карточек e-Reader успешно сконвертировано. - + Load alternate save game... Загрузить альтернативное сохранение... - + Load temporary save game... Загрузить временное сохранение... - + Load &patch... Загрузить &патч... - + Boot BIOS Загрузиться в BIOS - + Replace ROM... Заменить ROM... - + Scan e-Reader dotcodes... Сканировать dot-коды e-Reader... - + Convert e-Reader card image to raw... Конвертировать карту e-Reader в 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 Слот &%1 - + Load camera image... Загрузить изображение с камеры... - + Convert save game... Конвертировать игровое сохранение... - + GameShark saves (*.gsv *.sps *.xps) Сохранения GameShark (*.gsv *.sps *.xps) - + Reset needed Необходима перезагрузка - + Some changes will not take effect until the game is reset. Некоторые изменения не войдут в силу, пока игра не перезагружена. - + Save games Сохранения - + Import GameShark Save... Импорт сохранения GameShark... - + Export GameShark Save... Экспорт сохранения GameShark... - + Automatically determine Определить автоматически - + Use player %0 save game Использовать сохранение игрока %0 - + New multiplayer window Новое окно мультиплеера - + Connect to Dolphin... Соединение с Dolphin... - + Report bug... Сообщить об ошибке... - + About... О программе... - + E&xit &Выход - + &Emulation &Эмуляция - + &Reset Перезагрузить (&R/&К) - + Sh&utdown Выключить (&U/&Г) - + Yank game pak Пнуть картридж - + &Pause Пау&за - + &Next frame Следующий кадр (&N/&Т) - + Fast forward (held) Перемотка (удержание) - + &Fast forward Перемотк&а - + Fast forward speed Скорость перемотки - + Unbounded Неограниченная - + %0x - %0x + %0x - + Rewind (held) Обратная перемотка (удержание) - + Re&wind Обратная перемотка (&W/&Ц) - + Step backwards Шаг назад - + Solar sensor Датчик солнца - + Increase solar level Усилить солнечный свет - + Decrease solar level Ослабить солнечный свет - + Brightest solar level Ярчайшее солнце - + Darkest solar level Тусклейшее солнце - + Brightness %1 Яркость %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video Аудио/Видео (&V/&М) - + Frame size Размер кадра - + %1× - %1× + %1× - + Toggle fullscreen Переключить полноэкранный режим - + Lock aspect ratio Зафиксировать соотношение сторон - + Force integer scaling Принудительное целочисленное масштабирование - + Interframe blending Межкадровое смешение - + Bilinear filtering Билинейная фильтрация - + Frame&skip Пропуск кадров (&S/&Ы) - + Mute Выключить звук - + FPS target Целевой FPS - + Native (59.7275) Родной (59.7275) - + Take &screenshot Снять скриншот (&S/&Ы) - + F12 - + F12 - + Record A/V... Записать аудио/видео... - + Record GIF/WebP/APNG... Записать GIF/WebP/APNG... - + Video layers Видеослои - + Audio channels Аудиоканалы - + Adjust layer placement... Настроить расположение слоёв... - + &Tools Инструм&енты - + View &logs... Посмотреть в журнал... (&L/&Д) - + Game &overrides... Переопределения для этой игры... (&О/&Щ) - + Game Pak sensors... Датчики в Game Pak... - + &Cheats... Читы... (&C/&С) - + + Create forwarder... + + + + Settings... Настройки... - + Open debugger console... Открыть консоль отладки... - + Start &GDB server... Запустить сервер &GDB... - + Scripting... Скрипты... - + Game state views Просмотр состояния игры - + View &palette... Просмотр палитры... (&P/&З) - + View &sprites... Просмотр спрайтов... (&S/&Ы) - + View &tiles... Просмотр тайлов... (&T/&Е) - + View &map... Просмотр карты... (&M/&Ь) - + &Frame inspector... Изучение фрейм&а... - + View memory... Просмотр памяти... - + Search memory... Поиск в памяти... - + View &I/O registers... Просмотр регистров &I/O... - + Record debug video log... Запись отладочного видеожурнала... - + Stop debug video log Закончить запись отладочного видеожурнала - + Exit fullscreen Выйти из полноэкранного режима - + GameShark Button (held) Кнопка GameShark (удерживается) - + Autofire Автострельба - + Autofire A A (автострельба) - + Autofire B B (автострельба) - + Autofire L L (автострельба) - + Autofire R R (автострельба) - + Autofire Start Start (автострельба) - + Autofire Select Select (автострельба) - + Autofire Up Вверх (автострельба) - + Autofire Right Вправо (автострельба) - + Autofire Down Вниз (автострельба) - + Autofire Left Влево (автострельба) - + Clear - Очистить + Очистить QObject - + %1 byte %1 байт - + %1 kiB - + %1 MiB - + GBA - + GBA - + GB - + GB - + ? - + ? diff --git a/src/platform/qt/ts/mgba-sv.ts b/src/platform/qt/ts/mgba-sv.ts new file mode 100644 index 000000000..88d08dee1 --- /dev/null +++ b/src/platform/qt/ts/mgba-sv.ts @@ -0,0 +1,6742 @@ + + + + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + + + QGBA::AboutScreen + + + About + Om mGBA + + + + <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/">Hemsida</a> • <a href="https://forums.mgba.io/">Forum / Hjälp</a> • <a href="https://patreon.com/mgba">Stödja mGBA</a> • <a href="https://github.com/mgba-emu/mgba/tree/{gitBranch}">Källkod</a> + + + + Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> + Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> + + + + {projectName} would like to thank the following patrons from Patreon: + {projectName} tackar följande donatorer från 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, licensierad under Mozilla Public License, version 2.0 +Game Boy Advance är ett registrerat varumärke av Nintendo Co., Ltd. + + + + {projectName} is an open-source Game Boy Advance emulator + {projectName} är en emulator för Game Boy Advance, byggt på öppen källkod + + + + QGBA::ApplicationUpdatePrompt + + + An update is available + En uppdatering är tillgänglig + + + + An update to %1 is available. + + En uppdatering till %1 är tillgänglig. + + + + + +Do you want to download and install it now? You will need to restart the emulator when the download is complete. + +Vill du ladda ner och installera det nu? Programmet måste startas om när nedladdningen är klar. + + + + +Auto-update is not available on this platform. If you wish to update you will need to do it manually. + +Det finns ej automatiska uppdateringar för detta operativ system. Önskar du uppdatera programmet måste du göra det manuellt. + + + + Current version: %1 +New version: %2 +Download size: %3 + Nuvarande version: %1 +Nästa version: %2 +Nedladdningsstorlek: %3 + + + + Downloading update... + Uppdatering laddas ner... + + + + Downloading failed. Please update manually. + Nedladdningen misslyckades. Uppdateringen måste installeras manuellt. + + + + Downloading done. Press OK to restart %1 and install the update. + Nedladdning klar. Välj OK för att starta om %1 och installera uppdateringen. + + + + QGBA::ApplicationUpdater + + + Stable + Standard + + + + Development + Utveckling + + + + Unknown + Okänd + + + + (None) + (Inga) + + + + QGBA::ArchiveInspector + + + Open in archive... + Öppna i arkiveringsprogram... + + + + Loading... + Laddas... + + + + QGBA::AssetTile + + + Tile # + Tile # + + + + Palette # + Palette # + + + + Address + Adress + + + + Red + Röd + + + + Green + Grön + + + + Blue + Blå + + + + + + 0x%0 (%1) + 0x%0 (%1) + + + + QGBA::AudioDevice + + + Can't set format of context-less audio device + Det går inte att ställa in formatet för kontextlös ljudenhet + + + + Audio device is missing its core + Ljudenheten saknar kärnan + + + + Writing data to read-only audio device + Skriver data till skrivskyddad ljudenhet + + + + QGBA::AudioProcessorQt + + + Can't start an audio processor without input + Kan inte starta en ljudprocessor utan ingång + + + + QGBA::AudioProcessorSDL + + + Can't start an audio processor without input + Kan inte starta en ljudprocessor utan ingång + + + + QGBA::BattleChipView + + + BattleChip Gate + BattleChip Gate + + + + Chip name + Chip namn + + + + Insert + Infoga + + + + Save + Spara + + + + Load + Ladda + + + + Add + Lägg till + + + + Remove + Ta bort + + + + Gate type + Gate typ + + + + Inserted + Infogad + + + + Chip ID + Chip ID + + + + Update Chip data + Uppdatera Chip-data + + + + Show advanced + Visa avancerat + + + + BattleChip data missing + BattleChip-data saknas + + + + BattleChip data is missing. BattleChip Gates will still work, but some graphics will be missing. Would you like to download the data now? + BattleChip-data saknas. BattleChip Gates fungerar fortfarande, men viss grafik kommer att saknas. Vill du ladda ner datan nu? + + + + + Select deck file + Välj deck-fil + + + + Incompatible deck + Inkompatibelt deck + + + + The selected deck is not compatible with this Chip Gate + Den valda deck är inte kompatibel med denna Chip Gate + + + + QGBA::CheatsModel + + + (untitled) + (saknar namn) + + + + Failed to open cheats file: %1 + Misslyckades att öppna cheats-filen: %1 + + + + QGBA::CheatsView + + + Cheats + Cheats + + + + Add New Code + Lägg till ny kod + + + + Remove + Ta bort + + + + Add Lines + + + + + Code type + + + + + Save + Spara + + + + Load + Ladda + + + + Enter codes here... + + + + + + Autodetect (recommended) + + + + + + Select cheats file + + + + + Some cheats could not be added. Please ensure they're formatted correctly and/or try other cheat types. + + + + + QGBA::CoreController + + + Reset r%1-%2 %3 + + + + + + Rewinding not currently enabled + + + + + Reset the game? + + + + + Most games will require a reset to load the new save. Do you want to reset now? + + + + + 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; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). + + + + + QGBA::DebuggerConsole + + + Debugger + + + + + Enter command (try `help` for more info) + + + + + Break + + + + + QGBA::DebuggerConsoleController + + + Could not open CLI history for writing + + + + + QGBA::DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + + + Couldn't Connect + + + + + Could not connect to Dolphin. + + + + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + + + QGBA::FrameView + + + Inspect frame + + + + + Magnification + + + + + Freeze frame + + + + + Backdrop color + + + + + Disable scanline effects + + + + + Export + + + + + Reset + + + + + 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 + + + + + Write watchpoints behavior + + + + + Standard GDB + + + + + Internal change detection + + + + + Break on all writes + + + + + Break + + + + + Stop + + + + + Start + + + + + Crash + + + + + Could not start GDB server + + + + + QGBA::GIFView + + + Record GIF/WebP/APNG + + + + + Loop + + + + + Start + + + + + Stop + + + + + Select File + + + + + APNG + + + + + GIF + + + + + WebP + + + + + Frameskip + + + + + Failed to open output file: %1 + + + + + Select output file + + + + + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) + + + + + QGBA::GameBoy + + + + Autodetect + + + + + Game Boy (DMG) + + + + + Game Boy Pocket (MGB) + + + + + Super Game Boy (SGB) + + + + + Super Game Boy 2 (SGB) + + + + + Game Boy Color (CGB) + + + + + Game Boy Advance (AGB) + + + + + Super Game Boy Color (SGB + CGB) + + + + + ROM Only + + + + + MBC1 + + + + + MBC2 + + + + + MBC3 + + + + + MBC3 + RTC + + + + + MBC5 + + + + + MBC5 + Rumble + + + + + MBC6 + + + + + MBC7 (Tilt) + + + + + MMM01 + + + + + HuC-1 + + + + + HuC-3 + + + + + Pocket Cam + + + + + TAMA5 + + + + + Wisdom Tree + + + + + NT (old 1) + + + + + NT (old 2) + + + + + NT (new) + + + + + Pokémon Jade/Diamond + + + + + BBD + + + + + Hitek + + + + + GGB-81 + + + + + Li Cheng + + + + + Sachen (MMC1) + + + + + Sachen (MMC2) + + + + + QGBA::IOViewer + + + I/O Viewer + + + + + 0x0000 + + + + + + + B + + + + + 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 + + + + + + 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 + Okänd + + + + + Current index + + + + + + Auto-increment + + + + + + Red + Röd + + + + + Blue + Blå + + + + Sprite ordering + + + + + OAM order + + + + + x coordinate sorting + + + + + WRAM bank + + + + + QGBA::KeyEditor + + + + --- + + + + + Super (L) + + + + + Super (R) + + + + + Menu + + + + + QGBA::LibraryTree + + + Name + + + + + Location + + + + + Platform + + + + + Size + + + + + CRC32 + + + + + QGBA::LoadSaveState + + + + %1 State + + + + + + + + + + + + + No Save + + + + + 5 + + + + + 6 + + + + + 8 + + + + + 4 + + + + + 1 + + + + + 3 + + + + + 7 + + + + + 9 + + + + + 2 + + + + + Cancel + + + + + 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::LogView + + + Logs + + + + + Enabled Levels + + + + + Debug + + + + + Stub + + + + + Info + + + + + Warning + + + + + Error + + + + + Fatal + + + + + Game Error + + + + + Advanced settings + + + + + Clear + + + + + Max Lines + + + + + QGBA::MapView + + + Maps + + + + + Magnification + + + + + Export + + + + + Copy + + + + + 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 Range + + + + + Start Address: + + + + + Byte Count: + + + + + Dump across banks + + + + + Save memory region + + + + + Failed to open output file: %1 + + + + + QGBA::MemoryModel + + + Copy selection + + + + + Save selection + + + + + Paste + + + + + Load + Ladda + + + + 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 + + + Memory Search + + + + + Address + Adress + + + + Current Value + + + + + + Type + + + + + Value + + + + + Numeric + + + + + Text + + + + + Width + + + + + + Guess + + + + + 1 Byte (8-bit) + + + + + 2 Bytes (16-bit) + + + + + 4 Bytes (32-bit) + + + + + Number type + + + + + Decimal + + + + + Hexadecimal + + + + + Search type + + + + + Equal to value + + + + + Greater than value + + + + + Less than value + + + + + Unknown/changed + + + + + Changed by value + + + + + Unchanged + + + + + Increased + + + + + Decreased + + + + + Search ROM + + + + + New Search + + + + + Search Within + + + + + Open in Memory Viewer + + + + + Refresh + + + + + (%0/%1×) + + + + + (⅟%0×) + + + + + (%0×) + + + + + %1 byte%2 + + + + + QGBA::MemoryView + + + Memory + + + + + Inspect Address: + + + + + Set Alignment: + + + + + &1 Byte + + + + + &2 Bytes + + + + + &4 Bytes + + + + + Unsigned Integer: + + + + + Signed Integer: + + + + + String: + + + + + Load TBL + + + + + Copy Selection + + + + + Paste + + + + + Save Selection + + + + + Save Range + + + + + Load + Ladda + + + + QGBA::MessagePainter + + + Frame %1 + + + + + QGBA::ObjView + + + Sprites + + + + + Address + Adress + + + + Copy + + + + + Magnification + + + + + Geometry + + + + + Position + + + + + Dimensions + + + + + Matrix + + + + + Export + + + + + Attributes + + + + + Transform + + + + + + Off + + + + + Palette + + + + + Double Size + + + + + + + Return, Ctrl+R + + + + + Flipped + + + + + H + Short for horizontal + + + + + V + Short for vertical + + + + + Mode + + + + + + Normal + + + + + Mosaic + + + + + Enabled + + + + + Priority + + + + + Tile + + + + + + 0x%0 + + + + + + + + + + + + --- + + + + + Trans + + + + + OBJWIN + + + + + Invalid + + + + + + N/A + + + + + Export sprite + + + + + Portable Network Graphics (*.png) + + + + + QGBA::OverrideView + + + Game Overrides + + + + + Game Boy Advance + + + + + + + + Autodetect + + + + + Realtime clock + + + + + Gyroscope + + + + + Tilt + + + + + Light sensor + + + + + Rumble + + + + + Save type + + + + + None + + + + + SRAM + + + + + Flash 512kb + + + + + Flash 1Mb + + + + + EEPROM 8kB + + + + + EEPROM 512 bytes + + + + + SRAM 64kB (bootlegs only) + + + + + 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 + + + + + Official MBCs + + + + + Licensed MBCs + + + + + Unlicensed MBCs + + + + + QGBA::PaletteView + + + Palette + + + + + Background + + + + + Objects + + + + + Selection + + + + + Red + Röd + + + + Green + Grön + + + + Blue + Blå + + + + 16-bit value + + + + + Hex code + + + + + Palette index + + + + + Export BG + + + + + Export OBJ + + + + + #%0 + + + + + 0x%0 + + + + + + + + 0x%0 (%1) + 0x%0 (%1) + + + + Export palette + + + + + Windows PAL (*.pal);;Adobe Color Table (*.act) + + + + + Failed to open output palette file: %1 + + + + + QGBA::PlacementControl + + + Adjust placement + + + + + All + + + + + Offset + + + + + X + + + + + Y + + + + + QGBA::PrinterView + + + Game Boy Printer + + + + + Hurry up! + + + + + Tear off + + + + + Magnification + + + + + Copy + + + + + Save Printout + + + + + Portable Network Graphics (*.png) + + + + + QGBA::ROMInfo + + + + + + (unknown) + + + + + bytes + + + + + (no database present) + + + + + ROM Info + + + + + Game name: + + + + + Internal name: + + + + + Game ID: + + + + + File size: + + + + + CRC32: + + + + + QGBA::ReportView + + + Bug report archive + + + + + ZIP archive (*.zip) + + + + + 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 + Spara + + + + Open issue list in browser + + + + + Include save file + + + + + Create and include savestate + + + + + 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 + + + + + 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 + + + + + %1 SharkPort %2 save game + + + + + %1 GameShark Advance SP %2 save game + + + + + QGBA::ScriptingTextBuffer + + + Untitled buffer + + + + + QGBA::ScriptingView + + + Scripting + + + + + Run + + + + + File + + + + + Load recent script + + + + + Load script... + + + + + &Reset + + + + + 0 + + + + + Select script to load + + + + + Lua scripts (*.lua) + + + + + All files (*.*) + + + + + QGBA::SensorView + + + Sensors + + + + + Realtime clock + + + + + Fixed time + + + + + System time + + + + + Start time at + + + + + Now + + + + + Offset time + + + + + sec + + + + + MM/dd/yy hh:mm:ss AP + + + + + Light sensor + + + + + Brightness + + + + + Tilt sensor + + + + + + Set Y + + + + + + Set X + + + + + Gyroscope + + + + + Sensitivity + + + + + QGBA::SettingsView + + + + Qt Multimedia + + + + + SDL + + + + + Software (Qt) + + + + + + OpenGL + + + + + OpenGL (force version 1.x) + + + + + None + + + + + None (Still Image) + + + + + Keyboard + + + + + Controllers + + + + + Shortcuts + + + + + + Shaders + + + + + Select BIOS + + + + + Select directory + + + + + (%1×%2) + + + + + Never + + + + + Just now + + + + + Less than an hour ago + + + + + %n hour(s) ago + + + + + + + + %n day(s) ago + + + + + + + + Settings + + + + + Audio/Video + + + + + Gameplay + + + + + Interface + + + + + Update + + + + + 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: + + + + + Audio in multiplayer: + + + + + All windows + + + + + Player 1 window only + + + + + Currently active player window + + + + + Display driver: + + + + + Frameskip: + + + + + Skip every + + + + + + frames + + + + + FPS target: + + + + + frames per second + + + + + Sync: + + + + + + Video + + + + + + Audio + + + + + Lock aspect ratio + + + + + Force integer scaling + + + + + Bilinear filtering + + + + + Show filename instead of ROM name in library view + + + + + + Pause + + + + + When inactive: + + + + + On loading a game: + + + + + Load last state + + + + + Load cheats + + + + + Save entered cheats + + + + + When minimized: + + + + + Current channel: + + + + + Current version: + + + + + Update channel: + + + + + Available version: + + + + + (Unknown) + + + + + Last checked: + + + + + Automatically check on start + + + + + Check now + + + + + 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 + + + + + Library: + + + + + List view + + + + + Tree view + + + + + Show when no game open + + + + + Clear cache + + + + + Allow opposing input directions + + + + + Suspend screensaver + + + + + Dynamically update window title + + + + + Show filename instead of ROM name in title bar + + + + + Show OSD messages + + + + + Enable Discord Rich Presence + + + + + Periodically autosave state + + + + + Show FPS in title bar + + + + + Show frame count in OSD + + + + + Show emulation info on reset + + + + + 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 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 + 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 + + + + + QGBA::ShaderSelector + + + No shader active + + + + + Load shader + + + + + No shader loaded + + + + + by %1 + + + + + Preprocessing + + + + + Pass %1 + + + + + Shaders + + + + + Active Shader: + + + + + Name + + + + + Author + + + + + Description + + + + + Unload Shader + + + + + Load New Shader + + + + + QGBA::ShortcutModel + + + Action + + + + + Keyboard + + + + + Gamepad + + + + + QGBA::ShortcutView + + + Edit Shortcuts + + + + + Keyboard + + + + + Gamepad + + + + + Clear + + + + + QGBA::TileView + + + Export tiles + + + + + + Portable Network Graphics (*.png) + + + + + Export tile + + + + + Tiles + + + + + Export Selected + + + + + Export All + + + + + 256 colors + + + + + Palette + + + + + Magnification + + + + + Tiles per row + + + + + Fit to window + + + + + Displayed tiles + + + + + Only BG tiles + + + + + Only OBJ tiles + + + + + Both + + + + + Copy Selected + + + + + Copy All + + + + + QGBA::VideoView + + + Failed to open output video file: %1 + + + + + Native (%0x%1) + + + + + Select output file + + + + + 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 + + + + + WavPack + + + + + Opus + + + + + Vorbis + + + + + MP3 + + + + + AAC + + + + + Uncompressed + + + + + Bitrate (kbps) + + + + + ABR + + + + + H.264 + + + + + H.264 (NVENC) + + + + + VBR + + + + + CRF + + + + + Dimensions + + + + + Lock aspect ratio + + + + + Show advanced + Visa avancerat + + + + QGBA::Window + + + 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... + + + + + GameShark saves (*.gsv *.sps *.xps) + + + + + Reset needed + + + + + Some changes will not take effect until the game is reset. + + + + + Save games + + + + + Import GameShark Save... + + + + + Export GameShark Save... + + + + + Automatically determine + + + + + Use player %0 save game + + + + + 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 + + + + + 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... + + + + + Create forwarder... + + + + + Settings... + + + + + Open debugger console... + + + + + Start &GDB server... + + + + + Scripting... + + + + + Game state views + + + + + 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 + + + + diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 6e39742bf..ea755cf4a 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + + + + + Game Boy ROMs (%1) + + + + + All ROMs (%1) + + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -86,22 +109,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown - + (None) @@ -394,12 +417,12 @@ Download size: %3 - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -407,17 +430,17 @@ Download size: %3 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; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -496,6 +519,195 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -587,7 +799,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence @@ -595,22 +807,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button - + Clear Analog - + Refresh - + Set all @@ -744,148 +956,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2904,7 +3136,7 @@ Download size: %3 - + Slot %1 @@ -4064,12 +4296,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive - + ZIP archive (*.zip) @@ -4432,102 +4664,102 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) - + OpenGL - + OpenGL (force version 1.x) - + None - + None (Still Image) - + Keyboard - + Controllers - + Shortcuts - - + + Shaders - + Select BIOS - + Select directory - + (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4853,37 +5085,37 @@ Download size: %3 - + 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: @@ -5676,784 +5908,769 @@ Download size: %3 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... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + Save games - + Import GameShark Save... - + Export GameShark Save... - + Automatically determine - + Use player %0 save game - + 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 - + 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... - + + Create forwarder... + + + + Settings... - + Open debugger console... - + Start &GDB server... - + Scripting... - + Game state views - + 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 @@ -6461,32 +6678,32 @@ Download size: %3 QObject - + %1 byte - + %1 kiB - + %1 MiB - + GBA - + GB - + ? diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index e5f5c6074..66005a809 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + Game Boy Advance ROMları (%1) + + + + Game Boy ROMs (%1) + Game Boy ROMları (%1) + + + + All ROMs (%1) + Bütün ROMlar (%1) + + + + %1 Video Logs (*.mvl) + + + QGBA::AboutScreen @@ -87,22 +110,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable - + Development - + Unknown Bilinmeyen - + (None) @@ -395,12 +418,12 @@ Download size: %3 Beklenmedik bir platformda kartı çıkaramazsın! - + Failed to open snapshot file for reading: %1 Anlık görüntü dosyası okuma için açılamadı: %1 - + Failed to open snapshot file for writing: %1 Anlık görüntü dosyası yazma için açılamadı: %1 @@ -408,17 +431,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 Oyun dosyası açılamadı: %1 - + Could not load game. Are you sure it's in the correct format? Oyun yüklenemedi. Doğru formatta olduğundan emin misin? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). @@ -497,6 +520,195 @@ Download size: %3 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + Gözat + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -588,7 +800,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence Discord etkinliğini etkinleştir @@ -596,22 +808,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button Tuşu Temizle - + Clear Analog Analogu Temizle - + Refresh Yenile - + Set all Tümüne ayarla @@ -745,148 +957,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect Otomatik tespit - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam - + TAMA5 TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) - + Pokémon Jade/Diamond - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2905,7 +3137,7 @@ Download size: %3 Bozulmuş - + Slot %1 @@ -4065,12 +4297,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive Hata rapor arşivi - + ZIP archive (*.zip) ZIP arşivi (*.zip) @@ -4433,102 +4665,102 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia - + SDL - + Software (Qt) Yazılım - + OpenGL OpenGL - + OpenGL (force version 1.x) - + None Hiçbiri - + None (Still Image) - + Keyboard Klavye - + Controllers - + Shortcuts Kısayollar - - + + Shaders Gölgelendiricler - + Select BIOS BIOS seç - + Select directory Yolu seç - + (%1×%2) (%1×%2) - + Never - + Just now - + Less than an hour ago - + %n hour(s) ago - + %n day(s) ago @@ -4899,37 +5131,37 @@ Download size: %3 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: @@ -5677,120 +5909,100 @@ Download size: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - Game Boy Advance ROMları (%1) - - - - Game Boy ROMs (%1) - Game Boy ROMları (%1) - - - - All ROMs (%1) - Bütün ROMlar (%1) - - - - %1 Video Logs (*.mvl) - - - - + Archives (%1) Arşivler (%1) - - - + + + Select ROM ROM seç - + Select folder Klasör seç - - + + Select save Kayıt seç - + Select patch Yama seç - + Patches (*.ips *.ups *.bps) Yamalar (*.ips *.ups *.bps) - + 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ı. - + Select image Resim seç - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) Resim dosyası (*.png *.gif *.jpg *.jpeg);;All files (*) - + GameShark saves (*.sps *.xps) GameShark kayıtları (*.sps *.xps) - + Select video log Video günlüğü seç - + Video logs (*.mvl) Video günlükleri (*.mvl) - + Crash Çökme - + The game has crashed with the following error: %1 @@ -5799,664 +6011,669 @@ Download size: %3 %1 - + Unimplemented BIOS call Uygulanmamış BIOS girişi - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Oyun BIOS dosyasına ihtiyacı var. Lütfen en iyi deneyim için resmi BIOS'u kullanın. - + 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. - + Really make portable? Taşınabilir yapılsın mı? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Emülatörün yapılandırmasını yürütülebilir dosya ile aynı dizinden yüklemesini sağlar. Devam etmek istiyor musun? - + Restart needed Yeniden başlatma gerekli - + Some changes will not take effect until the emulator is restarted. Bazı değişiklikler emülatör yeniden başlatılıncaya kadar etkili olmaz. - + - Player %1 of %2 - + %1 - %2 - + %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File - + Load &ROM... &ROM yükle... - + Load ROM in archive... ROM'u arşivden yükle ... - + Add folder to library... Kütüphaneye klasör ekle ... - + Save games Oyunları kaydet - + Automatically determine - + Use player %0 save game - + Load &patch... &Patch yükle... - + Boot BIOS BIOS boot et - + Replace ROM... ROM değişti... - + + Create forwarder... + + + + Game state views - + Convert e-Reader card image to raw... e-Okuyucu kart resimlerini rawa dönüştür... - + ROM &info... ROM &info... - + Recent Son kullanılanlar - + Make portable Portatif yap - + &Load state &Kaydedilmiş konum yükle - + Load state file... Kaydedilmiş konum dosyası yükle... - + &Save state &Konumu kaydet - + Save state file... Konum dosyasını kaydet... - + Quick load Hızlı Yükle - + Quick save Hızlı kaydet - + Load recent En son yükle - + Save recent Hızlı kaydet - + Undo load state Kaydedilen konum yüklemeyi geri al - + Undo save state Konum kaydetmeyi geri al - - + + State &%1 Konum &%1 - + Load camera image... Kamera resmini yükle ... - + Convert save game... Kayıtlı oyun dömnüştürülüyor... - + GameShark saves (*.gsv *.sps *.xps) - + Reset needed - + Some changes will not take effect until the game is reset. - + New multiplayer window Yeni çokoyunculu ekranı - + Connect to Dolphin... Dolphin'e Bağlan... - + Report bug... Hata rapor et... - + About... Hakkında... - + E&xit Çıkış - + &Emulation Emülasyon - + &Reset &Reset - + Sh&utdown Kapat - + Yank game pak - + &Pause &Durdur - + &Next frame &Sonraki kare - + Fast forward (held) İleriye sar(basılı tutun) - + &Fast forward &İleriye sar - + Fast forward speed İleriye sarma hızı - + Unbounded - + %0x - + Rewind (held) Geri sar (basılı tutun) - + Re&wind Geri sar - + Step backwards Geriye doğru adım - + Solar sensor - + Increase solar level Solar seviyesini arttır - + Decrease solar level Solar seviyesini düşür - + Brightest solar level En parlak solar seviyesi - + Darkest solar level En karanlık solar seviyesi - + Brightness %1 Parlaklık:%1 - + Game Boy Printer... Game Boy yazıcısı... - + BattleChip Gate... - + Audio/&Video Ses/&Video - + Frame size Çerçeve boyutu - + Toggle fullscreen Tamekranı aç/kapa - + Lock aspect ratio En boy oranını kilitle - + Force integer scaling Tamsayılı ölçeklendirmeyi zorla - + Bilinear filtering Bilinear filtreleme - + Frame&skip Kare atlama - + Mute Sessiz - + FPS target FPS hedefi - + Native (59.7275) - + Take &screenshot Ekran görüntüsü al - + F12 - + Video layers - + Audio channels Ses kanalları - + Adjust layer placement... Katman yerleşimini ayarlayın... - + &Tools &Araçlar - + View &logs... Kayıtları görüntüle... - + Game &overrides... & 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... - + &Cheats... &Hileler... - + Settings... Ayarlar... - + Open debugger console... Hata ayıklayıcı konsolunu aç ... - + Start &GDB server... &GDB sunucusunu başlat... - + Scripting... - + View &palette... &Renk Paletini gör... - + View &sprites... &Spriteları gör... - + View &tiles... &Desenleri gör... - + View &map... &Haritayı gör - + &Frame inspector... &Kare denetçisi... - + View memory... Hafıza gör... - + Search memory... Hafızada ara... - + View &I/O registers... &I/O kayıtlarını görüntüle - + Record debug video log... Hata ayıklama video günlüğünü kaydet... - + Stop debug video log Hata ayıklama video günlüğünü durdur - + Exit fullscreen Tam ekrandan çık - + GameShark Button (held) GameShark Butonu (basılı tutun) - + Autofire Otomatik basma - + Autofire A Otomatik basma A - + Autofire B Otomatik basma B - + Autofire L Otomatik basma L - + Autofire R Otomatik basma R - + Autofire Start Otomatik basma Start - + Autofire Select Otomatik basma Select - + Autofire Up Otomatik basma Up - + Autofire Right Otomatik basma Right - + Autofire Down Otomatik basma Down - + Autofire Left Otomatik basma Sol - + Clear Temizle @@ -6464,32 +6681,32 @@ Download size: %3 QObject - + %1 byte %1 bayt - + %1 kiB %1 kiB - + %1 MiB %1 MiB - + GBA - + GB - + ? diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index 7c73ad9d8..75f8070c8 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -1,6 +1,29 @@ + + QGBA + + + Game Boy Advance ROMs (%1) + Game Boy Advance ROM (%1) + + + + Game Boy ROMs (%1) + Game Boy ROM (%1) + + + + All ROMs (%1) + 所有 ROM (%1) + + + + %1 Video Logs (*.mvl) + %1 视频日志 (*.mvl) + + QGBA::AboutScreen @@ -92,22 +115,22 @@ Download size: %3 QGBA::ApplicationUpdater - + Stable 稳定版 - + Development 开发版 - + Unknown 未知 - + (None) (无) @@ -400,12 +423,12 @@ Download size: %3 无法在意外平台上抽出卡带! - + Failed to open snapshot file for reading: %1 读取快照文件失败: %1 - + Failed to open snapshot file for writing: %1 写入快照文件失败: %1 @@ -413,17 +436,17 @@ Download size: %3 QGBA::CoreManager - + Failed to open game file: %1 打开游戏文件失败: %1 - + Could not load game. Are you sure it's in the correct format? 无法载入游戏。请确认游戏格式是否正确? - + Failed to open save file; in-game saves cannot be updated. Please ensure the save directory is writable without additional privileges (e.g. UAC on Windows). 无法打开存档;游戏内存档无法更新。请确保保存目录是可写的,且没有额外权限(例如 Windows 上的 UAC)。 @@ -502,6 +525,195 @@ Download size: %3 无法连接到 Dolphin。 + + QGBA::ForwarderGenerator + + + 3DS + + + + + Vita + + + + + QGBA::ForwarderGenerator3DS + + + Icon + + + + + Banner + + + + + QGBA::ForwarderGeneratorVita + + + Bubble + + + + + Background + 背景 + + + + Startup + + + + + QGBA::ForwarderView + + + Create forwarder + + + + + Files + + + + + ROM file: + + + + + + + Browse + 浏览 + + + + Output filename: + + + + + Forwarder base: + + + + + Latest stable version + + + + + Latest development build + + + + + Specific file + + + + + Base file: + + + + + System + + + + + 3DS + + + + + Vita + + + + + Presentation + + + + + Title: + + + + + Images: + + + + + Use default image + + + + + Preferred size: + + + + + Select image file + + + + + Select ROM file + + + + + Select output filename + + + + + Select base file + + + + + Build finished + + + + + Forwarder finished building + + + + + Build failed + + + + + Failed to build forwarder + + + + + %1 installable package (*.%2) + + + + + Select an image + + + QGBA::FrameView @@ -593,7 +805,7 @@ Download size: %3 QGBA::GBAApp - + Enable Discord Rich Presence 启用 Discord Rich Presence @@ -601,22 +813,22 @@ Download size: %3 QGBA::GBAKeyEditor - + Clear Button 清除按键 - + Clear Analog 清除模拟控制 - + Refresh 刷新 - + Set all 全部设置 @@ -750,148 +962,168 @@ Download size: %3 QGBA::GameBoy - - + + Autodetect 自动检测 - + Game Boy (DMG) - + Game Boy Pocket (MGB) - + Super Game Boy (SGB) - + Super Game Boy 2 (SGB) - + Game Boy Color (CGB) - + Game Boy Advance (AGB) - + Super Game Boy Color (SGB + CGB) - + ROM Only 仅 ROM - + MBC1 - + MBC2 - + MBC3 - + MBC3 + RTC - + MBC5 - + MBC5 + Rumble MB5 + 震动 - + MBC6 - + MBC7 (Tilt) - + MMM01 - + HuC-1 - + HuC-3 - + Pocket Cam 口袋摄像机 - + TAMA5 - + Wisdom Tree - + + NT (old 1) + + + + + NT (old 2) + + + + NT (new) NT(新) - + Pokémon Jade/Diamond 宝可梦翡翠/钻石 - + BBD - + Hitek - + + GGB-81 + + + + + Li Cheng + + + + Sachen (MMC1) - + Sachen (MMC2) @@ -2910,7 +3142,7 @@ Download size: %3 已损坏 - + Slot %1 插槽 %1 @@ -4070,12 +4302,12 @@ Download size: %3 QGBA::ReportView - + Bug report archive 错误报告存档 - + ZIP archive (*.zip) ZIP 存档 (*.zip) @@ -4438,102 +4670,102 @@ Download size: %3 QGBA::SettingsView - - + + Qt Multimedia Qt Multimedia - + SDL SDL - + Software (Qt) 软件渲染 (Qt) - + OpenGL OpenGL - + OpenGL (force version 1.x) OpenGL (强制版本 1.x) - + None - + None (Still Image) 无 (静止图像) - + Keyboard 键盘 - + Controllers 控制器 - + Shortcuts 快捷键 - - + + Shaders 着色器 - + Select BIOS 选择 BIOS - + Select directory 选择目录 - + (%1×%2) (%1×%2) - + Never 从不 - + Just now 刚刚 - + Less than an hour ago 不到一小时前 - + %n hour(s) ago %n 小时前 - + %n day(s) ago %n 天前 @@ -4859,37 +5091,37 @@ Download size: %3 立即检查更新 - + Default color palette only 只使用默认调色板 - + SGB color palette if available 可用时使用 SGB 调色板 - + GBC color palette if available 可用时使用 GBC 调色板 - + SGB (preferred) or GBC color palette if available 可用时使用 SGB(首选)或 GBC 调色板 - + Game Boy Camera Game Boy Camera - + Driver: 驱动: - + Source: 来源: @@ -5285,7 +5517,7 @@ Download size: %3 Preprocessing - 正在预处理 + 预处理 @@ -5682,100 +5914,80 @@ Download size: %3 QGBA::Window - - Game Boy Advance ROMs (%1) - Game Boy Advance ROM (%1) - - - - Game Boy ROMs (%1) - Game Boy ROM (%1) - - - - All ROMs (%1) - 所有 ROM (%1) - - - - %1 Video Logs (*.mvl) - %1 视频日志 (*.mvl) - - - + Archives (%1) 压缩文件 (%1) - - - + + + Select ROM 选择 ROM - + Select folder 选择文件夹 - - + + Select save 选择存档 - + Select patch 选择补丁 - + Patches (*.ips *.ups *.bps) 补丁 (*.ips *.ups *.bps) - + Select e-Reader dotcode 选择 e-Reader 点码 - + e-Reader card (*.raw *.bin *.bmp) e-Reader 卡 (*.raw *.bin *.bmp) - + Select image 选择图片 - + Image file (*.png *.gif *.jpg *.jpeg);;All files (*) 图像文件 (*.png *.gif *.jpg *.jpeg);;所有文件 (*) - + GameShark saves (*.sps *.xps) GameShark 存档 (*.sps *.xps) - + Select video log 选择视频日志 - + Video logs (*.mvl) 视频日志文件 (*.mvl) - + Crash 崩溃 - + The game has crashed with the following error: %1 @@ -5784,684 +5996,689 @@ Download size: %3 %1 - + Couldn't Start 无法启动 - + Could not start game. 无法启动游戏。 - + Unimplemented BIOS call 未实现的 BIOS 调用 - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. 此游戏使用尚未实现的 BIOS 调用。请使用官方 BIOS 以获得最佳体验。 - + 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 %1 - %2 - + %1 - %2 - %3 %1 - %2 - %3 - + %1 - %2 (%3 fps) - %4 - + &File 文件(&F) - + Load &ROM... 载入 ROM(&R)... - + Load ROM in archive... 从压缩文件中载入 ROM... - + Add folder to library... 将文件夹添加到库中... - + Save games (%1) 保存游戏(%1) - + Select save game 选择保存游戏 - + mGBA save state files (%1) mGBA 即时存档文件(%1) - - + + Select save state 选择即时存档 - + Select e-Reader card images 选择 e-Reader 卡片图像 - + Image file (*.png *.jpg *.jpeg) 图像文件(*.png *.jpg *.jpeg) - + Conversion finished 转换完成 - + %1 of %2 e-Reader cards converted successfully. 成功转换了 %1 张(共 %2 张)e-Reader 卡片。 - + Load alternate save game... 加载备用保存游戏... - + Load temporary save game... 加载临时保存游戏... - + Load &patch... 载入补丁(&P)... - + Boot BIOS 引导 BIOS - + Replace ROM... 替换 ROM... - + Scan e-Reader dotcodes... 扫描 e-Reader 点码... - + Convert e-Reader card image to raw... 将 e-Reader 卡片图像转换为原始数据... - + ROM &info... ROM 信息(&I)... - + Recent 最近打开 - + Make portable 程序便携化 - + &Load state 载入即时存档(&L) - + Load state file... 载入即时存档文件... - + &Save state 保存即时存档(&S) - + Save state file... 保存即时存档文件... - + Quick load 快速读档 - + Quick save 快速存档 - + Load recent 载入最近存档 - + Save recent 保存最近存档 - + Undo load state 撤消读档 - + Undo save state 撤消存档 - - + + State &%1 即时存档 (&%1) - + Load camera image... 载入相机图片... - + Convert save game... 转换保存游戏... - + GameShark saves (*.gsv *.sps *.xps) GameShark 存档 (*.gsv *.sps *.xps) - + Reset needed 需要重启 - + Some changes will not take effect until the game is reset. 某些改动需要重新启动才会生效。 - + Save games 游戏存档 - + Import GameShark Save... 导入 GameShark 存档... - + Export GameShark Save... 导出 GameShark 存档... - + Automatically determine 自动终止 - + Use player %0 save game 使用玩家 %0 存档 - + New multiplayer window 新建多人游戏窗口 - + Connect to Dolphin... 连接到 Dolphin... - + Report bug... 报告错误... - + About... 关于... - + E&xit 退出(&X) - + &Emulation 模拟(&E) - + &Reset 重置(&R) - + Sh&utdown 关机(&U) - + Yank game pak 快速抽出游戏卡带 - + &Pause 暂停(&P) - + &Next frame 下一帧(&N) - + Fast forward (held) 快进 (长按) - + &Fast forward 快进(&F) - + Fast forward speed 快进速度 - + Unbounded 不限制 - + %0x %0x - + Rewind (held) 倒带 (长按) - + Re&wind 倒带(&W) - + Step backwards 步退 - + Solar sensor 太阳光传感器 - + Increase solar level 增加太阳光等级 - + Decrease solar level 降低太阳光等级 - + Brightest solar level 太阳光等级为最亮 - + Darkest solar level 太阳光等级为最暗 - + Brightness %1 亮度 %1 - + Game Boy Printer... Game Boy 打印机... - + BattleChip Gate... BattleChip Gate... - + Audio/&Video 音频/视频(&V) - + Frame size 画面大小 - + %1× %1× - + Toggle fullscreen 切换全屏 - + Lock aspect ratio 锁定纵横比 - + Force integer scaling 强制整数缩放 - + Interframe blending 帧间混合 - + Bilinear filtering 双线性过滤 - + Frame&skip 跳帧(&S) - + Mute 静音 - + FPS target 目标 FPS - + Native (59.7275) 原生 (59.7275) - + Take &screenshot 截图(&S) - + F12 F12 - + Record A/V... 录制音频/视频... - + Record GIF/WebP/APNG... 录制 GIF/WebP/APNG... - + Video layers 视频图层 - + Audio channels 音频声道 - + Adjust layer placement... 调整图层布局... - + &Tools 工具(&T) - + View &logs... 查看日志(&L)... - + Game &overrides... 覆写游戏(&O)... - + Game Pak sensors... 游戏卡带传感器... - + &Cheats... 作弊码(&C)... - + + Create forwarder... + + + + Settings... 设置... - + Open debugger console... 打开调试器控制台... - + Start &GDB server... 打开 GDB 服务器(&G)... - + Scripting... 脚本... - + Game state views 游戏状态视图 - + View &palette... 查看调色板(&P)... - + View &sprites... 查看精灵图(&S)... - + View &tiles... 查看图块(&T)... - + View &map... 查看映射(&M)... - + &Frame inspector... 帧检查器(&F)... - + View memory... 查看内存... - + Search memory... 搜索内存... - + View &I/O registers... 查看 I/O 寄存器(&I)... - + Record debug video log... 记录调试视频日志... - + Stop debug video log 停止记录调试视频日志 - + Exit fullscreen 退出全屏 - + GameShark Button (held) GameShark 键 (长按) - + Autofire 连发 - + Autofire A 连发 A - + Autofire B 连发 B - + Autofire L 连发 L - + Autofire R 连发 R - + Autofire Start 连发 Start - + Autofire Select 连发 Select - + Autofire Up 连发 上 - + Autofire Right 连发 右 - + Autofire Down 连发 下 - + Autofire Left 连发 左 - + Clear 清除 @@ -6469,32 +6686,32 @@ Download size: %3 QObject - + %1 byte %1字节 - + %1 kiB - + %1 MiB %1 兆字节 - + GBA GBA - + GB GB - + ? ? diff --git a/src/platform/switch/main.c b/src/platform/switch/main.c index 9f1e84563..14996d5b0 100644 --- a/src/platform/switch/main.c +++ b/src/platform/switch/main.c @@ -82,6 +82,7 @@ static GLuint insizeLocation; static GLuint colorLocation; static GLuint tex; static GLuint oldTex; +static GLuint screenshotTex; static struct GUIFont* font; static color_t* frameBuffer; @@ -379,8 +380,6 @@ static void _gameUnloaded(struct mGUIRunner* runner) { static void _drawTex(struct mGUIRunner* runner, unsigned width, unsigned height, bool faded, bool blendTop) { glViewport(0, 1080 - vheight, vwidth, vheight); - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glUseProgram(program); glBindVertexArray(vao); @@ -493,11 +492,16 @@ static void _drawFrame(struct mGUIRunner* runner, bool faded) { } if (interframeBlending) { + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glBindTexture(GL_TEXTURE_2D, oldTex); _drawTex(runner, width, height, faded, false); glBindTexture(GL_TEXTURE_2D, tex); _drawTex(runner, width, height, faded, true); } else { + glDisable(GL_BLEND); + _drawTex(runner, width, height, faded, false); } @@ -523,10 +527,15 @@ static void _drawFrame(struct mGUIRunner* runner, bool faded) { static void _drawScreenshot(struct mGUIRunner* runner, const color_t* pixels, unsigned width, unsigned height, bool faded) { glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, tex); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + glBindTexture(GL_TEXTURE_2D, screenshotTex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + runner->core->desiredVideoDimensions(runner->core, &width, &height); + glDisable(GL_BLEND); + bool wasPbo = usePbo; + usePbo = false; _drawTex(runner, width, height, faded, false); + usePbo = wasPbo; } static uint16_t _pollGameInput(struct mGUIRunner* runner) { @@ -711,6 +720,13 @@ static void glInit(void) { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glGenTextures(1, &screenshotTex); + glBindTexture(GL_TEXTURE_2D, screenshotTex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glGenBuffers(1, &pbo); glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo); glBufferData(GL_PIXEL_UNPACK_BUFFER, 256 * 256 * 4, NULL, GL_STREAM_DRAW); @@ -790,6 +806,7 @@ static void glDeinit(void) { glDeleteFramebuffers(1, ©Fbo); glDeleteTextures(1, &tex); glDeleteTextures(1, &oldTex); + glDeleteTextures(1, &screenshotTex); glDeleteBuffers(1, &vbo); glDeleteProgram(program); glDeleteVertexArrays(1, &vao); diff --git a/src/platform/wii/main.c b/src/platform/wii/main.c index 312388347..cdfe00b2f 100644 --- a/src/platform/wii/main.c +++ b/src/platform/wii/main.c @@ -271,7 +271,7 @@ int main(int argc, char* argv[]) { memset(audioBuffer, 0, sizeof(audioBuffer)); #ifdef FIXED_ROM_BUFFER - romBufferSize = SIZE_CART0; + romBufferSize = GBA_SIZE_ROM0; romBuffer = SYS_GetArena2Lo(); SYS_SetArena2Lo((void*)((intptr_t) romBuffer + romBufferSize)); #endif diff --git a/src/script/CMakeLists.txt b/src/script/CMakeLists.txt index 504736f2f..d84659453 100644 --- a/src/script/CMakeLists.txt +++ b/src/script/CMakeLists.txt @@ -1,6 +1,7 @@ include(ExportDirectory) set(SOURCE_FILES context.c + input.c socket.c stdlib.c types.c) @@ -13,6 +14,7 @@ if(USE_LUA) list(APPEND SOURCE_FILES engines/lua.c) list(APPEND TEST_FILES test/context.c + test/input.c test/lua.c test/stdlib.c) endif() diff --git a/src/script/context.c b/src/script/context.c index 14775b05c..bf5fcfa54 100644 --- a/src/script/context.c +++ b/src/script/context.c @@ -211,7 +211,7 @@ void mScriptContextDisownWeakref(struct mScriptContext* context, uint32_t weakre poolEntry->refs = mSCRIPT_VALUE_UNREF; } -void mScriptContextTriggerCallback(struct mScriptContext* context, const char* callback) { +void mScriptContextTriggerCallback(struct mScriptContext* context, const char* callback, struct mScriptList* args) { struct mScriptValue* list = HashTableLookup(&context->callbacks, callback); if (!list) { return; @@ -224,6 +224,9 @@ void mScriptContextTriggerCallback(struct mScriptContext* context, const char* c continue; } mScriptFrameInit(&frame); + if (args) { + mScriptListCopy(&frame.arguments, args); + } if (fn->type->base == mSCRIPT_TYPE_WRAPPER) { fn = mScriptValueUnwrap(fn); } diff --git a/src/script/docgen.c b/src/script/docgen.c index 55d12eedc..65fcc87ce 100644 --- a/src/script/docgen.c +++ b/src/script/docgen.c @@ -6,7 +6,9 @@ #include #include #include +#include #include +#include #include struct mScriptContext context; @@ -36,62 +38,6 @@ void explainValue(struct mScriptValue* value, const char* name, int level); void explainValueScoped(struct mScriptValue* value, const char* name, const char* scope, int level); void explainType(struct mScriptType* type, int level); -void addTypesFromTuple(const struct mScriptTypeTuple*); -void addTypesFromTable(struct Table*); - -void addType(const struct mScriptType* type) { - if (HashTableLookup(&types, type->name) || type->isConst) { - return; - } - HashTableInsert(&types, type->name, (struct mScriptType*) type); - switch (type->base) { - case mSCRIPT_TYPE_FUNCTION: - addTypesFromTuple(&type->details.function.parameters); - addTypesFromTuple(&type->details.function.returnType); - break; - case mSCRIPT_TYPE_OBJECT: - mScriptClassInit(type->details.cls); - if (type->details.cls->parent) { - addType(type->details.cls->parent); - } - addTypesFromTable(&type->details.cls->instanceMembers); - break; - case mSCRIPT_TYPE_OPAQUE: - case mSCRIPT_TYPE_WRAPPER: - if (type->details.type) { - addType(type->details.type); - } - case mSCRIPT_TYPE_VOID: - case mSCRIPT_TYPE_SINT: - case mSCRIPT_TYPE_UINT: - case mSCRIPT_TYPE_FLOAT: - case mSCRIPT_TYPE_STRING: - case mSCRIPT_TYPE_LIST: - case mSCRIPT_TYPE_TABLE: - case mSCRIPT_TYPE_WEAKREF: - // No subtypes - break; - } -} - -void addTypesFromTuple(const struct mScriptTypeTuple* tuple) { - size_t i; - for (i = 0; i < tuple->count; ++i) { - addType(tuple->entries[i]); - } -} - -void addTypesFromTable(struct Table* table) { - struct TableIterator iter; - if (!HashTableIteratorStart(table, &iter)) { - return; - } - do { - struct mScriptClassMember* member = HashTableIteratorGetValue(table, &iter); - addType(member->type); - } while(HashTableIteratorNext(table, &iter)); -} - void printchomp(const char* string, int level) { char indent[(level + 1) * 2 + 1]; memset(indent, ' ', sizeof(indent) - 1); @@ -265,7 +211,7 @@ void explainObject(struct mScriptValue* value, int level) { continue; } fprintf(out, "%s%s:\n", indent, details->info.member.name); - addType(details->info.member.type); + mScriptTypeAdd(&types, details->info.member.type); if (mScriptObjectGet(value, details->info.member.name, &member)) { struct mScriptValue* unwrappedMember; if (member.type->base == mSCRIPT_TYPE_WRAPPER) { @@ -288,7 +234,7 @@ void explainValueScoped(struct mScriptValue* value, const char* name, const char memset(indent, ' ', sizeof(indent) - 1); indent[sizeof(indent) - 1] = '\0'; value = mScriptContextAccessWeakref(&context, value); - addType(value->type); + mScriptTypeAdd(&types, value->type); fprintf(out, "%stype: %s\n", indent, value->type->name); const char* docstring = NULL; @@ -421,7 +367,7 @@ void explainCore(struct mCore* core) { mScriptContextAttachCore(&context, core); struct mScriptValue* emu = mScriptContextGetGlobal(&context, "emu"); - addType(emu->type); + mScriptTypeAdd(&types, emu->type); if (mScriptObjectGet(emu, "memory", &wrapper)) { struct mScriptValue* memory = mScriptValueUnwrap(&wrapper); @@ -434,7 +380,7 @@ void explainCore(struct mCore* core) { fprintf(out, " %s:\n", name->value.string->buffer); value = mScriptContextAccessWeakref(&context, value); - addType(value->type); + mScriptTypeAdd(&types, value->type); struct mScriptFrame frame; uint32_t baseVal; @@ -486,7 +432,7 @@ void initTypes(void) { size_t i; for (i = 0; baseTypes[i]; ++i) { - addType(baseTypes[i]); + mScriptTypeAdd(&types, baseTypes[i]); } } @@ -523,9 +469,11 @@ int main(int argc, char* argv[]) { mScriptContextInit(&context); mScriptContextAttachStdlib(&context); mScriptContextAttachSocket(&context); + mScriptContextAttachInput(&context); mScriptContextSetTextBufferFactory(&context, NULL, NULL); initTypes(); + mScriptContextGetInputTypes(&types); fputs("version:\n", out); fprintf(out, " string: \"%s\"\n", projectVersion); diff --git a/src/script/engines/lua.c b/src/script/engines/lua.c index 3c7266a2a..bac841f1b 100644 --- a/src/script/engines/lua.c +++ b/src/script/engines/lua.c @@ -584,13 +584,18 @@ struct mScriptValue* _luaCoerceTable(struct mScriptEngineContextLua* luaContext) return false; } mScriptTableInsert(table, key, value); - mScriptValueDeref(key); + if (key->type != mSCRIPT_TYPE_MS_STR) { + // Strings are added to the ref pool, so we need to keep it + // ref'd to prevent it from being collected prematurely + mScriptValueDeref(key); + } mScriptValueDeref(value); } lua_pop(luaContext->lua, 1); size_t len = mScriptTableSize(table); if (!isList || !len) { + mScriptContextFillPool(luaContext->d.context, table); return table; } @@ -600,6 +605,7 @@ struct mScriptValue* _luaCoerceTable(struct mScriptEngineContextLua* luaContext) struct mScriptValue* value = mScriptTableLookup(table, &mSCRIPT_MAKE_S64(i)); if (!value) { mScriptValueDeref(list); + mScriptContextFillPool(luaContext->d.context, table); return table; } mScriptValueWrap(value, mScriptListAppend(list->value.list)); @@ -693,6 +699,31 @@ bool _luaWrap(struct mScriptEngineContextLua* luaContext, struct mScriptValue* v return true; } } + struct mScriptValue derefPtr; + if (value->type->base == mSCRIPT_TYPE_OPAQUE) { + if (!value->type->details.type) { + return false; + } + mScriptValueFollowPointer(value, &derefPtr); + switch (derefPtr.type->base) { + case mSCRIPT_TYPE_VOID: + case mSCRIPT_TYPE_SINT: + case mSCRIPT_TYPE_UINT: + case mSCRIPT_TYPE_FLOAT: + value = &derefPtr; + break; + case mSCRIPT_TYPE_OBJECT: + value = mScriptValueAlloc(derefPtr.type); + value->value.opaque = derefPtr.value.opaque; + weakref = mScriptContextSetWeakref(luaContext->d.context, value); + needsWeakref = true; + mScriptContextDisownWeakref(luaContext->d.context, weakref); + mScriptValueDeref(value); + break; + default: + return false; + } + } if (value->type == mSCRIPT_TYPE_MS_WEAKREF) { weakref = value->value.u32; value = mScriptContextAccessWeakref(luaContext->d.context, value); diff --git a/src/script/input.c b/src/script/input.c new file mode 100644 index 000000000..23fc498e9 --- /dev/null +++ b/src/script/input.c @@ -0,0 +1,581 @@ +/* Copyright (c) 2013-2022 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include + +#include +#include +#include + +static const char* eventNames[mSCRIPT_EV_TYPE_MAX] = { + [mSCRIPT_EV_TYPE_KEY] = "key", + [mSCRIPT_EV_TYPE_MOUSE_BUTTON] = "mouseButton", + [mSCRIPT_EV_TYPE_MOUSE_MOVE] = "mouseMove", + [mSCRIPT_EV_TYPE_MOUSE_WHEEL] = "mouseWheel", + [mSCRIPT_EV_TYPE_GAMEPAD_BUTTON] = "gamepadButton", + [mSCRIPT_EV_TYPE_GAMEPAD_HAT] = "gamepadHat", + [mSCRIPT_EV_TYPE_TRIGGER] = "trigger", +}; + +static const struct mScriptType* eventTypes[mSCRIPT_EV_TYPE_MAX] = { + [mSCRIPT_EV_TYPE_KEY] = mSCRIPT_TYPE_MS_S(mScriptKeyEvent), + [mSCRIPT_EV_TYPE_MOUSE_BUTTON] = mSCRIPT_TYPE_MS_S(mScriptMouseButtonEvent), + [mSCRIPT_EV_TYPE_MOUSE_MOVE] = mSCRIPT_TYPE_MS_S(mScriptMouseMoveEvent), + [mSCRIPT_EV_TYPE_MOUSE_WHEEL] = mSCRIPT_TYPE_MS_S(mScriptMouseWheelEvent), + [mSCRIPT_EV_TYPE_GAMEPAD_BUTTON] = mSCRIPT_TYPE_MS_S(mScriptGamepadButtonEvent), + [mSCRIPT_EV_TYPE_GAMEPAD_HAT] = mSCRIPT_TYPE_MS_S(mScriptGamepadHatEvent), +}; + +struct mScriptInputContext { + uint64_t seq; + struct Table activeKeys; + struct mScriptGamepad* activeGamepad; +}; + +static void _mScriptInputDeinit(struct mScriptInputContext*); +static bool _mScriptInputIsKeyActive(const struct mScriptInputContext*, struct mScriptValue*); +static struct mScriptValue* _mScriptInputActiveKeys(const struct mScriptInputContext*); + +mSCRIPT_DECLARE_STRUCT(mScriptInputContext); +mSCRIPT_DECLARE_STRUCT_VOID_METHOD(mScriptInputContext, _deinit, _mScriptInputDeinit, 0); +mSCRIPT_DECLARE_STRUCT_C_METHOD(mScriptInputContext, BOOL, isKeyActive, _mScriptInputIsKeyActive, 1, WRAPPER, key); +mSCRIPT_DECLARE_STRUCT_C_METHOD(mScriptInputContext, WLIST, activeKeys, _mScriptInputActiveKeys, 0); + +mSCRIPT_DEFINE_STRUCT(mScriptInputContext) + mSCRIPT_DEFINE_STRUCT_DEINIT(mScriptInputContext) + mSCRIPT_DEFINE_DOCSTRING("Sequence number of the next event to be emitted") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptInputContext, U64, seq) + mSCRIPT_DEFINE_DOCSTRING("Check if a given keyboard key is currently held. The input can be either the printable character for a key, the numerical Unicode codepoint, or a special value from C.KEY") + mSCRIPT_DEFINE_STRUCT_METHOD(mScriptInputContext, isKeyActive) + mSCRIPT_DEFINE_DOCSTRING("Get a list of the currently active keys. The values are Unicode codepoints or special key values from C.KEY, not strings, so make sure to convert as needed") + mSCRIPT_DEFINE_STRUCT_METHOD(mScriptInputContext, activeKeys) + mSCRIPT_DEFINE_DOCSTRING("The currently active gamepad, if any") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptInputContext, PCS(mScriptGamepad), activeGamepad) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptEvent) + mSCRIPT_DEFINE_CLASS_DOCSTRING( + "The base class for all event types. Different events have their own subclasses." + ) + mSCRIPT_DEFINE_DOCSTRING("The type of this event. See C.EV_TYPE for a list of possible types.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptEvent, S32, type) + mSCRIPT_DEFINE_DOCSTRING("Sequence number of this event. This value increases monotinically.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptEvent, U64, seq) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptKeyEvent) + mSCRIPT_DEFINE_CLASS_DOCSTRING("A keyboard key event.") + mSCRIPT_DEFINE_INHERIT(mScriptEvent) + mSCRIPT_DEFINE_DOCSTRING("The state of the key, represented by a C.INPUT_STATE value") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptKeyEvent, U8, state) + mSCRIPT_DEFINE_DOCSTRING("A bitmask of current modifiers, represented by ORed C.KMOD values") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptKeyEvent, S16, modifiers) + mSCRIPT_DEFINE_DOCSTRING( + "The relevant key for this event. For most printable characters, this will be the Unicode " + "codepoint of the character. Some special values are present as C.KEY as well." + ) + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptKeyEvent, S32, key) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptMouseButtonEvent) + mSCRIPT_DEFINE_CLASS_DOCSTRING("A mouse button event.") + mSCRIPT_DEFINE_INHERIT(mScriptEvent) + mSCRIPT_DEFINE_DOCSTRING("Which mouse this event pertains to. Currently, this will always be 0.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseButtonEvent, U8, mouse) + mSCRIPT_DEFINE_DOCSTRING("The state of the button, represented by a C.INPUT_STATE value") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseButtonEvent, U8, state) + mSCRIPT_DEFINE_DOCSTRING( + "Which mouse button this event pertains to. Symbolic names for primary (usually left), " + "secondary (usually right), and middle are in C.MOUSE_BUTTON, and further buttons " + "are numeric starting from 3." + ) + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseButtonEvent, U8, button) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptMouseMoveEvent) + mSCRIPT_DEFINE_CLASS_DOCSTRING("A mouse movement event.") + mSCRIPT_DEFINE_INHERIT(mScriptEvent) + mSCRIPT_DEFINE_DOCSTRING("Which mouse this event pertains to. Currently, this will always be 0.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseMoveEvent, U8, mouse) + mSCRIPT_DEFINE_DOCSTRING( + "The x coordinate of the mouse in the context of game screen pixels. " + "This can be out of bounds of the game screen depending on the size of the window in question." + ) + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseMoveEvent, S32, x) + mSCRIPT_DEFINE_DOCSTRING( + "The y coordinate of the mouse in the context of game screen pixels. " + "This can be out of bounds of the game screen depending on the size of the window in question." + ) + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseMoveEvent, S32, y) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptMouseWheelEvent) + mSCRIPT_DEFINE_INHERIT(mScriptEvent) + mSCRIPT_DEFINE_DOCSTRING("Which mouse this event pertains to. Currently, this will always be 0.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseWheelEvent, U8, mouse) + mSCRIPT_DEFINE_DOCSTRING("The amount scrolled horizontally") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseWheelEvent, S32, x) + mSCRIPT_DEFINE_DOCSTRING("The amount scrolled vertically") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptMouseWheelEvent, S32, y) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptGamepadButtonEvent) + mSCRIPT_DEFINE_CLASS_DOCSTRING("A gamead button event.") + mSCRIPT_DEFINE_INHERIT(mScriptEvent) + mSCRIPT_DEFINE_DOCSTRING("The state of the button, represented by a C.INPUT_STATE value") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepadButtonEvent, U8, state) + mSCRIPT_DEFINE_DOCSTRING("Which gamepad this event pertains to. Currently, this will always be 0.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepadButtonEvent, U8, pad) + mSCRIPT_DEFINE_DOCSTRING( + "Which button this event pertains to. There is currently no guaranteed button mapping, " + "and it might change between different controllers." + ) + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepadButtonEvent, U16, button) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptGamepadHatEvent) + mSCRIPT_DEFINE_CLASS_DOCSTRING("A gamepad POV hat event.") + mSCRIPT_DEFINE_INHERIT(mScriptEvent) + mSCRIPT_DEFINE_DOCSTRING("Which gamepad this event pertains to. Currently, this will always be 0.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepadHatEvent, U8, pad) + mSCRIPT_DEFINE_DOCSTRING("Which hat this event pertains to. For most gamepads this will be 0.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepadHatEvent, U8, hat) + mSCRIPT_DEFINE_DOCSTRING("The current direction of the hat. See C.INPUT_DIR for possible values.") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepadHatEvent, U8, direction) +mSCRIPT_DEFINE_END; + +mSCRIPT_DEFINE_STRUCT(mScriptGamepad) + mSCRIPT_DEFINE_DOCSTRING("The human-readable name of this gamepad") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepad, CHARP, visibleName) + mSCRIPT_DEFINE_DOCSTRING("The internal name of this gamepad, generally unique to the specific type of gamepad") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepad, CHARP, internalName) + mSCRIPT_DEFINE_DOCSTRING("An indexed list of the current values of each axis") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepad, LIST, axes) + mSCRIPT_DEFINE_DOCSTRING("An indexed list of the current values of each button") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepad, LIST, buttons) + mSCRIPT_DEFINE_DOCSTRING("An indexed list of the current values of POV hat") + mSCRIPT_DEFINE_STRUCT_MEMBER(mScriptGamepad, LIST, hats) +mSCRIPT_DEFINE_END; + +void mScriptContextAttachInput(struct mScriptContext* context) { + struct mScriptInputContext* inputContext = calloc(1, sizeof(*inputContext)); + struct mScriptValue* value = mScriptValueAlloc(mSCRIPT_TYPE_MS_S(mScriptInputContext)); + value->flags = mSCRIPT_VALUE_FLAG_FREE_BUFFER; + value->value.opaque = inputContext; + + inputContext->seq = 0; + TableInit(&inputContext->activeKeys, 0, NULL); + + mScriptContextSetGlobal(context, "input", value); + mScriptContextSetDocstring(context, "input", "Singleton instance of struct::mScriptInputContext"); + + mScriptContextExportConstants(context, "EV_TYPE", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(mSCRIPT_EV_TYPE, NONE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_EV_TYPE, KEY), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_EV_TYPE, MOUSE_BUTTON), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_EV_TYPE, MOUSE_MOVE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_EV_TYPE, MOUSE_WHEEL), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_EV_TYPE, GAMEPAD_BUTTON), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_EV_TYPE, TRIGGER), + mSCRIPT_KV_SENTINEL + }); + + mScriptContextExportConstants(context, "INPUT_STATE", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_STATE, UP), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_STATE, DOWN), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_STATE, HELD), + mSCRIPT_KV_SENTINEL + }); + + mScriptContextExportConstants(context, "INPUT_DIR", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, NONE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, NORTH), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, EAST), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, SOUTH), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, WEST), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, UP), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, RIGHT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, DOWN), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, LEFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, NORTHEAST), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, NORTHWEST), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, SOUTHEAST), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_INPUT_DIR, SOUTHWEST), + mSCRIPT_KV_SENTINEL + }); + + mScriptContextExportConstants(context, "KEY", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, NONE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, BACKSPACE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, TAB), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, ENTER), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, ESCAPE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, DELETE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F1), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F2), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F3), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F4), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F5), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F6), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F7), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F8), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F9), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F10), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F11), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F12), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F13), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F14), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F15), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F16), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F17), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F18), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F19), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F20), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F21), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F22), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F23), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, F24), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, UP), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, RIGHT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, DOWN), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, LEFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, PAGE_UP), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, PAGE_DOWN), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, HOME), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, END), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, INSERT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, BREAK), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, CLEAR), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, PRINT_SCREEN), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, SYSRQ), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, MENU), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, HELP), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, LSHIFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, RSHIFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, SHIFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, LCONTROL), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, RCONTROL), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, CONTROL), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, LALT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, RALT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, ALT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, LSUPER), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, RSUPER), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, SUPER), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, CAPS_LOCK), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, NUM_LOCK), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, SCROLL_LOCK), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_0), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_1), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_2), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_3), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_4), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_5), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_6), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_7), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_8), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_9), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_PLUS), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_MINUS), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_MULTIPLY), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_DIVIDE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_COMMA), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_POINT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KEY, KP_ENTER), + mSCRIPT_KV_SENTINEL + }); + + mScriptContextExportConstants(context, "KMOD", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, NONE), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, LSHIFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, RSHIFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, SHIFT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, LCONTROL), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, RCONTROL), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, CONTROL), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, LALT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, RALT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, ALT), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, LSUPER), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, RSUPER), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, SUPER), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, CAPS_LOCK), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, NUM_LOCK), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_KMOD, SCROLL_LOCK), + mSCRIPT_KV_SENTINEL + }); + + mScriptContextExportConstants(context, "MOUSE_BUTTON", (struct mScriptKVPair[]) { + mSCRIPT_CONSTANT_PAIR(mSCRIPT_MOUSE_BUTTON, PRIMARY), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_MOUSE_BUTTON, SECONDARY), + mSCRIPT_CONSTANT_PAIR(mSCRIPT_MOUSE_BUTTON, MIDDLE), + mSCRIPT_KV_SENTINEL + }); +} + +void _mScriptInputDeinit(struct mScriptInputContext* context) { + TableDeinit(&context->activeKeys); +} + +bool _mScriptInputIsKeyActive(const struct mScriptInputContext* context, struct mScriptValue* value) { + uint32_t key; + struct mScriptValue intValue; + size_t length; + const char* strbuf; + + switch (value->type->base) { + case mSCRIPT_TYPE_SINT: + case mSCRIPT_TYPE_UINT: + case mSCRIPT_TYPE_FLOAT: + if (!mScriptCast(mSCRIPT_TYPE_MS_U32, value, &intValue)) { + return false; + } + key = intValue.value.u32; + break; + case mSCRIPT_TYPE_STRING: + if (value->value.string->length > 1) { + return false; + } + strbuf = value->value.string->buffer; + length = value->value.string->size; + key = utf8Char(&strbuf, &length); + break; + default: + return false; + } + + void* down = TableLookup(&context->activeKeys, key); + return down != NULL; +} + +static struct mScriptValue* _mScriptInputActiveKeys(const struct mScriptInputContext* context) { + struct mScriptValue* list = mScriptValueAlloc(mSCRIPT_TYPE_MS_LIST); + struct TableIterator iter; + if (!TableIteratorStart(&context->activeKeys, &iter)) { + return list; + } + do { + uint32_t key = TableIteratorGetKey(&context->activeKeys, &iter); + *mScriptListAppend(list->value.list) = mSCRIPT_MAKE_U32(key); + } while (TableIteratorNext(&context->activeKeys, &iter)); + return list; +} + +static bool _updateKeys(struct mScriptContext* context, struct mScriptKeyEvent* event) { + int offset = 0; + switch (event->state) { + case mSCRIPT_INPUT_STATE_UP: + offset = -1; + break; + case mSCRIPT_INPUT_STATE_DOWN: + offset = 1; + break; + default: + return true; + } + + struct mScriptValue* input = mScriptContextGetGlobal(context, "input"); + if (!input) { + return false; + } + struct mScriptInputContext* inputContext = input->value.opaque; + intptr_t value = (intptr_t) TableLookup(&inputContext->activeKeys, event->key); + value += offset; + if (value < 1) { + TableRemove(&inputContext->activeKeys, event->key); + } else { + TableInsert(&inputContext->activeKeys, event->key, (void*) value); + } + if (offset < 0 && value > 0) { + return false; + } + if (offset > 0 && value != 1) { + event->state = mSCRIPT_INPUT_STATE_HELD; + } + return true; +} + +void mScriptContextFireEvent(struct mScriptContext* context, struct mScriptEvent* event) { + struct mScriptValue* input = mScriptContextGetGlobal(context, "input"); + if (!input) { + return; + } + struct mScriptInputContext* inputContext = input->value.opaque; + + switch (event->type) { + case mSCRIPT_EV_TYPE_KEY: + if (!_updateKeys(context, (struct mScriptKeyEvent*) event)) { + return; + } + break; + case mSCRIPT_EV_TYPE_NONE: + return; + } + + struct mScriptList args; + mScriptListInit(&args, 1); + struct mScriptValue* value = mScriptListAppend(&args); + value->type = eventTypes[event->type]; + value->refs = mSCRIPT_VALUE_UNREF; + value->flags = 0; + value->value.opaque = event; + event->seq = inputContext->seq; + ++inputContext->seq; + mScriptContextTriggerCallback(context, eventNames[event->type], &args); + mScriptListDeinit(&args); +} + +int mScriptContextGamepadAttach(struct mScriptContext* context, struct mScriptGamepad* pad) { + struct mScriptValue* input = mScriptContextGetGlobal(context, "input"); + if (!input) { + return false; + } + struct mScriptInputContext* inputContext = input->value.opaque; + if (inputContext->activeGamepad) { + return -1; + } + inputContext->activeGamepad = pad; + + return 0; +} + +bool mScriptContextGamepadDetach(struct mScriptContext* context, int pad) { + if (pad != 0) { + return false; + } + struct mScriptValue* input = mScriptContextGetGlobal(context, "input"); + if (!input) { + return false; + } + struct mScriptInputContext* inputContext = input->value.opaque; + if (!inputContext->activeGamepad) { + return false; + } + inputContext->activeGamepad = NULL; + return true; +} + +struct mScriptGamepad* mScriptContextGamepadLookup(struct mScriptContext* context, int pad) { + if (pad != 0) { + return NULL; + } + struct mScriptValue* input = mScriptContextGetGlobal(context, "input"); + if (!input) { + return false; + } + struct mScriptInputContext* inputContext = input->value.opaque; + return inputContext->activeGamepad; +} + +void mScriptGamepadInit(struct mScriptGamepad* gamepad) { + memset(gamepad, 0, sizeof(*gamepad)); + + mScriptListInit(&gamepad->axes, 8); + mScriptListInit(&gamepad->buttons, 1); + mScriptListInit(&gamepad->hats, 1); +} + +void mScriptGamepadDeinit(struct mScriptGamepad* gamepad) { + mScriptListDeinit(&gamepad->axes); + mScriptListDeinit(&gamepad->buttons); + mScriptListDeinit(&gamepad->hats); +} + +void mScriptGamepadSetAxisCount(struct mScriptGamepad* gamepad, unsigned count) { + if (count > UINT8_MAX) { + count = UINT8_MAX; + } + + unsigned oldSize = mScriptListSize(&gamepad->axes); + mScriptListResize(&gamepad->axes, (ssize_t) count - oldSize); + unsigned i; + for (i = oldSize; i < count; ++i) { + *mScriptListGetPointer(&gamepad->axes, i) = mSCRIPT_MAKE_S16(0); + } +} + +void mScriptGamepadSetButtonCount(struct mScriptGamepad* gamepad, unsigned count) { + if (count > UINT16_MAX) { + count = UINT16_MAX; + } + + unsigned oldSize = mScriptListSize(&gamepad->buttons); + mScriptListResize(&gamepad->buttons, (ssize_t) count - oldSize); + unsigned i; + for (i = oldSize; i < count; ++i) { + *mScriptListGetPointer(&gamepad->buttons, i) = mSCRIPT_MAKE_BOOL(false); + } +} + +void mScriptGamepadSetHatCount(struct mScriptGamepad* gamepad, unsigned count) { + if (count > UINT8_MAX) { + count = UINT8_MAX; + } + + unsigned oldSize = mScriptListSize(&gamepad->hats); + mScriptListResize(&gamepad->hats, (ssize_t) count - oldSize); + unsigned i; + for (i = oldSize; i < count; ++i) { + *mScriptListGetPointer(&gamepad->hats, i) = mSCRIPT_MAKE_U8(0); + } +} + +void mScriptGamepadSetAxis(struct mScriptGamepad* gamepad, unsigned id, int16_t value) { + if (id >= mScriptListSize(&gamepad->axes)) { + return; + } + + mScriptListGetPointer(&gamepad->axes, id)->value.s32 = value; +} + +void mScriptGamepadSetButton(struct mScriptGamepad* gamepad, unsigned id, bool down) { + if (id >= mScriptListSize(&gamepad->buttons)) { + return; + } + + mScriptListGetPointer(&gamepad->buttons, id)->value.u32 = down; +} + +void mScriptGamepadSetHat(struct mScriptGamepad* gamepad, unsigned id, int direction) { + if (id >= mScriptListSize(&gamepad->hats)) { + return; + } + + mScriptListGetPointer(&gamepad->hats, id)->value.u32 = direction; +} + +int16_t mScriptGamepadGetAxis(struct mScriptGamepad* gamepad, unsigned id) { + if (id >= mScriptListSize(&gamepad->axes)) { + return 0; + } + + return mScriptListGetPointer(&gamepad->axes, id)->value.s32; +} + +bool mScriptGamepadGetButton(struct mScriptGamepad* gamepad, unsigned id) { + if (id >= mScriptListSize(&gamepad->buttons)) { + return false; + } + + return mScriptListGetPointer(&gamepad->buttons, id)->value.u32; +} + +int mScriptGamepadGetHat(struct mScriptGamepad* gamepad, unsigned id) { + if (id >= mScriptListSize(&gamepad->hats)) { + return mSCRIPT_INPUT_DIR_NONE; + } + + return mScriptListGetPointer(&gamepad->hats, id)->value.u32; +} + +void mScriptContextGetInputTypes(struct Table* types) { + mScriptTypeAdd(types, mSCRIPT_TYPE_MS_S(mScriptEvent)); + mScriptTypeAdd(types, mSCRIPT_TYPE_MS_S(mScriptKeyEvent)); + mScriptTypeAdd(types, mSCRIPT_TYPE_MS_S(mScriptMouseMoveEvent)); + mScriptTypeAdd(types, mSCRIPT_TYPE_MS_S(mScriptMouseButtonEvent)); + mScriptTypeAdd(types, mSCRIPT_TYPE_MS_S(mScriptGamepadButtonEvent)); + mScriptTypeAdd(types, mSCRIPT_TYPE_MS_S(mScriptGamepadHatEvent)); + mScriptTypeAdd(types, mSCRIPT_TYPE_MS_S(mScriptGamepad)); +} diff --git a/src/script/test/classes.c b/src/script/test/classes.c index 95bb32920..85afb627c 100644 --- a/src/script/test/classes.c +++ b/src/script/test/classes.c @@ -14,6 +14,7 @@ struct TestA { int32_t i2; int8_t b8; int16_t hUnaligned; + char str[6]; struct mScriptValue table; struct mScriptList list; int32_t (*ifn0)(struct TestA*); @@ -105,6 +106,7 @@ mSCRIPT_DEFINE_STRUCT(TestA) mSCRIPT_DEFINE_STRUCT_MEMBER(TestA, S32, i2) mSCRIPT_DEFINE_STRUCT_MEMBER(TestA, S8, b8) mSCRIPT_DEFINE_STRUCT_MEMBER(TestA, S16, hUnaligned) + mSCRIPT_DEFINE_STRUCT_MEMBER(TestA, CHARP, str) mSCRIPT_DEFINE_STRUCT_MEMBER(TestA, TABLE, table) mSCRIPT_DEFINE_STRUCT_MEMBER(TestA, LIST, list) mSCRIPT_DEFINE_STRUCT_METHOD(TestA, ifn0) @@ -191,6 +193,13 @@ M_TEST_DEFINE(testALayout) { assert_ptr_equal(member->type, mSCRIPT_TYPE_MS_S16); assert_int_not_equal(member->offset, sizeof(int32_t) * 2 + 1); + member = HashTableLookup(&cls->instanceMembers, "str"); + assert_non_null(member); + assert_string_equal(member->name, "str"); + assert_null(member->docstring); + assert_ptr_equal(member->type, mSCRIPT_TYPE_MS_CHARP); + assert_int_equal(member->offset, &((struct TestA*) 0)->str); + member = HashTableLookup(&cls->instanceMembers, "table"); assert_non_null(member); assert_string_equal(member->name, "table"); @@ -304,6 +313,8 @@ M_TEST_DEFINE(testAGet) { s.table.type = mSCRIPT_TYPE_MS_TABLE; s.table.type->alloc(&s.table); + strcpy(s.str, "test"); + struct mScriptValue sval = mSCRIPT_MAKE_S(TestA, &s); struct mScriptValue val; struct mScriptValue compare; @@ -324,6 +335,10 @@ M_TEST_DEFINE(testAGet) { assert_true(mScriptObjectGet(&sval, "hUnaligned", &val)); assert_true(compare.type->equal(&compare, &val)); + compare = mSCRIPT_MAKE_CHARP("test"); + assert_true(mScriptObjectGet(&sval, "str", &val)); + assert_true(compare.type->equal(&compare, &val)); + compare = mSCRIPT_MAKE_S32(5); assert_true(mScriptObjectGet(&sval, "list", &val)); assert_ptr_equal(val.type, mSCRIPT_TYPE_MS_LIST); diff --git a/src/script/test/input.c b/src/script/test/input.c new file mode 100644 index 000000000..08b6a3bf8 --- /dev/null +++ b/src/script/test/input.c @@ -0,0 +1,180 @@ +/* Copyright (c) 2013-2022 Jeffrey Pfau + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +#include "util/test/suite.h" + +#include +#include +#include +#include + +#include "script/test.h" + +#define SETUP_LUA \ + struct mScriptContext context; \ + mScriptContextInit(&context); \ + struct mScriptEngineContext* lua = mScriptContextRegisterEngine(&context, mSCRIPT_ENGINE_LUA); \ + mScriptContextAttachStdlib(&context); \ + mScriptContextAttachInput(&context) + +M_TEST_SUITE_SETUP(mScriptInput) { + if (mSCRIPT_ENGINE_LUA->init) { + mSCRIPT_ENGINE_LUA->init(mSCRIPT_ENGINE_LUA); + } + return 0; +} + +M_TEST_SUITE_TEARDOWN(mScriptInput) { + if (mSCRIPT_ENGINE_LUA->deinit) { + mSCRIPT_ENGINE_LUA->deinit(mSCRIPT_ENGINE_LUA); + } + return 0; +} + +M_TEST_DEFINE(members) { + SETUP_LUA; + + TEST_PROGRAM("assert(input)"); + TEST_PROGRAM("assert(input.seq == 0)"); + TEST_PROGRAM("assert(input.isKeyActive)"); + + mScriptContextDeinit(&context); +} +M_TEST_DEFINE(seq) { + SETUP_LUA; + + TEST_PROGRAM("assert(input.seq == 0)"); + + TEST_PROGRAM( + "seq = nil\n" + "function cb(ev)\n" + " seq = ev.seq\n" + "end\n" + "id = callbacks:add('key', cb)\n" + ); + + struct mScriptKeyEvent keyEvent = { + .d = { .type = mSCRIPT_EV_TYPE_KEY }, + .state = mSCRIPT_INPUT_STATE_DOWN, + }; + + mScriptContextFireEvent(&context, &keyEvent.d); + TEST_PROGRAM("assert(input.seq == 1)"); + TEST_PROGRAM("assert(seq == 0)"); + + mScriptContextFireEvent(&context, &keyEvent.d); + TEST_PROGRAM("assert(input.seq == 2)"); + TEST_PROGRAM("assert(seq == 1)"); + + mScriptContextDeinit(&context); +} + +M_TEST_DEFINE(fireKey) { + SETUP_LUA; + + TEST_PROGRAM("assert(not input:isKeyActive('a'))"); + + TEST_PROGRAM( + "activeKey = false\n" + "state = nil\n" + "function cb(ev)\n" + " assert(ev.type == C.EV_TYPE.KEY)\n" + " activeKey = string.char(ev.key)\n" + " state = ev.state\n" + "end\n" + "id = callbacks:add('key', cb)\n" + "assert(id)\n" + "assert(not activeKey)\n" + ); + + struct mScriptKeyEvent keyEvent = { + .d = { .type = mSCRIPT_EV_TYPE_KEY }, + .state = mSCRIPT_INPUT_STATE_DOWN, + .key = 'a' + }; + mScriptContextFireEvent(&context, &keyEvent.d); + + TEST_PROGRAM("assert(input:isKeyActive('a'))"); + TEST_PROGRAM("assert(activeKey == 'a')"); + TEST_PROGRAM("assert(state == C.INPUT_STATE.DOWN)"); + + keyEvent.state = mSCRIPT_INPUT_STATE_UP; + mScriptContextFireEvent(&context, &keyEvent.d); + + TEST_PROGRAM("assert(not input:isKeyActive('a'))"); + TEST_PROGRAM("assert(state == C.INPUT_STATE.UP)"); + + mScriptContextDeinit(&context); +} + +M_TEST_DEFINE(activeKeys) { + SETUP_LUA; + + TEST_PROGRAM("assert(#input:activeKeys() == 0)"); + + struct mScriptKeyEvent keyEvent = { + .d = { .type = mSCRIPT_EV_TYPE_KEY }, + .state = mSCRIPT_INPUT_STATE_DOWN, + .key = 'a' + }; + mScriptContextFireEvent(&context, &keyEvent.d); + TEST_PROGRAM("assert(#input:activeKeys() == 1)"); + TEST_PROGRAM("assert(input:activeKeys()[1] == string.byte('a'))"); + + keyEvent.state = mSCRIPT_INPUT_STATE_UP; + mScriptContextFireEvent(&context, &keyEvent.d); + + TEST_PROGRAM("assert(#input:activeKeys() == 0)"); + + mScriptContextDeinit(&context); +} + +M_TEST_DEFINE(gamepadExport) { + SETUP_LUA; + + struct mScriptGamepad m_gamepad; + mScriptGamepadInit(&m_gamepad); + + TEST_PROGRAM("assert(not input.activeGamepad)"); + assert_int_equal(mScriptContextGamepadAttach(&context, &m_gamepad), 0); + TEST_PROGRAM("assert(input.activeGamepad)"); + + TEST_PROGRAM("assert(#input.activeGamepad.axes == 0)"); + TEST_PROGRAM("assert(#input.activeGamepad.buttons == 0)"); + TEST_PROGRAM("assert(#input.activeGamepad.hats == 0)"); + + mScriptGamepadSetAxisCount(&m_gamepad, 1); + TEST_PROGRAM("assert(#input.activeGamepad.axes == 1)"); + TEST_PROGRAM("assert(input.activeGamepad.axes[1] == 0)"); + mScriptGamepadSetAxis(&m_gamepad, 0, 123); + TEST_PROGRAM("assert(input.activeGamepad.axes[1] == 123)"); + + mScriptGamepadSetButtonCount(&m_gamepad, 1); + TEST_PROGRAM("assert(#input.activeGamepad.buttons == 1)"); + TEST_PROGRAM("assert(input.activeGamepad.buttons[1] == false)"); + mScriptGamepadSetButton(&m_gamepad, 0, true); + TEST_PROGRAM("assert(input.activeGamepad.buttons[1] == true)"); + + mScriptGamepadSetHatCount(&m_gamepad, 1); + TEST_PROGRAM("assert(#input.activeGamepad.hats == 1)"); + TEST_PROGRAM("assert(input.activeGamepad.hats[1] == C.INPUT_DIR.NONE)"); + mScriptGamepadSetHat(&m_gamepad, 0, mSCRIPT_INPUT_DIR_NORTHWEST); + TEST_PROGRAM("assert(input.activeGamepad.hats[1] == C.INPUT_DIR.NORTHWEST)"); + + mScriptContextGamepadDetach(&context, 0); + TEST_PROGRAM("assert(not input.activeGamepad)"); + + mScriptGamepadDeinit(&m_gamepad); + + mScriptContextDeinit(&context); +} + +M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(mScriptInput, + cmocka_unit_test(members), + cmocka_unit_test(seq), + cmocka_unit_test(fireKey), + cmocka_unit_test(activeKeys), + cmocka_unit_test(gamepadExport), +) diff --git a/src/script/test/lua.c b/src/script/test/lua.c index 2c047ec39..5731b0705 100644 --- a/src/script/test/lua.c +++ b/src/script/test/lua.c @@ -22,6 +22,7 @@ struct Test { void (*vfn0)(struct Test*); void (*vfn1)(struct Test*, int); int32_t (*icfn0)(const struct Test*); + struct Test* next; }; static int identityInt(int in) { @@ -83,6 +84,7 @@ mSCRIPT_DECLARE_STRUCT_VOID_METHOD(Test, v1, testV1, 1, S32, b); mSCRIPT_DEFINE_STRUCT(Test) mSCRIPT_DEFINE_STRUCT_MEMBER(Test, S32, i) + mSCRIPT_DEFINE_STRUCT_MEMBER(Test, PS(Test), next) mSCRIPT_DEFINE_STRUCT_METHOD(Test, ifn0) mSCRIPT_DEFINE_STRUCT_METHOD(Test, ifn1) mSCRIPT_DEFINE_STRUCT_METHOD(Test, icfn0) @@ -726,6 +728,42 @@ M_TEST_DEFINE(callList) { mScriptContextDeinit(&context); } +M_TEST_DEFINE(linkedList) { + SETUP_LUA; + + struct Test first = { + .i = 1 + }; + struct Test second = { + .i = 2 + }; + struct mScriptValue a = mSCRIPT_MAKE_S(Test, &first); + + assert_true(lua->setGlobal(lua, "l", &a)); + TEST_PROGRAM("assert(l)"); + TEST_PROGRAM("assert(l.i == 1)"); + TEST_PROGRAM("assert(not l.next)"); + + first.next = &second; + TEST_PROGRAM("assert(l)"); + TEST_PROGRAM("assert(l.i == 1)"); + TEST_PROGRAM("assert(l.next)"); + TEST_PROGRAM("assert(l.next.i == 2)"); + TEST_PROGRAM("assert(not l.next.next)"); + + TEST_PROGRAM( + "n = l.next\n" + "function readN()\n" + " assert(n)\n" + " assert(n.i or not n.i)\n" + "end\n" + "assert(pcall(readN))\n"); + // The weakref stored in `n` gets pruned between executions to avoid stale pointers + TEST_PROGRAM("assert(not pcall(readN))"); + + mScriptContextDeinit(&context); +} + M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(mScriptLua, cmocka_unit_test(create), cmocka_unit_test(loadGood), @@ -744,4 +782,5 @@ M_TEST_SUITE_DEFINE_SETUP_TEARDOWN(mScriptLua, cmocka_unit_test(tableLookup), cmocka_unit_test(tableIterate), cmocka_unit_test(callList), + cmocka_unit_test(linkedList) ) diff --git a/src/script/test/stdlib.c b/src/script/test/stdlib.c index 63ddda4fc..82a4c425b 100644 --- a/src/script/test/stdlib.c +++ b/src/script/test/stdlib.c @@ -82,15 +82,15 @@ M_TEST_DEFINE(callbacks) { TEST_VALUE(S32, "val", 0); - mScriptContextTriggerCallback(&context, "test"); + mScriptContextTriggerCallback(&context, "test", NULL); TEST_VALUE(S32, "val", 1); - mScriptContextTriggerCallback(&context, "test"); + mScriptContextTriggerCallback(&context, "test", NULL); TEST_VALUE(S32, "val", 2); TEST_PROGRAM("callbacks:remove(id)"); - mScriptContextTriggerCallback(&context, "test"); + mScriptContextTriggerCallback(&context, "test", NULL); TEST_VALUE(S32, "val", 2); mScriptContextDeinit(&context); diff --git a/src/script/types.c b/src/script/types.c index dc9153587..0237cd4cb 100644 --- a/src/script/types.c +++ b/src/script/types.c @@ -5,6 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include +#include #include #include #include @@ -853,6 +854,21 @@ const struct mScriptValue* mScriptValueUnwrapConst(const struct mScriptValue* va return NULL; } +void mScriptValueFollowPointer(struct mScriptValue* ptr, struct mScriptValue* out) { + if (ptr->type->base != mSCRIPT_TYPE_OPAQUE || !ptr->type->details.type) { + return; + } + + out->value.opaque = *(void**) ptr->value.opaque; + if (out->value.opaque) { + out->type = ptr->type->details.type; + } else { + out->type = mSCRIPT_TYPE_MS_VOID; + } + out->refs = mSCRIPT_VALUE_UNREF; + out->flags = 0; +} + struct mScriptValue* mScriptStringCreateEmpty(size_t size) { struct mScriptValue* val = mScriptValueAlloc(mSCRIPT_TYPE_MS_STR); struct mScriptString* internal = val->value.opaque; @@ -1178,6 +1194,15 @@ static bool _accessRawMember(struct mScriptClassMember* member, void* raw, bool val->type = mSCRIPT_TYPE_MS_WRAPPER; val->value.table = raw; break; + case mSCRIPT_TYPE_STRING: + if (member->type == mSCRIPT_TYPE_MS_CHARP) { + val->refs = mSCRIPT_VALUE_UNREF; + val->flags = 0; + val->type = mSCRIPT_TYPE_MS_CHARP; + val->value.opaque = raw; + break; + } + return false; case mSCRIPT_TYPE_LIST: val->refs = mSCRIPT_VALUE_UNREF; val->flags = 0; @@ -1500,3 +1525,56 @@ bool mScriptCoerceFrame(const struct mScriptTypeTuple* types, struct mScriptList } return true; } + +static void addTypesFromTuple(struct Table* types, const struct mScriptTypeTuple* tuple) { + size_t i; + for (i = 0; i < tuple->count; ++i) { + mScriptTypeAdd(types, tuple->entries[i]); + } +} + +static void addTypesFromTable(struct Table* types, struct Table* table) { + struct TableIterator iter; + if (!HashTableIteratorStart(table, &iter)) { + return; + } + do { + struct mScriptClassMember* member = HashTableIteratorGetValue(table, &iter); + mScriptTypeAdd(types, member->type); + } while(HashTableIteratorNext(table, &iter)); +} + +void mScriptTypeAdd(struct Table* types, const struct mScriptType* type) { + if (HashTableLookup(types, type->name) || type->isConst) { + return; + } + HashTableInsert(types, type->name, (struct mScriptType*) type); + switch (type->base) { + case mSCRIPT_TYPE_FUNCTION: + addTypesFromTuple(types, &type->details.function.parameters); + addTypesFromTuple(types, &type->details.function.returnType); + break; + case mSCRIPT_TYPE_OBJECT: + mScriptClassInit(type->details.cls); + if (type->details.cls->parent) { + mScriptTypeAdd(types, type->details.cls->parent); + } + addTypesFromTable(types, &type->details.cls->instanceMembers); + break; + case mSCRIPT_TYPE_OPAQUE: + case mSCRIPT_TYPE_WRAPPER: + if (type->details.type) { + mScriptTypeAdd(types, type->details.type); + } + case mSCRIPT_TYPE_VOID: + case mSCRIPT_TYPE_SINT: + case mSCRIPT_TYPE_UINT: + case mSCRIPT_TYPE_FLOAT: + case mSCRIPT_TYPE_STRING: + case mSCRIPT_TYPE_LIST: + case mSCRIPT_TYPE_TABLE: + case mSCRIPT_TYPE_WEAKREF: + // No subtypes + break; + } +}