From b02b9930473ebdde980e73403dae58a2c4516349 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Thu, 1 Mar 2018 10:15:22 -0800 Subject: [PATCH 01/10] GB: Cancel IRQs if interrupt is unasserted before dispatch (fixes #1000, #1003) --- src/gb/gb.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gb/gb.c b/src/gb/gb.c index dd99b2bac..4d404e83c 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -612,6 +612,7 @@ void GBDetectModel(struct GB* gb) { void GBUpdateIRQs(struct GB* gb) { int irqs = gb->memory.ie & gb->memory.io[REG_IF]; if (!irqs) { + gb->cpu->irqPending = false; return; } gb->cpu->halted = false; From 92fd0444ce5ba087784d8de0c6afcb39d3bdafe9 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 3 Mar 2018 14:44:47 -0800 Subject: [PATCH 02/10] README: Update supported information --- README.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4355e5207..53d85f1ff 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Up-to-date news and downloads can be found at [mgba.io](https://mgba.io/). Features -------- -- Near full Game Boy Advance hardware support[[1]](#missing). +- Highly accurate Game Boy Advance hardware support[[1]](#missing). - Game Boy/Game Boy Color hardware support. - Fast emulation. Known to run at full speed even on low end hardware, such as netbooks. - Qt and SDL ports for a heavy-weight and a light-weight frontend. @@ -18,6 +18,7 @@ Features - Save type detection, even for flash memory size[[2]](#flashdetect). - Support for cartridges with motion sensors and rumble (only usable with game controllers). - Real-time clock support, even without configuration. +- Solar sensor support for Boktai games. - Game Boy Camera and Game Boy Printer support. - A built-in BIOS implementation, and ability to load external BIOS files. - Turbo/fast-forward support by holding Tab. @@ -36,6 +37,31 @@ Features - Cores available for RetroArch/Libretro and OpenEmu. - Many, many smaller things. +#### Game Boy mappers + +The following mappers are fully supported: + +- MBC1 +- MBC1M +- MBC2 +- MBC3 +- MBC3+RTC +- MBC5 +- MBC5+Rumble +- MBC7 + +The following mappers are partially supported: + +- Pocket Cam +- TAMA5 +- HuC-3 + +The following mappers are not currently supported: + +- MBC6 +- HuC-1 +- MMM01 + ### Planned features - Networked multiplayer link cable support. From 2f7d555f4995f3ef0801d8dda609a465cf196c75 Mon Sep 17 00:00:00 2001 From: Lothar Serra Mari Date: Sun, 4 Mar 2018 11:48:38 +0100 Subject: [PATCH 03/10] README: Update supported information in README_DE --- README_DE.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/README_DE.md b/README_DE.md index ddf87480f..09a0f35ad 100644 --- a/README_DE.md +++ b/README_DE.md @@ -10,7 +10,7 @@ Aktuelle Neuigkeiten und Downloads findest Du auf [mgba.io](https://mgba.io). Features -------- -- Nahzu vollständige Unterstützung der Game Boy Advance-Hardware[[1]](#missing). +- Sehr genaue Unterstützung der Game Boy Advance-Hardware[[1]](#missing). - Unterstützung der Game Boy-/Game Boy Color-Hardware. - Schnelle Emulation. mGBA ist dafür bekannt, auch auf schwacher Hardware wie Netbooks mit voller Geschwindigkeit zu laufen. - Qt- und SDL-Portierungen für eine vollwertige und eine "leichtgewichtige" Benutzeroberfläche. @@ -18,6 +18,7 @@ Features - Erkennung des Speichertypes, einschließlich der Größe des Flash-Speichers[[2]](#flashdetect). - Unterstützung für Spielmodule mit Bewegungssensoren und Rüttel-Effekten (nur verwendbar mit Spiele-Controllern). - Unterstützung für Echtzeituhren, selbst ohne Konfiguration. +- Unterstützung für den Lichtsensor in Boktai-Spielen - Unterstützung für Game Boy Printer und Game Boy Camera. - Eingebaute BIOS-Implementierung mit der Möglichkeit, externe BIOS-Dateien zu laden. - Turbo/Vorlauf-Unterstützung durch drücken der Tab-Taste. @@ -36,6 +37,31 @@ Features - Verfügbare Cores für RetroArch/Libretro und OpenEmu. - Viele, viele kleinere Dinge. +### Game Boy-Mapper + +Die folgenden Mapper werden vollständig unterstützt: + +- MBC1 +- MBC1M +- MBC2 +- MBC3 +- MBC3+RTC (MBC3+Echtzeituhr) +- MBC5 +- MBC5+Rumble (MBC5+Rüttel-Modul) +- MBC7 + +Die folgenden Mapper werden teilweise unterstützt: + +- Pocket Cam +- TAMA5 +- HuC-3 + +Die folgenden Mapper werden derzeit nicht unterstützt: + +- MBC6 +- HuC-1 +- MMM01 + ### Geplante Features - Unterstützung für Link-Kabel-Multiplayer über ein Netzwerk. From 253ca1d1b806962487fcf892d5d03442f512f27d Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Wed, 7 Mar 2018 09:25:11 -0800 Subject: [PATCH 04/10] Qt: Fix build when sqlite and debugger support is disabled (fixes #1007) --- src/platform/qt/Window.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index 094140f43..d0d822ecd 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -412,7 +412,9 @@ void Window::openSettingsWindow() { connect(settingsWindow, &SettingsView::cameraDriverChanged, this, &Window::mustRestart); connect(settingsWindow, &SettingsView::languageChanged, this, &Window::mustRestart); connect(settingsWindow, &SettingsView::pathsChanged, this, &Window::reloadConfig); +#ifdef USE_SQLITE3 connect(settingsWindow, &SettingsView::libraryCleared, m_libraryView, &LibraryController::clear); +#endif openView(settingsWindow); } @@ -1830,13 +1832,17 @@ void Window::setController(CoreController* controller, const QString& fname) { connect(m_controller.get(), &CoreController::failed, this, &Window::gameFailed); connect(m_controller.get(), &CoreController::unimplementedBiosCall, this, &Window::unimplementedBiosCall); +#ifdef USE_GDB_STUB if (m_gdbController) { m_gdbController->setController(m_controller); } +#endif +#ifdef USE_DEBUGGERS if (m_console) { m_console->setController(m_controller); } +#endif #ifdef USE_MAGICK if (m_gifView) { From 3443c141692ccd12240b2f69b6d7b14083f8d149 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 9 Mar 2018 22:30:04 -0800 Subject: [PATCH 05/10] Core: Fix some linking issues when debuggers are disabled --- include/mgba/core/core.h | 2 ++ src/core/core.c | 3 ++- src/gba/core.c | 2 ++ src/platform/python/engine.c | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/include/mgba/core/core.h b/include/mgba/core/core.h index 59d9e429a..607a15a4e 100644 --- a/include/mgba/core/core.h +++ b/include/mgba/core/core.h @@ -196,8 +196,10 @@ void* mCoreGetMemoryBlock(struct mCore* core, uint32_t start, size_t* size); #ifdef USE_ELF struct ELF; bool mCoreLoadELF(struct mCore* core, struct ELF* elf); +#ifdef USE_DEBUGGERS void mCoreLoadELFSymbols(struct mDebuggerSymbols* symbols, struct ELF*); #endif +#endif CXX_GUARD_END diff --git a/src/core/core.c b/src/core/core.c index 39dbec636..343e11ce8 100644 --- a/src/core/core.c +++ b/src/core/core.c @@ -344,6 +344,7 @@ bool mCoreLoadELF(struct mCore* core, struct ELF* elf) { return true; } +#ifdef USE_DEBUGGERS void mCoreLoadELFSymbols(struct mDebuggerSymbols* symbols, struct ELF* elf) { size_t symIndex = ELFFindSection(elf, ".symtab"); size_t names = ELFFindSection(elf, ".strtab"); @@ -363,5 +364,5 @@ void mCoreLoadELFSymbols(struct mDebuggerSymbols* symbols, struct ELF* elf) { mDebuggerSymbolAdd(symbols, name, syms[i].st_value, -1); } } - +#endif #endif diff --git a/src/gba/core.c b/src/gba/core.c index 8c307ceff..0abd5ec6e 100644 --- a/src/gba/core.c +++ b/src/gba/core.c @@ -716,7 +716,9 @@ static void _GBACoreLoadSymbols(struct mCore* core, struct VFile* vf) { } struct ELF* elf = ELFOpen(vf); if (elf) { +#ifdef USE_DEBUGGERS mCoreLoadELFSymbols(core->symbolTable, elf); +#endif ELFClose(elf); } if (closeAfter) { diff --git a/src/platform/python/engine.c b/src/platform/python/engine.c index 6222039a0..e6b2c0cf6 100644 --- a/src/platform/python/engine.c +++ b/src/platform/python/engine.c @@ -83,10 +83,12 @@ bool mPythonScriptEngineLoadScript(struct mScriptEngine* se, const char* name, s void mPythonScriptEngineRun(struct mScriptEngine* se) { struct mPythonScriptEngine* engine = (struct mPythonScriptEngine*) se; +#ifdef USE_DEBUGGERS struct mDebugger* debugger = mScriptBridgeGetDebugger(engine->sb); if (debugger) { mPythonSetDebugger(debugger); } +#endif mPythonRunPending(); } From 35e27ea19f628d973a684fc675019f571e0cf2ee Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 10 Mar 2018 16:19:05 -0800 Subject: [PATCH 06/10] GBA Memory: Fix AGBPrint running out of memory on Wii (fixes #1001) --- src/gba/memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gba/memory.c b/src/gba/memory.c index c7cd86d26..fa279104f 100644 --- a/src/gba/memory.c +++ b/src/gba/memory.c @@ -1629,7 +1629,7 @@ void _pristineCow(struct GBA* gba) { if (!gba->isPristine) { return; } -#ifndef FIXED_ROM_BUFFER +#if !defined(FIXED_ROM_BUFFER) && !defined(__wii__) void* newRom = anonymousMemoryMap(SIZE_CART0); memcpy(newRom, gba->memory.rom, gba->memory.romSize); memset(((uint8_t*) newRom) + gba->memory.romSize, 0xFF, SIZE_CART0 - gba->memory.romSize); From 351774ec2f7ea8a185331bfa27783e3e6466e706 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 10 Mar 2018 17:24:54 -0800 Subject: [PATCH 07/10] Qt: Simplify window background drawing --- src/platform/qt/Window.cpp | 40 ++++++++++++++++++++++---------------- src/platform/qt/Window.h | 8 +++++++- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index d0d822ecd..f548a900d 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -963,6 +963,7 @@ void Window::openStateWindow(LoadSave ls) { } m_stateWindow->setAttribute(Qt::WA_DeleteOnClose); m_stateWindow->setMode(ls); + updateFrame(); attachWidget(m_stateWindow); } @@ -1759,6 +1760,16 @@ void Window::focusCheck() { } } +void Window::updateFrame() { + QSize size = m_controller->screenDimensions(); + QImage currentImage(reinterpret_cast(m_controller->drawContext()), size.width(), size.height(), + size.width() * BYTES_PER_PIXEL, QImage::Format_RGBX8888); + QPixmap pixmap; + pixmap.convertFromImage(currentImage); + m_screenWidget->setPixmap(pixmap); + emit paused(true); +} + void Window::setController(CoreController* controller, const QString& fname) { if (!controller) { return; @@ -1795,15 +1806,8 @@ void Window::setController(CoreController* controller, const QString& fname) { }); } connect(m_controller.get(), &CoreController::stopping, &m_inputController, &InputController::resumeScreensaver); - connect(m_controller.get(), &CoreController::paused, [this]() { - QSize size = m_controller->screenDimensions(); - QImage currentImage(reinterpret_cast(m_controller->drawContext()), size.width(), size.height(), - size.width() * BYTES_PER_PIXEL, QImage::Format_RGBX8888); - QPixmap pixmap; - pixmap.convertFromImage(currentImage); - m_screenWidget->setPixmap(pixmap); - emit paused(true); - }); + connect(m_controller.get(), &CoreController::paused, this, &Window::updateFrame); + #ifndef Q_OS_MAC connect(m_controller.get(), &CoreController::paused, menuBar(), &QWidget::show); connect(m_controller.get(), &CoreController::unpaused, [this]() { @@ -1874,11 +1878,15 @@ void Window::setController(CoreController* controller, const QString& fname) { } WindowBackground::WindowBackground(QWidget* parent) - : QLabel(parent) + : QWidget(parent) { setLayout(new QStackedLayout()); layout()->setContentsMargins(0, 0, 0, 0); - setAlignment(Qt::AlignCenter); +} + +void WindowBackground::setPixmap(const QPixmap& pmap) { + m_pixmap = pmap; + update(); } void WindowBackground::setSizeHint(const QSize& hint) { @@ -1902,11 +1910,9 @@ void WindowBackground::setLockAspectRatio(bool lock) { m_lockAspectRatio = lock; } -void WindowBackground::paintEvent(QPaintEvent*) { - const QPixmap* logo = pixmap(); - if (!logo) { - return; - } +void WindowBackground::paintEvent(QPaintEvent* event) { + QWidget::paintEvent(event); + const QPixmap& logo = pixmap(); QPainter painter(this); painter.setRenderHint(QPainter::SmoothPixmapTransform); painter.fillRect(QRect(QPoint(), size()), Qt::black); @@ -1925,5 +1931,5 @@ void WindowBackground::paintEvent(QPaintEvent*) { } QPoint origin = QPoint((s.width() - ds.width()) / 2, (s.height() - ds.height()) / 2); QRect full(origin, ds); - painter.drawPixmap(full, *logo); + painter.drawPixmap(full, logo); } diff --git a/src/platform/qt/Window.h b/src/platform/qt/Window.h index 5483478e1..baca971ea 100644 --- a/src/platform/qt/Window.h +++ b/src/platform/qt/Window.h @@ -134,6 +134,8 @@ private slots: void showFPS(); void focusCheck(); + void updateFrame(); + private: static const int FPS_TIMER_INTERVAL = 2000; static const int FRAME_LIST_SIZE = 120; @@ -222,22 +224,26 @@ private: #endif }; -class WindowBackground : public QLabel { +class WindowBackground : public QWidget { Q_OBJECT public: WindowBackground(QWidget* parent = 0); + void setPixmap(const QPixmap& pixmap); void setSizeHint(const QSize& size); virtual QSize sizeHint() const override; void setDimensions(int width, int height); void setLockIntegerScaling(bool lock); void setLockAspectRatio(bool lock); + const QPixmap& pixmap() const { return m_pixmap; } + protected: virtual void paintEvent(QPaintEvent*) override; private: + QPixmap m_pixmap; QSize m_sizeHint; int m_aspectWidth; int m_aspectHeight; From d22315cba5fb7d8ec6f9b2ae70cf69ecdbde9a88 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sat, 10 Mar 2018 17:37:29 -0800 Subject: [PATCH 08/10] Qt: Simplify display sizing --- src/platform/qt/Display.cpp | 11 ----------- src/platform/qt/Window.cpp | 14 +++++++++----- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/platform/qt/Display.cpp b/src/platform/qt/Display.cpp index e300b9574..fd91993bd 100644 --- a/src/platform/qt/Display.cpp +++ b/src/platform/qt/Display.cpp @@ -8,12 +8,6 @@ #include "DisplayGL.h" #include "DisplayQt.h" -#ifdef M_CORE_GB -#include -#elif defined(M_CORE_GBA) -#include -#endif - using namespace QGBA; #if defined(BUILD_GL) || defined(BUILD_GLES2) || defined(USE_EPOXY) @@ -55,11 +49,6 @@ Display::Display(QWidget* parent) : QWidget(parent) { setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); -#ifdef M_CORE_GB - setMinimumSize(GB_VIDEO_HORIZONTAL_PIXELS, GB_VIDEO_VERTICAL_PIXELS); -#elif defined(M_CORE_GBA) - setMinimumSize(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); -#endif connect(&m_mouseTimer, &QTimer::timeout, this, &Display::hideCursor); m_mouseTimer.setSingleShot(true); m_mouseTimer.setInterval(MOUSE_DISAPPEAR_TIMER); diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index f548a900d..c5d6adf4b 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -668,8 +668,6 @@ void Window::gameStarted() { multiplayerChanged(); updateTitle(); QSize size = m_controller->screenDimensions(); - m_display->setMinimumSize(size); - m_screenWidget->setMinimumSize(m_display->minimumSize()); m_screenWidget->setDimensions(size.width(), size.height()); m_config->updateOption("lockIntegerScaling"); m_config->updateOption("lockAspectRatio"); @@ -677,6 +675,7 @@ void Window::gameStarted() { resizeFrame(size * m_savedScale); } attachWidget(m_display.get()); + m_display->setMinimumSize(size); #ifndef Q_OS_MAC if (isFullScreen()) { @@ -751,7 +750,6 @@ void Window::gameStopped() { #elif defined(M_CORE_GBA) m_display->setMinimumSize(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); #endif - m_screenWidget->setMinimumSize(m_display->minimumSize()); m_videoLayers->clear(); m_audioChannels->clear(); @@ -803,8 +801,7 @@ void Window::reloadDisplayDriver() { m_shaderView.reset(); m_shaderView = std::make_unique(m_display.get(), m_config); #endif - m_screenWidget->setMinimumSize(m_display->minimumSize()); - m_screenWidget->setSizePolicy(m_display->sizePolicy()); + connect(this, &Window::shutdown, m_display.get(), &Display::stopDrawing); connect(m_display.get(), &Display::hideCursor, [this]() { if (static_cast(m_screenWidget->layout())->currentWidget() == m_display.get()) { @@ -830,6 +827,7 @@ void Window::reloadDisplayDriver() { #endif if (m_controller) { + m_display->setMinimumSize(m_controller->screenDimensions()); connect(m_controller.get(), &CoreController::stopping, m_display.get(), &Display::stopDrawing); connect(m_controller.get(), &CoreController::stateLoaded, m_display.get(), &Display::forceDraw); connect(m_controller.get(), &CoreController::rewound, m_display.get(), &Display::forceDraw); @@ -840,6 +838,12 @@ void Window::reloadDisplayDriver() { attachWidget(m_display.get()); m_display->startDrawing(m_controller); + } else { +#ifdef M_CORE_GB + m_display->setMinimumSize(GB_VIDEO_HORIZONTAL_PIXELS, GB_VIDEO_VERTICAL_PIXELS); +#elif defined(M_CORE_GBA) + m_display->setMinimumSize(VIDEO_HORIZONTAL_PIXELS, VIDEO_VERTICAL_PIXELS); +#endif } } From 7e8388089a99f4fa57255192265750e8d70d1647 Mon Sep 17 00:00:00 2001 From: Douglas Christman Date: Sat, 17 Mar 2018 18:20:48 +0800 Subject: [PATCH 09/10] Libretro: Add SGB border option --- src/platform/libretro/libretro.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index fe39a104b..c7c3876b4 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -76,6 +76,16 @@ static void _reloadSettings(void) { opts.skipBios = strcmp(var.value, "ON") == 0; } + var.key = "mgba_sgb_borders"; + var.value = 0; + if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + if (strcmp(var.value, "ON") == 0) { + mCoreConfigSetDefaultIntValue(&core->config, "sgb.borders", true); + } else { + mCoreConfigSetDefaultIntValue(&core->config, "sgb.borders", false); + } + } + var.key = "mgba_idle_optimization"; var.value = 0; if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { @@ -111,6 +121,7 @@ void retro_set_environment(retro_environment_t env) { { "mgba_allow_opposing_directions", "Allow opposing directional input; OFF|ON" }, { "mgba_use_bios", "Use BIOS file if found (requires restart); ON|OFF" }, { "mgba_skip_bios", "Skip BIOS intro (requires restart); OFF|ON" }, + { "mgba_sgb_borders", "Use Super Game Boy borders (requires restart); ON|OFF" }, { "mgba_idle_optimization", "Idle loop removal; Remove Known|Detect and Remove|Don't Remove" }, { "mgba_frameskip", "Frameskip; 0|1|2|3|4|5|6|7|8|9|10" }, { 0, 0 } From 6ad3f7ddc3d61bcd850a74e3433467f4e413627e Mon Sep 17 00:00:00 2001 From: Lothar Serra Mari Date: Sat, 17 Mar 2018 16:24:04 +0100 Subject: [PATCH 10/10] Doc: Add "libepoxy" to msys/mingw-w64 dependencies The libepoxy library is required for shader support. --- README.md | 4 ++-- README_DE.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 53d85f1ff..f9fab7b63 100644 --- a/README.md +++ b/README.md @@ -136,11 +136,11 @@ To build on Windows for development, using MSYS2 is recommended. Follow the inst For x86 (32 bit) builds: - pacman -Sy mingw-w64-i686-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2,ntldd-git} + pacman -Sy mingw-w64-i686-{cmake,ffmpeg,gcc,gdb,imagemagick,libepoxy,libzip,pkg-config,qt5,SDL2,ntldd-git} For x86_64 (64 bit) builds: - pacman -Sy mingw-w64-x86_64-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2,ntldd-git} + pacman -Sy mingw-w64-x86_64-{cmake,ffmpeg,gcc,gdb,imagemagick,libepoxy,libzip,pkg-config,qt5,SDL2,ntldd-git} Check out the source code by running this command: diff --git a/README_DE.md b/README_DE.md index 09a0f35ad..f5b7affe3 100644 --- a/README_DE.md +++ b/README_DE.md @@ -136,11 +136,11 @@ Um mGBA auf Windows zu kompilieren, wird MSYS2 empfohlen. Befolge die Installati Für x86 (32 Bit): - pacman -Sy mingw-w64-i686-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2,ntldd-git} + pacman -Sy mingw-w64-i686-{cmake,ffmpeg,gcc,gdb,imagemagick,libepoxy,libzip,pkg-config,qt5,SDL2,ntldd-git} Für x86_64 (64 Bit): - pacman -Sy mingw-w64-x86_64-{cmake,ffmpeg,gcc,gdb,imagemagick,libzip,pkg-config,qt5,SDL2,ntldd-git} + pacman -Sy mingw-w64-x86_64-{cmake,ffmpeg,gcc,gdb,imagemagick,libepoxy,libzip,pkg-config,qt5,SDL2,ntldd-git} Lade den aktuellen mGBA-Quellcode mithilfe des folgenden Kommandos herunter: