Some of the most notable changes since v0.10:
- Game Boy Advance emulation now supported
- 32X now supports emulated CPU overclocking
- Slightly improved 32X color accuracy
- Improved 32X PWM audio quality
- Sega CD per-region BIOS configuration
- NES palette customization options
- Game Boy and Game Boy Color now support LCD ghosting emulation via frame blending
- Support for running original Game Boy games in Game Boy Color mode
- Support for turbo/autofire input mappings
- Fixed a ton of bugs for every system, including two Sega CD regressions that affected v0.10
- SDL upgraded from SDL2 to SDL3
Save states are not compatible with previous versions.
I did not intend for this to come so long after the last release, but there was always just one more thing...
Full changelog below:
Game Boy Advance
- Game Boy Advance emulation is now supported; requires a Game Boy Advance BIOS ROM
- Video options for color correction and LCD ghosting emulation (frame blending), both enabled by default
- Audio enhancement option to apply enhanced interpolation to the Direct Sound channels rather than accurately emulating actual hardware's resampling behavior
- This massively reduces audio aliasing and noise in most cases, but it can also make audio sound muffled when games use very low sample rates (as most GBA games do)
- CPU/prefetch/DMA/etc. timing is not perfect but should be moderately accurate
- All types of cartridge save memory supported, with an option to force a specific type if auto-detection gets it wrong
- The cartridge RTC chip and solar sensor are emulated for the handful of games that use them (e.g. Boktai), other cartridge peripherals are not currently emulated
New Features
- (Genesis) Added an option to ignore configured aspect ratio and display square pixels when the VDP is in H40/H320px mode (#442)
- (Genesis) Added support for games with 24C64 EEPROM chips; College Slam and Frank Thomas Big Hurt Baseball are now playable (#459)
- (Genesis) New audio option to enable/disable individual YM2612 audio channels
- (Genesis) New audio option to adjust volume of individual sound sources
- (Genesis) Added some additional memory/register views to the Memory Viewer window
- (Sega CD) Added support for per-region BIOS configuration, where the emulator will automatically select the appropriate BIOS based on game region
- (32X) Added two new color display options (#492)
- New option to darken Genesis colors relative to 32X colors, enabled by default; on actual hardware the brightest 32X colors are noticeably brighter than the brightest Genesis colors
- New option to apply a yellow or purple tint to 32X colors, roughly as observed on actual hardware
- (32X) Added an option to overclock the SH-2s; this is extremely CPU-intensive but can reduce slowdown in some games
- (32X) Added options to hide all pixels of a given priority (#494)
- (NES) Added palette customization options (#424)
- Can now load a custom palette from a file; both 64-color and full 512-color palette files supported
- GUI now has a builtin NTSC palette generator with a graphic displaying the current palette
- (SNES) Added support for the ST018 coprocessor, used by Hayazashi Nidan Morita Shougi 2
- This is emulated using an ARM7TDMI implementation (ARMv4T) rather than an ARM6 (ARMv3), but this should not make any functional difference
- (GB) Added a frame blending option that simulates LCD ghosting, enabled by default; enabling this fixes graphical effects in a few games and demos (#469)
- (GB) When color correction is enabled, you can now manually adjust the LCD gamma value used for gamma correction
- (GB) Added support for booting from a boot ROM (#404)
- (GB) Added an option to run original Game Boy software in Game Boy Color mode (#150)
- This feature requires a GBC boot ROM in order to initialize the compatibility palettes, and it is off by default because it (accurately) causes major bugs in a few games
- (GB) Added (proper) support for the MBC30 mapper, used by the Japanese version of Pocket Monsters Crystal Version (#478)
- (GB) Added support for unlicensed/homebrew games with an SRAM size byte of $01 (2 KB) (#485)
- (Game Gear) Added a frame blending option that simulates LCD ghosting, currently disabled by default
- (Game Gear) Added support for booting from a BIOS / boot ROM (#404)
- Added turbo button support for face and shoulder buttons on all emulated systems (#554)
- Added options to automatically pause the emulator when in the background (#585)
Improvements
- Upgraded SDL from SDL2 to SDL3; for the most part this should hopefully have no noticeable impact except for audio playback maybe working a little better than before
- As part of this, I removed the borderless vs. exclusive fullscreen setting because this seemed much less straightforward to change in SDL3; fullscreen will now always use whatever the platform and graphics driver default to (probably always borderless on modern platforms)
- The auto-prescale video setting can now use separate scale factors for width and height, which produces a less aliased image when games use display modes with sub-1 pixel aspect ratio (e.g. Genesis NTSC H40/H320px mode, SNES high-res modes)
- Auto-prescale is also now enabled by default (the previous default was a fixed 3x upscale factor)
- (32X) Improved quality of PWM chip audio resampling
- There is also a new audio option to switch to the old resampling algorithm, which is lower quality but usually sounds a little sharper (given that most 32X games use PWM sample rates of 22 KHz or less)
- (SNES) When using the Super Scope, the emulator now displays the new Super Scope Turbo state whenever you toggle Turbo on/off
- (GB) Audio is now sampled internally at 2 MHz rather than 1 MHz, which should reduce audio aliasing from the wavetable channel
General Fixes
- Fixed a number of cases that would cause the emulator to crash, none triggered by official releases (as far as I know) but some triggered by homebrew/demos/test ROMs
- (Genesis) Loading a ROM file smaller than 1 KB or so (#434)
- (Genesis) Z80 tries to access its own memory through the 32KB 68K memory bank by mapping it to $A00000-$A07FFF or $A08000-$A0FFFF
- (Genesis) VRAM-to-VRAM copy DMA with source address higher than $1FFFF
- (Genesis) 68000 triggers a privilege violation exception
- (Genesis) 68000 triggers an address error while handling an exception
- (32X) One of the SH-2s executes a SLEEP instruction (#431)
- (32X) One of the SH-2s executes an illegal opcode
- (32X) One of the SH-2s tries to access certain invalid memory addresses (highest 3 bits set to 100 or 101)
- (32X) 68000 performs a 16-bit read from certain invalid memory addresses
- (SMS / Game Gear / Genesis) Z80 handles an IRQ while in interrupt mode 2
- (SNES) Loading a ROM file smaller than 32 KB (#538)
- (SNES) Loading an SA-1 cartridge where the cartridge header claims it does not have any BW-RAM (anything that does this now gets 64 KB of BW-RAM)
- (SNES) SA-1 Character Conversion DMA Type 1 with an I-RAM destination address higher than $7FF
- (GB) CPU executes a STOP instruction with no CGB speed switch armed (#465)
- Fixed changes to the save path and save state path options not applying immediately if changed while an emulator is running
- Fixed the UI theme option not applying to the Memory Viewer window
Genesis / Sega CD / 32X Fixes
- Fixed the VDP rendering too many pixels of the previous color when a game makes a mid-scanline backdrop color change while display is disabled; this improves accuracy of the glitchy lines in Gouketsuji Ichizoku / Power Instinct (#462)
- Fixed the 6-button controller timeout period being a little too short (#445)
- Fixed two games failing to boot due to the emulator not giving them the correct type of cartridge save memory
- Slightly adjusted memory refresh delay timing when the main CPU is executing out of RAM; this fixes incorrectly visible CRAM dots in Snatcher
- (Sega CD) Fixed implementation of VDP DMA reads from word RAM being delayed; this fixes glitchy background graphics in Snatcher (again)
- This was a regression that affected v0.10.0 and v0.10.1; it was broken by VDP DMA changes in v0.10.0
- (Sega CD / 32X) Adjusted inter-CPU/VDP timings to account for some VDP timing changes made in v0.10.0; this fixes the Sega CD version of Mickey Mania having glitchy graphics on the right side of the screen in the 3D chase stages (#491)
- This was also a regression that affected v0.10.0 and v0.10.1
- (32X) Improved accuracy of VDP auto fill timing; this fixes occasional major graphical glitches in Shadow Squadron / Stellar Assault during the intro and takeoff sequences (#225 / #439)
- (32X) Fixed some inaccuracies around VDP register latching; this fixes some early 32X demos not working properly (#430)
- (32X) Fixed some PWM resampling bugs that sometimes caused erroneous pops in PWM audio output
- (32X) Slightly improved SH-2 timing accuracy, particularly around 32-bit SDRAM writes being way too slow (#493)
- (32X) Fixed 32X HINT counter behavior not matching Genesis HINT behavior, which caused SH-2 horizontal interrupts to be off by a line (#559)
- (32X) Fixed 32X VDP per-line events (HBlank, line render) triggering slightly too early in the line
- Several timing fixes that fix graphical bugs in the Chaekopon demo by Limp Ninja (#435)
- Adjusted low-level sprite processing timings so that sprite attribute fetching is performed slightly earlier in the line
- Fixed a pretty egregious DMA timing bug where DMA would take way too long to start copying if initiated during active display with display enabled
- Fixed a number of inaccuracies identified by the testpico test ROM (#482)
- Fixed implementation of how Genesis VINT and HINT are delayed by 1 instruction when re-enabled; the previous implementation did the wrong thing when two consecutive MOVE instructions enabled then disabled VDP interrupts
- Fixed the Genesis VDP's F flag starting to read 1 (VINT pending) slightly later than it's supposed to
- (32X) Fixed behaviors related to enabling/disabling/clearing SH-2 VINT during VBlank
- (32X) Fixed some register bits being incorrectly writable / not writable
- (32X) Updates to initial state at power-on to more closely match actual hardware
NES Fixes
- Very slightly adjusted sprite 0 hit timing; this fixes glitchy lines on the title screen of Indiana Jones and the Last Crusade (#314)
- DMC DMA timing is now emulated; this fixes screen jitter in Ultimate Air Combat (#268)
- Fixed non-power-of-two CHR ROM sizes not working correctly (#573)
- Several fixes for inaccuracies identified by the AccuracyCoin test ROM (#551)
- Fixed an APU timing issue that sometimes caused an incorrectly skipped frame counter clock when software wrote 0x80 to $4017 with two consecutive
sta $4017instructions - More accurate APU frame counter timing
- More accurate OAM DMA timing
- DMA dummy reads are now emulated (with a new option to disable dummy controller port reads because they cause input glitches in some games)
- CPU open bus is now properly emulated (it was previously faked by always returning the address high byte)
- More accurate PPU open bus emulation
- Most PPU registers are no longer writable immediately after reset
- Fixed the 6502 incorrectly polling the interrupt lines during the final cycle of BRK instructions and IRQ handling
- More accurate controller port behaviors around strobing and consecutive-cycle reads
- Fixed an APU timing issue that sometimes caused an incorrectly skipped frame counter clock when software wrote 0x80 to $4017 with two consecutive
SNES Fixes
- Fixed BG2 incorrectly not rendering in Mode 7 if BG1 is disabled and BG2+EXTBG are enabled; this fixes missing background graphics in F-1 Grand Prix (#529)
- Fixed V IRQs incorrectly not triggering when a game either 1. changes VTIME to the current line while V IRQs are enabled, or 2. enables V IRQs while VTIME is set to the current line; this fixes graphical corruption in F-1 Grand Prix, F-1 Grand Prix Part III, S.O.S.: Sink or Swim, and RoboCop vs. The Terminator (#529 / #530 / #543)
- Fixed multiple bugs in the BG vertical mosaic implementation, which was previously quite wrong; this fixes graphical bugs in Beavis and Butt-Head and Jurassic Park Part 2: The Chaos Continues (#532 / #540)
- Improved DMA timing accuracy; this fixes graphical glitches in Circuit USA (#531)
- Fixed incorrect DSP-1 port address mapping for DSP-1 cartridges with more than 1 MB of ROM; this fixes Super Bases Loaded 2 failing to boot (#534)
- Fixed some revisions of Tintin in Tibet incorrectly defaulting to NTSC timings instead of PAL (#539)
- The 65816 stack pointer is now initialized to $01FF instead of $0100; this fixes some homebrew games failing to boot due to stack corruption (#468)
- Fixed SA-1 Character Conversion DMA Type 1 in 2bpp or 4bpp mode incorrectly treating the input packed pixel data as big-endian within a byte when it is actually little-endian; this fixes graphical glitches in the SA-1 tech demo cartridge (#537)
- Implemented multiplication/division timing; this fixes some old homebrew that accidentally depends on reading intermediate division results (#576)
Game Boy [Color] Fixes
- Fixed the GBC color correction implementation nonsensically performing calculations in sRGB color space rather than linear color space; this makes a particularly huge difference for the GBA LCD option
- Slightly adjusted timing of when the STAT LY=LYC bit reads 1; this fixes a glitchy line in Elevator Action (#472)
- The serial port transfer data register (SB / $FF01) is now read/write; this fixes Card Game not allowing you to start the game (#471)
- Fixed sample output behavior of pulse and wavetable channels when the DAC is enabled but the channel is inactive
- Added approximate emulation of DAC fading when a channel's DAC is turned on or off; combined with the above change, this fixes buzzing noises in Cannon Fodder, 3D Pocket Pool, and others (#475)
- Fixed VRAM DMA incorrectly terminating prematurely when the destination address increments from $9FFF to $A000; this fixes freezing in F1 Championship Season 2000 (#464)
- HDMA5 writes with bit 7 set are now allowed to change the length of in-progress HDMAs; this fixes corrupted graphics in NASCAR 2000 (#467)
- HDMA is now able to halt the CPU mid-instruction; this fixes occasional glitchy frames in Toy Story Racer