Notable changes since the last release (v0.8.3):
- Revamped low-pass filter options for Genesis / Sega CD / 32X that should be significantly more accurate to actual hardware than the v0.8.3 settings
- Improved audio quality for all emulated systems via much higher-quality audio resampling
- A rather large number of bugfixes for Genesis, Sega CD, 32X, SMS, Game Gear, SNES, Game Boy [Color]
- Major bugfixes for Linux AppImage builds in Wayland
- Save state files are now internally compressed using zstd, which should reduce save state file size by 70-80% in most cases
- Basic CPU + CD-ROM drive overclocking options for Sega CD, which have fairly low compatibility but do help in some games
Full changelog below.
New Features
- (Genesis / Sega CD / 32X) Replaced the low-pass filtering settings added in v0.8.3 with a new set of options that should be more accurate to actual hardware
- New option to apply a first-order 3.39 KHz low-pass filter to Genesis audio output; this is ON by default (biggest change from previous default settings)
- New option to apply a second-order 7.97 KHz low-pass filter to Sega CD PCM audio output; this is ON by default
- New options to individually configure whether the Genesis low-pass filter is applied to Sega CD and 32X audio output; these are all OFF by default
- (Genesis / SNES) Added a new video setting to disable deinterlacing in the handful of games that use interlaced display modes (e.g. Sonic the Hedgehog 2 in 2P Vs. mode, Ys III (Genesis) with the in-game "Int Mode" option enabled, Air Strike Patrol in mission briefing screens)
- Deinterlacing enabled matches the behavior in previous versions: normal-resolution interlaced modes display the same as progressive mode, and high-res interlaced modes make the graphics processor render all 448/480 lines every frame
- (Sega CD) Added an option to overclock the sub CPU by decreasing the master clock divider (#138)
- (Sega CD) Added an option to increase the disc drive speed when reading data tracks (#138)
- This has low compatibility but can shorten loading times in some games. Compatibility is slightly higher when the sub CPU is overclocked
- (Sega CD) Added an additional PCM chip interpolation option for 6-point cubic Hermite interpolation, which in some cases produces a slightly cleaner sound than 4-point cubic Hermite (the existing setting)
- Added a new hotkey to quickly toggle whether overclocking settings are enabled, for the systems that support overclocking (this includes Sega CD's new drive speed setting)
- This is mainly useful for Sega CD, where increasing the drive speed can shorten loading times during gameplay but almost always breaks FMVs and animated cutscenes
Improvements
- Audio resampling code has been rewritten to use the windowed sinc interpolation algorithm, which is much higher quality than the previous resampling implementation at a relatively low performance cost (for most emulated systems)
- Windowed sinc interpolation can be very performance-intensive for NES and GB/GBC audio resampling, so these two systems have a new audio setting to choose between windowed sinc interpolation and the old resampling algorithm (low-pass filter followed by nearest neighbor interpolation)
- (Genesis) Slightly improved performance by optimizing VDP rendering and tile fetching code
- (Genesis) Frontends now recognize .gen and .smd as file extensions for Genesis / Mega Drive ROM images (#149)
- This includes attempting to auto-detect when a ROM image is interleaved (common for .smd files), and deinterleaving it during load
- (SMS) The "crop vertical borders" video setting now defaults to enabled instead of disabled; unlike the left border, the vertical borders will only ever show the current backdrop color
- (SMS) The SMS model setting now defaults to SMS1, which emulates a VDP hardware quirk that is required for the Japanese version of Ys to render correctly (#182)
- (SMS / Game Gear) Reduced log level of a warning message that caused excessively verbose log output in Virtua Fighter Mini (#199)
- (SNES) In games that use the SA-1 coprocessor, the SA-1 CPU now gets a wait cycle every time it accesses SA-1 BW-RAM, similar to actual hardware
- The SA-1 CPU still runs faster than actual hardware in some cases because bus conflict wait cycles are not emulated
- GUI: When opening a game that requires a BIOS ROM or firmware ROM (e.g. any Sega CD game), if the BIOS/firmware ROM path is not configured, the error window now contains a button to configure the appropriate ROM path and immediately launch the game
- CLI: If no config file exists, the CLI will now attempt to write out the default config to the config path so that it can be edited manually if desired
- Save state files are now internally compressed using zstd which should reduce save state file size by at least 50%, often by 70-80%
- Frontends should now correctly handle files with uppercase file extensions
Multi-System Fixes
- Fixed a performance bug in the audio resampling code that could have caused intermittent extremely poor performance due to performing arithmetic on subnormal floating-point numbers, which can be up to 100 times slower than normal floating-point arithmetic on some CPUs (#135)
- Linux: AppImage builds now exclude all Wayland-related system libraries during packaging; this fixes the emulator failing to launch in some distros, e.g. Solus Plasma (#143)
- Linux: AppImage builds now interpret relative paths in command-line arguments as being relative to the original working directory where the AppImage was launched from, not the AppImage internal runner directory (#147)
- Linux/BSD CLI: For these platforms only and for the CLI only, reverted the change to estimate window scale factor because
SDL_GetDisplayDPI
does not return reliable values on Linux/BSD - Adjusted frame time sync's sleep implementation to fix frame time sync potentially causing slowdown on some platforms
- Save state files are now explicitly versioned, which fixes potential crashing when attempting to load an incompatible save state file from a different version
Genesis / Mega Drive Fixes
- Fixed the 68000 incorrectly being allowed to access audio RAM while the Z80 is on the bus; this fixes freezing in Joe & Mac (#144)
- Fixed Z80 RESET not clearing the Z80's HALT status
- Fixed writes to YM2612 F-num high / block registers ($A4-$A6 and $AC-$AE) taking effect immediately instead of after the next F-num low register write; this fixes some music glitches in Valis
- Implemented more accurate emulation of how the YM2612 computes operator amplitude from phase and envelope attenuation
- Fixed in-game saves not working correctly when Sonic & Knuckles is locked on to a cartridge with SRAM (e.g. Sonic 3)
- Fixed certain revisions of QuackShot not loading correctly due to having non-standard cartridge ROM address mappings (#174)
- Fixed some illegal 68000 opcodes incorrectly decoding to "valid" instructions (#184 / #185)
- Fixed an edge case related to how sprite tile/pixel overflow interacts with H=0 sprite masking (#186)
Sega CD Fixes
- Implemented a higher minimum seek time for small seek distances; this fixes Thunder Storm FX (JP) failing to boot (#178)
- Fixed a regression introduced in v0.8.3 that caused PCM chip channels to skip the first sample after being enabled (this made little-to-no audible difference in practice because the first sample is usually 0)
- Fixed slightly inaccurate emulation of PCM chip looping behavior at sample rates higher than 0x0800 / 32552 Hz
- Fixed inaccurate emulation of CD-DA fader volumes 1-3 out of 1024 (should be 50-60 dB of attenuation instead of complete silence)
- Unmapped/unknown address accesses will now log an error instead of crashing the emulator
32X Fixes
- Fixed a major bug in the PWM resampling code that caused PWM audio output to sound significantly more poppy and crackly than it's supposed to
- Fixed a bug around synchronizing SH-2 accesses to 32X communication ports that could have caused writes to be skipped in some cases; this fixes freezing in the Sonic Robo Blast 32X demo (#160)
- Significantly improved timing of 32X VDP interrupts for the SH-2s (#166)
- Significantly improved synchronization between the SH-2s and the 68000
- Fixed PWM DMA transfer rate via DREQ1 not taking the PWM timer interval into account; this fixes broken sound effects in BC Racers (#179)
Master System / Game Gear Fixes
- Fixed the Z80's RETI instruction not correctly copying IFF2 to IFF1 like RETN does; this fixes Desert Strike from freezing when you press Start/Pause (#181)
- Fixed incorrect handling of non-power-of-two ROM sizes, which fixes several homebrew games and demos (#201 / #203 / #204)
- (Game Gear) Fixed the emulator crashing if a game enables the VDP's 224-line mode, as the homebrew GG Turrican does (#202)
SNES Fixes
- Implemented more accurate clipping and truncation in Mode 7 intermediate calculations; this fixes glitched Mode 7 graphics in Tiny Toon Adventures: Wacky Sports Challenge (#161)
- Mode 7 registers are now latched about 12 pixels before line rendering begins; this fixes a glitchy line near the bottom of the play area in Battle Clash, where the screen transitions from Mode 1 to Mode 7
- Implemented an obscure behavior regarding the effects of writing to OAM during active display; this fixes incorrect sprite display in Uniracers' Vs. mode (#164)
- Made a best effort at implementing the effects on sprites of toggling forced blanking during active display; this mostly fixes some test ROMs that exercise this (#162)
- Adjusted behavior of APU communication ports when the 65816 writes to a port on the same cycle that the SPC700 clears the port; this fixes Kishin Douji Zenki: Tenchi Meidou failing to boot (#187)
Game Boy [Color] Fixes
- Implemented an obscure behavior where pulse channels should output a constant 0 after power-on until after the first phase increment; this fixes missing voice samples in Daiku no Gen-san - Robot Teikoku no Yabou (#151)
- Fixed a bug related to the pulse channel phase counter reloading on the same cycle as a frequency change via NR13/NR14/NR23/NR24; this combined with the above change fixes missing voice samples in Keitai Denjuu Telefang (#47)
- Added emulation for a hardware quirk where the Mode 2 STAT interrupt appears to trigger 145 times per frame, not 144; this fixes GBVideoPlayer (#155)
- CGB palette RAM auto-increment flags now default to 1 (#156)
- Slightly adjusted timings related to powering on the PPU; this combined with the above change fixes GBVideoPlayer2 (#156)
- Fixed an edge case where LYC writes at the beginning of a line were not triggering the LY=LYC STAT interrupt under certain conditions; this fixes glitchy graphics on the title screen of the SQRKZ homebrew (#154)
- The contents of OBJ palette RAM are now randomized at power-on (#152)