diff --git a/CHANGES b/CHANGES index 9f6722e56..9871f0ccf 100644 --- a/CHANGES +++ b/CHANGES @@ -44,37 +44,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 @@ -93,10 +67,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 diff --git a/CMakeLists.txt b/CMakeLists.txt index 16da73e58..4dca6d7e5 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(medusa) set(BINARY_NAME medusa-emu CACHE INTERNAL "Name of output binaries") if(NOT MSVC) 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 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) { 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; diff --git a/src/gb/renderers/software.c b/src/gb/renderers/software.c index 93c67b871..92fc927ff 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; } @@ -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); diff --git a/src/platform/libretro/libretro.c b/src/platform/libretro/libretro.c index 182644431..5e699a7d6 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" }, @@ -483,6 +485,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; diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 8b6223c18..3c15c731b 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) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/input) 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)