Difference between revisions of "Tricky-to-emulate games"

From GbdevWiki
Jump to: navigation, search
(KiGB compatibility screenshots might help identify candidates for this list)
(Dr. Rin ni Kiitemite! - Koi no Rin Fuusui, suggested by calc84maniac)
 
(19 intermediate revisions by 2 users not shown)
Line 5: Line 5:
 
; ''Altered Space''
 
; ''Altered Space''
 
: Requires STAT IRQ blocking (if more than one STAT condition (mode 0, 1, 2, LYC) is enabled, all enabled conditions have to be false for a cycle before another STAT IRQ can get through); otherwise graphics are corrupt.
 
: Requires STAT IRQ blocking (if more than one STAT condition (mode 0, 1, 2, LYC) is enabled, all enabled conditions have to be false for a cycle before another STAT IRQ can get through); otherwise graphics are corrupt.
 +
; ''Boxxle''
 +
: Loop at $1FB1 uses "nitro copy", writing a value to VRAM and looping until it took.
 
; ''Daedalian Opus'' (JP<nowiki>:</nowiki> ''Bouken Puzzle Road'')
 
; ''Daedalian Opus'' (JP<nowiki>:</nowiki> ''Bouken Puzzle Road'')
 
: Hangs if vblank interrupt timing is not precise.
 
: Hangs if vblank interrupt timing is not precise.
 +
; ''Daiku no Gen-san: Kachikachi no Tonkachi ga Kachi'' and ''Tokyo Disneyland: Fantasy Tour''
 +
: These rely on open bus in the SRAM area. ''Daiku no Gen-san'' hangs in stage 1-4 while transporting a block on an elevator to reach a switch. ([https://github.com/mgba-emu/mgba/issues/2032 mGBA issue #2032]; [https://github.com/TASEmulators/BizHawk/issues/2482 BizHawk issue #2482]) One minigame in ''Tokyo Disneyland'' accidentally reads a pointer from disabled SRAM and writes there. It relies on the value being $0A0A (or at least somewhere else where writes are harmless), not $FFFF (which is IE).
 +
; ''Dr. Rin ni Kiitemite! - Koi no Rin Fuusui''
 +
: At startup, this game executes a GBC speed switch using a STOP with an invalid opcode as its second byte.
 
; ''Game de Hakken!! Tamagotchi - Osutchi to Mesutchi''
 
; ''Game de Hakken!! Tamagotchi - Osutchi to Mesutchi''
 
: Complex multi-chip mapper.
 
: Complex multi-chip mapper.
 
; ''Koro Dice''
 
; ''Koro Dice''
 
: Timer glitch, write in second half causes extra tick
 
: Timer glitch, write in second half causes extra tick
 +
; ''Mr. Do!''
 +
: Relies on LY=LYC bit not changing from 1 to 0 while the LCD is off. (Reported by VOXEL in the emudev Discord server.)
 
; ''Pinball Deluxe'' and ''Pinball Fantasies''
 
; ''Pinball Deluxe'' and ''Pinball Fantasies''
: Depends on STAT IRQ blocking and dispatch to the correct handler if the least significant bit of <code>IF & IE</code> changes during interrupt processing. Otherwise, a cascading failure occurs within the engine that corrupts the playfield display. (See [http://mgba.io/2017/05/29/holy-grail-bugs/ "Holy Grail" Bugs in Emulation, Part 1] and [http://mgba.io/2018/03/09/holy-grail-bugs-revisited/ "Holy Grail" Bugs Revisited] by endrift and LIJI.)
+
: Depends on STAT IRQ blocking and dispatch to the correct handler if the least significant bit of <code>IF & IE</code> changes during the first 3 cycles of interrupt processing. (A VBlank interrupt lands while the CPU is processing STAT.) Otherwise, a cascading failure occurs within the engine that corrupts the playfield display. (See [https://mgba.io/2017/05/29/holy-grail-bugs/ "Holy Grail" Bugs in Emulation, Part 1] and [https://mgba.io/2018/03/09/holy-grail-bugs-revisited/ "Holy Grail" Bugs Revisited] by endrift and LIJI.)
 
; ''Pocket Bomberman'' (J), ''Pokemon Card GB'' (J); ''Robopon''
 
; ''Pocket Bomberman'' (J), ''Pokemon Card GB'' (J); ''Robopon''
 
: Obscure "HuC" mappers.
 
: Obscure "HuC" mappers.
 
; ''Prehistorik Man''
 
; ''Prehistorik Man''
: Large scroll text in title screen depends on mid-scanline writes to background palette (BGP) and uses sprite evaluation delay to change the effective horizontal position of these writes.
+
: Large scroll text in title screen depends on mid-scanline writes to background palette (BGP) and uses sprite evaluation delay to change the effective horizontal position of these writes. Also uses the envelopes' "zombie mode" to change channels' volume without needing to restart a note.
; ''Road Rash'' (original version) and ''Xerd no Densetsu''
+
; ''Road Rash'' (original version) and ''Legend of Zerd''
: These run only on a monochrome system (Game Boy, Super Game Boy, or Game Boy pocket), not a color system (Game Boy Color, Game Boy Advance, Game Boy Player), because they depend on writes to STAT briefly enabling IRQ for all modes.
+
: These run only on a monochrome system (Game Boy, Super Game Boy, or Game Boy pocket), not a color system (Game Boy Color, Game Boy Advance, Game Boy Player), because they depend on writes to STAT briefly enabling all STAT IRQ sources.
; ''Tokyo Disneyland: Fantasy Tour''
+
; ''Shantae''
: Relies on open bus. One minigame accidentally reads a pointer from disabled SRAM and writes there. It relies on the value being $0A0A (or at least somewhere else where writes are harmless), not $FFFF (which is IE).
+
: This GBC-only game plays a sound effect using hardware sweep when Shantae crouches. It relies on behavior of hardware sweep on GBC, and some emulators emulate only the (different) DMG behavior. It also stops the sound effect by writing to the envelope register without restarting the sound, which relies on effects related to zombie mode.
 +
; ''The Smurfs'' (SGB version)
 +
: Relies on double reading of opcodes when <code>halt</code> while IME=0 and interrupt is pending. At $0E3A, 76 f0 8c is <code>halt ldh a, [$ff8c]</code> without the <code>halt</code> bug. With the <code>halt</code> bug, it is executed as <code>halt ldh a, [$fff0] adc h</code>, and the game relies on the <code>adc h</code>.
 +
; ''Super Mario Land 2: 6 Golden Coins'' and ''Wario Land: Super Mario Land 3''
 +
: These games use SRAM at $A000-$BFFF contiguously with WRAM at $C000-$DFFF to hold a decompressed level map, and they put most of the game's variables in SRAM. If an emulator automatically saves SRAM to disk a certain time interval in seconds after it was last written, it is believed that these games will practically never automatically save.
 
; ''Warriors of Might and Magic''
 
; ''Warriors of Might and Magic''
 
: Draws status bar with mid-screen SCX/SCY changes. It also sets WX=0, which on GBC causes the window not to be drawn, and fills the window with garbage.
 
: Draws status bar with mid-screen SCX/SCY changes. It also sets WX=0, which on GBC causes the window not to be drawn, and fills the window with garbage.
 +
; ''Wario Land 3''
 +
: pool of rain, you have to go up a vine, and if you don't emulate VRAM inaccessibility during mode 3, you can't progress. to make it worse, it doesn't happen if it's the first level you play after a reset!
 +
: The error screen when run on pre-GBC systems depends on the speed register (KEY1, $FF4D) returning $FF. It is reported to misbehave on emulators where the speed bit reads 0.
  
 
== Game bugs ==
 
== Game bugs ==
Line 32: Line 47:
 
; ''A Boy and His Blob in The Rescue of Princess Blobette''
 
; ''A Boy and His Blob in The Rescue of Princess Blobette''
 
: Z-fighting between boy and blob. This is common in monochrome Game Boy games, where X position overrides OAM index as determiner of priority.
 
: Z-fighting between boy and blob. This is common in monochrome Game Boy games, where X position overrides OAM index as determiner of priority.
 +
; ''DuckTales''
 +
: Triggers a new wave channel note in NR34 without first stopping playback in NR30. This can cause wave RAM bytes 4-7, 8-11, or 12-15 to be copied over bytes 0-3.
 +
; ''Panel Action Bingo''
 +
: Sound effects on score counting screen stop early on CGB B.
 +
; ''R-Type'' (original version)
 +
: Does not initialize wave RAM, instead using the (unspecified) power-on pattern.
 +
 +
== See also ==
 +
* [[Games that are not compatible with future consoles‎‎]]
  
 
== External links ==
 
== External links ==
 
* [https://wiki.nesdev.com/w/index.php/Tricky-to-emulate_games "Tricky-to-emulate games"] on NESdev Wiki
 
* [https://wiki.nesdev.com/w/index.php/Tricky-to-emulate_games "Tricky-to-emulate games"] on NESdev Wiki
 
* [https://wiki.nesdev.com/w/index.php/Game_bugs "Game bugs"] on NESdev Wiki
 
* [https://wiki.nesdev.com/w/index.php/Game_bugs "Game bugs"] on NESdev Wiki
* [http://kigb.emuunlim.com/compatibility.htm KiGB compatibility screenshots]: Comparing KiGB to outdated VisualBoyAdvance, outdated BGB, no$gmb, and TGB Dual might be helpful for figuring out what games need quirks to be emulated.
+
* [http://kigb.emuunlim.com/compatibility.htm KiGB compatibility screenshots]: Comparing KiGB to outdated VisualBoyAdvance, outdated BGB, No$gmb, and TGB Dual might be helpful for figuring out what games need quirks to be emulated.
 +
* [https://www.smspower.org/Development/Software-Index "Software Index"] on SMS Power
 +
* [https://github.com/nba-emu/NanoBoyAdvance/blob/master/docs/ACCURACY.md#game-compatibility ACCURACY.md] from NanoBoyAdvance docs

Latest revision as of 10:50, 11 May 2024

Some Game Boy games depend on hard-to-emulate or just obscure behavior that some popular (or formerly popular) emulators get wrong.

Alone in the Dark: The New Nightmare
Poster child for hi-color techniques of rewriting GBC background palettes between scanlines.
Altered Space
Requires STAT IRQ blocking (if more than one STAT condition (mode 0, 1, 2, LYC) is enabled, all enabled conditions have to be false for a cycle before another STAT IRQ can get through); otherwise graphics are corrupt.
Boxxle
Loop at $1FB1 uses "nitro copy", writing a value to VRAM and looping until it took.
Daedalian Opus (JP: Bouken Puzzle Road)
Hangs if vblank interrupt timing is not precise.
Daiku no Gen-san: Kachikachi no Tonkachi ga Kachi and Tokyo Disneyland: Fantasy Tour
These rely on open bus in the SRAM area. Daiku no Gen-san hangs in stage 1-4 while transporting a block on an elevator to reach a switch. (mGBA issue #2032; BizHawk issue #2482) One minigame in Tokyo Disneyland accidentally reads a pointer from disabled SRAM and writes there. It relies on the value being $0A0A (or at least somewhere else where writes are harmless), not $FFFF (which is IE).
Dr. Rin ni Kiitemite! - Koi no Rin Fuusui
At startup, this game executes a GBC speed switch using a STOP with an invalid opcode as its second byte.
Game de Hakken!! Tamagotchi - Osutchi to Mesutchi
Complex multi-chip mapper.
Koro Dice
Timer glitch, write in second half causes extra tick
Mr. Do!
Relies on LY=LYC bit not changing from 1 to 0 while the LCD is off. (Reported by VOXEL in the emudev Discord server.)
Pinball Deluxe and Pinball Fantasies
Depends on STAT IRQ blocking and dispatch to the correct handler if the least significant bit of IF & IE changes during the first 3 cycles of interrupt processing. (A VBlank interrupt lands while the CPU is processing STAT.) Otherwise, a cascading failure occurs within the engine that corrupts the playfield display. (See "Holy Grail" Bugs in Emulation, Part 1 and "Holy Grail" Bugs Revisited by endrift and LIJI.)
Pocket Bomberman (J), Pokemon Card GB (J); Robopon
Obscure "HuC" mappers.
Prehistorik Man
Large scroll text in title screen depends on mid-scanline writes to background palette (BGP) and uses sprite evaluation delay to change the effective horizontal position of these writes. Also uses the envelopes' "zombie mode" to change channels' volume without needing to restart a note.
Road Rash (original version) and Legend of Zerd
These run only on a monochrome system (Game Boy, Super Game Boy, or Game Boy pocket), not a color system (Game Boy Color, Game Boy Advance, Game Boy Player), because they depend on writes to STAT briefly enabling all STAT IRQ sources.
Shantae
This GBC-only game plays a sound effect using hardware sweep when Shantae crouches. It relies on behavior of hardware sweep on GBC, and some emulators emulate only the (different) DMG behavior. It also stops the sound effect by writing to the envelope register without restarting the sound, which relies on effects related to zombie mode.
The Smurfs (SGB version)
Relies on double reading of opcodes when halt while IME=0 and interrupt is pending. At $0E3A, 76 f0 8c is halt ldh a, [$ff8c] without the halt bug. With the halt bug, it is executed as halt ldh a, [$fff0] adc h, and the game relies on the adc h.
Super Mario Land 2: 6 Golden Coins and Wario Land: Super Mario Land 3
These games use SRAM at $A000-$BFFF contiguously with WRAM at $C000-$DFFF to hold a decompressed level map, and they put most of the game's variables in SRAM. If an emulator automatically saves SRAM to disk a certain time interval in seconds after it was last written, it is believed that these games will practically never automatically save.
Warriors of Might and Magic
Draws status bar with mid-screen SCX/SCY changes. It also sets WX=0, which on GBC causes the window not to be drawn, and fills the window with garbage.
Wario Land 3
pool of rain, you have to go up a vine, and if you don't emulate VRAM inaccessibility during mode 3, you can't progress. to make it worse, it doesn't happen if it's the first level you play after a reset!
The error screen when run on pre-GBC systems depends on the speed register (KEY1, $FF4D) returning $FF. It is reported to misbehave on emulators where the speed bit reads 0.

Game bugs

Hardware quirks and program errors cause some released Game Boy games to look wrong or odd on authentic hardware. Ideally, games should look exactly as wrong in an emulator as they do on hardware. Refer to this list if you're developing an emulator and a particular game looks wrong so that you don't go "fixing" bugs while breaking your emulator.

A Boy and His Blob in The Rescue of Princess Blobette
Z-fighting between boy and blob. This is common in monochrome Game Boy games, where X position overrides OAM index as determiner of priority.
DuckTales
Triggers a new wave channel note in NR34 without first stopping playback in NR30. This can cause wave RAM bytes 4-7, 8-11, or 12-15 to be copied over bytes 0-3.
Panel Action Bingo
Sound effects on score counting screen stop early on CGB B.
R-Type (original version)
Does not initialize wave RAM, instead using the (unspecified) power-on pattern.

See also

External links