Skip to content

v0.7.2

Latest
Compare
Choose a tag to compare
@jsgroth jsgroth released this 31 May 19:12
· 19 commits to master since this release

Summary: Multiple save state slots, NES Zapper support, and a laundry list of bugfixes (mostly for Game Boy / Game Boy Color)

Save states from earlier versions are not compatible, in-game saves will still work

Features

  • (NES) Added support for the Zapper light gun used by Duck Hunt, Wild Gunman, and some other games (#25)
  • The emulator now supports up to 10 save state slots per game (#22)
    • There are new next/previous slot hotkeys to select a slot for quick save/load via hotkey, and there is a new sub-menu in the GUI to save/load any slot
  • The CLI now reads the same jgenesis-config.toml config file as the GUI (#24)
    • It reads from the same path by default, and there is also an optional --config arg to override the config file location
    • Most of the previously-existing command line args are still present, but they now function as temporary config overrides rather than being the only way to configure the CLI

Improvements

  • (Master System / Game Gear) Cartridge RAM is now assumed to be battery-backed if a game ever accesses it, after which it will be persisted to disk any time it's modified
    • There was already a "database" of games that have battery-backed RAM, but that solution was checksum-based and thus did not work for patched games (e.g. fan translations)
  • Replaced the egui_wgpu_backend library with the offical egui-wgpu integration; this fixes various rendering issues in the Memory Viewer window, most notably the aliased text

Game Boy [Color] Fixes

  • The serial port registers and interrupt are now properly emulated; this fixes a number of games from failing to boot (e.g. Razor Freestyle Scooter, Initial D Gaiden, LEGO Racers) or having game-breaking bugs (e.g. Alleyway, Stargate) (#27 / #28 / #29 / #45)
    • Peripherals (e.g. link cable) are not currently emulated, but these games all depend on how the serial port behaves when no device is connected
  • The joypad interrupt is now properly emulated; this fixes controls not working in The Lawnmower Man (#46)
  • Disabling the LCD now clears the screen after about a frame's worth of cycles instead of clearing it immediately; this fixes screen flashing during movies in A Bug's Life (#26)
  • Fixed the PPU blocking CPU access to VRAM and CGB palettes slightly too early when rendering begins; this fixes flickering colors in LEGO Racers (#29)
  • Added an exception to the DMG STAT write/interrupt bug where the spurious interrupt will no longer trigger if the HBlank STAT interrupt was previously enabled and the STAT write occurred during OAM scan; this fixes Initial D Gaiden from crashing upon starting a race (#28)
    • I'm not 100% confident this is accurate to actual hardware, but it doesn't break the two games that depend on this hardware bug (Zerd no Densetsu and Road Rash)
  • Fixed the DMG STAT bug incorrectly being able to trigger while the LCD is disabled; this fixes the splash screen not showing in Star Trek: 25th Anniversary
  • Implemented (part of) an obscure DMG-only window behavior where a single glitched pixel with color BGP[0] is drawn at the start of the line when the window is disabled, the window has previously rendered pixels in the current frame, and WX + SCX are aligned in a specific way; this fixes a minor visual glitch on the title screen of Star Trek: 25th Anniversary
  • Fixed incorrect logic in the window Y triggered check; this fixes corrupted graphics in Warriors of Might and Magic and Zen: Intergalactic Ninja (#30 / #40)
    • The previous logic was simply checking if WY==line at the start of a line, ignoring whether the window was enabled in LCDC. The check is now (WY==line AND window_enabled) and it's checked at the start and end of every line (checking only at the start of the line breaks the fairylake test ROM)
  • APU wavetable RAM is now pre-populated with values approximate to actual hardware at power-on; this fixes missing sound effects / music in Altered Space, R-Type, and Spot (#32 / #49)
  • In DMG mode, VRAM is now pre-populated with the Nintendo logo (copied out of the cartridge header) and a trademark symbol; this fixes the intro animations in X, Altered Space, and probably other games
  • HDMAs initiated during HBlank now begin immediately instead of waiting until the start of HBlank on the next line; this fixes corrupted graphics in The Little Mermaid II: Pinball Frenzy and 3-D Ultra Pinball: Thrillride (#35 / #58)
  • HBlank STAT interrupts no longer block LY=LYC STAT interrupts when both are enabled; this fixes corrupted graphics in Ken Griffey Jr.'s Slugfest (#37)
  • Fixed multiple bugs around the LY=LYC bit in the STAT register when LYC=0; together with the above two fixes, this fixes Worms Armageddon from crashing upon starting a new game (#44)
  • WRAM contents are now mostly randomized at power-on; this fixes the homebrew Minesweeper for Windows from freezing upon starting a new game (#31)
  • Implemented the obscure behavior of reading wavetable RAM while the wave channel is playing; this gets the emulator to pass the Demotronic demo's emulator detection (#34)
    • Timing is not cycle-accurate; the emulator still fails the relevant tests in both dmg_sound.gb and cgb_sound.gb
  • Improved timing around mid-scanline SCY/SCX writes; this fixes various effects in the Demotronic demo (#34)
  • Fixed timing of the LY=LYC STAT interrupt when LYC=0; combined with the above fix, this fixes the "gin & tonic trick" in the Mental Respirator demo (#41)
  • Fixed the CPU seeing mode 0->2 transitions in the STAT register slightly too early; this fixes the Space Waste demo from crashing at the start of the first effect (#48)
  • The (officially) undocumented PCM12 and PCM34 registers are now emulated; this fixes the GBVisualizer demo (#36)
  • In CGB mode, the first 67 bytes of HRAM are now pre-populated in the same way that the CGB boot ROM would populate them; this fixes GBVisualizer from playing music immediately instead of waiting for 2 seconds like it's supposed to (#36)

Non-GB Fixes

  • (Genesis) YM2612 channel L/R panning flags are now initialized to 1 instead of 0; this fixes missing audio channels in After Burner II as well as the missing low-volume ambient noise during the first ~45 seconds of the Overdrive 2 demo
  • (Genesis) Fixed the 3-button vs. 6-button controller setting being applied only after making a config change, not at game boot
  • (NES) Fixed a bug in parsing ROM sizes out of non-NES 2.0 ROM headers that caused certain test ROMs to crash the emulator due to having nonsense in the later iNES header bytes
  • (NES) Mapper bus conflicts are now emulated for CNROM (iNES mapper 3); this fixes corrupted graphics in Cybernoid (#79)
  • (SNES) Adjusted how INIDISP brightness affects colors, which fixes the image being slightly too bright when brightness is not min or max
  • (SNES) Added rudimentary support for mid-scanline brightness changes; this fixes the missing plane shadows in Air Strike Patrol
  • (SNES) Fixed how mid-scanline writes to BG scroll registers are handled; this fixes glitchy lines on the title screen of NHL '94 and fixes the glitchy "Good Luck" animation in Air Strike Patrol (#68)
  • (SNES) Fixed rendering when 512x448 interlaced mode is enabled mid-frame; this fixes briefing screens in Air Strike Patrol not rendering correctly
  • (SNES) Adjusted timings of 65816 CPU reads/writes so that reads occur at the beginning of the CPU cycle while writes occur at the end; this fixes Rendering Ranger R2 from almost always freezing during screen transitions
    • This game's CPU/APU communication code is extraordinarily timing-sensitive
  • (SNES) Improved handling of cartridges with non-power-of-two ROM sizes (which in actual hardware generally contained multiple ROM chips of different sizes)
  • (SNES) Super FX GSU memory accesses now ignore the highest bank bit; this fixes the VOXEL.smc Super FX demo from crashing (#62)
    • The emulator also now detects this demo and gives it 64KB of Super FX RAM instead of using the default 32KB, which fixes the demo rendering garbage after starting
  • (SNES) Fixed the 34 sprite-tiles-per-line limit not being applied correctly if the 34th tile is partway through a sprite that is more than 1 tile wide
  • (SNES) Fixed OAM priority rotation incorrectly rotating using bits 1-7 of OAM address instead of bits 2-8
  • (SNES) Implemented the "interlaced smaller OBJs" PPU flag (SETINI bit 1); together with the above fix, this fixes a broken effect in the SNES test cartridge's PPU test (stars at the end of the Mode 0 test)