All notable changes to this project will be documented in this file.
- Game Boy Color support.
- GBA backwards-compatibility to unlock features in some GBC games.
- Color correction to approximate the color spectrum of a GBC or GBA screen, leveraging native gamma settings.
- Game Boy Color skin for no-scaling mode.
- Brightness change hotkeys usable in menus.
- Confirmation setting for Load State now also applies to Restart Game.
- Various improvements to the menu, courtesy of runer112:
- Mark per-game options instead of global options with an asterisk.
- Improved menu item alignment and font.
- Majorly rewrite the CPU emulation to improve performance and flexibility of memory access emulation.
- Rearrange the JIT's static register allocation and the ABI of routines called from it.
- Remove dynamically-generated per-opcode memory routines, reducing overhead of memory region selection.
- For special memory accesses (I/O reads or non-RAM writes), dynamically generate minimal trampolines instead.
- For writes to MBC registers, directly use a routine for the specific register to remove range-checking overhead.
- Always pass valid timing info to memory accesses which may require it, removing the need for validity checks.
- Enable complex memory instructions to directly read/write RAM, such as bitwise operations and INC/DEC (HL).
- Allow absolute reads/writes to have variable-length implementations, for better performance with banked memory.
- Change stack bounds-checking to speed up close SP modifications (INC/DEC/ADD SP) and free up a register.
- Use inclusive bounds for the stack to avoid thrashing when touching the high edge of a memory region.
- Improve performance of return prediction by ignoring the stack offset unless the prediction misses.
- Improve performance of self-modifying code checks by using 24-bit comparisons.
- Improve performance of self-modifying JP instructions by using dynamic dispatch instead of recompiling.
- Expand the list of supported instructions in waitloop detection to reduce false negatives.
- Optimize ROM bank switching routine at ROM load time based on the ROM size, to eliminate redundant masking.
- Simplify MBC3 RTC bank switching by handling RTC updates immediately before register writes.
- Refactor the PPU scheduler to speed up writes to STAT and LYC registers.
- Predict future writes to the LYC register based on previous frames, to avoid excessive rescheduling.
- Remove post-vblank event cache to simplify all reschedules, and determine the event only when vblank is reached.
- Reduce SPI transfer clock to fix glitchy display on some calculator revisions.
- Increase Flash wait states for increased stability on some calculator revisions.
- Fix game screen corruption in the main menu when showing a confirmation dialog.
- Fix garbled character display when internal ROM title contains invalid characters.
- Fix corruption of a couple of pixels when restoring the home screen.
- Implement more accurate open-bus read behavior for disabled cartridge RAM.
- Implement correct mirroring behavior for MBC2 cartridge RAM.
- Fix reads past the end of ROM banks trimmed by the ROM converter.
- Fix conditions for the window trigger to include writes to LCDC or WY during hblank.
- Fix display of mid-frame sprite changes resulting from direct OAM writes.
- Allow NR30 writes to disable audio channel 3.
- Fix a scheduler edge case which could cause crashes in some games. Fixes Space Invaders (Japan).
- Now using 8 bits per pixel in all display modes, eliminating code for special-casing 4-bit pixels.
- Emulator overlays are horizontally stretched in fullscreen mode, as required by the tearing fix.
- Fixed diagonal screen tearing in fullscreen display modes by using VSYNC interface and interlaced scan.
- Greatly improved performance of frame rendering when sprite palettes are changed mid-frame.
- Fix a game freeze occuring in certain conditions after a delayed EI is followed by a HALT. Fixes Donkey Kong Land.
- Fix a likely runtime error when a memory access instruction reads an I/O register and later reads other memory.
- Fix an intermittent code corruption when loading RTC save states.
- Per-game configuration settings.
- Backlight adjustment hotkeys.
- Classic Game Boy palette option.
- Color adjustment option to more closely match a GBC screen when colorizing.
- Configurable confirmation dialog for loading and/or overwriting save states.
- Ability to delete save states and ROM files through the emulator menu.
- Ability to unmap most emulator hotkeys.
- Darkened menu background color to improve text contrast.
- Load State option is no longer shown for state slots that do not exist.
- Majorly improve performance in many games. Notably, Pokémon Gold and Silver now run at playable speeds.
- Refactor cycle counting and event scheduling to speed up branches and avoid speculative event schedules.
- Bind cycle offsets to memory access instructions dynamically, rather than using a fixed-size cache.
- Make address mapping cache use bucket-based linear lookup instead of binary search.
- Speed up callstack caching by tracking aggregated memory bank deltas using the bank switches themselves.
- Create a dynamic PPU state machine that caches LY and STAT register values with expiration times.
- Use tables of overlapped pixel data to speed up Game Boy VRAM writes and native palette generation.
- Speed up VRAM caching up to 2x by deferring pixel generation until the second byte is written.
- Queue BGP writes to handle at end of frame, allowing the maximum number of scanlines to use native palettes.
- Potentially fix white screen issue on Python models by reinitializing hardware on emulator start.
- Improve double-buffering logic, fixing occasional display of incomplete frames when frameskip is disabled.
- Implement bounds checking and full memory side effects on stack accesses. Fixes emulator glitches and crashes in many games.
- Implement MBC RAM protection. May help prevent cartridge save corruption in the case of game bugs or crashes.
- Prevent the emulator from freezing if a game turns the LCD on and off repeatedly.
- Add simple support for APU enable/disable and channel length counters.
- Implement delayed update of IME flag when an EI instruction is executed.
- Implement emulation of the CPU's HALT bug. Fixes a game crash in The Smurfs.
- Support changing interrupt target during dispatch. Fixes a game crash in Pinball Deluxe.
- Implement STAT interrupt blocking behavior. Fixes a game crash in Joust.
- Support executing instructions overlapping memory regions. Fixes emulator crashes in FIFA 2000 and Hyper Lode Runner.
- Skip rendering the first frame after the LCD turns on to avoid glitch frames. Fixes a graphical glitch in Tetris Blast.
- Use correct window triggering behavior (window is active after LY==WY). Fixes a graphical glitch in Tetris Blast.
- Catch up rendering on VRAM writes. Fixes a graphical glitch in V-Rally Championship Edition.
- Support mid-frame sprite palette changes. Fixes a graphical glitch in V-Rally Championship Edition.
- Fix mid-frame sprite size changes. Fixes a graphical glitch in the dmg-acid2 test ROM.
- Improve accuracy when fast-forwarding LY-based waitloops, and add support for STAT-based waitloops.
- Emulate differing flag outputs of RLA/RRA/RLCA/RRCA/CCF. Fully passes Blargg's cpu_instrs test ROM.
- Implement many timing and accuracy improvements for MBC, PPU, timer, serial, DMA, and RTC to pass test ROMs.
- Updated hardware accesses to support new (Revision M) calculators, including TI-83 Premium CE Python Edition.
- Updated ROM converter to respect a new AppVar size limitation on OS 5.3.5 (at this time, only on TI-83 Premium CE).
- Dynamically linked the converter EXEs against the Universal C Runtime, avoiding false positives on many antivirus engines.
- Save file converter between binary and AppVar formats.
- A launcher icon and description for shells such as Cesium.
- Overlay messages for state saving and loading (can be disabled).
- Hotkeys for quickly selecting the current state slot and saving or loading states.
- Updated ROM list, now integrated into the emulator menu system and sorted alphabetically by title.
- Refactored LCD mode switching and error handling, for smoother transitions between screens.
- Cleaned up the skin image, thanks ndye!
- Fix some cycle counting glitches related to serial port hardware.
- Only trigger a STAT interrupt on LYC write if the value changes. Fixed a graphical glitch in Kid Icarus: Of Myths and Monsters.
- For RETI, count cycles before attempting to schedule an interrupt. Fixed a graphical glitch in Kid Icarus: Of Myths and Monsters.
- Load the ROM again from the beginning after archiving a file. Fixed a game title display glitch if a Garbage Collect occurred.
- Use an asm_data_ptr to track the ROM title. Fixed a game title display glitch if the metadata file is unarchived.
- Refactor JIT flushing logic; force a flush after two cache flushes. Fixed a continuous performance drop in certain scenarios.
- Schedule the initial event one cycle after the loaded state. Prevents state save/load from triggering the same event twice.
- Support for loading ROMs up to 4MB, increased from 2MB.
- Key names for TI-83 Premium CE in the control options.
- Display the paletted white-equivalent color when the Game Boy screen is off, rather than pure white.
- Rearrange the emulator menu and reset the main menu option after (re)starting a game.
- Output ROM converter errors to the standard error stream.
- Fix sprites not displaying when an OAM DMA transfer is initiated mid-frame.
- Check for the RET instruction returning to a different ROM bank than its corresponding CALL. Fixes some crashes in specific games (e.g. Street Fighter II).
- Prevent a JIT overflow from overwriting the code path to the flush handler when decoding a banked CALL. Fixes some erratic crashes.
- Initial emulator release.