From f28e20d4aab2e3f48feeec4cc576a05ae9aa144f Mon Sep 17 00:00:00 2001 From: Douglas Christman Date: Tue, 27 Mar 2018 10:34:54 +0800 Subject: [PATCH 01/10] Libretro: Allow setting model to Game Boy Advance --- src/platform/libretro/libretro.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index df67de786..5f3187692 100644 --- a/src/platform/libretro/libretro.c +++ b/src/platform/libretro/libretro.c @@ -66,7 +66,7 @@ static void _reloadSettings(void) { enum GBModel model; const char* modelName; - var.key = "mgba_model"; + var.key = "mgba_gb_model"; var.value = 0; if (environCallback(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (strcmp(var.value, "Game Boy") == 0) { @@ -75,6 +75,8 @@ static void _reloadSettings(void) { model = GB_MODEL_SGB; } else if (strcmp(var.value, "Game Boy Color") == 0) { model = GB_MODEL_CGB; + } else if (strcmp(var.value, "Game Boy Advance") == 0) { + model = GB_MODEL_AGB; } else { model = GB_MODEL_AUTODETECT; } @@ -140,7 +142,7 @@ void retro_set_environment(retro_environment_t env) { struct retro_variable vars[] = { { "mgba_solar_sensor_level", "Solar sensor level; 0|1|2|3|4|5|6|7|8|9|10" }, { "mgba_allow_opposing_directions", "Allow opposing directional input; OFF|ON" }, - { "mgba_model", "Game Boy model (requires restart); Autodetect|Game Boy|Super Game Boy|Game Boy Color" }, + { "mgba_gb_model", "Game Boy model (requires restart); Autodetect|Game Boy|Super Game Boy|Game Boy Color|Game Boy Advance" }, { "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" }, @@ -482,6 +484,7 @@ bool retro_load_game(const struct retro_game_info* game) { } switch (gb->model) { + case GB_MODEL_AGB: case GB_MODEL_CGB: biosName = "gbc_bios.bin"; break; From 36de596fdbe9190a52ab40318a02b9d37806ce35 Mon Sep 17 00:00:00 2001 From: Douglas Christman Date: Thu, 29 Mar 2018 11:11:18 +0800 Subject: [PATCH 02/10] GB: Fix GBC games running on GBA with BIOS GBC games can detect if they are running on a GBA by checking if the low bit of register B is set to 1. B is set in `GBSkipBIOS`, but B was not updated when loading a real BIOS. Load 1 into B after unmapping the BIOS if the model is set to GBA. --- src/gb/gb.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/gb/gb.c b/src/gb/gb.c index 4d404e83c..b932e9eda 100644 --- a/src/gb/gb.c +++ b/src/gb/gb.c @@ -555,6 +555,10 @@ void GBUnmapBIOS(struct GB* gb) { free(gb->memory.romBase); gb->memory.romBase = gb->memory.rom; } + // XXX: Force AGB registers for AGB-mode + if (gb->model == GB_MODEL_AGB && gb->cpu->pc == 0x100) { + gb->cpu->b = 1; + } } void GBDetectModel(struct GB* gb) { From 16eed8ed34d6cbe366fce2d2335b04418c489031 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 30 Mar 2018 21:11:34 -0700 Subject: [PATCH 03/10] GB I/O: Fix SGB command clocking (fixes #1029) --- src/gb/io.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/gb/io.c b/src/gb/io.c index 21a7f696e..88e0f860c 100644 --- a/src/gb/io.c +++ b/src/gb/io.c @@ -106,7 +106,7 @@ static const uint8_t _registerMask[] = { static void _writeSGBBits(struct GB* gb, int bits) { if (!bits) { - gb->sgbBit = 0; + gb->sgbBit = -1; memset(gb->sgbPacket, 0, sizeof(gb->sgbPacket)); } if (bits == gb->currentSgbBits) { @@ -122,9 +122,12 @@ static void _writeSGBBits(struct GB* gb, int bits) { } switch (bits) { case 1: + if (gb->sgbBit < 0) { + return; + } gb->sgbPacket[gb->sgbBit >> 3] |= 1 << (gb->sgbBit & 7); - // Fall through - case 2: + break; + case 3: ++gb->sgbBit; default: break; From 8e46e0ea79d601ed57eab0ee365bc8a9525ed7fb Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Fri, 30 Mar 2018 22:43:26 -0700 Subject: [PATCH 04/10] Qt: Disable CMake policy CMP0071 (fixes #1028) --- src/platform/qt/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 074dfb391..1c2cc919c 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -17,6 +17,10 @@ if(BUILD_SDL) include_directories(${SDL_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/src/platform/sdl) endif() +if(POLICY CMP0071) + cmake_policy(SET CMP0071 OLD) +endif() + set(CMAKE_AUTOMOC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) From c9f50b2c5a644355b4190d44c290032561d1ff33 Mon Sep 17 00:00:00 2001 From: Douglas Christman Date: Sat, 31 Mar 2018 17:59:53 +0800 Subject: [PATCH 05/10] GB Video: Fix windows shifting down by one pixel when rewinding --- src/gb/renderers/software.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 93c67b871..79f0ca5b1 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -209,7 +209,7 @@ static void GBVideoSoftwareRendererUpdateWindow(struct GBVideoSoftwareRenderer* renderer->hasWindow = true; } else { if (!renderer->hasWindow) { - renderer->currentWy = renderer->lastY + 1 - renderer->wy; + renderer->currentWy = renderer->lastY - renderer->wy; } else { renderer->currentWy += renderer->lastY; } From 97e94610e6e8a2e4b38f77224f5702a8f93edcfe Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 2 Apr 2018 12:20:52 -0700 Subject: [PATCH 06/10] GB Video: Fix SGB palettes on load state --- src/gb/renderers/software.c | 3 +++ src/gb/video.c | 14 +++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 79f0ca5b1..92fc927ff 100644 --- a/src/gb/renderers/software.c +++ b/src/gb/renderers/software.c @@ -359,6 +359,9 @@ static void GBVideoSoftwareRendererWriteSGBPacket(struct GBVideoRenderer* render static void GBVideoSoftwareRendererWritePalette(struct GBVideoRenderer* renderer, int index, uint16_t value) { struct GBVideoSoftwareRenderer* softwareRenderer = (struct GBVideoSoftwareRenderer*) renderer; color_t color = mColorFrom555(value); + if (softwareRenderer->model == GB_MODEL_SGB && index < 0x10 && index && !(index & 3)) { + color = softwareRenderer->palette[0]; + } softwareRenderer->palette[index] = color; if (renderer->cache) { mCacheSetWritePalette(renderer->cache, index, color); diff --git a/src/gb/video.c b/src/gb/video.c index aafff0714..667191300 100644 --- a/src/gb/video.c +++ b/src/gb/video.c @@ -606,12 +606,12 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->renderer->writePalette(video->renderer, 1, video->palette[1]); video->renderer->writePalette(video->renderer, 2, video->palette[2]); video->renderer->writePalette(video->renderer, 3, video->palette[3]); - video->renderer->writePalette(video->renderer, 4, video->palette[0]); + video->renderer->writePalette(video->renderer, 4, video->palette[4]); video->renderer->writePalette(video->renderer, 5, video->palette[5]); video->renderer->writePalette(video->renderer, 6, video->palette[6]); video->renderer->writePalette(video->renderer, 7, video->palette[7]); - video->renderer->writePalette(video->renderer, 8, video->palette[0]); - video->renderer->writePalette(video->renderer, 12, video->palette[0]); + video->renderer->writePalette(video->renderer, 8, video->palette[8]); + video->renderer->writePalette(video->renderer, 12, video->palette[12]); break; case SGB_PAL23: video->palette[9] = data[3] | (data[4] << 8); @@ -645,9 +645,9 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { video->renderer->writePalette(video->renderer, 1, video->palette[1]); video->renderer->writePalette(video->renderer, 2, video->palette[2]); video->renderer->writePalette(video->renderer, 3, video->palette[3]); - video->renderer->writePalette(video->renderer, 4, video->palette[0]); - video->renderer->writePalette(video->renderer, 8, video->palette[0]); - video->renderer->writePalette(video->renderer, 12, video->palette[0]); + video->renderer->writePalette(video->renderer, 4, video->palette[4]); + video->renderer->writePalette(video->renderer, 8, video->palette[8]); + video->renderer->writePalette(video->renderer, 12, video->palette[12]); video->renderer->writePalette(video->renderer, 13, video->palette[13]); video->renderer->writePalette(video->renderer, 14, video->palette[14]); video->renderer->writePalette(video->renderer, 15, video->palette[15]); @@ -675,7 +675,7 @@ void GBVideoWriteSGBPacket(struct GBVideo* video, uint8_t* data) { continue; } LOAD_16LE(video->palette[i * 4 + 0], entry * 8 + 0, video->renderer->sgbPalRam); - video->renderer->writePalette(video->renderer, i * 4 + 0, video->palette[0]); + video->renderer->writePalette(video->renderer, i * 4 + 0, video->palette[i * 4 + 0]); LOAD_16LE(video->palette[i * 4 + 1], entry * 8 + 2, video->renderer->sgbPalRam); video->renderer->writePalette(video->renderer, i * 4 + 1, video->palette[i * 4 + 1]); LOAD_16LE(video->palette[i * 4 + 2], entry * 8 + 4, video->renderer->sgbPalRam); From cf3c275daf08fd89095302cff18d4c3e3b09bd67 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 2 Apr 2018 13:21:58 -0700 Subject: [PATCH 07/10] tools: Fix profiling with -N on a remote --- tools/perf.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/perf.py b/tools/perf.py index fdf830a77..67453ddeb 100755 --- a/tools/perf.py +++ b/tools/perf.py @@ -89,8 +89,10 @@ class PerfServer(object): else: server_command = [os.path.join(os.getcwd(), PerfTest.EXECUTABLE)] server_command.extend(['--', '-PD', '0']) - if (hasattr(test, "frames")): - server_command.extend(['-F', str(test.frames)]) + if hasattr(test, "frames"): + server_command.extend(['-F', str(test.frames)]) + if test.renderer != "software": + server_command.append('-N') subprocess.check_call(server_command) time.sleep(4) self.socket = socket.create_connection(self.address, timeout=1000) From 26b809044bc32d633d63dffb7d9fa892a1df3a82 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 2 Apr 2018 17:01:07 -0700 Subject: [PATCH 08/10] CMake: Add CMP0025 policy --- CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3c2abdc07..4aa15f2d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,7 @@ cmake_minimum_required(VERSION 3.1) +if(POLICY CMP0025) + cmake_policy(SET CMP0025 NEW) +endif() project(mGBA) set(BINARY_NAME mgba CACHE INTERNAL "Name of output binaries") if(NOT MSVC) From 7acdf54ee1f93342e5825b94bcc6c22e0663404a Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 3 Apr 2018 19:35:25 -0700 Subject: [PATCH 09/10] Res: Update patrons for April --- res/patrons.txt | 3 --- 1 file changed, 3 deletions(-) diff --git a/res/patrons.txt b/res/patrons.txt index a92093f30..4da58cb0e 100644 --- a/res/patrons.txt +++ b/res/patrons.txt @@ -1,9 +1,6 @@ Jaime J. Denizard Fog -Reilly Grant Philip Horton -mars -pr1ntf Rohit Nirmal Rhys Powell rootfather From e97b4b40c06bfb7985c58816e0cba6e6c9d563b2 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Tue, 3 Apr 2018 19:44:23 -0700 Subject: [PATCH 10/10] CHANGES: Update for 0.6.2 --- CHANGES | 62 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/CHANGES b/CHANGES index 61b8d113f..743f42451 100644 --- a/CHANGES +++ b/CHANGES @@ -24,37 +24,11 @@ Bugfixes: - GB Serialize: Fix game title check - GB: Revamp IRQ handling based on new information - GBA Video: Don't mask out high bits of BLDY (fixes mgba.io/i/899) - - GBA Video: Force align 256-color tiles - - GBA DMA: ROM reads are forced to increment - GB Video: Fix loading states while in mode 3 - - GB Video: Only trigger STAT write IRQs when screen is on (fixes mgba.io/i/912) - - GBA Cheats: Fix PARv3 slide codes (fixes mgba.io/i/919) - - GBA Video: OBJWIN can change blend params after OBJ is drawn (fixes mgba.io/i/921) - GBA DMA: Fix invalid DMA reads (fixes mgba.io/i/142) - - GBA Savedata: Fix crash when resizing flash - GBA Video: Add delay when enabling BGs (fixes mgba.io/i/744, mgba.io/i/752) - - GB Memory: HDMAs should not start when LCD is off (fixes mgba.io/i/310) - - GBA Cheats: Fix slide codes not initializing properly - - Qt: Fix locale being set to English on settings save (fixes mgba.io/i/906) - - LR35902: Fix watchpoints not reporting new value - - GBA Audio: Increase PSG volume (fixes mgba.io/i/932) - - 3DS: Fix opening files in directory names with trailing slashes - - GB MBC: Fix MBC2 saves (fixes mgba.io/i/954) - - GBA Memory: Fix copy-on-write memory leak - - Core: Fix ROM patches not being unloaded when disabled (fixes mgba.io/i/962) - - GBA I/O: Fix writing to DISPCNT CGB flag (fixes mgba.io/i/902) - - GBA Memory: Partially revert prefetch changes (fixes mgba.io/i/840) - - PSP2: Fix issues causing poor audio - - Wii: Fix screen tear when unpausing - - GBA: Fix some GBA ROM misdetection (fixes mgba.io/i/978) - - GBA Hardware: RTC accuracy improvements - GB Timer: Minor accuracy improvements - GB Audio: Clock frame events on DIV - - GBA: Fix SharkPort saves for EEPROM games - - Qt: Fix opening in fullscreen (fixes mgba.io/i/993) - - Python: Fix package directory - - GB Memory: Fix OAM DMA blocking regions (fixes mgba.io/i/1013) - - Wii: Fix various setup and teardown drawing issues (fixes mgba.io/i/988) - GBA Timer: Fix timers sometimes being late (fixes mgba.io/i/1012) Misc: - GBA Timer: Use global cycles for timers @@ -73,10 +47,44 @@ Misc: - GB: Skip BIOS option now works - Libretro: Add frameskip option - GBA Memory: 64 MiB GBA Video cartridge support - - 3DS: Scale font based on glyph heights (fixes mgba.io/i/961) - PSP2: Use system enter key by default - 3DS: Remove deprecated CSND interface +0.6.2: (2017-04-03) +Bugfixes: + - Core: Fix ROM patches not being unloaded when disabled (fixes mgba.io/i/962) + - 3DS: Fix opening files in directory names with trailing slashes + - LR35902: Fix watchpoints not reporting new value + - GB MBC: Fix MBC2 saves (fixes mgba.io/i/954) + - GB Memory: HDMAs should not start when LCD is off (fixes mgba.io/i/310) + - GB Memory: Fix OAM DMA blocking regions (fixes mgba.io/i/1013) + - GB Video: Only trigger STAT write IRQs when screen is on (fixes mgba.io/i/912) + - GBA: Fix some GBA ROM misdetection (fixes mgba.io/i/978) + - GBA: Fix SharkPort saves for EEPROM games + - GBA Audio: Increase PSG volume (fixes mgba.io/i/932) + - GBA BIOS: Fix incorrect exit condition in LZ77 + - GBA Cheats: Fix PARv3 slide codes (fixes mgba.io/i/919) + - GBA Cheats: Fix slide codes not initializing properly + - GBA DMA: ROM reads are forced to increment + - GBA Hardware: RTC accuracy improvements + - GBA I/O: Fix writing to DISPCNT CGB flag (fixes mgba.io/i/902) + - GBA Memory: Fix copy-on-write memory leak + - GBA Memory: Partially revert prefetch changes (fixes mgba.io/i/840) + - GBA Savedata: Fix crash when resizing flash + - GBA Video: Force align 256-color tiles + - GBA Video: OBJWIN can change blend params after OBJ is drawn (fixes mgba.io/i/921) + - PSP2: Fix issues causing poor audio + - Python: Fix package directory + - Qt: Fix locale being set to English on settings save (fixes mgba.io/i/906) + - Qt: Fix opening in fullscreen (fixes mgba.io/i/993) + - Wii: Fix screen tear when unpausing + - Wii: Fix various setup and teardown drawing issues (fixes mgba.io/i/988) +Misc: + - 3DS: Scale font based on glyph heights (fixes mgba.io/i/961) + - GB MBC: Remove erroneous bank 0 wrapping + - GBA: Improve multiboot image detection + - PSP2: Use system enter key by default + 0.6.1: (2017-10-01) Bugfixes: - GB, GBA: Fix crashes when attempting to identify null VFiles