diff --git a/CHANGES b/CHANGES index 722f98dab..1ef389804 100644 --- a/CHANGES +++ b/CHANGES @@ -33,7 +33,18 @@ Misc: - DS GX: Reject and log polygons that clip to more than 10 vertices - DS Core: Backport symbol loading changes from GBA core (fixes mgba.io/i/1834) -0.9.0: (Future) +0.10.0: (Future) +Emulation fixes: + - Core: Fix first event scheduling after loading savestate + - GB Serialize: Fix switching speed modes when loading a state (fixes mgba.io/i/2097) + - GBA Memory: Fix loading Thumb savestates when in ARM mode +Other fixes: + - GBA: Fix non-USA 1.0 FireRed misdetecting as a ROM hack (fixes mgba.io/i/2100) + - GBA: Fix crash when ROM loading fails +Misc: + - Qt: Add ROM filename and size to bug reporter + +0.9.0: (2021-03-28) Features: - e-Reader card scanning - New tool for converting between different save game formats @@ -75,6 +86,7 @@ Emulation fixes: - GBA BIOS: Improve HLE BIOS timing - GBA BIOS: Fix reloading video registers after reset (fixes mgba.io/i/1808) - GBA BIOS: Make HLE BIOS calls interruptable (fixes mgba.io/i/1711 and mgba.io/i/1823) + - GBA BIOS: Fix invalid decompression bounds checking - GBA DMA: Linger last DMA on bus (fixes mgba.io/i/301 and mgba.io/i/1320) - GBA DMA: Fix ordering and timing of overlapping DMAs - GBA I/O: Green swap register should be readable @@ -99,6 +111,7 @@ Emulation fixes: - GBA Video: Emulate sprite cycle limits in OpenGL renderer (fixes mgba.io/i/1635) - GBA Video: Fix OBJWIN erratic rendering in OpenGL renderer - GBA Video: Fix x offset in 256-color BG mosaic (fixes mgba.io/i/1684) + - GBA Video: Fix transposed BG mosaic parameters in GL renderer - SM83: Emulate HALT bug - SM83: Improve mid-M-cycle interrupts - SM83: HALT should not consume an extra T-state @@ -158,6 +171,7 @@ Misc: - GB: Allow pausing event loop while CPU is blocked - GB: Add support for sleep and shutdown callbacks - GB: Redo double speed emulation (closes mgba.io/i/1515) + - GB: Support loading CGB-on-AGB boot ROM - GB Audio: Add channel 4 batching back (fixes mgba.io/i/1313) - GB Core: Return the current number of banks for ROM/SRAM, not theoretical max - GB I/O: Implement preliminary support for PCM12/PCM34 (closes mgba.io/i/1468) @@ -188,6 +202,8 @@ Misc: - Qt: Use relative paths in portable mode when applicable (fixes mgba.io/i/838) - Qt: Better initial shortcut editor column sizes - SDL: Fall back to sw blit if OpenGL init fails + - Switch: Optimize font rendering (fixes mgba.io/i/2078) + - Switch: Allow switching between CPU and GPU renderers without reloading - Util: Reset vector size on deinit - VFS: Change semantics of VFile.sync on mapped files (fixes mgba.io/i/1730) diff --git a/include/mgba-util/gui.h b/include/mgba-util/gui.h index 29c0638f8..9ac225eb6 100644 --- a/include/mgba-util/gui.h +++ b/include/mgba-util/gui.h @@ -60,7 +60,7 @@ struct GUIBackground { struct GUIParams { unsigned width; unsigned height; - const struct GUIFont* font; + struct GUIFont* font; const char* basePath; void (*drawStart)(void); diff --git a/include/mgba-util/gui/font.h b/include/mgba-util/gui/font.h index 7f1ba34ce..403940954 100644 --- a/include/mgba-util/gui/font.h +++ b/include/mgba-util/gui/font.h @@ -82,11 +82,15 @@ unsigned GUIFontSpanWidth(const struct GUIFont*, const char* text); void GUIFontIconMetrics(const struct GUIFont*, enum GUIIcon icon, unsigned* w, unsigned* h); ATTRIBUTE_FORMAT(printf, 6, 7) -void GUIFontPrintf(const struct GUIFont*, int x, int y, enum GUIAlignment, uint32_t color, const char* text, ...); -void GUIFontPrint(const struct GUIFont*, int x, int y, enum GUIAlignment, uint32_t color, const char* text); -void GUIFontDrawGlyph(const struct GUIFont*, int x, int y, uint32_t color, uint32_t glyph); -void GUIFontDrawIcon(const struct GUIFont*, int x, int y, enum GUIAlignment, enum GUIOrientation, uint32_t color, enum GUIIcon); -void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon); +void GUIFontPrintf(struct GUIFont*, int x, int y, enum GUIAlignment, uint32_t color, const char* text, ...); +void GUIFontPrint(struct GUIFont*, int x, int y, enum GUIAlignment, uint32_t color, const char* text); +void GUIFontDrawGlyph(struct GUIFont*, int x, int y, uint32_t color, uint32_t glyph); +void GUIFontDrawIcon(struct GUIFont*, int x, int y, enum GUIAlignment, enum GUIOrientation, uint32_t color, enum GUIIcon); +void GUIFontDrawIconSize(struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon); + +#ifdef __SWITCH__ +void GUIFontDrawSubmit(struct GUIFont* font); +#endif CXX_GUARD_END diff --git a/include/mgba/gba/interface.h b/include/mgba/gba/interface.h index b59d265a2..aedd8895d 100644 --- a/include/mgba/gba/interface.h +++ b/include/mgba/gba/interface.h @@ -79,7 +79,6 @@ struct GBASIODriver { }; void GBASIOJOYCreate(struct GBASIODriver* sio); -int GBASIOJOYSendCommand(struct GBASIODriver* sio, enum GBASIOJOYCommand command, uint8_t* data); enum GBASIOBattleChipGateFlavor { GBA_FLAVOR_BATTLECHIP_GATE = 4, diff --git a/include/mgba/internal/gba/audio.h b/include/mgba/internal/gba/audio.h index 212e1b860..c9fab3ae1 100644 --- a/include/mgba/internal/gba/audio.h +++ b/include/mgba/internal/gba/audio.h @@ -304,6 +304,7 @@ void GBAAudioWriteSOUNDCNT_X(struct GBAAudio* audio, uint16_t value); void GBAAudioWriteSOUNDBIAS(struct GBAAudio* audio, uint16_t value); void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value); +uint32_t GBAAudioReadWaveRAM(struct GBAAudio* audio, int address); uint32_t GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value); void GBAAudioSampleFIFO(struct GBAAudio* audio, int fifoId, int32_t cycles); diff --git a/include/mgba/internal/gba/sio.h b/include/mgba/internal/gba/sio.h index 7a4e3ecfb..2c06af698 100644 --- a/include/mgba/internal/gba/sio.h +++ b/include/mgba/internal/gba/sio.h @@ -29,8 +29,12 @@ enum { JOY_CMD_TRANS = 0x14, JOY_CMD_RECV = 0x15, - JOYSTAT_TRANS_BIT = 8, - JOYSTAT_RECV_BIT = 2, + JOYSTAT_TRANS = 8, + JOYSTAT_RECV = 2, + + JOYCNT_RESET = 1, + JOYCNT_RECV = 2, + JOYCNT_TRANS = 4, }; DECL_BITFIELD(GBASIONormal, uint16_t); @@ -78,6 +82,8 @@ void GBASIOWriteRCNT(struct GBASIO* sio, uint16_t value); void GBASIOWriteSIOCNT(struct GBASIO* sio, uint16_t value); uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t value); +int GBASIOJOYSendCommand(struct GBASIODriver* sio, enum GBASIOJOYCommand command, uint8_t* data); + CXX_GUARD_END #endif diff --git a/include/mgba/internal/gba/sio/dolphin.h b/include/mgba/internal/gba/sio/dolphin.h new file mode 100644 index 000000000..29d0c575a --- /dev/null +++ b/include/mgba/internal/gba/sio/dolphin.h @@ -0,0 +1,41 @@ +/* Copyright (c) 2013-2017 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 SIO_DOLPHIN_H +#define SIO_DOLPHIN_H + +#include + +CXX_GUARD_START + +#include +#include + +#include + +extern const uint16_t DOLPHIN_CLOCK_PORT; +extern const uint16_t DOLPHIN_DATA_PORT; + +struct GBASIODolphin { + struct GBASIODriver d; + struct mTimingEvent event; + + Socket data; + Socket clock; + + int32_t clockSlice; + int state; + bool active; +}; + +void GBASIODolphinCreate(struct GBASIODolphin*); +void GBASIODolphinDestroy(struct GBASIODolphin*); + +bool GBASIODolphinConnect(struct GBASIODolphin*, const struct Address* address, short dataPort, short clockPort); +bool GBASIODolphinIsConnected(struct GBASIODolphin*); + +CXX_GUARD_END + +#endif diff --git a/res/nointro.dat b/res/nointro.dat index 23b4c6da0..6d37a5bfb 100644 --- a/res/nointro.dat +++ b/res/nointro.dat @@ -1,7 +1,7 @@ clrmamepro ( name "Nintendo - Game Boy Advance" description "Nintendo - Game Boy Advance" - version 20201205-110418 + version 20210326-211504 author "aci68, Aringon, Bent, BigFred, C. V. Reynolds, chillerecke, DeadSkullzJr, Densetsu, DeriLoko3, einstein95, ElBarto, Enker, fuzzball, Gefflon, Hiccup, hking0036, hydr0x, InternalLoss, Jack, jimmsu, kazumi213, Money_114, niemand, omonim2007, Powerpuff, PPLToast, relax, RetroGamer, Rifu, SonGoku, Tauwasser, Vallaine01, Whovian9369, xuom2, zg" homepage No-Intro url "http://www.no-intro.org" @@ -217,6 +217,12 @@ game ( rom ( name "2 Games in 1 - Findet Nemo + Findet Nemo - Das Abenteuer Geht Weiter (Germany) (De+Fr,De,Nl).gba" size 16777216 crc 60a35c6e sha1 E6F75D8108C9616A53853595123C787FCC5D83D0 ) ) +game ( + name "2 Games in 1 - Finding Nemo - The Continuing Adventures + The Incredibles (USA)" + description "2 Games in 1 - Finding Nemo - The Continuing Adventures + The Incredibles (USA)" + rom ( name "2 Games in 1 - Finding Nemo - The Continuing Adventures + The Incredibles (USA).gba" size 16777216 crc d5a37aa8 sha1 118CD86F64151C67BAF590B1030DA2FC6C6ACE16 ) +) + game ( name "2 Games in 1 - Finding Nemo + Finding Nemo - The Continuing Adventures (Europe) (En+En,Es,It,Sv,Da)" description "2 Games in 1 - Finding Nemo + Finding Nemo - The Continuing Adventures (Europe) (En+En,Es,It,Sv,Da)" @@ -247,12 +253,6 @@ game ( rom ( name "2 Games in 1 - Finding Nemo + The Incredibles (Europe) (Fr,Nl).gba" size 16777216 crc 2d4d69fa sha1 2A02888C0F14FE35881EC175A8BC7220E78F2559 ) ) -game ( - name "2 Games in 1 - Finding Nemo - The Continuing Adventures + The Incredibles (USA)" - description "2 Games in 1 - Finding Nemo - The Continuing Adventures + The Incredibles (USA)" - rom ( name "2 Games in 1 - Finding Nemo - The Continuing Adventures + The Incredibles (USA).gba" size 16777216 crc d5a37aa8 sha1 118CD86F64151C67BAF590B1030DA2FC6C6ACE16 ) -) - game ( name "2 Games in 1 - Golden Nugget Casino + Texas Hold 'em Poker (USA)" description "2 Games in 1 - Golden Nugget Casino + Texas Hold 'em Poker (USA)" @@ -571,6 +571,12 @@ game ( rom ( name "2 in 1 Game Pack - Shrek 2 + Shark Tale (USA).gba" size 16777216 crc 5cb036c7 sha1 226A4C2BBE400D00AFD2FA1D02285FBD4EA5015C ) ) +game ( + name "2 in 1 Game Pack - Spider-Man - Mysterio's Menace + X2 - Wolverine's Revenge (USA, Europe)" + description "2 in 1 Game Pack - Spider-Man - Mysterio's Menace + X2 - Wolverine's Revenge (USA, Europe)" + rom ( name "2 in 1 Game Pack - Spider-Man - Mysterio's Menace + X2 - Wolverine's Revenge (USA, Europe).gba" size 16777216 crc e7baa5b9 sha1 50C0F0531C0EEF9109FBD8424B1067534582316A ) +) + game ( name "2 in 1 Game Pack - Spider-Man & Spider-Man 2 (Europe) (En,Fr,De+En,Fr,De,Es,It)" description "2 in 1 Game Pack - Spider-Man & Spider-Man 2 (Europe) (En,Fr,De+En,Fr,De,Es,It)" @@ -583,12 +589,6 @@ game ( rom ( name "2 in 1 Game Pack - Spider-Man + Spider-Man 2 (USA) (En,Fr,De+En,Fr,De,Es).gba" size 33554432 crc 0ae3637f sha1 8BC2B600A043B776BC61FE8C0F4007B4360545F9 ) ) -game ( - name "2 in 1 Game Pack - Spider-Man - Mysterio's Menace + X2 - Wolverine's Revenge (USA, Europe)" - description "2 in 1 Game Pack - Spider-Man - Mysterio's Menace + X2 - Wolverine's Revenge (USA, Europe)" - rom ( name "2 in 1 Game Pack - Spider-Man - Mysterio's Menace + X2 - Wolverine's Revenge (USA, Europe).gba" size 16777216 crc e7baa5b9 sha1 50C0F0531C0EEF9109FBD8424B1067534582316A ) -) - game ( name "2 in 1 Game Pack - Tony Hawk's Underground + Kelly Slater's Pro Surfer (USA, Europe)" description "2 in 1 Game Pack - Tony Hawk's Underground + Kelly Slater's Pro Surfer (USA, Europe)" @@ -637,6 +637,12 @@ game ( rom ( name "2K Sports - Major League Baseball 2K7 (USA).gba" size 8388608 crc 8f3ff0e4 sha1 07390BC2BD53CD9EE5C6D2805AD374C59C195D9F ) ) +game ( + name "2K Sports - Major League Baseball 2K7 (USA) (Beta)" + description "2K Sports - Major League Baseball 2K7 (USA) (Beta)" + rom ( name "2K Sports - Major League Baseball 2K7 (USA) (Beta).gba" size 8388608 crc ea51532d sha1 776E084AC31336114F23230BDE4ADFC1F231934B ) +) + game ( name "3 Game Pack! - Candy Land + Chutes and Ladders + Original Memory Game (USA)" description "3 Game Pack! - Candy Land + Chutes and Ladders + Original Memory Game (USA)" @@ -1088,9 +1094,9 @@ game ( ) game ( - name "Alienators - Evolution Continues (USA, Europe) [b]" - description "Alienators - Evolution Continues (USA, Europe) [b]" - rom ( name "Alienators - Evolution Continues (USA, Europe) [b].gba" size 4194304 crc 0d694ca4 sha1 FB691C5E21FA388D75497E9090DB82DEC881E422 flags baddump ) + name "Alienators - Evolution Continues (USA, Europe)" + description "Alienators - Evolution Continues (USA, Europe)" + rom ( name "Alienators - Evolution Continues (USA, Europe).gba" size 4194304 crc 0d694ca4 sha1 FB691C5E21FA388D75497E9090DB82DEC881E422 ) ) game ( @@ -1118,9 +1124,9 @@ game ( ) game ( - name "All-Star Baseball 2004 featuring Derek Jeter (USA)" - description "All-Star Baseball 2004 featuring Derek Jeter (USA)" - rom ( name "All-Star Baseball 2004 featuring Derek Jeter (USA).gba" size 8388608 crc 60e2db03 sha1 29E168A84E51C3B765E345BAEE6910433F298993 ) + name "All-Star Baseball 2004 Featuring Derek Jeter (USA)" + description "All-Star Baseball 2004 Featuring Derek Jeter (USA)" + rom ( name "All-Star Baseball 2004 Featuring Derek Jeter (USA).gba" size 8388608 crc 60e2db03 sha1 29E168A84E51C3B765E345BAEE6910433F298993 ) ) game ( @@ -2516,9 +2522,9 @@ game ( ) game ( - name "Broken Circle (Europe) (En,It) (Aftermarket) (Unl)" - description "Broken Circle (Europe) (En,It) (Aftermarket) (Unl)" - rom ( name "Broken Circle (Europe) (En,It) (Aftermarket) (Unl).gba" size 16777216 crc 3212c09b sha1 E04A71DBE7B640CC53E81F447856E60666E64AA3 ) + name "Broken Circle (World) (En,It) (Aftermarket) (Unl)" + description "Broken Circle (World) (En,It) (Aftermarket) (Unl)" + rom ( name "Broken Circle (World) (En,It) (Aftermarket) (Unl).gba" size 16777216 crc 3212c09b sha1 E04A71DBE7B640CC53E81F447856E60666E64AA3 ) ) game ( @@ -2722,7 +2728,7 @@ game ( game ( name "Cardcaptor Sakura - Sakura Card Hen - Sakura to Card to Otomodachi (Japan) (Rev 1)" description "Cardcaptor Sakura - Sakura Card Hen - Sakura to Card to Otomodachi (Japan) (Rev 1)" - rom ( name "Cardcaptor Sakura - Sakura Card Hen - Sakura to Card to Otomodachi (Japan) (Rev 1).gba" size 16777216 crc 2c8488b2 sha1 06F8CEF944241AB73A062972CC7EB4A744DC1B6B ) + rom ( name "Cardcaptor Sakura - Sakura Card Hen - Sakura to Card to Otomodachi (Japan) (Rev 1).gba" size 16777216 crc 2c8488b2 sha1 06F8CEF944241AB73A062972CC7EB4A744DC1B6B flags verified ) ) game ( @@ -2878,7 +2884,7 @@ game ( game ( name "Castlevania - Circle of the Moon (USA)" description "Castlevania - Circle of the Moon (USA)" - rom ( name "Castlevania - Circle of the Moon (USA).gba" size 8388608 crc 1cc059a4 sha1 D661B01EB94186435723AC03344792C11C20C522 ) + rom ( name "Castlevania - Circle of the Moon (USA).gba" size 8388608 crc 1cc059a4 sha1 D661B01EB94186435723AC03344792C11C20C522 flags verified ) ) game ( @@ -3196,7 +3202,7 @@ game ( game ( name "Classic NES Series - Dr. Mario (USA, Europe)" description "Classic NES Series - Dr. Mario (USA, Europe)" - rom ( name "Classic NES Series - Dr. Mario (USA, Europe).gba" size 1048576 crc 934e1f1d sha1 FC396F0EAE55CF19E573AA322F525427E03D3854 flags verified ) + rom ( name "Classic NES Series - Dr. Mario (USA, Europe).gba" size 1048576 crc 934e1f1d sha1 FC396F0EAE55CF19E573AA322F525427E03D3854 ) ) game ( @@ -3214,37 +3220,37 @@ game ( game ( name "Classic NES Series - Metroid (USA, Europe)" description "Classic NES Series - Metroid (USA, Europe)" - rom ( name "Classic NES Series - Metroid (USA, Europe).gba" size 1048576 crc 9a243b9b sha1 838DA11F879E2FA3FFDEF95E1C6D5A54246C1846 flags verified ) + rom ( name "Classic NES Series - Metroid (USA, Europe).gba" size 1048576 crc 9a243b9b sha1 838DA11F879E2FA3FFDEF95E1C6D5A54246C1846 ) ) game ( name "Classic NES Series - Pac-Man (USA, Europe)" description "Classic NES Series - Pac-Man (USA, Europe)" - rom ( name "Classic NES Series - Pac-Man (USA, Europe).gba" size 1048576 crc c28df82f sha1 843D853ED28A116C85A5357F9A94E9179F36A6D0 flags verified ) + rom ( name "Classic NES Series - Pac-Man (USA, Europe).gba" size 1048576 crc c28df82f sha1 843D853ED28A116C85A5357F9A94E9179F36A6D0 ) ) game ( name "Classic NES Series - Super Mario Bros. (USA, Europe)" description "Classic NES Series - Super Mario Bros. (USA, Europe)" - rom ( name "Classic NES Series - Super Mario Bros. (USA, Europe).gba" size 1048576 crc f7129225 sha1 8CA35864AE33C9462DD66CEFF1FAC5A79E2E0A6F flags verified ) + rom ( name "Classic NES Series - Super Mario Bros. (USA, Europe).gba" size 1048576 crc f7129225 sha1 8CA35864AE33C9462DD66CEFF1FAC5A79E2E0A6F ) ) game ( name "Classic NES Series - The Legend of Zelda (USA, Europe)" description "Classic NES Series - The Legend of Zelda (USA, Europe)" - rom ( name "Classic NES Series - The Legend of Zelda (USA, Europe).gba" size 1048576 crc 6d49cabf sha1 28AAC26365BF41BA84E67F97E98D15C4678CB99D flags verified ) + rom ( name "Classic NES Series - The Legend of Zelda (USA, Europe).gba" size 1048576 crc 6d49cabf sha1 28AAC26365BF41BA84E67F97E98D15C4678CB99D ) ) game ( name "Classic NES Series - Xevious (USA, Europe)" description "Classic NES Series - Xevious (USA, Europe)" - rom ( name "Classic NES Series - Xevious (USA, Europe).gba" size 1048576 crc 9cd2d5dd sha1 B2088582808480E0D70C63A777B046409D4E15C4 flags verified ) + rom ( name "Classic NES Series - Xevious (USA, Europe).gba" size 1048576 crc 9cd2d5dd sha1 B2088582808480E0D70C63A777B046409D4E15C4 ) ) game ( name "Classic NES Series - Zelda II - The Adventure of Link (USA, Europe)" description "Classic NES Series - Zelda II - The Adventure of Link (USA, Europe)" - rom ( name "Classic NES Series - Zelda II - The Adventure of Link (USA, Europe).gba" size 1048576 crc 0b6ca48a sha1 22EA42AD9A99A6BC0FCBA8721CF8F484F68C3BF7 flags verified ) + rom ( name "Classic NES Series - Zelda II - The Adventure of Link (USA, Europe).gba" size 1048576 crc 0b6ca48a sha1 22EA42AD9A99A6BC0FCBA8721CF8F484F68C3BF7 ) ) game ( @@ -3320,9 +3326,9 @@ game ( ) game ( - name "Commandos 2 (Japan) (Proto)" - description "Commandos 2 (Japan) (Proto)" - rom ( name "Commandos 2 (Japan) (Proto).gba" size 2644724 crc dd58aecd sha1 3750E5704AE5EE240C273A68D36001F36348BB48 ) + name "Commandos 2 (Japan) (Proto) (2002-11-28)" + description "Commandos 2 (Japan) (Proto) (2002-11-28)" + rom ( name "Commandos 2 (Japan) (Proto) (2002-11-28).gba" size 2644724 crc dd58aecd sha1 3750E5704AE5EE240C273A68D36001F36348BB48 ) ) game ( @@ -3424,7 +3430,7 @@ game ( game ( name "Crash Bandicoot 2 - N-Tranced (Europe) (En,Fr,De,Es,It,Nl)" description "Crash Bandicoot 2 - N-Tranced (Europe) (En,Fr,De,Es,It,Nl)" - rom ( name "Crash Bandicoot 2 - N-Tranced (Europe) (En,Fr,De,Es,It,Nl).gba" size 8388608 crc 0f1d06a0 sha1 EE9234CA15BA2CAA71FAD7D6AF71E27B2030AE0B ) + rom ( name "Crash Bandicoot 2 - N-Tranced (Europe) (En,Fr,De,Es,It,Nl).gba" size 8388608 crc 0f1d06a0 sha1 EE9234CA15BA2CAA71FAD7D6AF71E27B2030AE0B flags verified ) ) game ( @@ -5470,115 +5476,115 @@ game ( game ( name "Famicom Mini 03 - Ice Climber (Japan) (En)" description "Famicom Mini 03 - Ice Climber (Japan) (En)" - rom ( name "Famicom Mini 03 - Ice Climber (Japan) (En).gba" size 4194304 crc 5646f9d1 sha1 B82C00D059D9C38C3EA493032FA1D36D5185EF80 ) + rom ( name "Famicom Mini 03 - Ice Climber (Japan) (En).gba" size 1048576 crc d0aef472 sha1 C64A586144DD33D4E30D02801519CBF0B93A0F09 ) ) game ( name "Famicom Mini 04 - Excitebike (Japan) (En)" description "Famicom Mini 04 - Excitebike (Japan) (En)" - rom ( name "Famicom Mini 04 - Excitebike (Japan) (En).gba" size 4194304 crc 319cdf36 sha1 D7DE5A18A950C7DBC5174AE0C293FB365F0B98CB ) + rom ( name "Famicom Mini 04 - Excitebike (Japan) (En).gba" size 1048576 crc 32604c95 sha1 AD9A633C793FDA6A0EC71AB7DFCD0D89B7440AFC ) ) game ( name "Famicom Mini 05 - Zelda no Densetsu 1 - The Hyrule Fantasy (Japan)" description "Famicom Mini 05 - Zelda no Densetsu 1 - The Hyrule Fantasy (Japan)" - rom ( name "Famicom Mini 05 - Zelda no Densetsu 1 - The Hyrule Fantasy (Japan).gba" size 4194304 crc 114e37a1 sha1 F7A425F77A26A26B8E3F6ADDE2BB89AE1F63377E flags verified ) + rom ( name "Famicom Mini 05 - Zelda no Densetsu 1 - The Hyrule Fantasy (Japan).gba" size 1048576 crc 712d76e8 sha1 8E398563478B079F5E6F34366C5D3FA5DFB5C594 ) ) game ( name "Famicom Mini 06 - Pac-Man (Japan) (En)" description "Famicom Mini 06 - Pac-Man (Japan) (En)" - rom ( name "Famicom Mini 06 - Pac-Man (Japan) (En).gba" size 4194304 crc 3fec1606 sha1 91458BC32C78FE412F725C0D3B777DD5AF8AC10B ) + rom ( name "Famicom Mini 06 - Pac-Man (Japan) (En).gba" size 1048576 crc 91acf642 sha1 9316699ED1943CEE6EE5CD5F0B40F76B3FCEF159 ) ) game ( name "Famicom Mini 07 - Xevious (Japan) (En)" description "Famicom Mini 07 - Xevious (Japan) (En)" - rom ( name "Famicom Mini 07 - Xevious (Japan) (En).gba" size 4194304 crc 1cd1f78c sha1 5CD976A599BC717136BE6D34D5ED05CACCDAC459 ) + rom ( name "Famicom Mini 07 - Xevious (Japan) (En).gba" size 1048576 crc f54eeb0e sha1 718E25B35B60341442C5098E03071A63CD332A97 ) ) game ( name "Famicom Mini 08 - Mappy (Japan) (En)" description "Famicom Mini 08 - Mappy (Japan) (En)" - rom ( name "Famicom Mini 08 - Mappy (Japan) (En).gba" size 4194304 crc d4b0779a sha1 504AC987F866E52434633725D2425C12F4829E8B ) + rom ( name "Famicom Mini 08 - Mappy (Japan) (En).gba" size 1048576 crc c29e4a08 sha1 72AE0EF34E40210CA8CDEAD5D9E145E28190DED5 ) ) game ( name "Famicom Mini 09 - Bomberman (Japan) (En)" description "Famicom Mini 09 - Bomberman (Japan) (En)" - rom ( name "Famicom Mini 09 - Bomberman (Japan) (En).gba" size 4194304 crc 3b92ee60 sha1 55FAF165142357F671DC3CC2841379012A281836 ) + rom ( name "Famicom Mini 09 - Bomberman (Japan) (En).gba" size 1048576 crc c1116e40 sha1 3EE5EB19AC00660E1C83C449C6A5B2A22C9F73EB ) ) game ( name "Famicom Mini 10 - Star Soldier (Japan) (En)" description "Famicom Mini 10 - Star Soldier (Japan) (En)" - rom ( name "Famicom Mini 10 - Star Soldier (Japan) (En).gba" size 4194304 crc 0958ee09 sha1 072A4AAB0E817CF9F6F7E8E9ECA01CE9129A69F7 ) + rom ( name "Famicom Mini 10 - Star Soldier (Japan) (En).gba" size 1048576 crc 1e23bad4 sha1 F740CB1C5E66886AAB560BFDD958D4EC447085C8 ) ) game ( name "Famicom Mini 11 - Mario Bros. (Japan)" description "Famicom Mini 11 - Mario Bros. (Japan)" - rom ( name "Famicom Mini 11 - Mario Bros. (Japan).gba" size 4194304 crc 9cd4d6cf sha1 E2A48D19AE151C9AF3FA8199D608FB8CFA417031 ) + rom ( name "Famicom Mini 11 - Mario Bros. (Japan).gba" size 1048576 crc 42a027ab sha1 32A336383B2DE86E4023C338E5D082F8BE462B4D ) ) game ( name "Famicom Mini 12 - Clu Clu Land (Japan)" description "Famicom Mini 12 - Clu Clu Land (Japan)" - rom ( name "Famicom Mini 12 - Clu Clu Land (Japan).gba" size 4194304 crc c4c03aa8 sha1 132B71A3E51421F1C2DA6C12C72408CA7DB262C2 ) + rom ( name "Famicom Mini 12 - Clu Clu Land (Japan).gba" size 1048576 crc 8b3219fe sha1 2F47308EF84F0D4A895A2E02616268D9A43DB348 ) ) game ( name "Famicom Mini 13 - Balloon Fight (Japan)" description "Famicom Mini 13 - Balloon Fight (Japan)" - rom ( name "Famicom Mini 13 - Balloon Fight (Japan).gba" size 4194304 crc 45d299d7 sha1 B3E9710536C5E7CC13FDB2169CA31C5FEDA8AC8B ) + rom ( name "Famicom Mini 13 - Balloon Fight (Japan).gba" size 1048576 crc a01f014a sha1 BB663B7570CBB4071B17884C5589E074A7DB7617 ) ) game ( name "Famicom Mini 14 - Wrecking Crew (Japan)" description "Famicom Mini 14 - Wrecking Crew (Japan)" - rom ( name "Famicom Mini 14 - Wrecking Crew (Japan).gba" size 4194304 crc 6c0611f0 sha1 2CF08CA3B76E6D1F5705457C6296826C71A38A34 ) + rom ( name "Famicom Mini 14 - Wrecking Crew (Japan).gba" size 1048576 crc adac99bd sha1 5606F9EFFD2D39EFACA739BD2B8F736D529191A6 ) ) game ( name "Famicom Mini 15 - Dr. Mario (Japan)" description "Famicom Mini 15 - Dr. Mario (Japan)" - rom ( name "Famicom Mini 15 - Dr. Mario (Japan).gba" size 4194304 crc e23a7ed0 sha1 35633B66CC920AC45E061CF40EB7761405881CEF ) + rom ( name "Famicom Mini 15 - Dr. Mario (Japan).gba" size 1048576 crc c836f2e2 sha1 4FB22FF059833D5206421277409ECE0CDD5D5B46 ) ) game ( name "Famicom Mini 16 - Dig Dug (Japan)" description "Famicom Mini 16 - Dig Dug (Japan)" - rom ( name "Famicom Mini 16 - Dig Dug (Japan).gba" size 4194304 crc 57513b63 sha1 7D870C79A7576630A16471D91BD23C1681B7DDC3 ) + rom ( name "Famicom Mini 16 - Dig Dug (Japan).gba" size 1048576 crc ee4c3504 sha1 0B46E4CABD1F5F624D8391658D9C888DBD29A6FF ) ) game ( name "Famicom Mini 17 - Takahashi Meijin no Bouken-jima (Japan)" description "Famicom Mini 17 - Takahashi Meijin no Bouken-jima (Japan)" - rom ( name "Famicom Mini 17 - Takahashi Meijin no Bouken-jima (Japan).gba" size 4194304 crc 3bef3b74 sha1 DBD9EED25971EF42DCE3852FAA778571C4BB3FAA ) + rom ( name "Famicom Mini 17 - Takahashi Meijin no Bouken-jima (Japan).gba" size 1048576 crc 53286f51 sha1 E61F8AC1490163C49668EFBC42B3549CB9AA881C ) ) game ( name "Famicom Mini 18 - Makaimura (Japan)" description "Famicom Mini 18 - Makaimura (Japan)" - rom ( name "Famicom Mini 18 - Makaimura (Japan).gba" size 4194304 crc 85261ec6 sha1 D52329277B87FFBFE87E3E7F5CA8153170FE177E ) + rom ( name "Famicom Mini 18 - Makaimura (Japan).gba" size 1048576 crc 8a7964ca sha1 4283B0A9DAFC29C80A2E1C1120B4AAB00DFED1DC ) ) game ( name "Famicom Mini 19 - Twin Bee (Japan)" description "Famicom Mini 19 - Twin Bee (Japan)" - rom ( name "Famicom Mini 19 - Twin Bee (Japan).gba" size 4194304 crc 26a17681 sha1 B3FA545FFDBCCB612B56C817C64AB16580B1A1AD ) + rom ( name "Famicom Mini 19 - Twin Bee (Japan).gba" size 1048576 crc 2f390212 sha1 E07A403BD9587E018F2213847F68B57794BD8B13 ) ) game ( name "Famicom Mini 20 - Ganbare Goemon! - Karakuri Douchuu (Japan)" description "Famicom Mini 20 - Ganbare Goemon! - Karakuri Douchuu (Japan)" - rom ( name "Famicom Mini 20 - Ganbare Goemon! - Karakuri Douchuu (Japan).gba" size 4194304 crc 10b48dba sha1 B681C2D7979B008D98EDA75AE12BC071CC21DA6F ) + rom ( name "Famicom Mini 20 - Ganbare Goemon! - Karakuri Douchuu (Japan).gba" size 1048576 crc 33196b58 sha1 2EC7D875ED0C8CE94CA3FE13495DAD2538DBD820 ) ) game ( name "Famicom Mini 21 - Super Mario Bros. 2 (Japan)" description "Famicom Mini 21 - Super Mario Bros. 2 (Japan)" - rom ( name "Famicom Mini 21 - Super Mario Bros. 2 (Japan).gba" size 4194304 crc f55674a3 sha1 3455D771F2E974E1AC55543AF741AE7FDED0312A ) + rom ( name "Famicom Mini 21 - Super Mario Bros. 2 (Japan).gba" size 1048576 crc ef18f7b2 sha1 017C7E0CB41A8D323D9D81F363A7CF51606808E7 ) ) game ( @@ -5626,13 +5632,13 @@ game ( game ( name "Famicom Mini 29 - Akumajou Dracula (Japan)" description "Famicom Mini 29 - Akumajou Dracula (Japan)" - rom ( name "Famicom Mini 29 - Akumajou Dracula (Japan).gba" size 4194304 crc 012fa057 sha1 DCFB0F7CB4EDB67F2D449C43BA33DEF09DB38BF9 ) + rom ( name "Famicom Mini 29 - Akumajou Dracula (Japan).gba" size 1048576 crc 11419d8b sha1 1684686077712875BA9D785642BBA21E8CB8F5BA ) ) game ( name "Famicom Mini 30 - SD Gundam World - Gachapon Senshi Scramble Wars (Japan)" description "Famicom Mini 30 - SD Gundam World - Gachapon Senshi Scramble Wars (Japan)" - rom ( name "Famicom Mini 30 - SD Gundam World - Gachapon Senshi Scramble Wars (Japan).gba" size 4194304 crc 9ed2daeb sha1 D3E54CFC3E0B08F54BD8B4520E0B661FBF0A75D8 ) + rom ( name "Famicom Mini 30 - SD Gundam World - Gachapon Senshi Scramble Wars (Japan).gba" size 1048576 crc ba78d1ee sha1 69E3FD59A0B4A02A3052D3428648C81E8D50A94D ) ) game ( @@ -6115,12 +6121,6 @@ game ( rom ( name "Fire Emblem - Rekka no Ken (Japan) (Virtual Console).gba" size 16777216 crc 0ba2fd1f sha1 C03D67769A893EF2207FD9B6BAF6E9E2D9290702 ) ) -game ( - name "Fire Emblem - Seima no Kousek (Japan) (Virtual Console)" - description "Fire Emblem - Seima no Kousek (Japan) (Virtual Console)" - rom ( name "Fire Emblem - Seima no Kousek (Japan) (Virtual Console).gba" size 16777216 crc d2b431f8 sha1 4DBBEDB8A4BB8AEE52294D0F7C6150EF2697ABF9 ) -) - game ( name "Fire Emblem - Seima no Kouseki (Japan)" description "Fire Emblem - Seima no Kouseki (Japan)" @@ -6133,6 +6133,12 @@ game ( rom ( name "Fire Emblem - Seima no Kouseki (Japan) (Beta).gba" size 16777216 crc cd9d8972 sha1 81C48809C9B8C3A099B7F9B1E08AB3DD8ADDE368 ) ) +game ( + name "Fire Emblem - Seima no Kouseki (Japan) (Virtual Console)" + description "Fire Emblem - Seima no Kouseki (Japan) (Virtual Console)" + rom ( name "Fire Emblem - Seima no Kouseki (Japan) (Virtual Console).gba" size 16777216 crc d2b431f8 sha1 4DBBEDB8A4BB8AEE52294D0F7C6150EF2697ABF9 ) +) + game ( name "Fire Emblem - The Sacred Stones (USA, Australia)" description "Fire Emblem - The Sacred Stones (USA, Australia)" @@ -7375,6 +7381,12 @@ game ( rom ( name "Gyakuten Saiban 3 (Japan) (Virtual Console).gba" size 8388608 crc 2c88386a sha1 88B38CFAA1CD83A8CA2361B3E6AAB84B4856ACB5 ) ) +game ( + name "Gyakuten Saiban 3 (Japan) (Demo) (Kiosk, GameCube)" + description "Gyakuten Saiban 3 (Japan) (Demo) (Kiosk, GameCube)" + rom ( name "Gyakuten Saiban 3 (Japan) (Demo) (Kiosk, GameCube).gba" size 8388608 crc 299a054b sha1 EE41EFF12E944CC73FB2A2C4706D0C2B8639668C ) +) + game ( name "Hachiemon (Japan)" description "Hachiemon (Japan)" @@ -8917,30 +8929,6 @@ game ( rom ( name "Kinnikuman II-Sei - Seigi Choujin e no Michi (Japan).gba" size 16777216 crc 3fe9c701 sha1 FF28C981C004D556961DB680C7B41E52F560831A ) ) -game ( - name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It)" - description "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It)" - rom ( name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It).gba" size 16777216 crc 4f07c618 sha1 6F478A455383A2A12378F292581DFD7300300700 flags verified ) -) - -game ( - name "Kirby & The Amazing Mirror (USA)" - description "Kirby & The Amazing Mirror (USA)" - rom ( name "Kirby & The Amazing Mirror (USA).gba" size 16777216 crc 9f2a3048 sha1 274B102B6D940F46861A92B4E65F89A51815C12C flags verified ) -) - -game ( - name "Kirby & The Amazing Mirror (USA) (Virtual Console)" - description "Kirby & The Amazing Mirror (USA) (Virtual Console)" - rom ( name "Kirby & The Amazing Mirror (USA) (Virtual Console).gba" size 16777216 crc f70ebb99 sha1 A7B758C2ABF4F0EF722922EAB4D394A1579B52E8 ) -) - -game ( - name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It) (Virtual Console)" - description "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It) (Virtual Console)" - rom ( name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It) (Virtual Console).gba" size 16777216 crc 7c74487c sha1 D740B50E4B363B902F7CF3831B08C306E12EA9C7 ) -) - game ( name "Kirby - Nightmare in Dream Land (USA)" description "Kirby - Nightmare in Dream Land (USA)" @@ -8965,6 +8953,30 @@ game ( rom ( name "Kirby - Nightmare in Dream Land (Europe) (En,Fr,De,Es,It) (Virtual Console).gba" size 16777216 crc 7336b1fa sha1 DFA3D9C8402F3EB2EA3E12E8F195187709634F92 ) ) +game ( + name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It)" + description "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It)" + rom ( name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It).gba" size 16777216 crc 4f07c618 sha1 6F478A455383A2A12378F292581DFD7300300700 flags verified ) +) + +game ( + name "Kirby & The Amazing Mirror (USA)" + description "Kirby & The Amazing Mirror (USA)" + rom ( name "Kirby & The Amazing Mirror (USA).gba" size 16777216 crc 9f2a3048 sha1 274B102B6D940F46861A92B4E65F89A51815C12C flags verified ) +) + +game ( + name "Kirby & The Amazing Mirror (USA) (Virtual Console)" + description "Kirby & The Amazing Mirror (USA) (Virtual Console)" + rom ( name "Kirby & The Amazing Mirror (USA) (Virtual Console).gba" size 16777216 crc f70ebb99 sha1 A7B758C2ABF4F0EF722922EAB4D394A1579B52E8 ) +) + +game ( + name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It) (Virtual Console)" + description "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It) (Virtual Console)" + rom ( name "Kirby & The Amazing Mirror (Europe) (En,Fr,De,Es,It) (Virtual Console).gba" size 16777216 crc 7c74487c sha1 D740B50E4B363B902F7CF3831B08C306E12EA9C7 ) +) + game ( name "Kisekko Gurumii - Chesty to Nuigurumi-tachi no Mahou no Bouken (Japan)" description "Kisekko Gurumii - Chesty to Nuigurumi-tachi no Mahou no Bouken (Japan)" @@ -10381,6 +10393,12 @@ game ( rom ( name "Mario vs. Donkey Kong (USA) (Demo) (Kiosk, GameCube).gba" size 16777216 crc 25505164 sha1 68EEBE6DBCF8973ED7426A793185DB202A01288F flags verified ) ) +game ( + name "Mario vs. Donkey Kong (Japan) (Demo) (Kiosk, GameCube)" + description "Mario vs. Donkey Kong (Japan) (Demo) (Kiosk, GameCube)" + rom ( name "Mario vs. Donkey Kong (Japan) (Demo) (Kiosk, GameCube).gba" size 16777216 crc b3642431 sha1 E7389B36573F7E32D53AE9ACFDBA744389C2F6C2 flags verified ) +) + game ( name "Marvel - Ultimate Alliance (USA)" description "Marvel - Ultimate Alliance (USA)" @@ -12008,9 +12026,9 @@ game ( ) game ( - name "MX 2002 featuring Ricky Carmichael (USA, Europe)" - description "MX 2002 featuring Ricky Carmichael (USA, Europe)" - rom ( name "MX 2002 featuring Ricky Carmichael (USA, Europe).gba" size 4194304 crc 0bf1dc56 sha1 87914981EE89219A0FA28833FB9D9F6E9B606D57 ) + name "MX 2002 Featuring Ricky Carmichael (USA, Europe)" + description "MX 2002 Featuring Ricky Carmichael (USA, Europe)" + rom ( name "MX 2002 Featuring Ricky Carmichael (USA, Europe).gba" size 4194304 crc 0bf1dc56 sha1 87914981EE89219A0FA28833FB9D9F6E9B606D57 ) ) game ( @@ -12169,6 +12187,12 @@ game ( rom ( name "Naruto - Saikyou Ninja Daikesshuu 2 (Japan).gba" size 8388608 crc b3d75ce1 sha1 6176C4D3FF95B56915B4D38EFA1115C1D5520F7C ) ) +game ( + name "Naruto - Saikyou Ninja Daikesshuu 2 (Japan) (Demo) (Kiosk, GameCube)" + description "Naruto - Saikyou Ninja Daikesshuu 2 (Japan) (Demo) (Kiosk, GameCube)" + rom ( name "Naruto - Saikyou Ninja Daikesshuu 2 (Japan) (Demo) (Kiosk, GameCube).gba" size 8388608 crc ba1f514a sha1 4F1047F13764C827CFCA12B9025FA62BB7F374A4 flags verified ) +) + game ( name "Naruto RPG - Uketsugareshi Hi no Ishi (Japan)" description "Naruto RPG - Uketsugareshi Hi no Ishi (Japan)" @@ -12181,6 +12205,12 @@ game ( rom ( name "Naruto RPG - Uketsugareshi Hi no Ishi (Japan) (Rev 1).gba" size 8388608 crc 2bf6555a sha1 DF43AB9AC90A8A6500AC85DAEE1A15EB0F00AFDF ) ) +game ( + name "Naruto RPG - Uketsugareshi Hi no Ishi (Japan) (Demo) (Kiosk, GameCube)" + description "Naruto RPG - Uketsugareshi Hi no Ishi (Japan) (Demo) (Kiosk, GameCube)" + rom ( name "Naruto RPG - Uketsugareshi Hi no Ishi (Japan) (Demo) (Kiosk, GameCube).gba" size 8388608 crc 502e4a7d sha1 1B6462A54A3D993FB01910237EEC9C9DD9DFF5F6 flags verified ) +) + game ( name "NASCAR Heat 2002 (USA)" description "NASCAR Heat 2002 (USA)" @@ -12967,18 +12997,18 @@ game ( rom ( name "Pinky Monkey Town (Japan).gba" size 4194304 crc 9f75b077 sha1 39963429361B42438D3BC1106AF0D345F3146B52 ) ) -game ( - name "Pinobee & Phoebee (Japan)" - description "Pinobee & Phoebee (Japan)" - rom ( name "Pinobee & Phoebee (Japan).gba" size 8388608 crc e989a4ae sha1 E5CB92C2ADB0B1715CE80D7562B562E527EE2E1F ) -) - game ( name "Pinobee - Wings of Adventure (USA, Europe)" description "Pinobee - Wings of Adventure (USA, Europe)" rom ( name "Pinobee - Wings of Adventure (USA, Europe).gba" size 8388608 crc d9385207 sha1 CB1549B6DD8070770B1A00928EEB7D458309E200 flags verified ) ) +game ( + name "Pinobee & Phoebee (Japan)" + description "Pinobee & Phoebee (Japan)" + rom ( name "Pinobee & Phoebee (Japan).gba" size 8388608 crc e989a4ae sha1 E5CB92C2ADB0B1715CE80D7562B562E527EE2E1F ) +) + game ( name "Pinobee no Daibouken (Japan)" description "Pinobee no Daibouken (Japan)" @@ -13172,45 +13202,69 @@ game ( ) game ( - name "Pokemon - 10th Anniversary Distribution (Europe)" - description "Pokemon - 10th Anniversary Distribution (Europe)" - rom ( name "Pokemon - 10th Anniversary Distribution (Europe).gba" size 4194304 crc 7e3ba6a2 sha1 3830C68BBE20406F56E1F4DF54B827D0DBD77714 ) + name "Pokemon - 10th Anniversary Distribution (Europe) (Kiosk)" + description "Pokemon - 10th Anniversary Distribution (Europe) (Kiosk)" + rom ( name "Pokemon - 10th Anniversary Distribution (Europe) (Kiosk).gba" size 4194304 crc 7e3ba6a2 sha1 3830C68BBE20406F56E1F4DF54B827D0DBD77714 ) ) game ( - name "Pokemon - Aura Mew Distribution (Europe)" - description "Pokemon - Aura Mew Distribution (Europe)" - rom ( name "Pokemon - Aura Mew Distribution (Europe).gba" size 4194304 crc 2912e76e sha1 DE5637F89AEB5D2D5F82B863F48BB0AB23E51715 ) + name "Pokemon - 10th Anniversary Distribution (Germany) (Kiosk)" + description "Pokemon - 10th Anniversary Distribution (Germany) (Kiosk)" + rom ( name "Pokemon - 10th Anniversary Distribution (Germany) (Kiosk).gba" size 4194304 crc dbf39320 sha1 1CD12C2BF0BED851939A618167A780CA6CEC4F76 ) ) game ( - name "Pokemon - Aura Mew Distribution (France)" - description "Pokemon - Aura Mew Distribution (France)" - rom ( name "Pokemon - Aura Mew Distribution (France).gba" size 4194304 crc 2ad292a4 sha1 5A27193B69815626C7FFC1DC27C14E000B348193 ) + name "Pokemon - 10th Anniversary Distribution (Italy) (Kiosk)" + description "Pokemon - 10th Anniversary Distribution (Italy) (Kiosk)" + rom ( name "Pokemon - 10th Anniversary Distribution (Italy) (Kiosk).gba" size 4194304 crc 82658753 sha1 9B7A0E8FB01A687B0A0DD44AAA5BDBF8417A007D ) ) game ( - name "Pokemon - Aura Mew Distribution (Germany)" - description "Pokemon - Aura Mew Distribution (Germany)" - rom ( name "Pokemon - Aura Mew Distribution (Germany).gba" size 4194304 crc 9a704af8 sha1 C0E8DD88BA17BD55873B36D2E04515596C7C57CB ) + name "Pokemon - 10th Anniversary Distribution (Spain) (Kiosk)" + description "Pokemon - 10th Anniversary Distribution (Spain) (Kiosk)" + rom ( name "Pokemon - 10th Anniversary Distribution (Spain) (Kiosk).gba" size 4194304 crc cd08f2b2 sha1 95BF71DDE9CED277F5CA07CCE4369B1D278F3DDD ) ) game ( - name "Pokemon - Aura Mew Distribution (Italy)" - description "Pokemon - Aura Mew Distribution (Italy)" - rom ( name "Pokemon - Aura Mew Distribution (Italy).gba" size 4194304 crc d111cc19 sha1 7BC8D22780F4BF767DE30441CAFA304CCE5D83D4 ) + name "Pokemon - 10th Anniversary Distribution (France) (Kiosk)" + description "Pokemon - 10th Anniversary Distribution (France) (Kiosk)" + rom ( name "Pokemon - 10th Anniversary Distribution (France) (Kiosk).gba" size 4194304 crc 6aa7aa37 sha1 B96CBF9B856984982890169515FB72A887CDE3BA ) ) game ( - name "Pokemon - Aura Mew Distribution (Spain)" - description "Pokemon - Aura Mew Distribution (Spain)" - rom ( name "Pokemon - Aura Mew Distribution (Spain).gba" size 4194304 crc ae57b39e sha1 BB20EF87DA0874E199E87E1979AA1490D3ECDCD7 ) + name "Pokemon - Aura Mew Distribution (Europe) (Kiosk)" + description "Pokemon - Aura Mew Distribution (Europe) (Kiosk)" + rom ( name "Pokemon - Aura Mew Distribution (Europe) (Kiosk).gba" size 4194304 crc 2912e76e sha1 DE5637F89AEB5D2D5F82B863F48BB0AB23E51715 ) ) game ( - name "Pokemon - Aurora Ticket Distribution (USA)" - description "Pokemon - Aurora Ticket Distribution (USA)" - rom ( name "Pokemon - Aurora Ticket Distribution (USA).gba" size 4194304 crc 24c80fa6 sha1 94A21D133E3F1B1A2129F450A9BC753D12C13B09 ) + name "Pokemon - Aura Mew Distribution (France) (Kiosk)" + description "Pokemon - Aura Mew Distribution (France) (Kiosk)" + rom ( name "Pokemon - Aura Mew Distribution (France) (Kiosk).gba" size 4194304 crc 2ad292a4 sha1 5A27193B69815626C7FFC1DC27C14E000B348193 ) +) + +game ( + name "Pokemon - Aura Mew Distribution (Germany) (Kiosk)" + description "Pokemon - Aura Mew Distribution (Germany) (Kiosk)" + rom ( name "Pokemon - Aura Mew Distribution (Germany) (Kiosk).gba" size 4194304 crc 9a704af8 sha1 C0E8DD88BA17BD55873B36D2E04515596C7C57CB ) +) + +game ( + name "Pokemon - Aura Mew Distribution (Italy) (Kiosk)" + description "Pokemon - Aura Mew Distribution (Italy) (Kiosk)" + rom ( name "Pokemon - Aura Mew Distribution (Italy) (Kiosk).gba" size 4194304 crc d111cc19 sha1 7BC8D22780F4BF767DE30441CAFA304CCE5D83D4 ) +) + +game ( + name "Pokemon - Aura Mew Distribution (Spain) (Kiosk)" + description "Pokemon - Aura Mew Distribution (Spain) (Kiosk)" + rom ( name "Pokemon - Aura Mew Distribution (Spain) (Kiosk).gba" size 4194304 crc ae57b39e sha1 BB20EF87DA0874E199E87E1979AA1490D3ECDCD7 ) +) + +game ( + name "Pokemon - Aurora Ticket Distribution (USA) (Kiosk)" + description "Pokemon - Aurora Ticket Distribution (USA) (Kiosk)" + rom ( name "Pokemon - Aurora Ticket Distribution (USA) (Kiosk).gba" size 4194304 crc 24c80fa6 sha1 94A21D133E3F1B1A2129F450A9BC753D12C13B09 ) ) game ( @@ -13220,9 +13274,9 @@ game ( ) game ( - name "Pokemon - Doel Deoxys Distribution (Netherlands)" - description "Pokemon - Doel Deoxys Distribution (Netherlands)" - rom ( name "Pokemon - Doel Deoxys Distribution (Netherlands).gba" size 4194304 crc 6346fd59 sha1 C09EB395BDB9B3981B8EC2F73179379E2BCFD0CC ) + name "Pokemon - Doel Deoxys Distribution (Netherlands) (Kiosk)" + description "Pokemon - Doel Deoxys Distribution (Netherlands) (Kiosk)" + rom ( name "Pokemon - Doel Deoxys Distribution (Netherlands) (Kiosk).gba" size 4194304 crc 6346fd59 sha1 C09EB395BDB9B3981B8EC2F73179379E2BCFD0CC ) ) game ( @@ -13304,9 +13358,9 @@ game ( ) game ( - name "Pokemon - Liechi Berry Glitch Fix & Shiny Zigzagoon Distribution (Europe)" - description "Pokemon - Liechi Berry Glitch Fix & Shiny Zigzagoon Distribution (Europe)" - rom ( name "Pokemon - Liechi Berry Glitch Fix & Shiny Zigzagoon Distribution (Europe).gba" size 4194304 crc d78b5a1f sha1 383D0E8D0DCB1E76F36939B359B753D6E1E8A11F ) + name "Pokemon - Liechi Berry Glitch Fix & Shiny Zigzagoon Distribution (Europe) (Kiosk)" + description "Pokemon - Liechi Berry Glitch Fix & Shiny Zigzagoon Distribution (Europe) (Kiosk)" + rom ( name "Pokemon - Liechi Berry Glitch Fix & Shiny Zigzagoon Distribution (Europe) (Kiosk).gba" size 4194304 crc d78b5a1f sha1 383D0E8D0DCB1E76F36939B359B753D6E1E8A11F ) ) game ( @@ -14452,7 +14506,7 @@ game ( game ( name "Rockman EXE 4 - Tournament Red Sun (Japan)" description "Rockman EXE 4 - Tournament Red Sun (Japan)" - rom ( name "Rockman EXE 4 - Tournament Red Sun (Japan).gba" size 8388608 crc 6a51907d sha1 7EFE1B77C39B58E1400AF5392BEC313003FA7861 ) + rom ( name "Rockman EXE 4 - Tournament Red Sun (Japan).gba" size 8388608 crc 6a51907d sha1 7EFE1B77C39B58E1400AF5392BEC313003FA7861 flags verified ) ) game ( @@ -15361,6 +15415,12 @@ game ( rom ( name "Shiren Monsters - Netsal (Japan).gba" size 16777216 crc c1f2b5ec sha1 D0E522435E453CA33018B6B9D19778873F67B695 ) ) +game ( + name "Shiren Monsters - Netsal (Japan) (Demo) (Kiosk, GameCube)" + description "Shiren Monsters - Netsal (Japan) (Demo) (Kiosk, GameCube)" + rom ( name "Shiren Monsters - Netsal (Japan) (Demo) (Kiosk, GameCube).gba" size 16777216 crc 25b0b122 sha1 2EBD243709A9B0AF16C6C0B0404FB02999EEFFFD flags verified ) +) + game ( name "Shrek - Hassle at the Castle (USA) (En,Fr,De,Es,It,Nl)" description "Shrek - Hassle at the Castle (USA) (En,Fr,De,Es,It,Nl)" @@ -15811,6 +15871,12 @@ game ( rom ( name "Sonic Advance 3 (Japan) (En,Ja,Fr,De,Es,It) (Virtual Console).gba" size 16777216 crc 1f36892f sha1 9FC8E926FC5472A1E34E3251C5D316526DC7A7A9 ) ) +game ( + name "Sonic Advance 3 (Japan) (Demo) (Kiosk, GameCube)" + description "Sonic Advance 3 (Japan) (Demo) (Kiosk, GameCube)" + rom ( name "Sonic Advance 3 (Japan) (Demo) (Kiosk, GameCube).gba" size 16777216 crc 0594d496 sha1 9C3F18112C126CA08403408A844A3A83967EB4DC flags verified ) +) + game ( name "Sonic Battle (Japan) (En,Ja)" description "Sonic Battle (Japan) (En,Ja)" @@ -18469,6 +18535,12 @@ game ( rom ( name "VeggieTales - LarryBoy and the Bad Apple (USA).gba" size 4194304 crc b5213253 sha1 3F6F229D719A2E533ABA538763802A64C2025BD9 ) ) +game ( + name "Viewpoint (Unknown) (Techo Demo)" + description "Viewpoint (Unknown) (Techo Demo)" + rom ( name "Viewpoint (Unknown) (Techo Demo).gba" size 2097152 crc 7ad65e4b sha1 8FDCC5C207593CB196CEA8416BB14BB45DB37434 ) +) + game ( name "Virtua Tennis (USA)" description "Virtua Tennis (USA)" @@ -18542,15 +18614,15 @@ game ( ) game ( - name "Wakeboarding Unleashed featuring Shaun Murray (Europe)" - description "Wakeboarding Unleashed featuring Shaun Murray (Europe)" - rom ( name "Wakeboarding Unleashed featuring Shaun Murray (Europe).gba" size 8388608 crc a3ccf1ec sha1 9EB979282FB2084BD205282EA71F18409D5558E2 ) + name "Wakeboarding Unleashed Featuring Shaun Murray (Europe)" + description "Wakeboarding Unleashed Featuring Shaun Murray (Europe)" + rom ( name "Wakeboarding Unleashed Featuring Shaun Murray (Europe).gba" size 8388608 crc a3ccf1ec sha1 9EB979282FB2084BD205282EA71F18409D5558E2 ) ) game ( - name "Wakeboarding Unleashed featuring Shaun Murray (USA)" - description "Wakeboarding Unleashed featuring Shaun Murray (USA)" - rom ( name "Wakeboarding Unleashed featuring Shaun Murray (USA).gba" size 8388608 crc cad6376c sha1 AB24E4968672379EB2B22CB1B2730EADF5989130 ) + name "Wakeboarding Unleashed Featuring Shaun Murray (USA)" + description "Wakeboarding Unleashed Featuring Shaun Murray (USA)" + rom ( name "Wakeboarding Unleashed Featuring Shaun Murray (USA).gba" size 8388608 crc cad6376c sha1 AB24E4968672379EB2B22CB1B2730EADF5989130 ) ) game ( @@ -18908,9 +18980,9 @@ game ( ) game ( - name "World Reborn (USA) (Aftermarket) (Unl)" - description "World Reborn (USA) (Aftermarket) (Unl)" - rom ( name "World Reborn (USA) (Aftermarket) (Unl).gba" size 4194304 crc eefb32ff sha1 C7EC2F8D7D3DEC40A893CDFE2A41A8ED43ED71C4 ) + name "World Reborn (World) (Aftermarket) (Unl)" + description "World Reborn (World) (Aftermarket) (Unl)" + rom ( name "World Reborn (World) (Aftermarket) (Unl).gba" size 4194304 crc eefb32ff sha1 C7EC2F8D7D3DEC40A893CDFE2A41A8ED43ED71C4 ) ) game ( @@ -19564,7 +19636,7 @@ game ( clrmamepro ( name "Nintendo - Game Boy Advance (Multiboot)" description "Nintendo - Game Boy Advance (Multiboot)" - version 20201010-045229 + version 20210321-122109 author "C. V. Reynolds, chillerecke, DeriLoko3, Hiccup, hking0036, niemand, omonim2007, relax" homepage No-Intro url "http://www.no-intro.org" @@ -19810,6 +19882,12 @@ game ( rom ( name "Dr. Mario (USA) (Kiosk, GameCube).gba" size 49404 crc 5e81043e sha1 0EB2C5B584D072F7CD1D837CEB2B1222FCEC441B ) ) +game ( + name "Made in Wario - Trial Version (Japan)" + description "Made in Wario - Trial Version (Japan)" + rom ( name "Made in Wario - Trial Version (Japan).gba" size 248108 crc 57da69a6 sha1 E3E66739303AAE3ABAB7DBD54F5645E7D484A5F6 flags verified ) +) + game ( name "Mario Kart - Double Dash!! (USA) (Fire Emblem GBA - Bonus Items)" description "Mario Kart - Double Dash!! (USA) (Fire Emblem GBA - Bonus Items)" @@ -19853,15 +19931,27 @@ game ( ) game ( - name "WarioWare, Inc. Mega Microgame$! - Trial Version (USA)" - description "WarioWare, Inc. Mega Microgame$! - Trial Version (USA)" - rom ( name "WarioWare, Inc. Mega Microgame$! - Trial Version (USA).gba" size 249848 crc cc86e7c2 sha1 CA4AE225F2F758ED84CEF9A3C8490EFD4B5A0A7C flags verified ) + name "WarioWare, Inc. - Trial ver. 1 (World)" + description "WarioWare, Inc. - Trial ver. 1 (World)" + rom ( name "WarioWare, Inc. - Trial ver. 1 (World).gba" size 244928 crc 7508c0c0 sha1 8BFCF10A8F57B16580A228ADDAE867A00E832151 flags verified ) +) + +game ( + name "WarioWare, Inc. - Trial ver. 4 (World)" + description "WarioWare, Inc. - Trial ver. 4 (World)" + rom ( name "WarioWare, Inc. - Trial ver. 4 (World).gba" size 234240 crc 00a15ebd sha1 01AF5F68897441F378EE417ACD800C152FF5350F flags verified ) +) + +game ( + name "WarioWare, Inc. - Trial version (USA)" + description "WarioWare, Inc. - Trial version (USA)" + rom ( name "WarioWare, Inc. - Trial version (USA).gba" size 249848 crc cc86e7c2 sha1 CA4AE225F2F758ED84CEF9A3C8490EFD4B5A0A7C flags verified ) ) clrmamepro ( name "Nintendo - Game Boy" description "Nintendo - Game Boy" - version 20201120-021052 + version 20210311-081758 author "aci68, akubi, Aringon, Bent, BigFred, BitLooter, C. V. Reynolds, chillerecke, darthcloud, DeadSkullzJr, Densetsu, DeriLoko3, ElBarto, foxe, fuzzball, Gefflon, Hiccup, hking0036, jimmsu, kazumi213, leekindo, Money_114, NGEfreak, omonim2007, Powerpuff, PPLToast, relax, RetroUprising, rpg2813, SonGoku, Tauwasser, xNo, xuom2" homepage No-Intro url "http://www.no-intro.org" @@ -20335,6 +20425,12 @@ game ( rom ( name "Asterix & Obelix (Europe) (Fr,De) (SGB Enhanced).gb" size 262144 crc 5143e227 sha1 EBC68B180680C7037B151B9A1B511B681499BA30 flags verified ) ) +game ( + name "Asterix & Obelix (Europe) (Fr,De) (Beta) (SGB Enhanced)" + description "Asterix & Obelix (Europe) (Fr,De) (Beta) (SGB Enhanced)" + rom ( name "Asterix & Obelix (Europe) (Fr,De) (Beta) (SGB Enhanced).gb" size 262144 crc bfa1d7be sha1 70472CBE59CFD426B0969150085CC97D31BD6470 ) +) + game ( name "Asteroids (USA, Europe)" description "Asteroids (USA, Europe)" @@ -20810,9 +20906,9 @@ game ( ) game ( - name "Bokujou Monogatari GB (Japan) (CGB+SGB Enhanced) (NP)" - description "Bokujou Monogatari GB (Japan) (CGB+SGB Enhanced) (NP)" - rom ( name "Bokujou Monogatari GB (Japan) (CGB+SGB Enhanced) (NP).gb" size 524288 crc 0424df85 sha1 551DF2021D0E433E7F07CF881C7B1D534F54F6AD ) + name "Bokujou Monogatari GB (Japan) (SGB Enhanced) (NP)" + description "Bokujou Monogatari GB (Japan) (SGB Enhanced) (NP)" + rom ( name "Bokujou Monogatari GB (Japan) (SGB Enhanced) (NP).gb" size 524288 crc 0424df85 sha1 551DF2021D0E433E7F07CF881C7B1D534F54F6AD ) ) game ( @@ -23918,9 +24014,9 @@ game ( ) game ( - name "Kaseki Sousei Reborn (Japan) (Rev 1) (Possible Proto) (SGB Enhanced)" - description "Kaseki Sousei Reborn (Japan) (Rev 1) (Possible Proto) (SGB Enhanced)" - rom ( name "Kaseki Sousei Reborn (Japan) (Rev 1) (Possible Proto) (SGB Enhanced).gb" size 524288 crc 7c94197c sha1 5759394E2E8BFD68CCF5519362572DAABA003573 ) + name "Kaseki Sousei Reborn (Japan) (Rev 1) (SGB Enhanced)" + description "Kaseki Sousei Reborn (Japan) (Rev 1) (SGB Enhanced)" + rom ( name "Kaseki Sousei Reborn (Japan) (Rev 1) (SGB Enhanced).gb" size 524288 crc 7c94197c sha1 5759394E2E8BFD68CCF5519362572DAABA003573 ) ) game ( @@ -25243,6 +25339,12 @@ game ( rom ( name "Mortal Kombat (USA, Europe).gb" size 262144 crc 90eb0929 sha1 59752879EFAF2F271CE4B8A9D4A455056A2985D0 flags verified ) ) +game ( + name "Mortal Kombat - Shinken Kourin Densetsu (Japan)" + description "Mortal Kombat - Shinken Kourin Densetsu (Japan)" + rom ( name "Mortal Kombat - Shinken Kourin Densetsu (Japan).gb" size 262144 crc 160fa9ef sha1 5C24D595401CE3D1BB4027D0BC12312DCA275470 ) +) + game ( name "Mortal Kombat & Mortal Kombat II (Japan)" description "Mortal Kombat & Mortal Kombat II (Japan)" @@ -25255,12 +25357,6 @@ game ( rom ( name "Mortal Kombat & Mortal Kombat II (USA, Europe).gb" size 1048576 crc 55300d0a sha1 E337489255B33367CE26194FC4038346D3388BD9 ) ) -game ( - name "Mortal Kombat - Shinken Kourin Densetsu (Japan)" - description "Mortal Kombat - Shinken Kourin Densetsu (Japan)" - rom ( name "Mortal Kombat - Shinken Kourin Densetsu (Japan).gb" size 262144 crc 160fa9ef sha1 5C24D595401CE3D1BB4027D0BC12312DCA275470 ) -) - game ( name "Mortal Kombat 3 (Europe)" description "Mortal Kombat 3 (Europe)" @@ -25684,13 +25780,13 @@ game ( game ( name "Nettou World Heroes 2 Jet (Japan) (SGB Enhanced)" description "Nettou World Heroes 2 Jet (Japan) (SGB Enhanced)" - rom ( name "Nettou World Heroes 2 Jet (Japan) (SGB Enhanced).gb" size 524288 crc 0a12f53c sha1 0DD04CA0AC61B449D3040587918B63D649FBBCC2 ) + rom ( name "Nettou World Heroes 2 Jet (Japan) (SGB Enhanced).gb" size 524288 crc 0a12f53c sha1 0DD04CA0AC61B449D3040587918B63D649FBBCC2 flags verified ) ) game ( name "Nettou World Heroes 2 Jet (Japan) (Rev 1) (SGB Enhanced)" description "Nettou World Heroes 2 Jet (Japan) (Rev 1) (SGB Enhanced)" - rom ( name "Nettou World Heroes 2 Jet (Japan) (Rev 1) (SGB Enhanced).gb" size 524288 crc 7c5ffe52 sha1 14BC507F479E814B0131FEBFAB19F2EF30EB23A5 ) + rom ( name "Nettou World Heroes 2 Jet (Japan) (Rev 1) (SGB Enhanced).gb" size 524288 crc 7c5ffe52 sha1 14BC507F479E814B0131FEBFAB19F2EF30EB23A5 flags verified ) ) game ( @@ -25987,6 +26083,12 @@ game ( rom ( name "Out of Gas (USA).gb" size 131072 crc 1b67e8b1 sha1 770AC35C0780CF432235593BD5674E72EDD6CF7D ) ) +game ( + name "Out of Gas (USA) (Beta)" + description "Out of Gas (USA) (Beta)" + rom ( name "Out of Gas (USA) (Beta).gb" size 131072 crc c3e365b4 sha1 FF90B89B413437B5E3360E28B6A62573619B4558 ) +) + game ( name "Outburst (Japan)" description "Outburst (Japan)" @@ -26209,6 +26311,12 @@ game ( rom ( name "Pang (Europe).gb" size 131072 crc ea9615b4 sha1 7CA64A45EA6A68770658AE39EF21C41F806988C5 ) ) +game ( + name "Pang (Europe) (Beta)" + description "Pang (Europe) (Beta)" + rom ( name "Pang (Europe) (Beta).gb" size 131072 crc 54d2754a sha1 B57D436D8A83F2FB1E42BAD3150893EF8FFAB0D4 ) +) + game ( name "Paperboy (USA, Europe)" description "Paperboy (USA, Europe)" @@ -26488,19 +26596,19 @@ game ( game ( name "Pocket Monsters - Aka (Japan) (SGB Enhanced)" description "Pocket Monsters - Aka (Japan) (SGB Enhanced)" - rom ( name "Pocket Monsters - Aka (Japan) (SGB Enhanced).gb" size 524288 crc 13652705 sha1 0623AD12F48C259447980D68BD85DDBF8204B2CD ) + rom ( name "Pocket Monsters - Aka (Japan) (SGB Enhanced).gb" size 524288 crc 13652705 sha1 0623AD12F48C259447980D68BD85DDBF8204B2CD flags verified ) ) game ( name "Pocket Monsters - Aka (Japan) (Rev 1) (SGB Enhanced)" description "Pocket Monsters - Aka (Japan) (Rev 1) (SGB Enhanced)" - rom ( name "Pocket Monsters - Aka (Japan) (Rev 1) (SGB Enhanced).gb" size 524288 crc b77be1e0 sha1 EF74C79CDED14204AC79E77F4964D9CB25003120 ) + rom ( name "Pocket Monsters - Aka (Japan) (Rev 1) (SGB Enhanced).gb" size 524288 crc b77be1e0 sha1 EF74C79CDED14204AC79E77F4964D9CB25003120 flags verified ) ) game ( name "Pocket Monsters - Ao (Japan) (SGB Enhanced)" description "Pocket Monsters - Ao (Japan) (SGB Enhanced)" - rom ( name "Pocket Monsters - Ao (Japan) (SGB Enhanced).gb" size 524288 crc e4468d14 sha1 0DA501E3E5C51AB8FEF55B092DCDD7E6B050E424 ) + rom ( name "Pocket Monsters - Ao (Japan) (SGB Enhanced).gb" size 524288 crc e4468d14 sha1 0DA501E3E5C51AB8FEF55B092DCDD7E6B050E424 flags verified ) ) game ( @@ -26530,7 +26638,7 @@ game ( game ( name "Pocket Monsters - Pikachu (Japan) (Rev 2) (SGB Enhanced)" description "Pocket Monsters - Pikachu (Japan) (Rev 2) (SGB Enhanced)" - rom ( name "Pocket Monsters - Pikachu (Japan) (Rev 2) (SGB Enhanced).gb" size 1048576 crc fd3da7ff sha1 91864ECDF26D1C593BDE4D9ED615520EB57D5E41 ) + rom ( name "Pocket Monsters - Pikachu (Japan) (Rev 2) (SGB Enhanced).gb" size 1048576 crc fd3da7ff sha1 91864ECDF26D1C593BDE4D9ED615520EB57D5E41 flags verified ) ) game ( @@ -26743,6 +26851,12 @@ game ( rom ( name "Populous (Europe).gb" size 131072 crc 453057ac sha1 4E3976FE32F4DB8F2E56EAE539D7CAE04D1B64CB flags verified ) ) +game ( + name "Populous (Europe) (Beta)" + description "Populous (Europe) (Beta)" + rom ( name "Populous (Europe) (Beta).gb" size 131072 crc ecf2dd6f sha1 76A08B4A0448641A263CE4DC65A2181192A0A621 ) +) + game ( name "Populous Gaiden (Japan)" description "Populous Gaiden (Japan)" @@ -28675,6 +28789,12 @@ game ( rom ( name "Taz-Mania (Europe).gb" size 131072 crc 0860b667 sha1 C184E8E11EF2388C60B69D445A46FC22A11D175E flags verified ) ) +game ( + name "Taz-Mania (Europe) (Beta)" + description "Taz-Mania (Europe) (Beta)" + rom ( name "Taz-Mania (Europe) (Beta).gb" size 131072 crc c3d85ef6 sha1 B31F8EC2A330D57EC7736E405833508CA8A98700 ) +) + game ( name "Taz-Mania 2 (USA)" description "Taz-Mania 2 (USA)" @@ -29414,9 +29534,9 @@ game ( ) game ( - name "Wario Blast featuring Bomberman! (USA, Europe) (SGB Enhanced)" - description "Wario Blast featuring Bomberman! (USA, Europe) (SGB Enhanced)" - rom ( name "Wario Blast featuring Bomberman! (USA, Europe) (SGB Enhanced).gb" size 262144 crc 927b57a1 sha1 279FB0223E362DB553B739B1B8F9C18B81D92413 flags verified ) + name "Wario Blast Featuring Bomberman! (USA, Europe) (SGB Enhanced)" + description "Wario Blast Featuring Bomberman! (USA, Europe) (SGB Enhanced)" + rom ( name "Wario Blast Featuring Bomberman! (USA, Europe) (SGB Enhanced).gb" size 262144 crc 927b57a1 sha1 279FB0223E362DB553B739B1B8F9C18B81D92413 flags verified ) ) game ( @@ -29884,7 +30004,7 @@ game ( clrmamepro ( name "Nintendo - Game Boy Color" description "Nintendo - Game Boy Color" - version 20201205-111422 + version 20210303-092238 author "akubi, Aringon, Bent, BigFred, BitLooter, C. V. Reynolds, chillerecke, coraz, darthcloud, DeadSkullzJr, Densetsu, DeriLoko3, foxe, fuzzball, Hiccup, hking0036, kazumi213, Money_114, NGEfreak, omonim2007, PPLToast, relax, Rifu, SonGoku, Tauwasser, Whovian9369, xuom2, zg" homepage No-Intro url "http://www.no-intro.org" @@ -30226,6 +30346,12 @@ game ( rom ( name "Arthur's Absolutely Fun Day! (USA).gbc" size 1048576 crc f03599a3 sha1 CF1323CFD3FBE8BA8C9766A87A7C68D8B7E729F9 ) ) +game ( + name "Asterix - Sur la Trace D'Idefix (Europe) (En,Fr,De,Es,It,Nl)" + description "Asterix - Sur la Trace D'Idefix (Europe) (En,Fr,De,Es,It,Nl)" + rom ( name "Asterix - Sur la Trace D'Idefix (Europe) (En,Fr,De,Es,It,Nl).gbc" size 1048576 crc 408dc5c6 sha1 5C7207137AB422D3326D183D3433DB161D8ECBC5 ) +) + game ( name "Asterix & Obelix (Europe) (En,Fr,De,Es)" description "Asterix & Obelix (Europe) (En,Fr,De,Es)" @@ -30238,12 +30364,6 @@ game ( rom ( name "Asterix & Obelix Contre Cesar (Europe) (En,Fr,De,Es,Nl) (GB Compatible).gbc" size 1048576 crc 71043d76 sha1 A4B892D269957D84570C07856C81F48F037B5A03 ) ) -game ( - name "Asterix - Sur la Trace D'Idefix (Europe) (En,Fr,De,Es,It,Nl)" - description "Asterix - Sur la Trace D'Idefix (Europe) (En,Fr,De,Es,It,Nl)" - rom ( name "Asterix - Sur la Trace D'Idefix (Europe) (En,Fr,De,Es,It,Nl).gbc" size 1048576 crc 408dc5c6 sha1 5C7207137AB422D3326D183D3433DB161D8ECBC5 ) -) - game ( name "Asteroids (USA, Europe) (GB Compatible)" description "Asteroids (USA, Europe) (GB Compatible)" @@ -30832,12 +30952,6 @@ game ( rom ( name "Bug's Life, A (USA) (SGB Enhanced) (GB Compatible).gbc" size 1048576 crc 8360047a sha1 4C689CE3B99A5B585A452B095D72A688391EA0EB ) ) -game ( - name "Bugs Bunny & Lola Bunny - Operation Carrot Patch (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)" - description "Bugs Bunny & Lola Bunny - Operation Carrot Patch (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)" - rom ( name "Bugs Bunny & Lola Bunny - Operation Carrot Patch (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible).gbc" size 1048576 crc f0cc407f sha1 BA004FAC4524B82FD74A9037A37734D0ABA07E50 flags verified ) -) - game ( name "Bugs Bunny - Crazy Castle 3 (Japan) (GB Compatible)" description "Bugs Bunny - Crazy Castle 3 (Japan) (GB Compatible)" @@ -30856,6 +30970,12 @@ game ( rom ( name "Bugs Bunny - Crazy Castle 4 (Japan).gbc" size 1048576 crc d6387eaa sha1 E4A198D4ACF5AC987071A1D2B91501CACA62269B ) ) +game ( + name "Bugs Bunny & Lola Bunny - Operation Carrot Patch (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)" + description "Bugs Bunny & Lola Bunny - Operation Carrot Patch (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible)" + rom ( name "Bugs Bunny & Lola Bunny - Operation Carrot Patch (Europe) (En,Fr,De,Es,It,Nl) (GB Compatible).gbc" size 1048576 crc f0cc407f sha1 BA004FAC4524B82FD74A9037A37734D0ABA07E50 flags verified ) +) + game ( name "Bugs Bunny et le Chateau des Catastrophes (France)" description "Bugs Bunny et le Chateau des Catastrophes (France)" @@ -31000,6 +31120,12 @@ game ( rom ( name "Carmageddon - Carpocalypse Now (USA, Europe) (En,Fr,Es,It).gbc" size 2097152 crc bb482ed7 sha1 DF37636BBD57A426E23D21581376D7E3A87C7933 flags verified ) ) +game ( + name "Carnivale (USA) (Proto)" + description "Carnivale (USA) (Proto)" + rom ( name "Carnivale (USA) (Proto).gbc" size 1048576 crc e9503c71 sha1 07D41E21BC82F64D788E720583169FB0E588DA89 ) +) + game ( name "Casper (Europe) (En,Es,It)" description "Casper (Europe) (En,Es,It)" @@ -32287,7 +32413,7 @@ game ( game ( name "Fushigi no Dungeon - Fuurai no Shiren GB 2 - Sabaku no Majou (Japan) (BFWJ)" description "Fushigi no Dungeon - Fuurai no Shiren GB 2 - Sabaku no Majou (Japan) (BFWJ)" - rom ( name "Fushigi no Dungeon - Fuurai no Shiren GB 2 - Sabaku no Majou (Japan) (BFWJ).gbc" size 4194304 crc f3c20fbe sha1 D9C490AF97C08AC7053BBB9F7AE06D3501035127 ) + rom ( name "Fushigi no Dungeon - Fuurai no Shiren GB 2 - Sabaku no Majou (Japan) (BFWJ).gbc" size 4194304 crc f3c20fbe sha1 D9C490AF97C08AC7053BBB9F7AE06D3501035127 flags verified ) ) game ( @@ -32323,7 +32449,7 @@ game ( game ( name "Gambler Densetsu Tetsuya - Shinjuku Tenun Hen (Japan) (Rev 1)" description "Gambler Densetsu Tetsuya - Shinjuku Tenun Hen (Japan) (Rev 1)" - rom ( name "Gambler Densetsu Tetsuya - Shinjuku Tenun Hen (Japan) (Rev 1).gbc" size 1048576 crc 91739def sha1 B62F8E56B995874C0E1A2533DF5A37F6996DF12E ) + rom ( name "Gambler Densetsu Tetsuya - Shinjuku Tenun Hen (Japan) (Rev 1).gbc" size 1048576 crc 91739def sha1 B62F8E56B995874C0E1A2533DF5A37F6996DF12E flags verified ) ) game ( @@ -32335,7 +32461,7 @@ game ( game ( name "Game & Watch Gallery 3 (USA, Europe) (SGB Enhanced) (GB Compatible)" description "Game & Watch Gallery 3 (USA, Europe) (SGB Enhanced) (GB Compatible)" - rom ( name "Game & Watch Gallery 3 (USA, Europe) (SGB Enhanced) (GB Compatible).gbc" size 1048576 crc 1ac625da sha1 64CCB3B41715080A9AA13970678AA9047FC7A9FD ) + rom ( name "Game & Watch Gallery 3 (USA, Europe) (SGB Enhanced) (GB Compatible).gbc" size 1048576 crc 1ac625da sha1 64CCB3B41715080A9AA13970678AA9047FC7A9FD flags verified ) ) game ( @@ -32512,6 +32638,12 @@ game ( rom ( name "Gifty (Germany) (En).gbc" size 1048576 crc b97a8cb8 sha1 F92997128F6BCE74F5E5C0787F98FA3D2B6C3133 ) ) +game ( + name "Gimmick Land (Japan) (Proto)" + description "Gimmick Land (Japan) (Proto)" + rom ( name "Gimmick Land (Japan) (Proto).gbc" size 2097152 crc 228d0b0c sha1 F63ADFF202D7351C61411766C5B57EFEFAC58BCD ) +) + game ( name "Glocal Hexcite (Japan) (SGB Enhanced) (GB Compatible)" description "Glocal Hexcite (Japan) (SGB Enhanced) (GB Compatible)" @@ -32704,6 +32836,12 @@ game ( rom ( name "Gyouten Ningen Batseelor - Doctor Guy no Yabou (Japan).gbc" size 4194304 crc b17dc263 sha1 B72E885BAEEB27CB32DE5B5DCEDB632537898C33 flags verified ) ) +game ( + name "Hajimari no Mori (Japan) (Proto)" + description "Hajimari no Mori (Japan) (Proto)" + rom ( name "Hajimari no Mori (Japan) (Proto).gbc" size 2097152 crc fecc8ee8 sha1 75A3E1794FD6BD6D35F0A357A82612C016DFBA24 ) +) + game ( name "Halloween Racer (Europe) (En,Fr,De,Es,It,Pt)" description "Halloween Racer (Europe) (En,Fr,De,Es,It,Pt)" @@ -32914,6 +33052,12 @@ game ( rom ( name "Hello Kitty's Cube Frenzy (USA) (GB Compatible).gbc" size 1048576 crc 937729f6 sha1 6F15379553A0EC8A8174B85A35EAA4085DEC6B43 ) ) +game ( + name "Hello Kitty's Cube Frenzy (Europe) (Proto)" + description "Hello Kitty's Cube Frenzy (Europe) (Proto)" + rom ( name "Hello Kitty's Cube Frenzy (Europe) (Proto).gbc" size 1048576 crc 9606a07f sha1 2225DA8A68E489C0F562AFCB8E90FC9387321AF0 ) +) + game ( name "Hercules - The Legendary Journeys (Europe) (En,Fr,De,Es,It,Nl)" description "Hercules - The Legendary Journeys (Europe) (En,Fr,De,Es,It,Nl)" @@ -33238,6 +33382,12 @@ game ( rom ( name "Jet de Go! - Let's Go by Airliner (Japan).gbc" size 2097152 crc 20c4ccf6 sha1 97BF75AFA0089DDB342EA7046B7CD113BA2C6FEC ) ) +game ( + name "Jibaku-kun - Rei no Itsuki no Kajitsu (Japan) (Proto)" + description "Jibaku-kun - Rei no Itsuki no Kajitsu (Japan) (Proto)" + rom ( name "Jibaku-kun - Rei no Itsuki no Kajitsu (Japan) (Proto).gbc" size 2097152 crc 1900bcc8 sha1 FEC43A82916E8504DE685B928A0AF73C2252B55D ) +) + game ( name "Jim Henson's Bear in the Big Blue House (Europe) (En,Fr,De,Es,It,Nl)" description "Jim Henson's Bear in the Big Blue House (Europe) (En,Fr,De,Es,It,Nl)" @@ -33598,6 +33748,12 @@ game ( rom ( name "Klustar (USA) (GB Compatible).gbc" size 262144 crc 3f8d6041 sha1 096748F23F61E83837568C4070A34572D11FF48E ) ) +game ( + name "Klustar (Japan) (Proto)" + description "Klustar (Japan) (Proto)" + rom ( name "Klustar (Japan) (Proto).gbc" size 262144 crc 65da9075 sha1 9C60C858F647B42007FC27C5D21F3F57923C4CDA ) +) + game ( name "Knockout Kings (USA, Europe)" description "Knockout Kings (USA, Europe)" @@ -33718,6 +33874,12 @@ game ( rom ( name "Laura (USA).gbc" size 1048576 crc e2bff286 sha1 3FE3EB99EE818C94E9A07E19640AF6A2AAD33903 ) ) +game ( + name "Laura (Europe) (En,Fr,De,Es,It,Nl,Sv,Da) (Beta)" + description "Laura (Europe) (En,Fr,De,Es,It,Nl,Sv,Da) (Beta)" + rom ( name "Laura (Europe) (En,Fr,De,Es,It,Nl,Sv,Da) (Beta).gbc" size 1048576 crc f90a3dae sha1 772539821E4B703259B2E2AD535D74A03FA22760 ) +) + game ( name "Le Mans 24 Hours (Europe) (En,Fr,De,Es,It)" description "Le Mans 24 Hours (Europe) (En,Fr,De,Es,It)" @@ -34367,9 +34529,9 @@ game ( ) game ( - name "Maya the Bee & Her Friends (Europe) (En,Fr,De) (GB Compatible)" - description "Maya the Bee & Her Friends (Europe) (En,Fr,De) (GB Compatible)" - rom ( name "Maya the Bee & Her Friends (Europe) (En,Fr,De) (GB Compatible).gbc" size 1048576 crc 983b1d26 sha1 522D7F33FD39BD00F48208743FB2246EF0BD3FF1 ) + name "Max Steel - Covert Missions (USA) (En,Fr,De,Es) (Proto)" + description "Max Steel - Covert Missions (USA) (En,Fr,De,Es) (Proto)" + rom ( name "Max Steel - Covert Missions (USA) (En,Fr,De,Es) (Proto).gbc" size 1048576 crc 57b1e978 sha1 050A3F041328016C433D923B213674014546DB6E ) ) game ( @@ -34378,6 +34540,12 @@ game ( rom ( name "Maya the Bee - Garden Adventures (Europe) (En,Fr,De,Es).gbc" size 1048576 crc 142b6efb sha1 E46EA15B4C780A49E29E86516CB1EC5A03BDDDCE ) ) +game ( + name "Maya the Bee & Her Friends (Europe) (En,Fr,De) (GB Compatible)" + description "Maya the Bee & Her Friends (Europe) (En,Fr,De) (GB Compatible)" + rom ( name "Maya the Bee & Her Friends (Europe) (En,Fr,De) (GB Compatible).gbc" size 1048576 crc 983b1d26 sha1 522D7F33FD39BD00F48208743FB2246EF0BD3FF1 ) +) + game ( name "McDonald's Monogatari - Honobono Tenchou Ikusei Game (Japan)" description "McDonald's Monogatari - Honobono Tenchou Ikusei Game (Japan)" @@ -34913,9 +35081,9 @@ game ( ) game ( - name "MTV Sports - Skateboarding featuring Andy MacDonald (USA, Europe)" - description "MTV Sports - Skateboarding featuring Andy MacDonald (USA, Europe)" - rom ( name "MTV Sports - Skateboarding featuring Andy MacDonald (USA, Europe).gbc" size 1048576 crc 744561f3 sha1 91B6E99A68293D72DF74528E8077FAE58D9C33C3 ) + name "MTV Sports - Skateboarding Featuring Andy MacDonald (USA, Europe)" + description "MTV Sports - Skateboarding Featuring Andy MacDonald (USA, Europe)" + rom ( name "MTV Sports - Skateboarding Featuring Andy MacDonald (USA, Europe).gbc" size 1048576 crc 744561f3 sha1 91B6E99A68293D72DF74528E8077FAE58D9C33C3 ) ) game ( @@ -35057,9 +35225,9 @@ game ( ) game ( - name "NBA 3 on 3 featuring Kobe Bryant (USA) (SGB Enhanced) (GB Compatible)" - description "NBA 3 on 3 featuring Kobe Bryant (USA) (SGB Enhanced) (GB Compatible)" - rom ( name "NBA 3 on 3 featuring Kobe Bryant (USA) (SGB Enhanced) (GB Compatible).gbc" size 1048576 crc 001f4754 sha1 8F8D1A33A71B22C9359DDC1AAE0BD9CAD4CC7456 ) + name "NBA 3 on 3 Featuring Kobe Bryant (USA) (SGB Enhanced) (GB Compatible)" + description "NBA 3 on 3 Featuring Kobe Bryant (USA) (SGB Enhanced) (GB Compatible)" + rom ( name "NBA 3 on 3 Featuring Kobe Bryant (USA) (SGB Enhanced) (GB Compatible).gbc" size 1048576 crc 001f4754 sha1 8F8D1A33A71B22C9359DDC1AAE0BD9CAD4CC7456 ) ) game ( @@ -35290,6 +35458,12 @@ game ( rom ( name "Ojarumaru - Tsukiyo ga Ike no Takaramono (Japan) (GB Compatible).gbc" size 2097152 crc ed7461d2 sha1 66D87A06D4D951E7695DF73F53793A462509E4D0 ) ) +game ( + name "Orbital Diagnostic System (Unknown) (Unl)" + description "Orbital Diagnostic System (Unknown) (Unl)" + rom ( name "Orbital Diagnostic System (Unknown) (Unl).gbc" size 32768 crc 731c6ff4 sha1 2D4F9DC954D9485FBD7D402E07EDF42BEEBBEB8C ) +) + game ( name "Original Moorhuhn Jagd, Die (Germany)" description "Original Moorhuhn Jagd, Die (Germany)" @@ -35776,6 +35950,12 @@ game ( rom ( name "Pokemon de Panepon (Japan).gbc" size 2097152 crc 6bf7e4a6 sha1 110AE6649B4264F88D82760AD6AE4EE7F07DB9B2 ) ) +game ( + name "Pokemon Picross (Japan) (Proto)" + description "Pokemon Picross (Japan) (Proto)" + rom ( name "Pokemon Picross (Japan) (Proto).gbc" size 2097152 crc cf647f4b sha1 8204064B7149357939B57342820E7955749183B6 ) +) + game ( name "Pokemon Pinball (Europe) (En,Fr,De,Es,It) (Rumble Version) (SGB Enhanced) (GB Compatible)" description "Pokemon Pinball (Europe) (En,Fr,De,Es,It) (Rumble Version) (SGB Enhanced) (GB Compatible)" @@ -37510,6 +37690,12 @@ game ( rom ( name "Suske en Wiske - De Tijdtemmers ~ Bob et Bobette - Les Dompteurs du Temps (Europe) (Fr,Nl).gbc" size 524288 crc a4c6523d sha1 2B4B8C3A4A74FDF7ACC4138125FEA5D8F5A9A093 ) ) +game ( + name "Sutte Hakkun GB (Japan) (Proto)" + description "Sutte Hakkun GB (Japan) (Proto)" + rom ( name "Sutte Hakkun GB (Japan) (Proto).gbc" size 524288 crc e0386f84 sha1 6EFD637F039D4F3A2240640921724A69A2844CC7 ) +) + game ( name "Suzuki Alstare Extreme Racing (Europe) (En,Fr,De,Es,It,Nl)" description "Suzuki Alstare Extreme Racing (Europe) (En,Fr,De,Es,It,Nl)" diff --git a/res/patrons.txt b/res/patrons.txt index 47bdc9ab6..244976221 100644 --- a/res/patrons.txt +++ b/res/patrons.txt @@ -2,3 +2,7 @@ Miras Absar Emily A. Bellows Jaime J. Denizard Benedikt Feih +Jezzabel +NimbusFox +Petru-Sebastian Toader +Zach diff --git a/src/core/timing.c b/src/core/timing.c index ddee6d332..4ac09a5a0 100644 --- a/src/core/timing.c +++ b/src/core/timing.c @@ -100,7 +100,10 @@ int32_t mTimingTick(struct mTiming* timing, int32_t cycles) { if (timing->reroot) { timing->root = timing->reroot; timing->reroot = NULL; - *timing->nextEvent = mTimingNextEvent(timing); + *timing->nextEvent = mTimingNextEvent(timing); + if (*timing->nextEvent <= 0) { + return mTimingTick(timing, 0); + } } return *timing->nextEvent; } diff --git a/src/feature/gui/gui-runner.c b/src/feature/gui/gui-runner.c index 27746da69..302e21b28 100644 --- a/src/feature/gui/gui-runner.c +++ b/src/feature/gui/gui-runner.c @@ -623,14 +623,19 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { int frames = 0; GUIPollInput(&runner->params, 0, &keys); while (keys && frames < 30) { - ++frames; - runner->params.drawStart(); - runner->drawFrame(runner, true); - runner->params.drawEnd(); #ifdef _3DS - // XXX: Why does this fix #1294? - usleep(1000); + if (!frames) { #endif + runner->params.drawStart(); + runner->drawFrame(runner, true); + runner->params.drawEnd(); +#ifdef _3DS + } else { + // XXX: Why does this fix #1294? + usleep(15000); + } +#endif + ++frames; GUIPollInput(&runner->params, 0, &keys); } if (runner->unpaused) { diff --git a/src/feature/thread-proxy.c b/src/feature/thread-proxy.c index ac56f1b47..d2956ed95 100644 --- a/src/feature/thread-proxy.c +++ b/src/feature/thread-proxy.c @@ -60,6 +60,7 @@ void mVideoThreadProxyReset(struct mVideoLogger* logger) { ConditionWake(&proxyRenderer->toThreadCond); ConditionWait(&proxyRenderer->fromThreadCond, &proxyRenderer->mutex); } + RingFIFOClear(&proxyRenderer->dirtyQueue); MutexUnlock(&proxyRenderer->mutex); } diff --git a/src/gb/gb.c b/src/gb/gb.c index 404c660c3..c5b21b548 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -26,12 +26,13 @@ const uint32_t GB_COMPONENT_MAGIC = 0x400000; static const uint8_t _knownHeader[4] = { 0xCE, 0xED, 0x66, 0x66}; -#define DMG_BIOS_CHECKSUM 0xC2F5CC97 -#define DMG_2_BIOS_CHECKSUM 0x59C8598E +#define DMG0_BIOS_CHECKSUM 0xC2F5CC97 +#define DMG_BIOS_CHECKSUM 0x59C8598E #define MGB_BIOS_CHECKSUM 0xE6920754 #define SGB_BIOS_CHECKSUM 0xEC8A83B9 #define SGB2_BIOS_CHECKSUM 0X53D0DD63 #define CGB_BIOS_CHECKSUM 0x41884E46 +#define AGB_BIOS_CHECKSUM 0xFFD6B0F1 mLOG_DEFINE_CATEGORY(GB, "GB", "gb"); @@ -414,11 +415,12 @@ static uint32_t _GBBiosCRC32(struct VFile* vf) { bool GBIsBIOS(struct VFile* vf) { switch (_GBBiosCRC32(vf)) { case DMG_BIOS_CHECKSUM: - case DMG_2_BIOS_CHECKSUM: + case DMG0_BIOS_CHECKSUM: case MGB_BIOS_CHECKSUM: case SGB_BIOS_CHECKSUM: case SGB2_BIOS_CHECKSUM: case CGB_BIOS_CHECKSUM: + case AGB_BIOS_CHECKSUM: return true; default: return false; @@ -623,7 +625,7 @@ void GBDetectModel(struct GB* gb) { if (gb->biosVf) { switch (_GBBiosCRC32(gb->biosVf)) { case DMG_BIOS_CHECKSUM: - case DMG_2_BIOS_CHECKSUM: + case DMG0_BIOS_CHECKSUM: gb->model = GB_MODEL_DMG; break; case MGB_BIOS_CHECKSUM: @@ -638,6 +640,9 @@ void GBDetectModel(struct GB* gb) { case CGB_BIOS_CHECKSUM: gb->model = GB_MODEL_CGB; break; + case AGB_BIOS_CHECKSUM: + gb->model = GB_MODEL_AGB; + break; default: gb->biosVf->close(gb->biosVf); gb->biosVf = NULL; diff --git a/src/gb/serialize.c b/src/gb/serialize.c index ac7352a91..d3fd8f12a 100644 --- a/src/gb/serialize.c +++ b/src/gb/serialize.c @@ -172,6 +172,7 @@ bool GBDeserialize(struct GB* gb, const struct GBSerializedState* state) { gb->cpu->condition = GBSerializedCpuFlagsGetCondition(flags); gb->cpu->irqPending = GBSerializedCpuFlagsGetIrqPending(flags); gb->doubleSpeed = GBSerializedCpuFlagsGetDoubleSpeed(flags); + gb->cpu->tMultiplier = 2 - gb->doubleSpeed; gb->cpu->halted = GBSerializedCpuFlagsGetHalted(flags); gb->cpuBlocked = GBSerializedCpuFlagsGetBlocked(flags); diff --git a/src/gba/CMakeLists.txt b/src/gba/CMakeLists.txt index 5b4a52c0c..ba9c298dc 100644 --- a/src/gba/CMakeLists.txt +++ b/src/gba/CMakeLists.txt @@ -34,6 +34,7 @@ set(SOURCE_FILES video.c) set(SIO_FILES + sio/dolphin.c sio/joybus.c sio/lockstep.c) diff --git a/src/gba/audio.c b/src/gba/audio.c index b936edd1d..a8e2324b9 100644 --- a/src/gba/audio.c +++ b/src/gba/audio.c @@ -221,7 +221,27 @@ void GBAAudioWriteSOUNDBIAS(struct GBAAudio* audio, uint16_t value) { } void GBAAudioWriteWaveRAM(struct GBAAudio* audio, int address, uint32_t value) { - audio->psg.ch3.wavedata32[address | (!audio->psg.ch3.bank * 4)] = value; + int bank = !audio->psg.ch3.bank; + + // When the audio hardware is turned off, it acts like bank 0 has been + // selected in SOUND3CNT_L, so any read comes from bank 1. + if (!audio->enable) { + bank = 1; + } + + audio->psg.ch3.wavedata32[address | (bank * 4)] = value; +} + +uint32_t GBAAudioReadWaveRAM(struct GBAAudio* audio, int address) { + int bank = !audio->psg.ch3.bank; + + // When the audio hardware is turned off, it acts like bank 0 has been + // selected in SOUND3CNT_L, so any read comes from bank 1. + if (!audio->enable) { + bank = 1; + } + + return audio->psg.ch3.wavedata32[address | (bank * 4)]; } uint32_t GBAAudioWriteFIFO(struct GBAAudio* audio, int address, uint32_t value) { diff --git a/src/gba/bios.c b/src/gba/bios.c index 8dd28f197..171b09ec9 100644 --- a/src/gba/bios.c +++ b/src/gba/bios.c @@ -525,7 +525,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { break; case GBA_SWI_LZ77_UNCOMP_WRAM: case GBA_SWI_LZ77_UNCOMP_VRAM: - if (cpu->gprs[0] < BASE_WORKING_RAM) { + if (!(cpu->gprs[0] & 0x0E000000)) { mLOG(GBA_BIOS, GAME_ERROR, "Bad LZ77 source"); break; } @@ -541,7 +541,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { } break; case GBA_SWI_HUFFMAN_UNCOMP: - if (cpu->gprs[0] < BASE_WORKING_RAM) { + if (!(cpu->gprs[0] & 0x0E000000)) { mLOG(GBA_BIOS, GAME_ERROR, "Bad Huffman source"); break; } @@ -558,7 +558,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { break; case GBA_SWI_RL_UNCOMP_WRAM: case GBA_SWI_RL_UNCOMP_VRAM: - if (cpu->gprs[0] < BASE_WORKING_RAM) { + if (!(cpu->gprs[0] & 0x0E000000)) { mLOG(GBA_BIOS, GAME_ERROR, "Bad RL source"); break; } @@ -576,7 +576,7 @@ void GBASwi16(struct ARMCore* cpu, int immediate) { case GBA_SWI_DIFF_8BIT_UNFILTER_WRAM: case GBA_SWI_DIFF_8BIT_UNFILTER_VRAM: case GBA_SWI_DIFF_16BIT_UNFILTER: - if (cpu->gprs[0] < BASE_WORKING_RAM) { + if (!(cpu->gprs[0] & 0x0E000000)) { mLOG(GBA_BIOS, GAME_ERROR, "Bad UnFilter source"); break; } diff --git a/src/gba/gba.c b/src/gba/gba.c index dd7946bae..13562c9b9 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -411,6 +411,7 @@ bool GBALoadROM(struct GBA* gba, struct VFile* vf) { gba->memory.romSize = gba->pristineRomSize; } if (!gba->memory.rom) { + gba->romVf = NULL; mLOG(GBA, WARN, "Couldn't map ROM"); return false; } diff --git a/src/gba/io.c b/src/gba/io.c index 4f7a997ad..a1d356ada 100644 --- a/src/gba/io.c +++ b/src/gba/io.c @@ -342,248 +342,255 @@ void GBAIOInit(struct GBA* gba) { void GBAIOWrite(struct GBA* gba, uint32_t address, uint16_t value) { if (address < REG_SOUND1CNT_LO && (address > REG_VCOUNT || address < REG_DISPSTAT)) { - value = gba->video.renderer->writeVideoRegister(gba->video.renderer, address, value); - } else { - switch (address) { - // Video - case REG_DISPSTAT: - value &= 0xFFF8; - GBAVideoWriteDISPSTAT(&gba->video, value); - return; + gba->memory.io[address >> 1] = gba->video.renderer->writeVideoRegister(gba->video.renderer, address, value); + return; + } - case REG_VCOUNT: - mLOG(GBA_IO, GAME_ERROR, "Write to read-only I/O register: %03X", address); - return; + if (address >= REG_SOUND1CNT_LO && address <= REG_SOUNDCNT_LO && !gba->audio.enable) { + // Ignore writes to most audio registers if the hardware is off. + return; + } - // Audio - case REG_SOUND1CNT_LO: - GBAAudioWriteSOUND1CNT_LO(&gba->audio, value); - value &= 0x007F; - break; - case REG_SOUND1CNT_HI: - GBAAudioWriteSOUND1CNT_HI(&gba->audio, value); - break; - case REG_SOUND1CNT_X: - GBAAudioWriteSOUND1CNT_X(&gba->audio, value); - value &= 0x47FF; - break; - case REG_SOUND2CNT_LO: - GBAAudioWriteSOUND2CNT_LO(&gba->audio, value); - break; - case REG_SOUND2CNT_HI: - GBAAudioWriteSOUND2CNT_HI(&gba->audio, value); - value &= 0x47FF; - break; - case REG_SOUND3CNT_LO: - GBAAudioWriteSOUND3CNT_LO(&gba->audio, value); - value &= 0x00E0; - break; - case REG_SOUND3CNT_HI: - GBAAudioWriteSOUND3CNT_HI(&gba->audio, value); - value &= 0xE03F; - break; - case REG_SOUND3CNT_X: - GBAAudioWriteSOUND3CNT_X(&gba->audio, value); - // TODO: The low bits need to not be readable, but still 8-bit writable - value &= 0x47FF; - break; - case REG_SOUND4CNT_LO: - GBAAudioWriteSOUND4CNT_LO(&gba->audio, value); - value &= 0xFF3F; - break; - case REG_SOUND4CNT_HI: - GBAAudioWriteSOUND4CNT_HI(&gba->audio, value); - value &= 0x40FF; - break; - case REG_SOUNDCNT_LO: - GBAAudioWriteSOUNDCNT_LO(&gba->audio, value); - value &= 0xFF77; - break; - case REG_SOUNDCNT_HI: - GBAAudioWriteSOUNDCNT_HI(&gba->audio, value); - value &= 0x770F; - break; - case REG_SOUNDCNT_X: - GBAAudioWriteSOUNDCNT_X(&gba->audio, value); - value &= 0x0080; - value |= gba->memory.io[REG_SOUNDCNT_X >> 1] & 0xF; - break; - case REG_SOUNDBIAS: - GBAAudioWriteSOUNDBIAS(&gba->audio, value); - break; + switch (address) { + // Video + case REG_DISPSTAT: + value &= 0xFFF8; + GBAVideoWriteDISPSTAT(&gba->video, value); + return; - case REG_WAVE_RAM0_LO: - case REG_WAVE_RAM1_LO: - case REG_WAVE_RAM2_LO: - case REG_WAVE_RAM3_LO: - GBAIOWrite32(gba, address, (gba->memory.io[(address >> 1) + 1] << 16) | value); - break; + case REG_VCOUNT: + mLOG(GBA_IO, GAME_ERROR, "Write to read-only I/O register: %03X", address); + return; - case REG_WAVE_RAM0_HI: - case REG_WAVE_RAM1_HI: - case REG_WAVE_RAM2_HI: - case REG_WAVE_RAM3_HI: - GBAIOWrite32(gba, address - 2, gba->memory.io[(address >> 1) - 1] | (value << 16)); - break; + // Audio + case REG_SOUND1CNT_LO: + GBAAudioWriteSOUND1CNT_LO(&gba->audio, value); + value &= 0x007F; + break; + case REG_SOUND1CNT_HI: + GBAAudioWriteSOUND1CNT_HI(&gba->audio, value); + break; + case REG_SOUND1CNT_X: + GBAAudioWriteSOUND1CNT_X(&gba->audio, value); + value &= 0x47FF; + break; + case REG_SOUND2CNT_LO: + GBAAudioWriteSOUND2CNT_LO(&gba->audio, value); + break; + case REG_SOUND2CNT_HI: + GBAAudioWriteSOUND2CNT_HI(&gba->audio, value); + value &= 0x47FF; + break; + case REG_SOUND3CNT_LO: + GBAAudioWriteSOUND3CNT_LO(&gba->audio, value); + value &= 0x00E0; + break; + case REG_SOUND3CNT_HI: + GBAAudioWriteSOUND3CNT_HI(&gba->audio, value); + value &= 0xE03F; + break; + case REG_SOUND3CNT_X: + GBAAudioWriteSOUND3CNT_X(&gba->audio, value); + // TODO: The low bits need to not be readable, but still 8-bit writable + value &= 0x47FF; + break; + case REG_SOUND4CNT_LO: + GBAAudioWriteSOUND4CNT_LO(&gba->audio, value); + value &= 0xFF3F; + break; + case REG_SOUND4CNT_HI: + GBAAudioWriteSOUND4CNT_HI(&gba->audio, value); + value &= 0x40FF; + break; + case REG_SOUNDCNT_LO: + GBAAudioWriteSOUNDCNT_LO(&gba->audio, value); + value &= 0xFF77; + break; + case REG_SOUNDCNT_HI: + GBAAudioWriteSOUNDCNT_HI(&gba->audio, value); + value &= 0x770F; + break; + case REG_SOUNDCNT_X: + GBAAudioWriteSOUNDCNT_X(&gba->audio, value); + value &= 0x0080; + value |= gba->memory.io[REG_SOUNDCNT_X >> 1] & 0xF; + break; + case REG_SOUNDBIAS: + GBAAudioWriteSOUNDBIAS(&gba->audio, value); + break; - case REG_FIFO_A_LO: - case REG_FIFO_B_LO: - GBAIOWrite32(gba, address, (gba->memory.io[(address >> 1) + 1] << 16) | value); - return; + case REG_WAVE_RAM0_LO: + case REG_WAVE_RAM1_LO: + case REG_WAVE_RAM2_LO: + case REG_WAVE_RAM3_LO: + GBAIOWrite32(gba, address, (gba->memory.io[(address >> 1) + 1] << 16) | value); + break; - case REG_FIFO_A_HI: - case REG_FIFO_B_HI: - GBAIOWrite32(gba, address - 2, gba->memory.io[(address >> 1) - 1] | (value << 16)); - return; + case REG_WAVE_RAM0_HI: + case REG_WAVE_RAM1_HI: + case REG_WAVE_RAM2_HI: + case REG_WAVE_RAM3_HI: + GBAIOWrite32(gba, address - 2, gba->memory.io[(address >> 1) - 1] | (value << 16)); + break; - // DMA - case REG_DMA0SAD_LO: - case REG_DMA0DAD_LO: - case REG_DMA1SAD_LO: - case REG_DMA1DAD_LO: - case REG_DMA2SAD_LO: - case REG_DMA2DAD_LO: - case REG_DMA3SAD_LO: - case REG_DMA3DAD_LO: - GBAIOWrite32(gba, address, (gba->memory.io[(address >> 1) + 1] << 16) | value); - break; + case REG_FIFO_A_LO: + case REG_FIFO_B_LO: + GBAIOWrite32(gba, address, (gba->memory.io[(address >> 1) + 1] << 16) | value); + return; - case REG_DMA0SAD_HI: - case REG_DMA0DAD_HI: - case REG_DMA1SAD_HI: - case REG_DMA1DAD_HI: - case REG_DMA2SAD_HI: - case REG_DMA2DAD_HI: - case REG_DMA3SAD_HI: - case REG_DMA3DAD_HI: - GBAIOWrite32(gba, address - 2, gba->memory.io[(address >> 1) - 1] | (value << 16)); - break; + case REG_FIFO_A_HI: + case REG_FIFO_B_HI: + GBAIOWrite32(gba, address - 2, gba->memory.io[(address >> 1) - 1] | (value << 16)); + return; - case REG_DMA0CNT_LO: - GBADMAWriteCNT_LO(gba, 0, value & 0x3FFF); - break; - case REG_DMA0CNT_HI: - value = GBADMAWriteCNT_HI(gba, 0, value); - break; - case REG_DMA1CNT_LO: - GBADMAWriteCNT_LO(gba, 1, value & 0x3FFF); - break; - case REG_DMA1CNT_HI: - value = GBADMAWriteCNT_HI(gba, 1, value); - break; - case REG_DMA2CNT_LO: - GBADMAWriteCNT_LO(gba, 2, value & 0x3FFF); - break; - case REG_DMA2CNT_HI: - value = GBADMAWriteCNT_HI(gba, 2, value); - break; - case REG_DMA3CNT_LO: - GBADMAWriteCNT_LO(gba, 3, value); - break; - case REG_DMA3CNT_HI: - value = GBADMAWriteCNT_HI(gba, 3, value); - break; + // DMA + case REG_DMA0SAD_LO: + case REG_DMA0DAD_LO: + case REG_DMA1SAD_LO: + case REG_DMA1DAD_LO: + case REG_DMA2SAD_LO: + case REG_DMA2DAD_LO: + case REG_DMA3SAD_LO: + case REG_DMA3DAD_LO: + GBAIOWrite32(gba, address, (gba->memory.io[(address >> 1) + 1] << 16) | value); + break; - // Timers - case REG_TM0CNT_LO: - GBATimerWriteTMCNT_LO(&gba->timers[0], value); - return; - case REG_TM1CNT_LO: - GBATimerWriteTMCNT_LO(&gba->timers[1], value); - return; - case REG_TM2CNT_LO: - GBATimerWriteTMCNT_LO(&gba->timers[2], value); - return; - case REG_TM3CNT_LO: - GBATimerWriteTMCNT_LO(&gba->timers[3], value); - return; + case REG_DMA0SAD_HI: + case REG_DMA0DAD_HI: + case REG_DMA1SAD_HI: + case REG_DMA1DAD_HI: + case REG_DMA2SAD_HI: + case REG_DMA2DAD_HI: + case REG_DMA3SAD_HI: + case REG_DMA3DAD_HI: + GBAIOWrite32(gba, address - 2, gba->memory.io[(address >> 1) - 1] | (value << 16)); + break; - case REG_TM0CNT_HI: - value &= 0x00C7; - GBATimerWriteTMCNT_HI(&gba->timers[0], &gba->timing, &gba->memory.io[REG_TM0CNT_LO >> 1], value); - break; - case REG_TM1CNT_HI: - value &= 0x00C7; - GBATimerWriteTMCNT_HI(&gba->timers[1], &gba->timing, &gba->memory.io[REG_TM1CNT_LO >> 1], value); - break; - case REG_TM2CNT_HI: - value &= 0x00C7; - GBATimerWriteTMCNT_HI(&gba->timers[2], &gba->timing, &gba->memory.io[REG_TM2CNT_LO >> 1], value); - break; - case REG_TM3CNT_HI: - value &= 0x00C7; - GBATimerWriteTMCNT_HI(&gba->timers[3], &gba->timing, &gba->memory.io[REG_TM3CNT_LO >> 1], value); - break; + case REG_DMA0CNT_LO: + GBADMAWriteCNT_LO(gba, 0, value & 0x3FFF); + break; + case REG_DMA0CNT_HI: + value = GBADMAWriteCNT_HI(gba, 0, value); + break; + case REG_DMA1CNT_LO: + GBADMAWriteCNT_LO(gba, 1, value & 0x3FFF); + break; + case REG_DMA1CNT_HI: + value = GBADMAWriteCNT_HI(gba, 1, value); + break; + case REG_DMA2CNT_LO: + GBADMAWriteCNT_LO(gba, 2, value & 0x3FFF); + break; + case REG_DMA2CNT_HI: + value = GBADMAWriteCNT_HI(gba, 2, value); + break; + case REG_DMA3CNT_LO: + GBADMAWriteCNT_LO(gba, 3, value); + break; + case REG_DMA3CNT_HI: + value = GBADMAWriteCNT_HI(gba, 3, value); + break; - // SIO - case REG_SIOCNT: - GBASIOWriteSIOCNT(&gba->sio, value); - break; - case REG_RCNT: - value &= 0xC1FF; - GBASIOWriteRCNT(&gba->sio, value); - break; - case REG_JOY_TRANS_LO: - case REG_JOY_TRANS_HI: - gba->memory.io[REG_JOYSTAT >> 1] |= JOYSTAT_TRANS_BIT; - // Fall through - case REG_SIODATA32_LO: - case REG_SIODATA32_HI: - case REG_SIOMLT_SEND: - case REG_JOYCNT: - case REG_JOYSTAT: - case REG_JOY_RECV_LO: - case REG_JOY_RECV_HI: - value = GBASIOWriteRegister(&gba->sio, address, value); - break; + // Timers + case REG_TM0CNT_LO: + GBATimerWriteTMCNT_LO(&gba->timers[0], value); + return; + case REG_TM1CNT_LO: + GBATimerWriteTMCNT_LO(&gba->timers[1], value); + return; + case REG_TM2CNT_LO: + GBATimerWriteTMCNT_LO(&gba->timers[2], value); + return; + case REG_TM3CNT_LO: + GBATimerWriteTMCNT_LO(&gba->timers[3], value); + return; + + case REG_TM0CNT_HI: + value &= 0x00C7; + GBATimerWriteTMCNT_HI(&gba->timers[0], &gba->timing, &gba->memory.io[REG_TM0CNT_LO >> 1], value); + break; + case REG_TM1CNT_HI: + value &= 0x00C7; + GBATimerWriteTMCNT_HI(&gba->timers[1], &gba->timing, &gba->memory.io[REG_TM1CNT_LO >> 1], value); + break; + case REG_TM2CNT_HI: + value &= 0x00C7; + GBATimerWriteTMCNT_HI(&gba->timers[2], &gba->timing, &gba->memory.io[REG_TM2CNT_LO >> 1], value); + break; + case REG_TM3CNT_HI: + value &= 0x00C7; + GBATimerWriteTMCNT_HI(&gba->timers[3], &gba->timing, &gba->memory.io[REG_TM3CNT_LO >> 1], value); + break; + + // SIO + case REG_SIOCNT: + GBASIOWriteSIOCNT(&gba->sio, value); + break; + case REG_RCNT: + value &= 0xC1FF; + GBASIOWriteRCNT(&gba->sio, value); + break; + case REG_JOY_TRANS_LO: + case REG_JOY_TRANS_HI: + gba->memory.io[REG_JOYSTAT >> 1] |= JOYSTAT_TRANS; + // Fall through + case REG_SIODATA32_LO: + case REG_SIODATA32_HI: + case REG_SIOMLT_SEND: + case REG_JOYCNT: + case REG_JOYSTAT: + case REG_JOY_RECV_LO: + case REG_JOY_RECV_HI: + value = GBASIOWriteRegister(&gba->sio, address, value); + break; + + // Interrupts and misc + case REG_KEYCNT: + value &= 0xC3FF; + gba->memory.io[address >> 1] = value; + GBATestKeypadIRQ(gba); + return; + case REG_WAITCNT: + value &= 0x5FFF; + GBAAdjustWaitstates(gba, value); + break; + case REG_IE: + gba->memory.io[REG_IE >> 1] = value; + GBATestIRQ(gba, 1); + return; + case REG_IF: + value = gba->memory.io[REG_IF >> 1] & ~value; + gba->memory.io[REG_IF >> 1] = value; + GBATestIRQ(gba, 1); + return; + case REG_IME: + gba->memory.io[REG_IME >> 1] = value & 1; + GBATestIRQ(gba, 1); + return; + case REG_MAX: + // Some bad interrupt libraries will write to this + break; + case REG_DEBUG_ENABLE: + gba->debug = value == 0xC0DE; + return; + case REG_DEBUG_FLAGS: + if (gba->debug) { + GBADebug(gba, value); - // Interrupts and misc - case REG_KEYCNT: - value &= 0xC3FF; - gba->memory.io[address >> 1] = value; - GBATestKeypadIRQ(gba); return; - case REG_WAITCNT: - value &= 0x5FFF; - GBAAdjustWaitstates(gba, value); - break; - case REG_IE: - gba->memory.io[REG_IE >> 1] = value; - GBATestIRQ(gba, 1); - return; - case REG_IF: - value = gba->memory.io[REG_IF >> 1] & ~value; - gba->memory.io[REG_IF >> 1] = value; - GBATestIRQ(gba, 1); - return; - case REG_IME: - gba->memory.io[REG_IME >> 1] = value & 1; - GBATestIRQ(gba, 1); - return; - case REG_MAX: - // Some bad interrupt libraries will write to this - break; - case REG_DEBUG_ENABLE: - gba->debug = value == 0xC0DE; - return; - case REG_DEBUG_FLAGS: - if (gba->debug) { - GBADebug(gba, value); - return; - } - // Fall through - default: - if (address >= REG_DEBUG_STRING && address - REG_DEBUG_STRING < sizeof(gba->debugString)) { - STORE_16LE(value, address - REG_DEBUG_STRING, gba->debugString); - return; - } - mLOG(GBA_IO, STUB, "Stub I/O register write: %03X", address); - if (address >= REG_MAX) { - mLOG(GBA_IO, GAME_ERROR, "Write to unused I/O register: %03X", address); - return; - } - break; } + // Fall through + default: + if (address >= REG_DEBUG_STRING && address - REG_DEBUG_STRING < sizeof(gba->debugString)) { + STORE_16LE(value, address - REG_DEBUG_STRING, gba->debugString); + return; + } + mLOG(GBA_IO, STUB, "Stub I/O register write: %03X", address); + if (address >= REG_MAX) { + mLOG(GBA_IO, GAME_ERROR, "Write to unused I/O register: %03X", address); + return; + } + break; } gba->memory.io[address >> 1] = value; } @@ -616,6 +623,9 @@ void GBAIOWrite8(struct GBA* gba, uint32_t address, uint8_t value) { void GBAIOWrite32(struct GBA* gba, uint32_t address, uint32_t value) { switch (address) { + // Wave RAM can be written and read even if the audio hardware is disabled. + // However, it is not possible to switch between the two banks because it + // isn't possible to write to register SOUND3CNT_LO. case REG_WAVE_RAM0_LO: GBAAudioWriteWaveRAM(&gba->audio, 0, value); break; @@ -826,13 +836,34 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) { case REG_JOY_RECV_LO: case REG_JOY_RECV_HI: - gba->memory.io[REG_JOYSTAT >> 1] &= ~JOYSTAT_RECV_BIT; + gba->memory.io[REG_JOYSTAT >> 1] &= ~JOYSTAT_RECV; break; case REG_SOUNDBIAS: case REG_POSTFLG: mLOG(GBA_IO, STUB, "Stub I/O register read: %03x", address); break; + + // Wave RAM can be written and read even if the audio hardware is disabled. + // However, it is not possible to switch between the two banks because it + // isn't possible to write to register SOUND3CNT_LO. + case REG_WAVE_RAM0_LO: + return GBAAudioReadWaveRAM(&gba->audio, 0) & 0xFFFF; + case REG_WAVE_RAM0_HI: + return GBAAudioReadWaveRAM(&gba->audio, 0) >> 16; + case REG_WAVE_RAM1_LO: + return GBAAudioReadWaveRAM(&gba->audio, 1) & 0xFFFF; + case REG_WAVE_RAM1_HI: + return GBAAudioReadWaveRAM(&gba->audio, 1) >> 16; + case REG_WAVE_RAM2_LO: + return GBAAudioReadWaveRAM(&gba->audio, 2) & 0xFFFF; + case REG_WAVE_RAM2_HI: + return GBAAudioReadWaveRAM(&gba->audio, 2) >> 16; + case REG_WAVE_RAM3_LO: + return GBAAudioReadWaveRAM(&gba->audio, 3) & 0xFFFF; + case REG_WAVE_RAM3_HI: + return GBAAudioReadWaveRAM(&gba->audio, 3) >> 16; + case REG_SOUND1CNT_LO: case REG_SOUND1CNT_HI: case REG_SOUND1CNT_X: @@ -863,14 +894,6 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) { case REG_BLDALPHA: case REG_SOUNDCNT_HI: case REG_SOUNDCNT_X: - case REG_WAVE_RAM0_LO: - case REG_WAVE_RAM0_HI: - case REG_WAVE_RAM1_LO: - case REG_WAVE_RAM1_HI: - case REG_WAVE_RAM2_LO: - case REG_WAVE_RAM2_HI: - case REG_WAVE_RAM3_LO: - case REG_WAVE_RAM3_HI: case REG_DMA0CNT_HI: case REG_DMA1CNT_HI: case REG_DMA2CNT_HI: diff --git a/src/gba/memory.c b/src/gba/memory.c index 7752bc311..c0863befc 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -345,7 +345,7 @@ static void GBASetActiveRegion(struct ARMCore* cpu, uint32_t address) { cpu->memory.activeSeqCycles16 = memory->waitstatesSeq16[memory->activeRegion]; cpu->memory.activeNonseqCycles32 = memory->waitstatesNonseq32[memory->activeRegion]; cpu->memory.activeNonseqCycles16 = memory->waitstatesNonseq16[memory->activeRegion]; - cpu->memory.activeMask &= -(cpu->executionMode == MODE_THUMB ? WORD_SIZE_THUMB : WORD_SIZE_ARM); + cpu->memory.activeMask &= -(cpu->cpsr.t ? WORD_SIZE_THUMB : WORD_SIZE_ARM); } #define LOAD_BAD \ diff --git a/src/gba/overrides.c b/src/gba/overrides.c index 1f76fd03b..bb88e57e6 100644 --- a/src/gba/overrides.c +++ b/src/gba/overrides.c @@ -375,8 +375,30 @@ void GBAOverrideApplyDefaults(struct GBA* gba, const struct Configuration* overr if (cart) { memcpy(override.id, &cart->id, sizeof(override.id)); - if (!strncmp("pokemon red version", &((const char*) gba->memory.rom)[0x108], 20) && gba->romCrc32 != 0xDD88761C) { - // Enable FLASH1M and RTC on Pokémon FireRed ROM hacks + static const uint32_t pokemonTable[] = { + // FireRed + 0x1A81EEDF, // BPRD + 0x3B2056E9, // BPRJ + 0x5DC668F6, // BPRF + 0x73A72167, // BPRI + 0x84EE4776, // BPRE rev 1 + 0x9F08064E, // BPRS + 0xBB640DF7, // BPRJ rev 1 + 0xDD88761C, // BPRE + }; + + bool isPokemon = false; + isPokemon = isPokemon || !strncmp("pokemon red version", &((const char*) gba->memory.rom)[0x108], 20); + bool isKnownPokemon = false; + if (isPokemon) { + size_t i; + for (i = 0; !isKnownPokemon && i < sizeof(pokemonTable) / sizeof(*pokemonTable); ++i) { + isKnownPokemon = gba->romCrc32 == pokemonTable[i]; + } + } + + if (isPokemon && !isKnownPokemon) { + // Enable FLASH1M and RTC on Pokémon ROM hacks override.savetype = SAVEDATA_FLASH1M; override.hardware = HW_RTC; override.vbaBugCompat = true; diff --git a/src/gba/renderers/gl.c b/src/gba/renderers/gl.c index ef6f5c897..59a559bf2 100644 --- a/src/gba/renderers/gl.c +++ b/src/gba/renderers/gl.c @@ -1824,7 +1824,7 @@ void _prepareBackground(struct GBAVideoGLRenderer* renderer, struct GBAVideoGLBa glUniform1i(uniforms[GBA_GL_BG_VRAM], 0); glUniform1i(uniforms[GBA_GL_OBJ_PALETTE], 1); if (background->mosaic) { - glUniform2i(uniforms[GBA_GL_BG_MOSAIC], GBAMosaicControlGetBgV(renderer->mosaic) + 1, GBAMosaicControlGetBgH(renderer->mosaic) + 1); + glUniform2i(uniforms[GBA_GL_BG_MOSAIC], GBAMosaicControlGetBgH(renderer->mosaic) + 1, GBAMosaicControlGetBgV(renderer->mosaic) + 1); } else { glUniform2i(uniforms[GBA_GL_BG_MOSAIC], 0, 0); } diff --git a/src/gba/sio.c b/src/gba/sio.c index a153cb1fa..84f4962ed 100644 --- a/src/gba/sio.c +++ b/src/gba/sio.c @@ -31,6 +31,23 @@ static struct GBASIODriver* _lookupDriver(struct GBASIO* sio, enum GBASIOMode mo } } +static const char* _modeName(enum GBASIOMode mode) { + switch (mode) { + case SIO_NORMAL_8: + return "NORMAL8"; + case SIO_NORMAL_32: + return "NORMAL32"; + case SIO_MULTI: + return "MULTI"; + case SIO_JOYBUS: + return "JOYBUS"; + case SIO_GPIO: + return "GPIO"; + default: + return "(unknown)"; + } +} + static void _switchMode(struct GBASIO* sio) { unsigned mode = ((sio->rcnt & 0xC000) | (sio->siocnt & 0x3000)) >> 12; enum GBASIOMode newMode; @@ -43,6 +60,7 @@ static void _switchMode(struct GBASIO* sio) { if (sio->activeDriver && sio->activeDriver->unload) { sio->activeDriver->unload(sio->activeDriver); } + mLOG(GBA_SIO, DEBUG, "Switching mode from %s to %s", _modeName(sio->mode), _modeName(newMode)); sio->mode = newMode; sio->activeDriver = _lookupDriver(sio, sio->mode); if (sio->activeDriver && sio->activeDriver->load) { @@ -182,5 +200,19 @@ uint16_t GBASIOWriteRegister(struct GBASIO* sio, uint32_t address, uint16_t valu if (sio->activeDriver && sio->activeDriver->writeRegister) { return sio->activeDriver->writeRegister(sio->activeDriver, address, value); } + // Dummy drivers + switch (sio->mode) { + case SIO_JOYBUS: + switch (address) { + case REG_JOYCNT: + return (value & 0x0040) | (sio->p->memory.io[REG_JOYCNT >> 1] & ~(value & 0x7) & ~0x0040); + case REG_JOYSTAT: + return (value & 0x0030) | (sio->p->memory.io[REG_JOYSTAT >> 1] & ~0x30); + } + break; + default: + // TODO + break; + } return value; } diff --git a/src/gba/sio/dolphin.c b/src/gba/sio/dolphin.c new file mode 100644 index 000000000..896d17d3e --- /dev/null +++ b/src/gba/sio/dolphin.c @@ -0,0 +1,206 @@ +/* Copyright (c) 2013-2017 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 + +#define BITS_PER_SECOND 115200 // This is wrong, but we need to maintain compat for the time being +#define CYCLES_PER_BIT (GBA_ARM7TDMI_FREQUENCY / BITS_PER_SECOND) +#define CLOCK_GRAIN (CYCLES_PER_BIT * 8) +#define CLOCK_WAIT 500 + +const uint16_t DOLPHIN_CLOCK_PORT = 49420; +const uint16_t DOLPHIN_DATA_PORT = 54970; + +enum { + WAIT_FOR_FIRST_CLOCK = 0, + WAIT_FOR_CLOCK, + WAIT_FOR_COMMAND, +}; + +static bool GBASIODolphinInit(struct GBASIODriver* driver); +static bool GBASIODolphinLoad(struct GBASIODriver* driver); +static bool GBASIODolphinUnload(struct GBASIODriver* driver); +static void GBASIODolphinProcessEvents(struct mTiming* timing, void* context, uint32_t cyclesLate); + +static int32_t _processCommand(struct GBASIODolphin* dol, uint32_t cyclesLate); +static void _flush(struct GBASIODolphin* dol); + +void GBASIODolphinCreate(struct GBASIODolphin* dol) { + GBASIOJOYCreate(&dol->d); + dol->d.init = GBASIODolphinInit; + dol->d.load = GBASIODolphinLoad; + dol->d.unload = GBASIODolphinUnload; + dol->event.context = dol; + dol->event.name = "GB SIO Lockstep"; + dol->event.callback = GBASIODolphinProcessEvents; + dol->event.priority = 0x80; + + dol->data = INVALID_SOCKET; + dol->clock = INVALID_SOCKET; + dol->active = false; +} + +void GBASIODolphinDestroy(struct GBASIODolphin* dol) { + if (!SOCKET_FAILED(dol->data)) { + SocketClose(dol->data); + dol->data = INVALID_SOCKET; + } + + if (!SOCKET_FAILED(dol->clock)) { + SocketClose(dol->clock); + dol->clock = INVALID_SOCKET; + } +} + +bool GBASIODolphinConnect(struct GBASIODolphin* dol, const struct Address* address, short dataPort, short clockPort) { + if (!SOCKET_FAILED(dol->data)) { + SocketClose(dol->data); + dol->data = INVALID_SOCKET; + } + if (!dataPort) { + dataPort = DOLPHIN_DATA_PORT; + } + + if (!SOCKET_FAILED(dol->clock)) { + SocketClose(dol->clock); + dol->clock = INVALID_SOCKET; + } + if (!clockPort) { + clockPort = DOLPHIN_CLOCK_PORT; + } + + dol->data = SocketConnectTCP(dataPort, address); + if (SOCKET_FAILED(dol->data)) { + return false; + } + + dol->clock = SocketConnectTCP(clockPort, address); + if (SOCKET_FAILED(dol->clock)) { + SocketClose(dol->data); + dol->data = INVALID_SOCKET; + return false; + } + + SocketSetBlocking(dol->data, false); + SocketSetBlocking(dol->clock, false); + SocketSetTCPPush(dol->data, true); + return true; +} + +static bool GBASIODolphinInit(struct GBASIODriver* driver) { + struct GBASIODolphin* dol = (struct GBASIODolphin*) driver; + dol->active = false; + dol->clockSlice = 0; + dol->state = WAIT_FOR_FIRST_CLOCK; + _flush(dol); + return true; +} + +static bool GBASIODolphinLoad(struct GBASIODriver* driver) { + struct GBASIODolphin* dol = (struct GBASIODolphin*) driver; + dol->active = true; + _flush(dol); + mTimingDeschedule(&dol->d.p->p->timing, &dol->event); + mTimingSchedule(&dol->d.p->p->timing, &dol->event, 0); + return true; +} + +static bool GBASIODolphinUnload(struct GBASIODriver* driver) { + struct GBASIODolphin* dol = (struct GBASIODolphin*) driver; + dol->active = false; + return true; +} + +void GBASIODolphinProcessEvents(struct mTiming* timing, void* context, uint32_t cyclesLate) { + struct GBASIODolphin* dol = context; + if (SOCKET_FAILED(dol->data)) { + return; + } + + dol->clockSlice -= cyclesLate; + + int32_t clockSlice; + + int32_t nextEvent = CLOCK_GRAIN; + switch (dol->state) { + case WAIT_FOR_FIRST_CLOCK: + dol->clockSlice = 0; + // Fall through + case WAIT_FOR_CLOCK: + if (dol->clockSlice < 0) { + Socket r = dol->clock; + SocketPoll(1, &r, 0, 0, CLOCK_WAIT); + } + if (SocketRecv(dol->clock, &clockSlice, 4) == 4) { + clockSlice = ntohl(clockSlice); + dol->clockSlice += clockSlice; + dol->state = WAIT_FOR_COMMAND; + nextEvent = 0; + } + // Fall through + case WAIT_FOR_COMMAND: + if (dol->clockSlice < -VIDEO_TOTAL_LENGTH * 4) { + Socket r = dol->data; + SocketPoll(1, &r, 0, 0, CLOCK_WAIT); + } + if (_processCommand(dol, cyclesLate) >= 0) { + dol->state = WAIT_FOR_CLOCK; + nextEvent = CLOCK_GRAIN; + } + break; + } + + dol->clockSlice -= nextEvent; + mTimingSchedule(timing, &dol->event, nextEvent); +} + +void _flush(struct GBASIODolphin* dol) { + uint8_t buffer[32]; + while (SocketRecv(dol->clock, buffer, sizeof(buffer)) == sizeof(buffer)); + while (SocketRecv(dol->data, buffer, sizeof(buffer)) == sizeof(buffer)); +} + +int32_t _processCommand(struct GBASIODolphin* dol, uint32_t cyclesLate) { + // This does not include the stop bits due to compatibility reasons + int bitsOnLine = 8; + uint8_t buffer[6]; + int gotten = SocketRecv(dol->data, buffer, 1); + if (gotten < 1) { + return -1; + } + + switch (buffer[0]) { + case JOY_RESET: + case JOY_POLL: + bitsOnLine += 24; + break; + case JOY_RECV: + gotten = SocketRecv(dol->data, &buffer[1], 4); + if (gotten < 4) { + return -1; + } + mLOG(GBA_SIO, DEBUG, "DOL recv: %02X%02X%02X%02X", buffer[1], buffer[2], buffer[3], buffer[4]); + // Fall through + case JOY_TRANS: + bitsOnLine += 40; + break; + } + + if (!dol->active) { + return 0; + } + + int sent = GBASIOJOYSendCommand(&dol->d, buffer[0], &buffer[1]); + SocketSend(dol->data, &buffer[1], sent); + + return bitsOnLine * CYCLES_PER_BIT - cyclesLate; +} + +bool GBASIODolphinIsConnected(struct GBASIODolphin* dol) { + return dol->data != INVALID_SOCKET; +} diff --git a/src/gba/sio/joybus.c b/src/gba/sio/joybus.c index 8d6fc2d77..6cfca878f 100644 --- a/src/gba/sio/joybus.c +++ b/src/gba/sio/joybus.c @@ -21,12 +21,21 @@ void GBASIOJOYCreate(struct GBASIODriver* sio) { uint16_t GBASIOJOYWriteRegister(struct GBASIODriver* sio, uint32_t address, uint16_t value) { switch (address) { case REG_JOYCNT: + mLOG(GBA_SIO, DEBUG, "JOY write: CNT <- %04X", value); return (value & 0x0040) | (sio->p->p->memory.io[REG_JOYCNT >> 1] & ~(value & 0x7) & ~0x0040); case REG_JOYSTAT: + mLOG(GBA_SIO, DEBUG, "JOY write: STAT <- %04X", value); return (value & 0x0030) | (sio->p->p->memory.io[REG_JOYSTAT >> 1] & ~0x30); case REG_JOY_TRANS_LO: + mLOG(GBA_SIO, DEBUG, "JOY write: TRANS_LO <- %04X", value); + break; case REG_JOY_TRANS_HI: - sio->p->p->memory.io[REG_JOYSTAT >> 1] |= 8; + mLOG(GBA_SIO, DEBUG, "JOY write: TRANS_HI <- %04X", value); + break; + default: + mLOG(GBA_SIO, DEBUG, "JOY write: Unknown reg %03X <- %04X", address, value); + // Fall through + case REG_RCNT: break; } return value; @@ -35,7 +44,7 @@ uint16_t GBASIOJOYWriteRegister(struct GBASIODriver* sio, uint32_t address, uint int GBASIOJOYSendCommand(struct GBASIODriver* sio, enum GBASIOJOYCommand command, uint8_t* data) { switch (command) { case JOY_RESET: - sio->p->p->memory.io[REG_JOYCNT >> 1] |= 1; + sio->p->p->memory.io[REG_JOYCNT >> 1] |= JOYCNT_RESET; if (sio->p->p->memory.io[REG_JOYCNT >> 1] & 0x40) { GBARaiseIRQ(sio->p->p, IRQ_SIO, 0); } @@ -44,29 +53,36 @@ int GBASIOJOYSendCommand(struct GBASIODriver* sio, enum GBASIOJOYCommand command data[0] = 0x00; data[1] = 0x04; data[2] = sio->p->p->memory.io[REG_JOYSTAT >> 1]; + + mLOG(GBA_SIO, DEBUG, "JOY %s: %02X (%02X)", command == JOY_POLL ? "poll" : "reset", data[2], sio->p->p->memory.io[REG_JOYCNT >> 1]); return 3; case JOY_RECV: - sio->p->p->memory.io[REG_JOYCNT >> 1] |= 2; - sio->p->p->memory.io[REG_JOYSTAT >> 1] |= 2; + sio->p->p->memory.io[REG_JOYCNT >> 1] |= JOYCNT_RECV; + sio->p->p->memory.io[REG_JOYSTAT >> 1] |= JOYSTAT_RECV; sio->p->p->memory.io[REG_JOY_RECV_LO >> 1] = data[0] | (data[1] << 8); sio->p->p->memory.io[REG_JOY_RECV_HI >> 1] = data[2] | (data[3] << 8); data[0] = sio->p->p->memory.io[REG_JOYSTAT >> 1]; + mLOG(GBA_SIO, DEBUG, "JOY recv: %02X (%02X)", data[0], sio->p->p->memory.io[REG_JOYCNT >> 1]); + if (sio->p->p->memory.io[REG_JOYCNT >> 1] & 0x40) { GBARaiseIRQ(sio->p->p, IRQ_SIO, 0); } return 1; case JOY_TRANS: - sio->p->p->memory.io[REG_JOYCNT >> 1] |= 4; - sio->p->p->memory.io[REG_JOYSTAT >> 1] &= ~8; data[0] = sio->p->p->memory.io[REG_JOY_TRANS_LO >> 1]; data[1] = sio->p->p->memory.io[REG_JOY_TRANS_LO >> 1] >> 8; data[2] = sio->p->p->memory.io[REG_JOY_TRANS_HI >> 1]; data[3] = sio->p->p->memory.io[REG_JOY_TRANS_HI >> 1] >> 8; data[4] = sio->p->p->memory.io[REG_JOYSTAT >> 1]; + sio->p->p->memory.io[REG_JOYCNT >> 1] |= JOYCNT_TRANS; + sio->p->p->memory.io[REG_JOYSTAT >> 1] &= ~JOYSTAT_TRANS; + + mLOG(GBA_SIO, DEBUG, "JOY trans: %02X%02X%02X%02X:%02X (%02X)", data[0], data[1], data[2], data[3], data[4], sio->p->p->memory.io[REG_JOYCNT >> 1]); + if (sio->p->p->memory.io[REG_JOYCNT >> 1] & 0x40) { GBARaiseIRQ(sio->p->p, IRQ_SIO, 0); } diff --git a/src/platform/3ds/gui-font.c b/src/platform/3ds/gui-font.c index 7d073c709..668c7382d 100644 --- a/src/platform/3ds/gui-font.c +++ b/src/platform/3ds/gui-font.c @@ -89,7 +89,7 @@ void GUIFontIconMetrics(const struct GUIFont* font, enum GUIIcon icon, unsigned* } } -void GUIFontDrawGlyph(const struct GUIFont* font, int glyph_x, int glyph_y, uint32_t color, uint32_t glyph) { +void GUIFontDrawGlyph(struct GUIFont* font, int glyph_x, int glyph_y, uint32_t color, uint32_t glyph) { int index = fontGlyphIndexFromCodePoint(font->font, glyph); fontGlyphPos_s data; fontCalcGlyphPos(&data, font->font, index, 0, 1.0, 1.0); @@ -109,7 +109,7 @@ void GUIFontDrawGlyph(const struct GUIFont* font, int glyph_x, int glyph_y, uint u, v, tex->width * width, tex->height * height, 0); } -void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIcon(struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { ctrActivateTexture(&font->icons); if (icon >= GUI_ICON_MAX) { @@ -159,7 +159,7 @@ void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment } } -void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIconSize(struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { ctrActivateTexture(&font->icons); if (icon >= GUI_ICON_MAX) { diff --git a/src/platform/3ds/main.c b/src/platform/3ds/main.c index df8bb68f8..cf11de8fc 100644 --- a/src/platform/3ds/main.c +++ b/src/platform/3ds/main.c @@ -301,7 +301,7 @@ static void _setup(struct mGUIRunner* runner) { _map3DSKey(&runner->core->inputMap, KEY_L, GBA_KEY_L); _map3DSKey(&runner->core->inputMap, KEY_R, GBA_KEY_R); - outputBuffer = linearMemAlign(256 * 224 * sizeof(color_t), 0x80); + memset(outputBuffer, 0, 256 * 224 * sizeof(color_t)); runner->core->setVideoBuffer(runner->core, outputBuffer, 256); unsigned mode; @@ -883,6 +883,7 @@ int main() { _cleanup(); return 1; } + outputBuffer = linearMemAlign(256 * 224 * sizeof(color_t), 0x80); struct mGUIRunner runner = { .params = { diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index cfd623bc7..aa7c579e9 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -64,6 +64,7 @@ static size_t dataSize; static void* savedata; static struct mAVStream stream; static bool sensorsInitDone; +static bool rumbleInitDone; static int rumbleUp; static int rumbleDown; static struct mRumble rumble; @@ -118,6 +119,19 @@ static void _initSensors(void) { sensorsInitDone = true; } +static void _initRumble(void) { + if (rumbleInitDone) { + return; + } + + struct retro_rumble_interface rumbleInterface; + if (environCallback(RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE, &rumbleInterface)) { + rumbleCallback = rumbleInterface.set_rumble_state; + } + + rumbleInitDone = true; +} + static void _reloadSettings(void) { struct mCoreOptions opts = { .useBios = true, @@ -310,13 +324,9 @@ void retro_init(void) { // TODO: RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME when BIOS booting is supported - struct retro_rumble_interface rumbleInterface; - if (environCallback(RETRO_ENVIRONMENT_GET_RUMBLE_INTERFACE, &rumbleInterface)) { - rumbleCallback = rumbleInterface.set_rumble_state; - rumble.setRumble = _setRumble; - } else { - rumbleCallback = 0; - } + rumbleInitDone = false; + rumble.setRumble = _setRumble; + rumbleCallback = 0; sensorsInitDone = false; sensorGetCallback = 0; @@ -1002,6 +1012,9 @@ static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* rig static void _setRumble(struct mRumble* rumble, int enable) { UNUSED(rumble); + if (!rumbleInitDone) { + _initRumble(); + } if (!rumbleCallback) { return; } diff --git a/src/platform/psp2/gui-font.c b/src/platform/psp2/gui-font.c index f0296d541..1a2d16636 100644 --- a/src/platform/psp2/gui-font.c +++ b/src/platform/psp2/gui-font.c @@ -65,13 +65,13 @@ void GUIFontIconMetrics(const struct GUIFont* font, enum GUIIcon icon, unsigned* } } -void GUIFontDrawGlyph(const struct GUIFont* font, int x, int y, uint32_t color, uint32_t glyph) { +void GUIFontDrawGlyph(struct GUIFont* font, int x, int y, uint32_t color, uint32_t glyph) { char base[5] = { 0 }; toUtf8(glyph, base); vita2d_pgf_draw_text(font->pgf, x, y, color, FONT_SIZE, base); } -void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIcon(struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { if (icon >= GUI_ICON_MAX) { return; } @@ -117,7 +117,7 @@ void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment } } -void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIconSize(struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { if (icon >= GUI_ICON_MAX) { return; } diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 8641ed557..a8b688596 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -130,6 +130,7 @@ set(UI_FILES BattleChipView.ui CheatsView.ui DebuggerConsole.ui + DolphinConnector.ui FrameView.ui GIFView.ui IOViewer.ui @@ -158,6 +159,7 @@ set(GBA_SRC BattleChipModel.cpp BattleChipUpdater.cpp BattleChipView.cpp + DolphinConnector.cpp GBAOverride.cpp) set(GB_SRC diff --git a/src/platform/qt/CoreController.cpp b/src/platform/qt/CoreController.cpp index d44c23389..4e0af7adf 100644 --- a/src/platform/qt/CoreController.cpp +++ b/src/platform/qt/CoreController.cpp @@ -42,6 +42,10 @@ CoreController::CoreController(mCore* core, QObject* parent) m_threadContext.userData = this; updateROMInfo(); +#ifdef M_CORE_GBA + GBASIODolphinCreate(&m_dolphin); +#endif + m_resetActions.append([this]() { if (m_autoload) { mCoreLoadState(m_threadContext.core, 0, m_loadStateFlags); @@ -113,6 +117,9 @@ CoreController::CoreController(mCore* core, QObject* parent) } controller->clearMultiplayerController(); +#ifdef M_CORE_GBA + controller->detachDolphin(); +#endif QMetaObject::invokeMethod(controller, "stopping"); }; @@ -361,6 +368,28 @@ mCacheSet* CoreController::graphicCaches() { return m_cacheSet.get(); } +#ifdef M_CORE_GBA +bool CoreController::attachDolphin(const Address& address) { + if (platform() != mPLATFORM_GBA) { + return false; + } + if (GBASIODolphinConnect(&m_dolphin, &address, 0, 0)) { + GBA* gba = static_cast(m_threadContext.core->board); + GBASIOSetDriver(&gba->sio, &m_dolphin.d, SIO_JOYBUS); + return true; + } + return false; +} + +void CoreController::detachDolphin() { + if (platform() == mPLATFORM_GBA) { + GBA* gba = static_cast(m_threadContext.core->board); + GBASIOSetDriver(&gba->sio, nullptr, SIO_JOYBUS); + } + GBASIODolphinDestroy(&m_dolphin); +} +#endif + void CoreController::setOverride(std::unique_ptr override) { Interrupter interrupter(this); m_override = std::move(override); @@ -691,6 +720,7 @@ void CoreController::loadPatch(const QString& patchPath) { updateROMInfo(); } if (mCoreThreadHasStarted(&m_threadContext)) { + interrupter.resume(); reset(); } } diff --git a/src/platform/qt/CoreController.h b/src/platform/qt/CoreController.h index 11bc34ed9..32ae30b90 100644 --- a/src/platform/qt/CoreController.h +++ b/src/platform/qt/CoreController.h @@ -25,6 +25,9 @@ #ifdef M_CORE_GB #include #endif +#ifdef M_CORE_GBA +#include +#endif #ifdef M_CORE_GBA #include @@ -106,6 +109,10 @@ public: void clearMultiplayerController(); MultiplayerController* multiplayerController() { return m_multiplayer; } +#ifdef M_CORE_GBA + bool isDolphinConnected() const { return !SOCKET_FAILED(m_dolphin.data); } +#endif + mCacheSet* graphicCaches(); int stateSlot() const { return m_stateSlot; } @@ -171,6 +178,9 @@ public slots: void detachBattleChipGate(); void setBattleChipId(uint16_t id); void setBattleChipFlavor(int flavor); + + bool attachDolphin(const Address& address); + void detachDolphin(); #endif void setAVStream(mAVStream*); @@ -265,6 +275,9 @@ private: InputController* m_inputController = nullptr; LogController* m_log = nullptr; MultiplayerController* m_multiplayer = nullptr; +#ifdef M_CORE_GBA + GBASIODolphin m_dolphin; +#endif mVideoLogContext* m_vl = nullptr; VFile* m_vlVf = nullptr; diff --git a/src/platform/qt/DisplayGL.cpp b/src/platform/qt/DisplayGL.cpp index cddcdd136..207d791ae 100644 --- a/src/platform/qt/DisplayGL.cpp +++ b/src/platform/qt/DisplayGL.cpp @@ -7,8 +7,6 @@ #if defined(BUILD_GL) || defined(BUILD_GLES2) -#include "CoreController.h" - #include #include #include @@ -106,6 +104,7 @@ void DisplayGL::startDrawing(std::shared_ptr controller) { #else messagePainter()->resize(size(), isAspectRatioLocked(), devicePixelRatio()); #endif + CoreController::Interrupter interrupter(controller); QMetaObject::invokeMethod(m_painter.get(), "start"); setUpdatesEnabled(false); } @@ -226,12 +225,13 @@ void DisplayGL::clearShaders() { } void DisplayGL::resizeContext() { + m_painter->interrupt(); QMetaObject::invokeMethod(m_painter.get(), "resizeContext"); } void DisplayGL::setVideoScale(int scale) { if (m_context) { - CoreController::Interrupter interrupter(m_context); + m_painter->interrupt(); mCoreConfigSetIntValue(&m_context->thread()->core->config, "videoScale", scale); } QMetaObject::invokeMethod(m_painter.get(), "resizeContext"); @@ -365,10 +365,10 @@ void PainterGL::resizeContext() { } if (m_started) { - CoreController::Interrupter interrupter(m_context); mCore* core = m_context->thread()->core; core->reloadConfigOption(core, "videoScale", NULL); } + m_interrupter.resume(); QSize size = m_context->screenDimensions(); m_backend->setDimensions(m_backend, size.width(), size.height()); @@ -577,6 +577,10 @@ void PainterGL::setVideoProxy(std::shared_ptr proxy) { m_videoProxy = proxy; } +void PainterGL::interrupt() { + m_interrupter.interrupt(m_context); +} + void PainterGL::setShaders(struct VDir* dir) { if (!supportsShaders()) { return; diff --git a/src/platform/qt/DisplayGL.h b/src/platform/qt/DisplayGL.h index a5243a97a..a9ec10945 100644 --- a/src/platform/qt/DisplayGL.h +++ b/src/platform/qt/DisplayGL.h @@ -29,6 +29,7 @@ #include +#include "CoreController.h" #include "VideoProxy.h" #include "platform/video-backend.h" @@ -102,6 +103,7 @@ public: bool supportsShaders() const { return m_supportsShaders; } void setVideoProxy(std::shared_ptr); + void interrupt(); public slots: void create(); @@ -149,7 +151,8 @@ private: std::unique_ptr m_gl; bool m_active = false; bool m_started = false; - std::shared_ptr m_context = nullptr; + std::shared_ptr m_context; + CoreController::Interrupter m_interrupter; bool m_supportsShaders; bool m_showOSD; VideoShader m_shader{}; diff --git a/src/platform/qt/DolphinConnector.cpp b/src/platform/qt/DolphinConnector.cpp new file mode 100644 index 000000000..b1eec9dfc --- /dev/null +++ b/src/platform/qt/DolphinConnector.cpp @@ -0,0 +1,83 @@ +/* Copyright (c) 2013-2021 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 "DolphinConnector.h" + +#include + +#include "CoreController.h" +#include "Window.h" +#include "utils.h" + +using namespace QGBA; + +DolphinConnector::DolphinConnector(Window* window, QWidget* parent) + : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) + , m_window(window) +{ + m_ui.setupUi(this); + + connect(window, &QObject::destroyed, this, &QWidget::close); + connect(m_ui.connect, &QAbstractButton::clicked, this, &DolphinConnector::attach); + connect(m_ui.disconnect, &QAbstractButton::clicked, this, &DolphinConnector::detach); + + updateAttached(); +} + +void DolphinConnector::attach() { + QHostAddress qaddress; + Address address; + if (m_ui.specLocal->isChecked()) { + qaddress.setAddress("127.0.0.1"); + } else if (m_ui.specIPAddr->isChecked()) { + if (!qaddress.setAddress(m_ui.ipAddr->text())) { + return; + } + + } + bool reset = m_ui.doReset->isChecked(); + if (!m_window->controller()) { + m_window->bootBIOS(); + reset = false; + if (!m_window->controller() || m_window->controller()->platform() != mPLATFORM_GBA) { + return; + } + } + + convertAddress(&qaddress, &address); + m_controller = m_window->controller(); + CoreController::Interrupter interrupter(m_controller); + m_controller->attachDolphin(address); + connect(m_controller.get(), &CoreController::stopping, this, &DolphinConnector::detach); + interrupter.resume(); + + if (!m_controller->isDolphinConnected()) { + QMessageBox* fail = new QMessageBox(QMessageBox::Warning, tr("Couldn't Connect"), + tr("Could not connect to Dolphin."), + QMessageBox::Ok); + fail->setAttribute(Qt::WA_DeleteOnClose); + fail->show(); + } else if (reset) { + m_controller->reset(); + } + + updateAttached(); +} + +void DolphinConnector::detach() { + if (m_controller) { + m_controller->detachDolphin(); + m_controller.reset(); + } + updateAttached(); +} + +void DolphinConnector::updateAttached() { + bool attached = m_window->controller() && m_window->controller()->isDolphinConnected(); + m_ui.connect->setDisabled(attached); + m_ui.disconnect->setEnabled(attached); + m_ui.specLocal->setDisabled(attached); + m_ui.specIPAddr->setDisabled(attached); +} diff --git a/src/platform/qt/DolphinConnector.h b/src/platform/qt/DolphinConnector.h new file mode 100644 index 000000000..796b496ee --- /dev/null +++ b/src/platform/qt/DolphinConnector.h @@ -0,0 +1,37 @@ +/* Copyright (c) 2013-2021 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/. */ +#pragma once + +#include "ui_DolphinConnector.h" + +#include + +namespace QGBA { + +class CoreController; +class Window; + +class DolphinConnector : public QDialog { +Q_OBJECT + +public: + DolphinConnector(Window* window, QWidget* parent = nullptr); + +public slots: + void attach(); + void detach(); + +private slots: + void updateAttached(); + +private: + Ui::DolphinConnector m_ui; + + std::shared_ptr m_controller; + Window* m_window; +}; + +} diff --git a/src/platform/qt/DolphinConnector.ui b/src/platform/qt/DolphinConnector.ui new file mode 100644 index 000000000..6ec28fdc9 --- /dev/null +++ b/src/platform/qt/DolphinConnector.ui @@ -0,0 +1,134 @@ + + + DolphinConnector + + + + 0 + 0 + 306 + 123 + + + + Connect to Dolphin + + + + QLayout::SetFixedSize + + + + + Local computer + + + true + + + buttonGroup + + + + + + + IP address + + + buttonGroup + + + + + + + false + + + + + + + + + Connect + + + + + + + + + + false + + + Disconnect + + + + + + + + + + Close + + + + + + + + + + + + Reset on connect + + + + + + + + + close + clicked() + DolphinConnector + close() + + + 256 + 119 + + + 152 + 72 + + + + + specIPAddr + toggled(bool) + ipAddr + setEnabled(bool) + + + 152 + 43 + + + 152 + 49 + + + + + + + + diff --git a/src/platform/qt/OverrideView.cpp b/src/platform/qt/OverrideView.cpp index 9b168f49b..375e2b360 100644 --- a/src/platform/qt/OverrideView.cpp +++ b/src/platform/qt/OverrideView.cpp @@ -134,9 +134,10 @@ void OverrideView::updateOverrides() { if (!m_controller) { return; } + bool hasOverride = false; #ifdef M_CORE_GBA if (m_ui.tabWidget->currentWidget() == m_ui.tabGBA) { - std::unique_ptr gba(new GBAOverride); + auto gba = std::make_unique(); memset(gba->override.id, 0, 4); gba->override.savetype = static_cast(m_ui.savetype->currentIndex() - 1); gba->override.hardware = HW_NO_OVERRIDE; @@ -145,6 +146,7 @@ void OverrideView::updateOverrides() { gba->override.vbaBugCompat = false; if (!m_ui.hwAutodetect->isChecked()) { + hasOverride = true; gba->override.hardware = HW_NONE; if (m_ui.hwRTC->isChecked()) { gba->override.hardware |= HW_RTC; @@ -163,20 +165,22 @@ void OverrideView::updateOverrides() { } } if (m_ui.hwGBPlayer->isChecked()) { + hasOverride = true; gba->override.hardware |= HW_GB_PLAYER_DETECTION; } if (m_ui.vbaBugCompat->isChecked()) { + hasOverride = true; gba->override.vbaBugCompat = true; } bool ok; uint32_t parsedIdleLoop = m_ui.idleLoop->text().toInt(&ok, 16); if (ok) { + hasOverride = true; gba->override.idleLoop = parsedIdleLoop; } - if (gba->override.savetype != SAVEDATA_AUTODETECT || gba->override.hardware != HW_NO_OVERRIDE || - gba->override.idleLoop != IDLE_LOOP_NONE) { + if (hasOverride) { m_controller->setOverride(std::move(gba)); } else { m_controller->clearOverride(); @@ -185,16 +189,14 @@ void OverrideView::updateOverrides() { #endif #ifdef M_CORE_GB if (m_ui.tabWidget->currentWidget() == m_ui.tabGB) { - std::unique_ptr gb(new GBOverride); + auto gb = std::make_unique(); gb->override.mbc = static_cast(m_ui.mbc->currentData().toInt()); gb->override.model = static_cast(m_ui.gbModel->currentData().toInt()); - bool hasColor = false; + hasOverride = gb->override.mbc != GB_MBC_AUTODETECT || gb->override.model != GB_MODEL_AUTODETECT; for (int i = 0; i < 12; ++i) { gb->override.gbColors[i] = m_gbColors[i]; - hasColor = hasColor || (m_gbColors[i] & 0xFF000000); + hasOverride = hasOverride || (m_gbColors[i] & 0xFF000000); } - bool hasOverride = gb->override.mbc != GB_MBC_AUTODETECT || gb->override.model != GB_MODEL_AUTODETECT; - hasOverride = hasOverride || hasColor; if (hasOverride) { m_controller->setOverride(std::move(gb)); } else { @@ -268,6 +270,7 @@ void OverrideView::gameStopped() { m_ui.tabWidget->setEnabled(true); m_ui.savetype->setCurrentIndex(0); m_ui.idleLoop->clear(); + m_ui.vbaBugCompat->setChecked(false); m_ui.mbc->setCurrentIndex(0); m_ui.gbModel->setCurrentIndex(0); diff --git a/src/platform/qt/ReportView.cpp b/src/platform/qt/ReportView.cpp index b33fd2ea6..d21da1422 100644 --- a/src/platform/qt/ReportView.cpp +++ b/src/platform/qt/ReportView.cpp @@ -245,6 +245,11 @@ void ReportView::generateReport() { { CoreController::Interrupter interrupter(controller); + QFileInfo rom(window->windowFilePath()); + if (rom.exists()) { + windowReport << QString("Filename: %1").arg(redact(rom.filePath())); + windowReport << QString("Size: %1").arg(rom.size()); + } addROMInfo(windowReport, controller.get()); if (m_ui.includeSave->isChecked() && !m_ui.includeState->isChecked()) { diff --git a/src/platform/qt/ReportView.ui b/src/platform/qt/ReportView.ui index 6e6fd6d2a..9c7f2158c 100644 --- a/src/platform/qt/ReportView.ui +++ b/src/platform/qt/ReportView.ui @@ -6,14 +6,14 @@ 0 0 - 855 - 474 + 914 + 533 Generate Bug Report - + diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index fdc79b747..c1ba8515f 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -29,6 +29,7 @@ #include "DebuggerConsole.h" #include "DebuggerConsoleController.h" #include "Display.h" +#include "DolphinConnector.h" #include "CoreController.h" #include "FrameView.h" #include "GBAApp.h" @@ -376,6 +377,10 @@ void Window::selectROM() { } } +void Window::bootBIOS() { + setController(m_manager->loadBIOS(mPLATFORM_GBA, m_config->getOption("gba.bios")), QString()); +} + #ifdef USE_SQLITE3 void Window::selectROMInArchive() { QString filename = GBAApp::app()->getOpenFileName(this, tr("Select ROM"), getFiltersArchive()); @@ -543,6 +548,18 @@ std::function Window::openControllerTView(A... arg) { }; } +template +std::function Window::openNamedTView(std::unique_ptr* name, A... arg) { + return [=]() { + if (!*name) { + *name = std::make_unique(arg...); + connect(this, &Window::shutdown, name->get(), &QWidget::close); + } + (*name)->show(); + (*name)->setFocus(Qt::PopupFocusReason); + }; +} + template std::function Window::openNamedControllerTView(std::unique_ptr* name, A... arg) { return [=]() { @@ -1163,9 +1180,7 @@ void Window::setupMenu(QMenuBar* menubar) { m_actions.addAction(tr("Load &patch..."), "loadPatch", this, &Window::selectPatch, "file"); #ifdef M_CORE_GBA - m_actions.addAction(tr("Boot BIOS"), "bootBIOS", [this]() { - setController(m_manager->loadBIOS(mPLATFORM_GBA, m_config->getOption("gba.bios")), QString()); - }, "file"); + m_actions.addAction(tr("Boot BIOS"), "bootBIOS", this, &Window::bootBIOS, "file"); #endif addGameAction(tr("Replace ROM..."), "replaceROM", this, &Window::replaceROM, "file"); @@ -1278,11 +1293,19 @@ void Window::setupMenu(QMenuBar* menubar) { GBAApp::app()->newWindow(); }, "file"); +#ifdef M_CORE_GBA + Action* dolphin = m_actions.addAction(tr("Connect to Dolphin..."), "connectDolphin", openNamedTView(&m_dolphinView, this), "file"); + m_platformActions.insert(mPLATFORM_GBA, dolphin); +#endif + + m_actions.addSeparator("file"); + + m_actions.addAction(tr("Report bug..."), "bugReport", openTView(), "file"); + #ifndef Q_OS_MAC m_actions.addSeparator("file"); #endif - m_actions.addAction(tr("Report bug..."), "bugReport", openTView(), "file"); m_actions.addAction(tr("About..."), "about", openTView(), "file"); #ifndef Q_OS_MAC diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 4ee9a314e..a28425136 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -34,6 +34,7 @@ class CoreController; class CoreManager; class DebuggerConsoleController; class Display; +class DolphinConnector; class FrameView; class GDBController; class GIFView; @@ -72,6 +73,7 @@ signals: public slots: void setController(CoreController* controller, const QString& fname); void selectROM(); + void bootBIOS(); #ifdef USE_SQLITE3 void selectROMInArchive(); void addDirToLibrary(); @@ -163,6 +165,7 @@ private: template std::function openTView(A... arg); template std::function openControllerTView(A... arg); + template std::function openNamedTView(std::unique_ptr*, A... arg); template std::function openNamedControllerTView(std::unique_ptr*, A... arg); Action* addGameAction(const QString& visibleName, const QString& name, Action::Function action, const QString& menu = {}, const QKeySequence& = {}); @@ -222,6 +225,7 @@ private: std::unique_ptr m_overrideView; std::unique_ptr m_sensorView; + std::unique_ptr m_dolphinView; FrameView* m_frameView = nullptr; #ifdef USE_FFMPEG diff --git a/src/platform/qt/ts/medusa-emu-de.ts b/src/platform/qt/ts/medusa-emu-de.ts index d8d0577d1..58ca136b4 100644 --- a/src/platform/qt/ts/medusa-emu-de.ts +++ b/src/platform/qt/ts/medusa-emu-de.ts @@ -231,6 +231,44 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.Unterbrechen + + DolphinConnector + + + Connect to Dolphin + Mit Dolphin verbinden + + + + Local computer + Lokaler Computer + + + + IP address + IP-Adresse + + + + Connect + Verbinden + + + + Disconnect + Verbindung trennen + + + + Close + Schließen + + + + Reset on connect + Bei Verbindung zurücksetzen + + FrameView @@ -1219,27 +1257,27 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 Fehler beim Öffnen der Speicherdatei: %1 - + Failed to open game file: %1 Fehler beim Öffnen der Spieldatei: %1 - + Can't yank pack in unexpected platform! 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 @@ -2812,7 +2850,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. Keypad - Kepad + Keypad @@ -3999,7 +4037,7 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. QGBA::Window - + Game Boy Advance ROMs (%1) Game Boy Advance-ROMs (%1) @@ -4009,61 +4047,61 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.DS-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) Patches (*.ips *.ups *.bps) - + 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) @@ -4078,22 +4116,22 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.DS-Unterstützung erfordert ein Abbild des BIOS und der Firmware. - + Select video log Video-Log auswählen - + Video logs (*.mvl) Video-Logs (*.mvl) - + Crash Absturz - + The game has crashed with the following error: %1 @@ -4102,413 +4140,418 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd. - + 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... - + Load &patch... &Patch laden... - + Boot BIOS BIOS booten - + Replace ROM... ROM ersetzen... - + 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... - + 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 - + Sync to &video Mit &Video synchronisieren - + Sync to &audio Mit &Audio synchronisieren - + 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 - + 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... @@ -4528,228 +4571,228 @@ Game Boy Advance ist eine eingetragene Marke von Nintendo Co., Ltd.DS - + 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) - + 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 diff --git a/src/platform/qt/ts/medusa-emu-es.ts b/src/platform/qt/ts/medusa-emu-es.ts index ea7e1890e..8528c234f 100644 --- a/src/platform/qt/ts/medusa-emu-es.ts +++ b/src/platform/qt/ts/medusa-emu-es.ts @@ -216,6 +216,44 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Entrar a depuración + + DolphinConnector + + + Connect to Dolphin + Conectar a Dolphin + + + + Local computer + Computadora local + + + + IP address + Dirección IP + + + + Connect + Conectar + + + + Disconnect + Desconectar + + + + Close + Cerrar + + + + Reset on connect + Reiniciar al conectar + + FrameView @@ -470,7 +508,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Advanced settings - + Ajustes avanzados @@ -1127,7 +1165,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Copy - Copiar + Copiar @@ -1140,7 +1178,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. 2021 - 2021 + 2021 @@ -1204,27 +1242,27 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 Error al abrir el archivo de guardado: %1 - + Failed to open game file: %1 Error al abrir el archivo del juego: %1 - + Can't yank pack in unexpected platform! ¡No se puede remover 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 @@ -1239,7 +1277,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. 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? + No se pudo cargar el juego. ¿Estás seguro de que está en el formato correcto? @@ -1379,7 +1417,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Failed to open output file: %1 - Error al abrir el archivo de salida: %1 + Error al abrir el archivo de salida: %1 @@ -1497,7 +1535,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Swap green components - + Intercambiar componentes verdes @@ -1647,7 +1685,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Integer part (low) - + Parte entera (baja) @@ -1655,7 +1693,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Integer part (high) - + Parte entera (alta) @@ -2365,7 +2403,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Address (low) - + Dirección (baja) @@ -2377,53 +2415,53 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Address (high) - + Dirección (alta) Sound frequency (low) - + Frecuencia de sonido (baja) Sound frequency (high) - + Frecuencia de sonido (alta) Source (high) - + Origen (alto) Source (low) - + Origen (bajo) Destination (high) - + Destino (alto) Destination (low) - + Destino (bajo) Green (low) - + Verde (bajo) Green (high) - + Verde (alto) @@ -2914,341 +2952,341 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Right/A - + Derecha/A Left/B - + Izquierda/B Up/Select - + Arriba/Select Down/Start - + Abajo/Start Active D-pad - + Activar D-pad Active face buttons - + Botones frontales activos Internal clock - + Reloj interno 32× clocking (CGB only) - + 32× frecuencia (solo CGB) Transfer active - + Transferencia activa Divider - + Divisor 1/16 - 1/16 + 1/16 LCD STAT - + LCD STAT Timer - + Temporizador Serial - + Serie Joypad - + Mando Volume right - + Volumen derecha Output right - + Salida derecha Volume left - + Volumen izquierda Output left - + Salida izquierda Background enable/priority - + Habilitar/priorizar fondo Enable sprites - + Habilitar sprites Double-height sprites - + Sprites de doble altura Background tile map - + Mapa de tiles en fondo (BG) 0x9800 – 0x9BFF - + 0x9800 – 0x9BFF 0x9C00 – 0x9FFF - + 0x9C00 – 0x9FFF Background tile data - + Datos de tiles de fondo 0x8800 – 0x87FF - + 0x8800 – 0x87FF 0x8000 – 0x8FFF - + 0x8000 – 0x8FFF Enable window - + Habilitar window Window tile map - + Mapa de tiles en window Enable LCD - + Habilitar LCD Mode - Modo + Modo 0: HBlank - + 0: HBlank 1: VBlank - + 1: VBlank 2: OAM scan - + 2: escaneo de OAM 3: HDraw - + 3: HDraw In LYC - + Dentro LYC Enable HBlank (mode 0) IRQ - + Habilitar IRQ en HBlank (modo 0) Enable VBlank (mode 1) IRQ - + Habilitar IRQ en VBlank (modo 1) Enable OAM (mode 2) IRQ - + Habilitar IRQ de OAM (modo 2) Enable LYC IRQ - + Habilitar IRQ de LYC Current Y coordinate - + Coordenada Y actual Comparison Y coordinate - + Coordenada Y comparación Start upper byte - + Byte alto del inicio Color 0 shade - + Tono del color 0 Color 1 shade - + Tono del color 1 Color 2 shade - + Tono del color 2 Color 3 shade - + Tono del color 3 Prepare to switch speed - + Preparar cambio de velocidad Double speed - + Doble velocidad VRAM bank - + Banco de VRAM Length - + Largo Timing - + Sincronización Write bit - + Bit de escritura Read bit - + Bit de lectura Unknown - + Desconocido Current index - + Índice actual Auto-increment - + Autoincremento Red - Rojo + Rojo Blue - Azul + Azul Sprite ordering - + Orden de sprites OAM order - + Orden de OAM x coordinate sorting - + Orden por coordenadas X WRAM bank - + Banco de WRAM @@ -3600,7 +3638,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. --- - --- + --- @@ -3734,62 +3772,62 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Save games and save states (%1) - + Juegos y estados guardados (%1) Select save game or save state - + Seleccionar juego o estado guardado Save games (%1) - + Datos de guardado (%1) Select save game - + Seleccionar juego guardado Conversion failed - + Conversión fallada Failed to convert the save game. This is probably a bug. - + No se pudo convertir el estado guardado. Esto probablemente es un error. No file selected - + Archivo no seleccionado Could not open file - + Error al abrir el archivo No valid formats found - + No se encontraron formatos válidos Please select a valid input file - + Seleccione un archivo de entrada válido No valid conversions found - + No se encontraron conversiones validas Cannot convert save games between platforms - + No se pueden convertir los estados guardados entre plataformas distintas @@ -3854,7 +3892,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Select directory - + Elegir carpeta @@ -3953,101 +3991,101 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. 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 - + Video logs (*.mvl) Video-registros (*.mvl) - + Crash Error fatal - + The game has crashed with the following error: %1 @@ -4056,624 +4094,629 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. %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... - + Load &patch... Cargar &parche... - + Boot BIOS Arrancar BIOS - + Replace ROM... Reemplazar ROM... - + ROM &info... &Información de la ROM... - + Recent Recientes - + Make portable Hacer "portable" - + &Load state Ca&rgar estado - + Report bug... Reportar bug... - + 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 - + Load alternate save game... - + Elegir juego guardado alterno... - + Load temporary save game... - + Elegir juego guardado temporal... - + &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... - + Convert save game... - + Convertir juego guardado... - + New multiplayer window Nueva ventana multijugador - + + Connect to Dolphin... + Conectar a Dolphin... + + + E&xit Salir (&X) - + &Emulation &Emulación - + &Reset &Reinicializar - + Sh&utdown Apagar (&U) - + Yank game pak Tirar del 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 - + Sync to &video Sincronizar a &video - + Sync to &audio Sincronizar a au&dio - + 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 - + 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 - + 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... - + View &palette... Ver &paleta... - + View &sprites... Ver &sprites... - + View &tiles... Ver &tiles... - + 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... - + Stop debug video log Detener registro de depuración de video - + 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 - + Autofire Right Disparo automático Derecha - + Autofire Down Disparo automático Abajo - + Autofire Left Disparo automático Izquierda @@ -4683,17 +4726,17 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. %1 byte - + %1 byte %1 kiB - + %1 kiB %1 MiB - + %1 MiB @@ -4802,32 +4845,32 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. <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> Generate report - + Generar reporte Save - Guardar + Guardar Open issue list in browser - + Abrir lista de reportes en navegador Include save file - + Incluir archivo de guardado Create and include savestate - + Crear y incluir archivo de estado @@ -4835,103 +4878,103 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Convert/Extract Save Game - + Convertir/Extraer Guardado de Juego Input file - + Archivo de entrada Browse - Examinar + Examinar Output file - + Archivo de salida %1 %2 save game - + %1 %2 juego guardado little endian - + little-endian big endian - + big-endian SRAM - SRAM + SRAM %1 flash - + %1 flash %1 EEPROM - + %1 EEPROM %1 SRAM + RTC - + %1 SRAM + RTC %1 SRAM - + %1 SRAM packed MBC2 - + MBC2 empacado unpacked MBC2 - + MBC2 desempacado MBC6 flash - + flash MBC6 MBC6 combined SRAM + flash - + SRAM + flash combinados MBC6 MBC6 SRAM - + SRAM MBC6 TAMA5 - + TAMA5 %1 (%2) - + %1 (%2) %1 save state with embedded %2 save game - + %1 estado guardado con juego guardado %2 integrado @@ -5228,7 +5271,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Dynamically update window title - + Actualizar titulo de ventana dinámicamente @@ -5238,28 +5281,28 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Save state extra data: - + Guardar datos adicionales de estado: Save game - + Guardar juego Load state extra data: - + Cargar datos adicionales de estado: Super Game Boy/Game Boy Color model: - + Modelo Super Game Boy/Game Boy Color: 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 @@ -5452,7 +5495,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Enable Game Boy Player features by default - + Habilitar funcionalidad de Game Boy Player por defecto @@ -5584,17 +5627,17 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. Game Boy-only model: - + Modelo solo-Game Boy: Game Boy Color-only model: - + Modelo solo-Game Boy Color: Game Boy/Game Boy Color model: - + Modelo Game Boy/Game Boy Color: @@ -5783,7 +5826,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. 4K - 480p {4K?} + 4K @@ -5834,7 +5877,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. None - Ninguno + Ninguno @@ -5879,12 +5922,12 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. H.264 - H.264 + H.264 H.264 (NVENC) - H.264 (NVENC) + H.264 (NVENC) @@ -5894,7 +5937,7 @@ Game Boy Advance es una marca registrada de Nintendo Co., Ltd. CRF - + CRF diff --git a/src/platform/qt/ts/medusa-emu-it.ts b/src/platform/qt/ts/medusa-emu-it.ts index 4c0f5c71e..5aeb6521f 100644 --- a/src/platform/qt/ts/medusa-emu-it.ts +++ b/src/platform/qt/ts/medusa-emu-it.ts @@ -216,6 +216,44 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. Interruzione + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1204,27 +1242,27 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 Impossibile aprire il file di salvataggio: %1 - + Failed to open game file: %1 Impossibile aprire il file di gioco: %1 - + Can't yank pack in unexpected platform! 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 @@ -3953,96 +3991,96 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. 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) Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Selezione e-Reader dotcode - + e-Reader card (*.raw *.bin *.bmp) e-Reader card (*.raw *.bin *.bmp) - + 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 @@ -4051,629 +4089,634 @@ Game Boy Advance è un marchio registrato di Nintendo Co., Ltd. %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... - + ROM &info... Informazioni ROM... - + Recent Recente - + 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 camera... - + Convert save game... - + New multiplayer window Nuova finestra multigiocatore - + + Connect to Dolphin... + + + + Report bug... Segnala bug... - + E&xit Esci (&X) - + &Emulation Emulazione - + &Reset Reset - + Sh&utdown Spegni (&U) - + Yank game pak Yank 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 - + Sync to &video Sincronizza con il video - + Sync to &audio Sincronizza con l'audio - + Solar sensor Sensore solare - + Increase solar level Aumenta il livello solare - + Decrease solar level Riduce il livello solare - + Brightest solar level Livello solare brillante - + Darkest solar level Livello solare più scuro - + Brightness %1 Luminosità %1 - + Audio/&Video Audio/Video - + Frame size Dimensioni 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 screenshot - + F12 F12 - + Record GIF/WebP/APNG... Registra GIF / WebP / APNG ... - + Video layers Layers video - + Audio channels Canali audio - + &Tools Strumenti - + View &logs... Visualizza (&Logs) &registri... - + Game &overrides... Valore specifico per il gioco... - + &Cheats... Trucchi... - + Open debugger console... Apri debugger console... - + 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 l'integer scaling - + Bilinear filtering Filtro bilineare - + Game Boy Printer... Stampante Game Boy... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - + Select save state - + Load alternate save game... - + Load temporary save game... - + BattleChip Gate... BattleChip Gate... - + %1× %1x - + Interframe blending Interframe blending - + Native (59.7275) Nativo (59.7) - + Record A/V... Registra A/V... - + Adjust layer placement... Regola posizionamento layer... - + Game Pak sensors... Sensori Game Pak... - + 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 debug video log... - + Stop debug video log Ferma debug video log - + 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 diff --git a/src/platform/qt/ts/mgba-en.ts b/src/platform/qt/ts/mgba-en.ts index 04cc91b18..e70d907a2 100644 --- a/src/platform/qt/ts/mgba-en.ts +++ b/src/platform/qt/ts/mgba-en.ts @@ -215,6 +215,44 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1203,27 +1241,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3952,725 +3990,730 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 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 - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + + Connect to Dolphin... + + + + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-fr.ts b/src/platform/qt/ts/mgba-fr.ts index cccc10f47..3239e77fe 100644 --- a/src/platform/qt/ts/mgba-fr.ts +++ b/src/platform/qt/ts/mgba-fr.ts @@ -217,6 +217,44 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd.Arrêter + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1205,27 +1243,27 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 Échec de l'ouverture du fichier de sauvegarde : %1 - + Failed to open game file: %1 Échec de l'ouverture du fichier de jeu : %1 - + Can't yank pack in unexpected platform! - + 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 @@ -3972,101 +4010,101 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. 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 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 @@ -4075,624 +4113,629 @@ Game Boy Advance est une marque de fabrique enregistré par Nintendo Co., Ltd. - + 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… - + 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 - + Sync to &video Synchro &vidéo - + Sync to &audio Synchro &audio - + 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 - + 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... - + Export GameShark Save... Exporter la sauvegarde de GameShark... - + 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… - + 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 diff --git a/src/platform/qt/ts/mgba-ja.ts b/src/platform/qt/ts/mgba-ja.ts index 3315f2858..ef843b3d1 100644 --- a/src/platform/qt/ts/mgba-ja.ts +++ b/src/platform/qt/ts/mgba-ja.ts @@ -216,6 +216,44 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Break + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1204,27 +1242,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 セーブファイルを開けませんでした: %1 - + Failed to open game file: %1 ゲームファイルを開けませんでした: %1 - + Can't yank pack in unexpected platform! 予期しないプラットフォームでパックをヤンクすることはできません! - + Failed to open snapshot file for reading: %1 読み取り用のスナップショットファイルを開けませんでした: %1 - + Failed to open snapshot file for writing: %1 書き込み用のスナップショットファイルを開けませんでした: %1 @@ -3953,101 +3991,101 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 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 @@ -4056,624 +4094,629 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. %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 - + Load alternate save game... - + Load temporary save game... - + &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... - + 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 後退 - + Sync to &video ビデオ同期 (&V) - + Sync to &audio オーディオ同期 (&A) - + 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... ポケットプリンタ... - + 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) - + 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 連打 左 diff --git a/src/platform/qt/ts/mgba-ko.ts b/src/platform/qt/ts/mgba-ko.ts index 39f37f017..325aa0828 100644 --- a/src/platform/qt/ts/mgba-ko.ts +++ b/src/platform/qt/ts/mgba-ko.ts @@ -216,6 +216,44 @@ Game Boy Advance는 Nintendo Co., Ltd.의 등록 상표입니다. 중단 + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1204,27 +1242,27 @@ Game Boy Advance는 Nintendo Co., Ltd.의 등록 상표입니다. QGBA::CoreController - + Failed to open save file: %1 저장 파일을 열지 못했습니다: %1 - + Failed to open game file: %1 게임 파일을 열지 못했습니다: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 읽기 용 스냅샷 파일을 열지 못했습니다: %1 - + Failed to open snapshot file for writing: %1 쓰기 용 스냅샷 파일을 열지 못했습니다: %1 @@ -3953,96 +3991,96 @@ Game Boy Advance는 Nintendo Co., Ltd.의 등록 상표입니다. 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-Reader card (*.raw *.bin *.bmp) - + 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 @@ -4051,629 +4089,634 @@ Game Boy Advance는 Nintendo Co., Ltd.의 등록 상표입니다. %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. 일부 변경 사항은 에뮬레이터가 다시 시작될 때까지 적용되지 않습니다. - + - 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... 롬을 아카이브에 로드... - + Load &patch... 로드 &패치... - + Boot BIOS BIOS 부팅 - + Replace ROM... 롬 교체... - + Scan e-Reader dotcodes... - + 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... - + 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 돌아가기 - + Sync to &video 비디오 &동기화 - + Sync to &audio 오디오 &동기화 - + 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... &치트.. - + 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) - + Select save game - + mGBA save state files (%1) - + Select save state - + Load alternate save game... - + Load temporary save game... - + BattleChip Gate... - + %1× %1x {1×?} - + Interframe blending - + Native (59.7275) Nativo (59.7) {59.7275)?} - + Record A/V... - + Record GIF/WebP/APNG... - + Adjust layer placement... 레이어 배치 조정... - + Game Pak sensors... - + View &palette... 팔레트 &보기... - + View &sprites... 스프라이트 &보기... - + View &tiles... 타일 &보기... - + View &map... 지도 &보기... - + &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) 게임샤크 버튼 (누름) - + 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 연사 왼쪽 diff --git a/src/platform/qt/ts/mgba-nb_NO.ts b/src/platform/qt/ts/mgba-nb_NO.ts new file mode 100644 index 000000000..dc3a29804 --- /dev/null +++ b/src/platform/qt/ts/mgba-nb_NO.ts @@ -0,0 +1,5955 @@ + + + + + AboutScreen + + + About + Om + + + + <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> + + + + + Branch: <tt>{gitBranch}</tt><br/>Revision: <tt>{gitCommit}</tt> + + + + + © 2013 – {year} Jeffrey Pfau, licensed under the Mozilla Public License, version 2.0 +Game Boy Advance is a registered trademark of Nintendo Co., Ltd. + + + + + {projectName} would like to thank the following patrons from Patreon: + {projectName} takker følgende kronerullere fra Patreon: + + + + {projectName} is an open-source Game Boy Advance emulator + {projectName} er en fri Game Boy Advance-emulator + + + + ArchiveInspector + + + Open in archive... + + + + + Loading... + + + + + AssetTile + + + Tile # + + + + + Palette # + + + + + Address + Adresse + + + + Red + Rød + + + + Green + Grønn + + + + Blue + Blå + + + + BattleChipView + + + BattleChip Gate + + + + + Chip name + + + + + Insert + + + + + Save + Lagre + + + + Load + Last inn + + + + Add + Legg til + + + + Remove + Fjern + + + + Gate type + + + + + Ba&ttleChip Gate + + + + + Progress &Gate + + + + + Beast &Link Gate + + + + + Inserted + + + + + Chip ID + + + + + Update Chip data + + + + + Show advanced + + + + + CheatsView + + + Cheats + Juks + + + + Remove + Fjern + + + + Save + Lagre + + + + Load + Last inn + + + + Add New Set + + + + + Add + Legg til + + + + Enter codes here... + + + + + DebuggerConsole + + + Debugger + Avluser + + + + Enter command (try `help` for more info) + + + + + Break + + + + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + + + FrameView + + + Inspect frame + + + + + Magnification + Forstørrelse + + + + Freeze frame + + + + + Backdrop color + + + + + Disable scanline effects + + + + + Export + Eksporter + + + + Reset + Tilbakestill + + + + GIFView + + + Record GIF/WebP/APNG + + + + + Loop + Gjenta + + + + Start + Start + + + + Stop + Stopp + + + + Select File + Velg fil + + + + APNG + APNG + + + + GIF + GIF + + + + WebP + WebP + + + + Frameskip + + + + + IOViewer + + + I/O Viewer + + + + + 0x0000 + + + + + B + + + + + LibraryTree + + + Name + Navn + + + + Location + + + + + Platform + Plattform + + + + Size + Størrelse + + + + CRC32 + + + + + LoadSaveState + + + + %1 State + + + + + + + + + + + + + No Save + + + + + 5 + 5 + + + + 6 + 6 + + + + 8 + 8 + + + + 4 + 4 + + + + 1 + 1 + + + + 3 + 3 + + + + 7 + 7 + + + + 9 + 9 + + + + 2 + 2 + + + + Cancel + Avbryt + + + + LogView + + + Logs + Logger + + + + Enabled Levels + + + + + Debug + + + + + Stub + + + + + Info + Info + + + + Warning + Advarsel + + + + Error + Feil + + + + Fatal + + + + + Game Error + Spillfeil + + + + Advanced settings + + + + + Clear + Tøm + + + + Max Lines + + + + + MapView + + + Maps + Kart + + + + Magnification + Forstørrelse + + + + Export + Eksporter + + + + Copy + Kopier + + + + MemoryDump + + + Save Memory Range + + + + + Start Address: + + + + + Byte Count: + + + + + Dump across banks + + + + + MemorySearch + + + Memory Search + Minnesøk + + + + Address + Adresse + + + + Current Value + Nåværende verdi + + + + + Type + Type + + + + Value + Verdi + + + + Numeric + + + + + Text + Tekst + + + + Width + Bredde + + + + + 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 + Ukjent/endret + + + + Changed by value + + + + + Unchanged + Uendret + + + + Increased + + + + + Decreased + + + + + Search ROM + + + + + New Search + Nytt søk + + + + Search Within + + + + + Open in Memory Viewer + + + + + Refresh + Gjenoppfrisk + + + + MemoryView + + + Memory + Minne + + + + Inspect Address: + + + + + Set Alignment: + + + + + &1 Byte + + + + + &2 Bytes + + + + + &4 Bytes + + + + + Unsigned Integer: + + + + + Signed Integer: + + + + + String: + + + + + Load TBL + + + + + Copy Selection + + + + + Paste + Lim inn + + + + Save Selection + + + + + Save Range + + + + + Load + Last inn + + + + ObjView + + + Sprites + + + + + Address + Adresse + + + + Copy + Kopier + + + + Magnification + Forstørrelse + + + + Geometry + Geometri + + + + Position + Posisjon + + + + , + + + + + Dimensions + Dimensjoner + + + + × + + + + + Matrix + + + + + Export + Eksporter + + + + Attributes + + + + + Transform + + + + + Off + + + + + Palette + + + + + Double Size + + + + + + + + Return, Ctrl+R + + + + + Flipped + + + + + H + Short for horizontal + + + + + V + Short for vertical + + + + + Mode + Modus + + + + Normal + Normal + + + + Mosaic + Flislagt + + + + Enabled + + + + + Priority + Prioritet + + + + Tile + Flis + + + + OverrideView + + + Game Overrides + + + + + Game Boy Advance + Game Boy Advance + + + + + + + Autodetect + + + + + Realtime clock + Sanntidsklokke + + + + Gyroscope + + + + + Tilt + + + + + Light sensor + Lyssensor + + + + Rumble + Vibrasjon + + + + Save type + Lagringstype + + + + None + Ingen + + + + SRAM + SRAM + + + + Flash 512kb + + + + + Flash 1Mb + + + + + EEPROM + + + + + Idle loop + + + + + Game Boy Player features + + + + + VBA bug compatibility mode + + + + + Game Boy + + + + + Game Boy model + + + + + Memory bank controller + + + + + Background Colors + Bakgrunnsfarger + + + + Sprite Colors 1 + + + + + Sprite Colors 2 + + + + + PaletteView + + + Palette + + + + + Background + Bakgrunn + + + + Objects + Objekter + + + + Selection + Utvalg + + + + Red + Rød + + + + Green + Grønn + + + + Blue + Blå + + + + 16-bit value + 16-biters verdi + + + + Hex code + + + + + Palette index + + + + + Export BG + + + + + Export OBJ + + + + + PlacementControl + + + Adjust placement + + + + + All + + + + + Offset + Forskyvning + + + + X + + + + + Y + + + + + PrinterView + + + Game Boy Printer + Game Boy-skriver + + + + Hurry up! + + + + + Tear off + + + + + Magnification + Forstørrelse + + + + Copy + Kopier + + + + QGBA::AboutScreen + + + 2021 + 2021 + + + + QGBA::AssetTile + + + %0%1%2 + + + + + + + 0x%0 (%1) + + + + + QGBA::CheatsModel + + + (untitled) + + + + + Failed to open cheats file: %1 + + + + + QGBA::CheatsView + + + + Add GameShark + Legg til GameShark + + + + Add Pro Action Replay + + + + + Add CodeBreaker + Legg til CodeBreaker + + + + Add GameGenie + Legg til GameGenie + + + + + Select cheats file + Velg juksekodefil + + + + QGBA::CoreController + + + Failed to open save file: %1 + + + + + Failed to open game file: %1 + + + + + Can't yank pack in unexpected platform! + + + + + Failed to open snapshot file for reading: %1 + + + + + Failed to open snapshot file for writing: %1 + + + + + QGBA::CoreManager + + + Failed to open game file: %1 + + + + + Could not load game. Are you sure it's in the correct format? + + + + + Failed to open save file. Is the save directory writable? + + + + + QGBA::FrameView + + + Export frame + + + + + Portable Network Graphics (*.png) + + + + + None + Ingen + + + + Background + Bakgrunn + + + + Window + Vindu + + + + Objwin + + + + + Sprite + + + + + Backdrop + + + + + Frame + + + + + %1 %2 + + + + + QGBA::GBAApp + + + Enable Discord Rich Presence + + + + + QGBA::GBAKeyEditor + + + Clear Button + + + + + Clear Analog + + + + + Refresh + Gjenoppfrisk + + + + Set all + + + + + QGBA::GDBWindow + + + Server settings + Tjenerinnstillinger + + + + Local port + Lokal port + + + + Bind address + + + + + Break + + + + + Stop + Stopp + + + + Start + Start + + + + Crash + Krasj + + + + Could not start GDB server + Kunne ikke starte GDB-tjener + + + + QGBA::GIFView + + + Failed to open output file: %1 + Klarte ikke å åpne utdatafil: %1 + + + + Select output file + Velg utdatafil + + + + Graphics Interchange Format (*.gif);;WebP ( *.webp);;Animated Portable Network Graphics (*.png *.apng) + + + + + QGBA::IOViewer + + + Background mode + + + + + Mode 0: 4 tile layers + + + + + Mode 1: 2 tile layers + 1 rotated/scaled tile layer + + + + + Mode 2: 2 rotated/scaled tile layers + + + + + Mode 3: Full 15-bit bitmap + + + + + Mode 4: Full 8-bit bitmap + + + + + Mode 5: Small 15-bit bitmap + + + + + CGB Mode + CGB-modus + + + + 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 + + + + + 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 + Prioritet + + + + + + + Tile data base (* 16kB) + + + + + + + + Enable mosaic + + + + + + + + Enable 256-color + + + + + + + + Tile map base (* 2kB) + + + + + + + + Background dimensions + Bakgrunnsdimensjoner + + + + + Overflow wraps + + + + + + + + + + Horizontal offset + Vannrett forskyvning + + + + + + + + + Vertical offset + Loddrett forskyvning + + + + + + + + + + + + + + + Fractional part + + + + + + + + + + + + Integer part + + + + + + 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 + + + + + Swap green components + + + + + + + + Integer part (low) + + + + + + + + Integer part (high) + + + + + 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 + Tilbakestill + + + + Double-size wave table + + + + + Active wave table + + + + + + Enable channel 3 + + + + + + Volume + Lydstyrke + + + + + 0% + 0% + + + + + + 100% + 100% + + + + + + 50% + 50% + + + + + + 25% + 25% + + + + + + + 75% + 75% + + + + + Clock divider + + + + + + Register stages + + + + + + 15 + 15 + + + + + 7 + 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 + 0 + + + + + + + + + + + + 1 + 1 + + + + Channel A reset + + + + + Enable channel B right + + + + + Enable channel B left + + + + + Channel B timer + + + + + Channel B reset + + + + + + Active channel 1 + Aktiv kanal 1 + + + + + Active channel 2 + Aktiv kanal 2 + + + + + Active channel 3 + Aktiv kanal 3 + + + + + Active channel 4 + Aktiv kanal 4 + + + + + Enable audio + + + + + Bias + + + + + Resolution + Oppløsning + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Sample + Sampling + + + + + + + + + + + Address (low) + + + + + + + + + + + + Address (high) + + + + + 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 + 1/16 + + + + + LCD STAT + + + + + + Timer + + + + + + Serial + + + + + + Joypad + + + + + + + Sound frequency (low) + + + + + + + Sound frequency (high) + + + + + 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 + Modus + + + + 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 + + + + + Source (high) + + + + + Source (low) + + + + + Destination (high) + + + + + Destination (low) + + + + + Length + + + + + Timing + + + + + Write bit + + + + + Read bit + + + + + + Unknown + + + + + + Current index + + + + + + Auto-increment + + + + + + Red + Rød + + + + + Green (low) + + + + + + Green (high) + + + + + + Blue + Blå + + + + Sprite ordering + + + + + OAM order + + + + + x coordinate sorting + + + + + WRAM bank + + + + + + + + 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 + Verdi + + + + + + + Scale + + + + + + + + + 1/64 + 1/64 + + + + + + + + 1/256 + 1/256 + + + + + + + + 1/1024 + 1/1024 + + + + + + Cascade + + + + + + A + + + + + + B + + + + + + Select + + + + + + Start + 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 + 4 + + + + + + + 3 + 3 + + + + + + + + 2 + 2 + + + + + + + + 8 + 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 + + + + + QGBA::KeyEditor + + + + --- + + + + + Super (L) + + + + + Super (R) + + + + + Menu + + + + + QGBA::LoadSaveState + + + Load State + + + + + Save State + + + + + Empty + + + + + Corrupted + + + + + Slot %1 + + + + + QGBA::LogConfigModel + + + + Default + + + + + Fatal + + + + + Error + Feil + + + + Warning + Advarsel + + + + Info + Info + + + + Debug + + + + + Stub + + + + + Game Error + Spillfeil + + + + QGBA::LogController + + + [%1] %2: %3 + + + + + An error occurred + + + + + DEBUG + + + + + STUB + + + + + INFO + + + + + WARN + + + + + ERROR + + + + + FATAL + + + + + GAME ERROR + + + + + QGBA::MapView + + + Priority + Prioritet + + + + + Map base + + + + + + Tile base + + + + + Size + Størrelse + + + + + Offset + Forskyvning + + + + Xform + + + + + Map Addr. + + + + + Mirror + + + + + None + Ingen + + + + Both + + + + + Horizontal + + + + + Vertical + + + + + + + N/A + + + + + Export map + + + + + Portable Network Graphics (*.png) + + + + + QGBA::MemoryDump + + + Save memory region + + + + + Failed to open output file: %1 + Klarte ikke å åpne utdatafil: %1 + + + + QGBA::MemoryModel + + + Copy selection + + + + + Save selection + + + + + Paste + Lim inn + + + + Load + Last inn + + + + All + + + + + Load TBL + + + + + Save selected memory + + + + + Failed to open output file: %1 + Klarte ikke å åpne utdatafil: %1 + + + + Load memory + + + + + Failed to open input file: %1 + + + + + TBL + + + + + ISO-8859-1 + + + + + QGBA::MemorySearch + + + (%0/%1×) + + + + + (⅟%0×) + + + + + (%0×) + + + + + %1 byte%2 + + + + + QGBA::ObjView + + + + 0x%0 + + + + + Off + + + + + + + + + + + + --- + + + + + Normal + Normal + + + + Trans + + + + + OBJWIN + + + + + Invalid + + + + + + N/A + + + + + Export sprite + + + + + Portable Network Graphics (*.png) + + + + + QGBA::OverrideView + + + Official MBCs + + + + + Licensed MBCs + + + + + Unlicensed MBCs + + + + + QGBA::PaletteView + + + #%0 + + + + + 0x%0 + + + + + + + + 0x%0 (%1) + + + + + Export palette + + + + + Windows PAL (*.pal);;Adobe Color Table (*.act) + + + + + Failed to open output palette file: %1 + + + + + QGBA::ROMInfo + + + + + + + (unknown) + + + + + + bytes + + + + + (no database present) + + + + + QGBA::ReportView + + + Bug report archive + + + + + ZIP archive (*.zip) + + + + + QGBA::SaveConverter + + + Save games and save states (%1) + + + + + Select save game or save state + + + + + Save games (%1) + + + + + Select save game + + + + + Conversion failed + + + + + Failed to convert the save game. This is probably a bug. + + + + + No file selected + + + + + Could not open file + + + + + No valid formats found + + + + + Please select a valid input file + + + + + No valid conversions found + + + + + Cannot convert save games between platforms + + + + + QGBA::SettingsView + + + + Qt Multimedia + + + + + SDL + + + + + Software (Qt) + + + + + OpenGL + + + + + OpenGL (force version 1.x) + + + + + None (Still Image) + + + + + Keyboard + + + + + Controllers + + + + + Shortcuts + + + + + + Shaders + + + + + Select BIOS + + + + + Select directory + + + + + (%1×%2) + + + + + QGBA::ShaderSelector + + + No shader active + + + + + Load shader + + + + + No shader loaded + + + + + by %1 + + + + + Preprocessing + + + + + Pass %1 + + + + + QGBA::ShortcutModel + + + Action + + + + + Keyboard + + + + + Gamepad + + + + + QGBA::TileView + + + Export tiles + + + + + + Portable Network Graphics (*.png) + + + + + Export tile + + + + + QGBA::VideoView + + + Failed to open output video file: %1 + + + + + Native (%0x%1) + + + + + Select output file + Velg utdatafil + + + + 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 + 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 + + + + + Load alternate save game... + + + + + Load temporary save game... + + + + + Load &patch... + + + + + Boot BIOS + + + + + Replace ROM... + + + + + Scan e-Reader dotcodes... + + + + + ROM &info... + + + + + Recent + + + + + Make portable + + + + + &Load state + + + + + Load state file... + + + + + &Save state + + + + + Save state file... + + + + + Quick load + + + + + Quick save + + + + + Load recent + + + + + Save recent + + + + + Undo load state + + + + + Undo save state + + + + + + State &%1 + + + + + Load camera image... + + + + + Convert save game... + + + + + Import GameShark Save... + + + + + Export GameShark Save... + + + + + New multiplayer window + + + + + Connect to Dolphin... + + + + + Report bug... + + + + + About... + + + + + E&xit + + + + + &Emulation + + + + + &Reset + + + + + Sh&utdown + + + + + Yank game pak + + + + + &Pause + + + + + &Next frame + + + + + Fast forward (held) + + + + + &Fast forward + + + + + Fast forward speed + + + + + Unbounded + + + + + %0x + + + + + Rewind (held) + + + + + Re&wind + + + + + Step backwards + + + + + Sync to &video + + + + + Sync to &audio + + + + + Solar sensor + + + + + Increase solar level + + + + + Decrease solar level + + + + + Brightest solar level + + + + + Darkest solar level + + + + + Brightness %1 + + + + + Game Boy Printer... + + + + + BattleChip Gate... + + + + + Audio/&Video + + + + + Frame size + + + + + %1× + + + + + Toggle fullscreen + + + + + Lock aspect ratio + + + + + Force integer scaling + + + + + Interframe blending + + + + + Bilinear filtering + + + + + Frame&skip + + + + + Mute + + + + + FPS target + + + + + Native (59.7275) + + + + + Take &screenshot + + + + + F12 + + + + + Record A/V... + + + + + Record GIF/WebP/APNG... + + + + + Video layers + + + + + Audio channels + + + + + Adjust layer placement... + + + + + &Tools + + + + + View &logs... + + + + + Game &overrides... + + + + + Game Pak sensors... + + + + + &Cheats... + + + + + Settings... + + + + + Open debugger console... + + + + + Start &GDB server... + + + + + View &palette... + + + + + View &sprites... + + + + + View &tiles... + + + + + View &map... + + + + + &Frame inspector... + + + + + View memory... + + + + + Search memory... + + + + + View &I/O registers... + + + + + Record debug video log... + + + + + Stop debug video log + + + + + Exit fullscreen + + + + + GameShark Button (held) + + + + + Autofire + + + + + Autofire A + + + + + Autofire B + + + + + Autofire L + + + + + Autofire R + + + + + Autofire Start + + + + + Autofire Select + + + + + Autofire Up + + + + + Autofire Right + + + + + Autofire Down + + + + + Autofire Left + + + + + Clear + Tøm + + + + QObject + + + %1 byte + + + + + %1 kiB + + + + + %1 MiB + + + + + GBA + + + + + GB + + + + + ? + + + + + QShortcut + + + Shift + + + + + Control + + + + + Alt + + + + + Meta + + + + + ROMInfo + + + ROM Info + + + + + Game name: + + + + + {NAME} + + + + + Internal name: + + + + + {TITLE} + + + + + Game ID: + + + + + {ID} + + + + + File size: + + + + + {SIZE} + + + + + CRC32: + + + + + {CRC} + + + + + ReportView + + + Generate Bug Report + + + + + <html><head/><body><p>To file a bug report, please first generate a report file to attach to the bug report you're about to file. It is recommended that you include the save files, as these often help with debugging issues. This will collect some information about the version of {projectName} you're running, your configuration, your computer, and the game you currently have open (if any). Once this collection is completed you can review all of the information gathered below and save it to a zip file. The collection will automatically attempt to redact any personal information, such as your username if it's in any of the paths gathered, but just in case you can edit it afterwards. After you have generated and saved it, please click the button below or go to <a href="https://mgba.io/i/"><span style=" text-decoration: underline; color:#2980b9;">mgba.io/i</span></a> to file the bug report on GitHub. Make sure to attach the report you generated!</p></body></html> + + + + + Generate report + + + + + Save + Lagre + + + + Open issue list in browser + + + + + Include save file + + + + + Create and include savestate + + + + + SaveConverter + + + Convert/Extract Save Game + + + + + Input file + + + + + + Browse + + + + + Output file + + + + + %1 %2 save game + + + + + little endian + + + + + big endian + + + + + SRAM + SRAM + + + + %1 flash + + + + + %1 EEPROM + + + + + %1 SRAM + RTC + + + + + %1 SRAM + + + + + packed MBC2 + + + + + unpacked MBC2 + + + + + MBC6 flash + + + + + MBC6 combined SRAM + flash + + + + + MBC6 SRAM + + + + + TAMA5 + + + + + %1 (%2) + + + + + %1 save state with embedded %2 save game + + + + + SensorView + + + Sensors + + + + + Realtime clock + Sanntidsklokke + + + + Fixed time + + + + + System time + + + + + Start time at + + + + + Now + + + + + MM/dd/yy hh:mm:ss AP + + + + + Light sensor + Lyssensor + + + + Brightness + + + + + Tilt sensor + + + + + + Set Y + + + + + + Set X + + + + + Gyroscope + + + + + Sensitivity + + + + + SettingsView + + + Settings + + + + + Audio/Video + + + + + Interface + + + + + Emulation + + + + + Enhancements + + + + + BIOS + + + + + Paths + + + + + Logging + + + + + Game Boy + + + + + Audio driver: + + + + + Audio buffer: + + + + + + 1536 + 1536 + + + + 512 + 512 + + + + 768 + 768 + + + + 1024 + 1024 + + + + 2048 + 2048 + + + + 3072 + 3072 + + + + 4096 + 4096 + + + + samples + + + + + Sample rate: + + + + + + 44100 + 44100 + + + + 22050 + 22050 + + + + 32000 + 32000 + + + + 48000 + 48000 + + + + Hz + + + + + Volume: + + + + + + Mute + + + + + Fast forward volume: + + + + + Display driver: + + + + + Frameskip: + + + + + Skip every + + + + + + frames + + + + + FPS target: + + + + + frames per second + + + + + Sync: + + + + + Video + + + + + Audio + + + + + Lock aspect ratio + + + + + Force integer scaling + + + + + Bilinear filtering + + + + + Native (59.7275) + + + + + Interframe blending + + + + + Language + + + + + English + + + + + Library: + + + + + List view + + + + + Tree view + + + + + Show when no game open + + + + + Clear cache + + + + + Allow opposing input directions + + + + + Suspend screensaver + + + + + Pause when inactive + + + + + Pause when minimized + + + + + Dynamically update window title + + + + + Show filename instead of ROM name in title bar + + + + + Show OSD messages + + + + + Enable Discord Rich Presence + + + + + Automatically save state + + + + + Automatically load state + + + + + Automatically save cheats + + + + + Automatically load cheats + + + + + Show FPS in title bar + + + + + Fast forward speed: + + + + + + Unbounded + + + + + Fast forward (held) speed: + + + + + Autofire interval: + + + + + Enable rewind + + + + + Rewind history: + + + + + Idle loops: + + + + + Run all + + + + + Remove known + + + + + Detect and remove + + + + + Preload entire ROM into memory + + + + + Save state extra data: + + + + + + Save game + + + + + Load state extra data: + + + + + + Screenshot + + + + + + Cheat codes + + + + + Enable Game Boy Player features by default + + + + + Video renderer: + + + + + Software + + + + + OpenGL + + + + + OpenGL enhancements + + + + + High-resolution scale: + + + + + (240×160) + + + + + XQ GBA audio (experimental) + + + + + GB BIOS file: + + + + + + + + + + + + + Browse + + + + + Use BIOS file if found + + + + + Skip BIOS intro + + + + + GBA BIOS file: + + + + + GBC BIOS file: + + + + + SGB BIOS file: + + + + + Save games + + + + + + + + + Same directory as the ROM + + + + + Save states + + + + + Screenshots + + + + + Patches + + + + + Cheats + Juks + + + + Log to file + + + + + Log to console + + + + + Select Log File + + + + + Game Boy-only model: + + + + + Super Game Boy model: + + + + + Game Boy Color-only model: + + + + + Game Boy/Game Boy Color model: + + + + + Default BG colors: + + + + + Default sprite colors 1: + + + + + Default sprite colors 2: + + + + + Use GBC colors in GB games + + + + + Super Game Boy borders + + + + + Camera driver: + + + + + Camera: + + + + + Super Game Boy/Game Boy Color model: + + + + + ShaderSelector + + + Shaders + + + + + Active Shader: + + + + + Name + Navn + + + + Author + + + + + Description + + + + + Unload Shader + + + + + Load New Shader + + + + + ShortcutView + + + Edit Shortcuts + + + + + Keyboard + + + + + Gamepad + + + + + Clear + Tøm + + + + TileView + + + Tiles + + + + + Export Selected + + + + + Export All + + + + + 256 colors + + + + + Magnification + Forstørrelse + + + + Tiles per row + + + + + Fit to window + + + + + Copy Selected + + + + + Copy All + + + + + VideoView + + + Record Video + + + + + Start + Start + + + + Stop + Stopp + + + + Select File + Velg fil + + + + Presets + + + + + High &Quality + + + + + &YouTube + + + + + + WebM + + + + + + MP4 + + + + + &Lossless + + + + + 4K + 4K + + + + &1080p + + + + + &720p + + + + + &480p + + + + + &Native + + + + + Format + + + + + MKV + + + + + AVI + + + + + H.264 + + + + + H.264 (NVENC) + + + + + HEVC + + + + + HEVC (NVENC) + + + + + VP8 + + + + + VP9 + + + + + FFV1 + + + + + + None + Ingen + + + + FLAC + + + + + Opus + + + + + Vorbis + + + + + MP3 + + + + + AAC + + + + + Uncompressed + + + + + Bitrate (kbps) + + + + + ABR + + + + + VBR + + + + + CRF + + + + + Dimensions + Dimensjoner + + + + Lock aspect ratio + + + + + Show advanced + + + + diff --git a/src/platform/qt/ts/mgba-nl.ts b/src/platform/qt/ts/mgba-nl.ts index 3aa36a688..0dd520255 100644 --- a/src/platform/qt/ts/mgba-nl.ts +++ b/src/platform/qt/ts/mgba-nl.ts @@ -215,6 +215,44 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1203,27 +1241,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3952,725 +3990,730 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 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 - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + + Connect to Dolphin... + + + + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-pt_BR.ts b/src/platform/qt/ts/mgba-pt_BR.ts index be939506b..8317b9e8d 100644 --- a/src/platform/qt/ts/mgba-pt_BR.ts +++ b/src/platform/qt/ts/mgba-pt_BR.ts @@ -216,6 +216,44 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. Pausar + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1204,27 +1242,27 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 Falha ao abrir o arquivo de salvamento: %1 - + Failed to open game file: %1 Falha ao abrir o arquivo do jogo: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 Falha ao abrir o arquivo de snapshot para leitura: %1 - + Failed to open snapshot file for writing: %1 Falha ao abrir o arquivo de snapshot para escrita: %1 @@ -3953,101 +3991,101 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. 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 as ROMs (%1) - + %1 Video Logs (*.mvl) %1 Logs de Vídeo (*.mvl) - + Archives (%1) Arquivos (%1) - - - + + + Select ROM Selecionar ROM - + Select folder Selecionar pasta - - + + Select save Selecionar salvamento - + Select patch Selecione correção - + Patches (*.ips *.ups *.bps) Patches (*.ips *.ups *.bps) - + Select e-Reader dotcode Selecione dotcode do e-Reader - + e-Reader card (*.raw *.bin *.bmp) e-Reader card (*.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) GameShark saves (*.sps *.xps) - + Select video log Selecionar registro de vídeo - + Video logs (*.mvl) Video logs (*.mvl) - + Crash Travamento - + The game has crashed with the following error: %1 @@ -4056,624 +4094,629 @@ Game Boy Advance é uma marca registrada da Nintendo Co., Ltd. %1 - + Unimplemented BIOS call Chamada de BIOS não implementada - + This game uses a BIOS call that is not implemented. Please use the official BIOS for best experience. Este jogo usa uma chamada de BIOS que não está implementada. Por favor, use a BIOS oficial para uma melhor experiência. - + Failed to create an appropriate display device, falling back to software display. Games may run slowly, especially with larger windows. - + Really make portable? Quer mesmo tornar portátil? - + This will make the emulator load its configuration from the same directory as the executable. Do you want to continue? Isto fará com que o emulador carregue sua configuração a partir do mesmo diretório que o executável. Você quer continuar? - + Restart needed É necessário reiniciar - + Some changes will not take effect until the emulator is restarted. Algumas alterações não terão efeito até que o emulador seja reiniciado. - + - 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 em arquivo... - + Add folder to library... Adicionar pasta à biblioteca... - + Load &patch... Carregar &patch... - + Boot BIOS Rodar BIOS - + Replace ROM... Substituir ROM... - + ROM &info... &Informações da ROM... - + Recent Recente - + Make portable Tornar portátil - + &Load state &Carregar Estado - + Report bug... - + About... Sobre... - + Game Pak sensors... Sensores de Game Pak... - + Clear Limpar - + Load state file... Carregar arquivo de estado... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - + Select save state - + Load alternate save game... - + Load temporary save game... - + &Save state &Salvar Estado - + Save state file... Salvar arquivo de estado... - + Quick load Carregamento rápido - + Quick save Salvamento rápido - + Load recent Carregar recente - + Save recent Salvar recente - + Undo load state Desfazer carregar estado - + Undo save state Desfazer salvar estado - - + + State &%1 Estado &%1 - + Load camera image... Carregar imagem da câmera... - + Convert save game... - + New multiplayer window Nova janela multijogador - + + Connect to Dolphin... + + + + E&xit &Sair - + &Emulation &Emulação - + &Reset &Resetar - + Sh&utdown &Desligar - + Yank game pak Remover game pak - + &Pause &Pausar - + &Next frame &Próximo quadro - + Fast forward (held) Avançar rápido (segurado) - + &Fast forward Avanço &Rápido - + Fast forward speed Velocidade de avanço - + Unbounded Ilimitado - + %0x %0x - + Rewind (held) Retroceder (segurado) - + Re&wind Re&troceder - + Step backwards Voltar um passo - + Sync to &video Sincronizar para &vídeo - + Sync to &audio Sincronizar para &áudio - + 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 quadro - + Toggle fullscreen Alternar tela cheia - + Lock aspect ratio Fixar proporção - + Force integer scaling Forçar dimensionamento inteiro - + Bilinear filtering Filtragem bilinear - + Frame&skip &Salto de quadro - + Mute Mudo - + FPS target Meta de FPS - + Native (59.7275) Nativo (59,7275) - + Take &screenshot Capturar &tela - + F12 F12 - + Game Boy Printer... Game Boy Printer... - + BattleChip Gate... BattleChip Gate... - + %1× %1× - + Interframe blending Interframe blending - + Record A/V... Gravar A/V... - + Video layers Camadas de vídeo - + Audio channels Canais de áudio - + Adjust layer placement... Ajustar posicionamento da camada... - + &Tools &Ferramentas - + View &logs... Visualizar &registros... - + Game &overrides... Game &overrides... - + Couldn't Start Não foi possível Iniciar - + Could not start game. Não foi possível iniciar o jogo. - + Scan e-Reader dotcodes... Escanear dotcode do e-Reader... - + Import GameShark Save... Importar salvamento do GameShark... - + Export GameShark Save... Exportar salvamento do GameShark... - + Record GIF/WebP/APNG... Gravar GIF/WebP/APNG... - + &Cheats... &Cheats... - + Settings... Configurações... - + Open debugger console... Abrir console de depuração... - + Start &GDB server... Iniciar servidor &GDB... - + View &palette... Visualizar &paleta... - + View &sprites... Visualizar &sprites... - + View &tiles... Visualizar &blocos... - + View &map... Visualizar &mapa... - + &Frame inspector... Inspetor de &quadro... - + View memory... Visualizar memória... - + Search memory... Pesquisar memória... - + View &I/O registers... Visualizar registros de &E/S... - + Record debug video log... Gravar log de vídeo de depuração... - + Stop debug video log Parar log de vídeo de depuração - + Exit fullscreen Sair da tela cheia - + GameShark Button (held) Botão de GameShark (segurado) - + 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 Cima - + Autofire Right Disparo automático Direita - + Autofire Down Disparo automático Baixo - + Autofire Left Disparo automático Esquerda diff --git a/src/platform/qt/ts/mgba-ru.ts b/src/platform/qt/ts/mgba-ru.ts index 50a11dcc9..cd0e432d8 100644 --- a/src/platform/qt/ts/mgba-ru.ts +++ b/src/platform/qt/ts/mgba-ru.ts @@ -215,6 +215,44 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. Прервать + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1203,27 +1241,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3952,725 +3990,730 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 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 - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + + Connect to Dolphin... + + + + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-template.ts b/src/platform/qt/ts/mgba-template.ts index 316e83c23..f818b528c 100644 --- a/src/platform/qt/ts/mgba-template.ts +++ b/src/platform/qt/ts/mgba-template.ts @@ -215,6 +215,44 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1203,27 +1241,27 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. QGBA::CoreController - + Failed to open save file: %1 - + Failed to open game file: %1 - + Can't yank pack in unexpected platform! - + Failed to open snapshot file for reading: %1 - + Failed to open snapshot file for writing: %1 @@ -3952,725 +3990,730 @@ Game Boy Advance is a registered trademark of Nintendo Co., Ltd. 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 - + Load alternate save game... - + Load temporary save game... - + Load &patch... - + Boot BIOS - + Replace ROM... - + Scan e-Reader dotcodes... - + ROM &info... - + Recent - + Make portable - + &Load state - + Load state file... - + &Save state - + Save state file... - + Quick load - + Quick save - + Load recent - + Save recent - + Undo load state - + Undo save state - - + + State &%1 - + Load camera image... - + Convert save game... - + Import GameShark Save... - + Export GameShark Save... - + New multiplayer window - + + Connect to Dolphin... + + + + Report bug... - + About... - + E&xit - + &Emulation - + &Reset - + Sh&utdown - + Yank game pak - + &Pause - + &Next frame - + Fast forward (held) - + &Fast forward - + Fast forward speed - + Unbounded - + %0x - + Rewind (held) - + Re&wind - + Step backwards - + Sync to &video - + Sync to &audio - + Solar sensor - + Increase solar level - + Decrease solar level - + Brightest solar level - + Darkest solar level - + Brightness %1 - + Game Boy Printer... - + BattleChip Gate... - + Audio/&Video - + Frame size - + %1× - + Toggle fullscreen - + Lock aspect ratio - + Force integer scaling - + Interframe blending - + Bilinear filtering - + Frame&skip - + Mute - + FPS target - + Native (59.7275) - + Take &screenshot - + F12 - + Record A/V... - + Record GIF/WebP/APNG... - + Video layers - + Audio channels - + Adjust layer placement... - + &Tools - + View &logs... - + Game &overrides... - + Game Pak sensors... - + &Cheats... - + Settings... - + Open debugger console... - + Start &GDB server... - + View &palette... - + View &sprites... - + View &tiles... - + View &map... - + &Frame inspector... - + View memory... - + Search memory... - + View &I/O registers... - + Record debug video log... - + Stop debug video log - + Exit fullscreen - + GameShark Button (held) - + Autofire - + Autofire A - + Autofire B - + Autofire L - + Autofire R - + Autofire Start - + Autofire Select - + Autofire Up - + Autofire Right - + Autofire Down - + Autofire Left - + Clear diff --git a/src/platform/qt/ts/mgba-tr.ts b/src/platform/qt/ts/mgba-tr.ts index 318c8bb72..f009b3d7a 100644 --- a/src/platform/qt/ts/mgba-tr.ts +++ b/src/platform/qt/ts/mgba-tr.ts @@ -216,6 +216,44 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1204,27 +1242,27 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. QGBA::CoreController - + Failed to open save file: %1 Kayıt dosyası açılamadı: %1 - + Failed to open game file: %1 Oyun dosyası açılamadı: %1 - + Can't yank pack in unexpected platform! - + 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 @@ -3953,101 +3991,101 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. 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-Reader card (*.raw *.bin *.bmp) - + 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 @@ -4056,624 +4094,629 @@ Game Boy Advance, Nintendo Co., Ltd.'nin tescilli ticari markasıdır. - + 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. - + 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 ... - + Load &patch... &Patch yükle... - + Boot BIOS BIOS boot et - + Replace ROM... ROM değişti... - + 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... - + New multiplayer window Yeni çokoyunculu ekranı - + + Connect to Dolphin... + + + + Report bug... - + 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 - + Sync to &video &Videoya eşitle - + Sync to &audio &Sese eşitle - + 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... Oyunların üzerine yazılanlar - + Couldn't Start - + Save games (%1) - + Select save game - + mGBA save state files (%1) - + Select save state - + Could not start game. - + Load alternate save game... - + Load temporary save game... - + Scan e-Reader dotcodes... - + Import GameShark Save... - + Export GameShark Save... - + %1× - + Interframe blending - + Record A/V... - + Record GIF/WebP/APNG... - + Game Pak sensors... - + &Cheats... &Hileler... - + Settings... Ayarlar... - + Open debugger console... Hata ayıklayıcı konsolunu aç ... - + Start &GDB server... &GDB sunucusunu başlat... - + View &palette... &Renk Paletini gör... - + View &sprites... &Spriteları gör... - + View &tiles... &Desenleri gör... - + View &map... &Haritayı gör - + &Frame inspector... - + 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... - + Stop debug video log - + 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 diff --git a/src/platform/qt/ts/mgba-zh_CN.ts b/src/platform/qt/ts/mgba-zh_CN.ts index 9fecd690f..5c58cae3e 100644 --- a/src/platform/qt/ts/mgba-zh_CN.ts +++ b/src/platform/qt/ts/mgba-zh_CN.ts @@ -216,6 +216,44 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 断点 + + DolphinConnector + + + Connect to Dolphin + + + + + Local computer + + + + + IP address + + + + + Connect + + + + + Disconnect + + + + + Close + + + + + Reset on connect + + + FrameView @@ -1204,27 +1242,27 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 QGBA::CoreController - + Failed to open save file: %1 打开存档失败: %1 - + Failed to open game file: %1 打开游戏文件失败: %1 - + Can't yank pack in unexpected platform! 无法在意外平台上抽出卡带! - + Failed to open snapshot file for reading: %1 读取快照文件失败: %1 - + Failed to open snapshot file for writing: %1 写入快照文件失败: %1 @@ -3953,101 +3991,101 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 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 @@ -4056,624 +4094,629 @@ Game Boy Advance 是任天堂有限公司(Nintendo Co., Ltd.)的注册商标 %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 %1 - %2 (%3 fps) - %4 - + &File 文件(&F) - + Load &ROM... 载入 ROM(&R)... - + Load ROM in archive... 从压缩文件中载入 ROM... - + Add folder to library... 将文件夹添加到库中... - + Save games (%1) - + Select save game - + mGBA save state files (%1) - + Select save state - + Load alternate save game... - + Load temporary save game... - + Load &patch... 载入补丁(&P)... - + Boot BIOS 引导 BIOS - + Replace ROM... 替换 ROM... - + Scan e-Reader dotcodes... 扫描 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... - + Import GameShark Save... 导入 GameShark 存档... - + Export GameShark Save... 导出 GameShark 存档... - + New multiplayer window 新建多人游戏窗口 - + + Connect to 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 步退 - + Sync to &video 视频同步(&V) - + Sync to &audio 音频同步(&A) - + 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)... - + Settings... 设置... - + Open debugger console... 打开调试器控制台... - + Start &GDB server... 打开 GDB 服务器(&G)... - + 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 清除 diff --git a/src/platform/switch/gui-font.c b/src/platform/switch/gui-font.c index 24d9f2c71..e164a5e64 100644 --- a/src/platform/switch/gui-font.c +++ b/src/platform/switch/gui-font.c @@ -14,6 +14,7 @@ #define GLYPH_HEIGHT 24 #define CELL_HEIGHT 32 #define CELL_WIDTH 32 +#define MAX_GLYPHS 1024 static const GLfloat _offsets[] = { 0.f, 0.f, @@ -22,50 +23,70 @@ static const GLfloat _offsets[] = { 0.f, 1.f, }; -static const GLchar* const _gles2Header = - "#version 100\n" +static const GLchar* const _gles3Header = + "#version 300 es\n" "precision mediump float;\n"; static const char* const _vertexShader = - "attribute vec2 offset;\n" - "uniform vec3 origin;\n" - "uniform vec2 glyph;\n" - "uniform vec2 dims;\n" - "uniform mat2 transform;\n" - "varying vec2 texCoord;\n" + "in vec2 offset;\n" + "in vec3 origin;\n" + "in vec2 glyph;\n" + "in vec2 dims;\n" + "in mat2 transform;\n" + "in vec4 color;\n" + "out vec4 fragColor;\n" + "out vec2 texCoord;\n" "void main() {\n" " texCoord = (glyph + offset * dims) / 512.0;\n" " vec2 scaledOffset = (transform * (offset * 2.0 - vec2(1.0)) + vec2(1.0)) / 2.0 * dims;\n" + " fragColor = color;\n" " gl_Position = vec4((origin.x + scaledOffset.x) / 640.0 - 1.0, -(origin.y + scaledOffset.y) / 360.0 + 1.0, origin.z, 1.0);\n" "}"; static const char* const _fragmentShader = - "varying vec2 texCoord;\n" + "in vec2 texCoord;\n" + "in vec4 fragColor;\n" + "out vec4 outColor;\n" "uniform sampler2D tex;\n" - "uniform vec4 color;\n" "uniform float cutoff;\n" + "uniform vec3 colorModulus;\n" "void main() {\n" " vec4 texColor = texture2D(tex, texCoord);\n" " texColor.a = clamp((texColor.a - cutoff) / (1.0 - cutoff), 0.0, 1.0);\n" - " texColor.rgb = color.rgb;\n" - " texColor.a *= color.a;\n" - " gl_FragColor = texColor;\n" + " texColor.rgb = fragColor.rgb * colorModulus;\n" + " texColor.a *= fragColor.a;\n" + " outColor = texColor;\n" "}"; struct GUIFont { GLuint font; + int currentGlyph; GLuint program; GLuint vbo; GLuint vao; GLuint texLocation; - GLuint dimsLocation; - GLuint transformLocation; - GLuint colorLocation; + GLuint cutoffLocation; + GLuint colorModulusLocation; + GLuint originLocation; GLuint glyphLocation; - GLuint cutoffLocation; + GLuint dimsLocation; + GLuint transformLocation[2]; + GLuint colorLocation; + + GLuint originVbo; + GLuint glyphVbo; + GLuint dimsVbo; + GLuint transformVbo[2]; + GLuint colorVbo; + + GLfloat originData[MAX_GLYPHS][3]; + GLfloat glyphData[MAX_GLYPHS][2]; + GLfloat dimsData[MAX_GLYPHS][2]; + GLfloat transformData[2][MAX_GLYPHS][2]; + GLfloat colorData[MAX_GLYPHS][4]; }; static bool _loadTexture(const char* path) { @@ -120,12 +141,13 @@ struct GUIFont* GUIFontCreate(void) { return NULL; } + font->currentGlyph = 0; font->program = glCreateProgram(); GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); const GLchar* shaderBuffer[2]; - shaderBuffer[0] = _gles2Header; + shaderBuffer[0] = _gles3Header; shaderBuffer[1] = _vertexShader; glShaderSource(vertexShader, 2, shaderBuffer, NULL); @@ -154,27 +176,82 @@ struct GUIFont* GUIFontCreate(void) { glGetShaderInfoLog(vertexShader, sizeof(msg), NULL, msg); puts(msg); } + glLinkProgram(font->program); + glGetProgramiv(font->program, GL_LINK_STATUS, &success); + if (!success) { + GLchar msg[512]; + glGetProgramInfoLog(font->program, sizeof(msg), NULL, msg); + puts(msg); + } + glDeleteShader(vertexShader); glDeleteShader(fragmentShader); font->texLocation = glGetUniformLocation(font->program, "tex"); - font->colorLocation = glGetUniformLocation(font->program, "color"); - font->dimsLocation = glGetUniformLocation(font->program, "dims"); - font->transformLocation = glGetUniformLocation(font->program, "transform"); - font->originLocation = glGetUniformLocation(font->program, "origin"); - font->glyphLocation = glGetUniformLocation(font->program, "glyph"); font->cutoffLocation = glGetUniformLocation(font->program, "cutoff"); + font->colorModulusLocation = glGetUniformLocation(font->program, "colorModulus"); + + font->originLocation = glGetAttribLocation(font->program, "origin"); + font->glyphLocation = glGetAttribLocation(font->program, "glyph"); + font->dimsLocation = glGetAttribLocation(font->program, "dims"); + font->transformLocation[0] = glGetAttribLocation(font->program, "transform"); + font->transformLocation[1] = font->transformLocation[0] + 1; + font->colorLocation = glGetAttribLocation(font->program, "color"); + GLuint offsetLocation = glGetAttribLocation(font->program, "offset"); - glGenBuffers(1, &font->vbo); glGenVertexArrays(1, &font->vao); glBindVertexArray(font->vao); + + glGenBuffers(1, &font->vbo); glBindBuffer(GL_ARRAY_BUFFER, font->vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(_offsets), _offsets, GL_STATIC_DRAW); glVertexAttribPointer(offsetLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribDivisor(offsetLocation, 0); glEnableVertexAttribArray(offsetLocation); + + glGenBuffers(1, &font->originVbo); + glBindBuffer(GL_ARRAY_BUFFER, font->originVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glVertexAttribPointer(font->originLocation, 3, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribDivisor(font->originLocation, 1); + glEnableVertexAttribArray(font->originLocation); + + glGenBuffers(1, &font->glyphVbo); + glBindBuffer(GL_ARRAY_BUFFER, font->glyphVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glVertexAttribPointer(font->glyphLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribDivisor(font->glyphLocation, 1); + glEnableVertexAttribArray(font->glyphLocation); + + glGenBuffers(1, &font->dimsVbo); + glBindBuffer(GL_ARRAY_BUFFER, font->dimsVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glVertexAttribPointer(font->dimsLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribDivisor(font->dimsLocation, 1); + glEnableVertexAttribArray(font->dimsLocation); + + glGenBuffers(2, font->transformVbo); + glBindBuffer(GL_ARRAY_BUFFER, font->transformVbo[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glVertexAttribPointer(font->transformLocation[0], 2, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribDivisor(font->transformLocation[0], 1); + glEnableVertexAttribArray(font->transformLocation[0]); + glBindBuffer(GL_ARRAY_BUFFER, font->transformVbo[1]); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glVertexAttribPointer(font->transformLocation[1], 2, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribDivisor(font->transformLocation[1], 1); + glEnableVertexAttribArray(font->transformLocation[1]); + + glGenBuffers(1, &font->colorVbo); + glBindBuffer(GL_ARRAY_BUFFER, font->colorVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glVertexAttribPointer(font->colorLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL); + glVertexAttribDivisor(font->colorLocation, 1); + glEnableVertexAttribArray(font->colorLocation); + glBindVertexArray(0); return font; @@ -182,6 +259,11 @@ struct GUIFont* GUIFontCreate(void) { void GUIFontDestroy(struct GUIFont* font) { glDeleteBuffers(1, &font->vbo); + glDeleteBuffers(1, &font->originVbo); + glDeleteBuffers(1, &font->glyphVbo); + glDeleteBuffers(1, &font->dimsVbo); + glDeleteBuffers(2, font->transformVbo); + glDeleteBuffers(1, &font->colorVbo); glDeleteProgram(font->program); glDeleteTextures(1, &font->font); glDeleteVertexArrays(1, &font->vao); @@ -220,39 +302,38 @@ void GUIFontIconMetrics(const struct GUIFont* font, enum GUIIcon icon, unsigned* } } -void GUIFontDrawGlyph(const struct GUIFont* font, int x, int y, uint32_t color, uint32_t glyph) { +void GUIFontDrawGlyph(struct GUIFont* font, int x, int y, uint32_t color, uint32_t glyph) { if (glyph > 0x7F) { glyph = '?'; } struct GUIFontGlyphMetric metric = defaultFontMetrics[glyph]; - glUseProgram(font->program); - glBindVertexArray(font->vao); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, font->font); + if (font->currentGlyph >= MAX_GLYPHS) { + GUIFontDrawSubmit(font); + } - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + int offset = font->currentGlyph; - glUniform1i(font->texLocation, 0); - glUniform2f(font->glyphLocation, (glyph & 15) * CELL_WIDTH + metric.padding.left * 2, (glyph >> 4) * CELL_HEIGHT + metric.padding.top * 2); - glUniform2f(font->dimsLocation, CELL_WIDTH - (metric.padding.left + metric.padding.right) * 2, CELL_HEIGHT - (metric.padding.top + metric.padding.bottom) * 2); - glUniform3f(font->originLocation, x, y - GLYPH_HEIGHT + metric.padding.top * 2, 0); - glUniformMatrix2fv(font->transformLocation, 1, GL_FALSE, (float[4]) {1.0, 0.0, 0.0, 1.0}); + font->originData[offset][0] = x; + font->originData[offset][1] = y - GLYPH_HEIGHT + metric.padding.top * 2; + font->originData[offset][2] = 0; + font->glyphData[offset][0] = (glyph & 15) * CELL_WIDTH + metric.padding.left * 2; + font->glyphData[offset][1] = (glyph >> 4) * CELL_HEIGHT + metric.padding.top * 2; + font->dimsData[offset][0] = CELL_WIDTH - (metric.padding.left + metric.padding.right) * 2; + font->dimsData[offset][1] = CELL_HEIGHT - (metric.padding.top + metric.padding.bottom) * 2; + font->transformData[0][offset][0] = 1.0f; + font->transformData[0][offset][1] = 0.0f; + font->transformData[1][offset][0] = 0.0f; + font->transformData[1][offset][1] = 1.0f; + font->colorData[offset][0] = (color & 0xFF) / 255.0f; + font->colorData[offset][1] = ((color >> 8) & 0xFF) / 255.0f; + font->colorData[offset][2] = ((color >> 16) & 0xFF) / 255.0f; + font->colorData[offset][3] = ((color >> 24) & 0xFF) / 255.0f; - glUniform1f(font->cutoffLocation, 0.1f); - glUniform4f(font->colorLocation, 0.0, 0.0, 0.0, ((color >> 24) & 0xFF) / 128.0f); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - glUniform1f(font->cutoffLocation, 0.7f); - glUniform4f(font->colorLocation, (color & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, ((color >> 16) & 0xFF) / 255.0f, ((color >> 24) & 0xFF) / 255.0f); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - glBindVertexArray(0); - glUseProgram(0); + ++font->currentGlyph; } -void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIcon(struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { if (icon >= GUI_ICON_MAX) { return; } @@ -277,7 +358,6 @@ void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment break; } - glUseProgram(font->program); switch (orient) { case GUI_ORIENT_HMIRROR: hFlip = -1.0; @@ -290,34 +370,32 @@ void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment // TODO: Rotate break; } + if (font->currentGlyph >= MAX_GLYPHS) { + GUIFontDrawSubmit(font); + } - glUseProgram(font->program); - glBindVertexArray(font->vao); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, font->font); + int offset = font->currentGlyph; - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + font->originData[offset][0] = x; + font->originData[offset][1] = y; + font->originData[offset][2] = 0; + font->glyphData[offset][0] = metric.x * 2; + font->glyphData[offset][1] = metric.y * 2 + 256; + font->dimsData[offset][0] = metric.width * 2; + font->dimsData[offset][1] = metric.height * 2; + font->transformData[0][offset][0] = hFlip; + font->transformData[0][offset][1] = 0.0f; + font->transformData[1][offset][0] = 0.0f; + font->transformData[1][offset][1] = vFlip; + font->colorData[offset][0] = (color & 0xFF) / 255.0f; + font->colorData[offset][1] = ((color >> 8) & 0xFF) / 255.0f; + font->colorData[offset][2] = ((color >> 16) & 0xFF) / 255.0f; + font->colorData[offset][3] = ((color >> 24) & 0xFF) / 255.0f; - glUniform1i(font->texLocation, 0); - glUniform2f(font->glyphLocation, metric.x * 2, metric.y * 2 + 256); - glUniform2f(font->dimsLocation, metric.width * 2, metric.height * 2); - glUniform3f(font->originLocation, x, y, 0); - glUniformMatrix2fv(font->transformLocation, 1, GL_FALSE, (float[4]) {hFlip, 0.0, 0.0, vFlip}); - - glUniform1f(font->cutoffLocation, 0.1f); - glUniform4f(font->colorLocation, 0.0, 0.0, 0.0, ((color >> 24) & 0xFF) / 128.0f); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - glUniform1f(font->cutoffLocation, 0.7f); - glUniform4f(font->colorLocation, (color & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, ((color >> 16) & 0xFF) / 255.0f, ((color >> 24) & 0xFF) / 255.0f); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); - - glBindVertexArray(0); - glUseProgram(0); + ++font->currentGlyph; } -void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIconSize(struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { if (icon >= GUI_ICON_MAX) { return; } @@ -330,6 +408,32 @@ void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, h = metric.height * 2; } + if (font->currentGlyph >= MAX_GLYPHS) { + GUIFontDrawSubmit(font); + } + + int offset = font->currentGlyph; + + font->originData[offset][0] = x + w / 2 - metric.width; + font->originData[offset][1] = y + h / 2 - metric.height; + font->originData[offset][2] = 0; + font->glyphData[offset][0] = metric.x * 2; + font->glyphData[offset][1] = metric.y * 2 + 256; + font->dimsData[offset][0] = metric.width * 2; + font->dimsData[offset][1] = metric.height * 2; + font->transformData[0][offset][0] = w * 0.5f / metric.width; + font->transformData[0][offset][1] = 0.0f; + font->transformData[1][offset][0] = 0.0f; + font->transformData[1][offset][1] = h * 0.5f / metric.height; + font->colorData[offset][0] = (color & 0xFF) / 255.0f; + font->colorData[offset][1] = ((color >> 8) & 0xFF) / 255.0f; + font->colorData[offset][2] = ((color >> 16) & 0xFF) / 255.0f; + font->colorData[offset][3] = ((color >> 24) & 0xFF) / 255.0f; + + ++font->currentGlyph; +} + +void GUIFontDrawSubmit(struct GUIFont* font) { glUseProgram(font->program); glBindVertexArray(font->vao); glActiveTexture(GL_TEXTURE0); @@ -339,18 +443,40 @@ void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glUniform1i(font->texLocation, 0); - glUniform2f(font->glyphLocation, metric.x * 2, metric.y * 2 + 256); - glUniform2f(font->dimsLocation, metric.width * 2, metric.height * 2); - glUniform3f(font->originLocation, x + w / 2 - metric.width, y + h / 2 - metric.height, 0); - glUniformMatrix2fv(font->transformLocation, 1, GL_FALSE, (float[4]) {w * 0.5f / metric.width, 0.0, 0.0, h * 0.5f / metric.height}); + + glBindBuffer(GL_ARRAY_BUFFER, font->originVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 3 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 3 * font->currentGlyph, font->originData); + + glBindBuffer(GL_ARRAY_BUFFER, font->glyphVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 2 * font->currentGlyph, font->glyphData); + + glBindBuffer(GL_ARRAY_BUFFER, font->dimsVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 2 * font->currentGlyph, font->dimsData); + + glBindBuffer(GL_ARRAY_BUFFER, font->transformVbo[0]); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 2 * font->currentGlyph, font->transformData[0]); + + glBindBuffer(GL_ARRAY_BUFFER, font->transformVbo[1]); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 2 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 2 * font->currentGlyph, font->transformData[1]); + + glBindBuffer(GL_ARRAY_BUFFER, font->colorVbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * 4 * MAX_GLYPHS, NULL, GL_STREAM_DRAW); + glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * 4 * font->currentGlyph, font->colorData); glUniform1f(font->cutoffLocation, 0.1f); - glUniform4f(font->colorLocation, 0.0, 0.0, 0.0, ((color >> 24) & 0xFF) / 128.0f); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glUniform3f(font->colorModulusLocation, 0.f, 0.f, 0.f); + glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, font->currentGlyph); glUniform1f(font->cutoffLocation, 0.7f); - glUniform4f(font->colorLocation, ((color >> 16) & 0xFF) / 255.0f, ((color >> 8) & 0xFF) / 255.0f, (color & 0xFF) / 255.0f, ((color >> 24) & 0xFF) / 255.0f); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + glUniform3f(font->colorModulusLocation, 1.f, 1.f, 1.f); + glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, font->currentGlyph); + + font->currentGlyph = 0; glBindVertexArray(0); glUseProgram(0); diff --git a/src/platform/switch/main.c b/src/platform/switch/main.c index 9c300eab1..67133eb11 100644 --- a/src/platform/switch/main.c +++ b/src/platform/switch/main.c @@ -21,10 +21,15 @@ #define AUTO_INPUT 0x4E585031 #define SAMPLES 0x200 -#define BUFFER_SIZE 0x1000 #define N_BUFFERS 4 #define ANALOG_DEADZONE 0x4000 +#if (SAMPLES * 4) < 0x1000 +#define BUFFER_SIZE 0x1000 +#else +#define BUFFER_SIZE (SAMPLES * 4) +#endif + TimeType __nx_time_type = TimeType_UserSystemClock; static EGLDisplay s_display; @@ -78,6 +83,7 @@ static GLuint colorLocation; static GLuint tex; static GLuint oldTex; +static struct GUIFont* font; static color_t* frameBuffer; static struct mAVStream stream; static struct mSwitchRumble { @@ -88,7 +94,6 @@ static struct mSwitchRumble { } rumble; static struct mRotationSource rotation = {0}; static int audioBufferActive; -static struct GBAStereoSample audioBuffer[N_BUFFERS][SAMPLES] __attribute__((__aligned__(0x1000))); static AudioOutBuffer audoutBuffer[N_BUFFERS]; static int enqueuedBuffers; static bool frameLimiter = true; @@ -110,6 +115,8 @@ static float gyroZ = 0; static float tiltX = 0; static float tiltY = 0; +static struct GBAStereoSample audioBuffer[N_BUFFERS][BUFFER_SIZE / 4] __attribute__((__aligned__(0x1000))); + static enum ScreenMode { SM_PA, SM_AF, @@ -203,22 +210,22 @@ static uint32_t _pollInput(const struct mInputMap* map) { HidAnalogStickState jspos = padGetStickPos(&pad, 0); - int l = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_LSTICK_LEFT)); - int r = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_LSTICK_RIGHT)); - int u = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_LSTICK_UP)); - int d = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_LSTICK_DOWN)); + int l = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_StickLLeft)); + int r = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_StickLRight)); + int u = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_StickLUp)); + int d = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_StickLDown)); if (l == -1) { - l = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_DLEFT)); + l = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_Left)); } if (r == -1) { - r = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_DRIGHT)); + r = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_Right)); } if (u == -1) { - u = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_DUP)); + u = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_Up)); } if (d == -1) { - d = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(KEY_DDOWN)); + d = mInputMapKey(map, AUTO_INPUT, __builtin_ctz(HidNpadButton_Down)); } if (jspos.x < -ANALOG_DEADZONE && l != -1) { @@ -247,6 +254,35 @@ static enum GUICursorState _pollCursor(unsigned* x, unsigned* y) { return GUI_CURSOR_DOWN; } +static void _updateRenderer(struct mGUIRunner* runner, bool gl) { + if (gl) { + runner->core->setVideoGLTex(runner->core, tex); + usePbo = false; + } else { + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + runner->core->setVideoBuffer(runner->core, frameBuffer, 256); + usePbo = true; + } +} + +static int _audioWait(u64 timeout) { + AudioOutBuffer* releasedBuffers; + u32 nReleasedBuffers = 0; + Result rc; + if (timeout) { + rc = audoutWaitPlayFinish(&releasedBuffers, &nReleasedBuffers, timeout); + } else { + rc = audoutGetReleasedAudioOutBuffer(&releasedBuffers, &nReleasedBuffers); + } + if (R_FAILED(rc)) { + return 0; + } + enqueuedBuffers -= nReleasedBuffers; + return nReleasedBuffers; +} + static void _setup(struct mGUIRunner* runner) { _mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_A, GBA_KEY_A); _mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_B, GBA_KEY_B); @@ -259,17 +295,11 @@ static void _setup(struct mGUIRunner* runner) { _mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_L, GBA_KEY_L); _mapKey(&runner->core->inputMap, AUTO_INPUT, HidNpadButton_R, GBA_KEY_R); - int fakeBool; - if (mCoreConfigGetIntValue(&runner->config, "hwaccelVideo", &fakeBool) && fakeBool && runner->core->supportsFeature(runner->core, mCORE_FEATURE_OPENGL)) { - runner->core->setVideoGLTex(runner->core, tex); - usePbo = false; - } else { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, tex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); - runner->core->setVideoBuffer(runner->core, frameBuffer, 256); - usePbo = true; + int fakeBool = false; + if (runner->core->supportsFeature(runner->core, mCORE_FEATURE_OPENGL)) { + mCoreConfigGetIntValue(&runner->config, "hwaccelVideo", &fakeBool); } + _updateRenderer(runner, fakeBool); runner->core->setPeripheral(runner->core, mPERIPH_RUMBLE, &rumble.d); runner->core->setPeripheral(runner->core, mPERIPH_ROTATION, &rotation); @@ -322,9 +352,16 @@ static void _gameLoaded(struct mGUIRunner* runner) { } } - int scale; - if (mCoreConfigGetUIntValue(&runner->config, "videoScale", &scale)) { - runner->core->reloadConfigOption(runner->core, "videoScale", &runner->config); + if (runner->core->supportsFeature(runner->core, mCORE_FEATURE_OPENGL)) { + if (mCoreConfigGetIntValue(&runner->config, "hwaccelVideo", &fakeBool) && fakeBool == usePbo) { + _updateRenderer(runner, fakeBool); + runner->core->reloadConfigOption(runner->core, "hwaccelVideo", &runner->config); + } + + unsigned scale; + if (mCoreConfigGetUIntValue(&runner->config, "videoScale", &scale)) { + runner->core->reloadConfigOption(runner->core, "videoScale", &runner->config); + } } rumble.up = 0; @@ -506,10 +543,7 @@ static void _setFrameLimiter(struct mGUIRunner* runner, bool limit) { UNUSED(runner); if (!frameLimiter && limit) { while (enqueuedBuffers > 2) { - AudioOutBuffer* releasedBuffers; - u32 audoutNReleasedBuffers; - audoutWaitPlayFinish(&releasedBuffers, &audoutNReleasedBuffers, 100000000); - enqueuedBuffers -= audoutNReleasedBuffers; + _audioWait(100000000); } } frameLimiter = limit; @@ -536,29 +570,25 @@ static bool _running(struct mGUIRunner* runner) { static void _postAudioBuffer(struct mAVStream* stream, blip_t* left, blip_t* right) { UNUSED(stream); - AudioOutBuffer* releasedBuffers; - u32 audoutNReleasedBuffers; - audoutGetReleasedAudioOutBuffer(&releasedBuffers, &audoutNReleasedBuffers); - enqueuedBuffers -= audoutNReleasedBuffers; - if (!frameLimiter && enqueuedBuffers >= N_BUFFERS) { - blip_clear(left); - blip_clear(right); - return; - } - if (enqueuedBuffers >= N_BUFFERS - 1 && R_SUCCEEDED(audoutWaitPlayFinish(&releasedBuffers, &audoutNReleasedBuffers, 10000000))) { - enqueuedBuffers -= audoutNReleasedBuffers; + _audioWait(0); + while (enqueuedBuffers >= N_BUFFERS - 1) { + if (!frameLimiter) { + blip_clear(left); + blip_clear(right); + return; + } + _audioWait(10000000); } if (enqueuedBuffers >= N_BUFFERS) { blip_clear(left); blip_clear(right); return; } - struct GBAStereoSample* samples = audioBuffer[audioBufferActive]; blip_read_samples(left, &samples[0].left, SAMPLES, true); blip_read_samples(right, &samples[0].right, SAMPLES, true); audoutAppendAudioOutBuffer(&audoutBuffer[audioBufferActive]); - audioBufferActive += 1; + ++audioBufferActive; audioBufferActive %= N_BUFFERS; ++enqueuedBuffers; } @@ -640,6 +670,10 @@ static void _guiPrepare(void) { glViewport(0, 1080 - vheight, vwidth, vheight); } +static void _guiFinish(void) { + GUIFontDrawSubmit(font); +} + int main(int argc, char* argv[]) { NWindow* window = nwindowGetDefault(); nwindowSetDimensions(window, 1920, 1080); @@ -651,7 +685,7 @@ int main(int argc, char* argv[]) { audoutInitialize(); psmInitialize(); - struct GUIFont* font = GUIFontCreate(); + font = GUIFontCreate(); vmode = appletGetOperationMode(); if (vmode == AppletOperationMode_Console) { @@ -802,7 +836,7 @@ int main(int argc, char* argv[]) { _drawStart, _drawEnd, _pollInput, _pollCursor, _batteryState, - _guiPrepare, NULL, + _guiPrepare, _guiFinish, }, .keySources = (struct GUIInputKeys[]) { { @@ -884,7 +918,7 @@ int main(int argc, char* argv[]) { .nStates = 16 }, { - .title = "GPU-accelerated renderer (requires game reload)", + .title = "GPU-accelerated renderer", .data = "hwaccelVideo", .submenu = 0, .state = 0, @@ -946,13 +980,13 @@ int main(int argc, char* argv[]) { }; mGUIInit(&runner, "switch"); - _mapKey(&runner.params.keyMap, AUTO_INPUT, KEY_A, GUI_INPUT_SELECT); - _mapKey(&runner.params.keyMap, AUTO_INPUT, KEY_B, GUI_INPUT_BACK); - _mapKey(&runner.params.keyMap, AUTO_INPUT, KEY_X, GUI_INPUT_CANCEL); - _mapKey(&runner.params.keyMap, AUTO_INPUT, KEY_DUP, GUI_INPUT_UP); - _mapKey(&runner.params.keyMap, AUTO_INPUT, KEY_DDOWN, GUI_INPUT_DOWN); - _mapKey(&runner.params.keyMap, AUTO_INPUT, KEY_DLEFT, GUI_INPUT_LEFT); - _mapKey(&runner.params.keyMap, AUTO_INPUT, KEY_DRIGHT, GUI_INPUT_RIGHT); + _mapKey(&runner.params.keyMap, AUTO_INPUT, HidNpadButton_A, GUI_INPUT_SELECT); + _mapKey(&runner.params.keyMap, AUTO_INPUT, HidNpadButton_B, GUI_INPUT_BACK); + _mapKey(&runner.params.keyMap, AUTO_INPUT, HidNpadButton_X, GUI_INPUT_CANCEL); + _mapKey(&runner.params.keyMap, AUTO_INPUT, HidNpadButton_Up, GUI_INPUT_UP); + _mapKey(&runner.params.keyMap, AUTO_INPUT, HidNpadButton_Down, GUI_INPUT_DOWN); + _mapKey(&runner.params.keyMap, AUTO_INPUT, HidNpadButton_Left, GUI_INPUT_LEFT); + _mapKey(&runner.params.keyMap, AUTO_INPUT, HidNpadButton_Right, GUI_INPUT_RIGHT); audoutStartAudioOut(); diff --git a/src/platform/wii/gui-font.c b/src/platform/wii/gui-font.c index 1a247c751..b539154eb 100644 --- a/src/platform/wii/gui-font.c +++ b/src/platform/wii/gui-font.c @@ -84,12 +84,10 @@ void GUIFontIconMetrics(const struct GUIFont* font, enum GUIIcon icon, unsigned* } } -void GUIFontDrawGlyph(const struct GUIFont* font, int x, int y, uint32_t color, uint32_t glyph) { +void GUIFontDrawGlyph(struct GUIFont* font, int x, int y, uint32_t color, uint32_t glyph) { color = (color >> 24) | (color << 8); GXTexObj tex; - // Grumble grumble, libogc is bad about const-correctness - struct GUIFont* ncfont = font; - TPL_GetTexture(&ncfont->tdf, 0, &tex); + TPL_GetTexture(&font->tdf, 0, &tex); GX_LoadTexObj(&tex, GX_TEXMAP0); GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); @@ -120,7 +118,7 @@ void GUIFontDrawGlyph(const struct GUIFont* font, int x, int y, uint32_t color, GX_End(); } -void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIcon(struct GUIFont* font, int x, int y, enum GUIAlignment align, enum GUIOrientation orient, uint32_t color, enum GUIIcon icon) { if (icon >= GUI_ICON_MAX) { return; } @@ -128,8 +126,7 @@ void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment color = (color >> 24) | (color << 8); GXTexObj tex; - struct GUIFont* ncfont = font; - TPL_GetTexture(&ncfont->iconsTdf, 0, &tex); + TPL_GetTexture(&font->iconsTdf, 0, &tex); GX_LoadTexObj(&tex, GX_TEXMAP0); GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); @@ -198,7 +195,7 @@ void GUIFontDrawIcon(const struct GUIFont* font, int x, int y, enum GUIAlignment GX_End(); } -void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { +void GUIFontDrawIconSize(struct GUIFont* font, int x, int y, int w, int h, uint32_t color, enum GUIIcon icon) { if (icon >= GUI_ICON_MAX) { return; } @@ -206,8 +203,7 @@ void GUIFontDrawIconSize(const struct GUIFont* font, int x, int y, int w, int h, color = (color >> 24) | (color << 8); GXTexObj tex; - struct GUIFont* ncfont = font; - TPL_GetTexture(&ncfont->iconsTdf, 0, &tex); + TPL_GetTexture(&font->iconsTdf, 0, &tex); GX_LoadTexObj(&tex, GX_TEXMAP0); GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); diff --git a/src/util/gui/font.c b/src/util/gui/font.c index 04a22153c..ab25419d3 100644 --- a/src/util/gui/font.c +++ b/src/util/gui/font.c @@ -26,7 +26,7 @@ unsigned GUIFontSpanWidth(const struct GUIFont* font, const char* text) { return width; } -void GUIFontPrint(const struct GUIFont* font, int x, int y, enum GUIAlignment align, uint32_t color, const char* text) { +void GUIFontPrint(struct GUIFont* font, int x, int y, enum GUIAlignment align, uint32_t color, const char* text) { switch (align & GUI_ALIGN_HCENTER) { case GUI_ALIGN_HCENTER: x -= GUIFontSpanWidth(font, text) / 2; @@ -55,7 +55,7 @@ void GUIFontPrint(const struct GUIFont* font, int x, int y, enum GUIAlignment al } } -void GUIFontPrintf(const struct GUIFont* font, int x, int y, enum GUIAlignment align, uint32_t color, const char* text, ...) { +void GUIFontPrintf(struct GUIFont* font, int x, int y, enum GUIAlignment align, uint32_t color, const char* text, ...) { char buffer[256]; va_list args; va_start(args, text);