Skip to content

v0.9.0

Latest
Compare
Choose a tag to compare
@jsgroth jsgroth released this 13 Feb 00:08
· 30 commits to master since this release

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)