Game bugs: Difference between revisions
(citation for ''Rambo'' did not explain anything, it was just someone stating the same bug happened there. Restore the now-deleted citation for the effect on SMB1 because it actually demonstrated what went wrong.) |
(→"Impossible" controller input: Noted another way in which it's possible to press opposing directions in real hardware) |
||
(36 intermediate revisions by 6 users not shown) | |||
Line 10: | Line 10: | ||
[[File:Smb3-attribute-glitch.png|thumb|Attribute glitch in ''Super Mario Bros. 3'']] | [[File:Smb3-attribute-glitch.png|thumb|Attribute glitch in ''Super Mario Bros. 3'']] | ||
{| class="wikitable | {| class="wikitable" | ||
! style="width: 18%" | Game | ! style="width: 18%" | Game | ||
! | ! Problem | ||
|- | |- | ||
|''The Addams Family''|| The in-game status bar occasionally bumps vertically by 1 pixel, caused by non-solid background pixels overlapping the sprite zero that is used for the status bar split. | |''The Addams Family''|| The in-game status bar occasionally bumps vertically by 1 pixel, caused by non-solid background pixels overlapping the sprite zero that is used for the status bar split. | ||
|- | |- | ||
|''Akumajou Densetsu''|| When a door is opened/shut when the player goes through them, the screen shakes by one pixel. | |''Ai Senshi Nicol'' || Loading CHR-RAM can fail due to a race condition, causing level graphics to be incorrect. This occurs if an NMI lands between the two [[PPUADDR]] writes for the graphics copy, because the NMI handler reads [[PPUSTATUS]], clearing the address write latch. Whether this happens depends on FDS disk access timing, which does not take a well-defined, fixed amount of time. It is not clear if this can happen with real-world timing variance on real hardware, but it is a concern for emulators. | ||
|- | |||
|''Akumajou Densetsu''|| | |||
* When a door is opened/shut when the player goes through them, the screen shakes by one pixel. | |||
* During Stages 6-4 and 6-5, the game uses horizontal mirroring with one nametable reserved for the rising water, but still scrolls horizontally and instead [[PPUMASK|masks the leftmost column]], causing tile/attribute glitches at the left edge and clipping part of the status bar. ''Castlevania III'' instead uses a third nametable from the [[MMC5]]'s ExRAM for the rising water, preventing these issues. | |||
|- | |- | ||
|''Akumajou Special''|| The game over screen is sometimes glitched when it occurs in bidirectional scroll stages. (Validated in Game Center CX.) | |''Akumajou Special''|| The game over screen is sometimes glitched when it occurs in bidirectional scroll stages. (Validated in Game Center CX.) | ||
|- | |- | ||
|''Armadillo''|| The in-game status bar occasionally bumps vertically by 1 pixel. | |''Armadillo''|| | ||
* The in-game status bar occasionally bumps vertically by 1 pixel. | |||
* Slowdowns occur frequently. | |||
|- | |- | ||
|''Castlevania''|| | |''Castlevania''|| | ||
* Revision 0 of the US version is prone to crashing when too many sprites are active (for example, when fighting Death), due to the game loading the wrong ROM bank after jumping to the NMI routine. | |||
* In the US versions, due to [[APU DMC#Conflict with controller and PPU read|DMC DMA controller corruption]], holding Up when Simon is hit can occasionally cause the game to pause. ''Castlevania'' only uses DPCM for a short grunt sample when Simon is hit, and the US versions do not have any controller re-read code, instead seemingly relying on inputs being ignored while the sample plays; Start is still processed to allow pausing, however, and if DMC DMA causes a controller bit deletion before Start is read, an Up input will be read as Start instead. The Japanese versions (FDS and Famicom) use controller re-read code, so they are exempt from this issue. | |||
|- | |- | ||
|''Castlevania II - Simon's Quest''|| Sometimes incorrect tiles are shown on the playfield. | |''Castlevania II - Simon's Quest''|| Sometimes incorrect tiles are shown on the playfield. | ||
Line 28: | Line 36: | ||
| ''Castlevania III - Dracula's Curse''|| | | ''Castlevania III - Dracula's Curse''|| | ||
* The [[APU DMC|DMC channel]] in music sometimes mutes. | * The [[APU DMC|DMC channel]] in music sometimes mutes. | ||
* When pressing the | * When pressing the B button at the exact time that Trevor falls off a block, the whip sound plays, but Trevor doesn't attack. | ||
|- | |- | ||
|''Chip 'n Dale Rescue Rangers''|| As the intro sequence is fading out, the game displays sprites with incorrect tiles in the positions for the player initials and life indicators at the top of the screen. When the screen fades back in, the same positions have the correct graphics. | |''Chip 'n Dale Rescue Rangers''|| As the intro sequence is fading out, the game displays sprites with incorrect tiles in the positions for the player initials and life indicators at the top of the screen. When the screen fades back in, the same positions have the correct graphics. | ||
Line 40: | Line 48: | ||
|''Donald Land''|| When the player progresses too quickly by boosting off of apples, the background loads fall behind and the scroll seam becomes visible. | |''Donald Land''|| When the player progresses too quickly by boosting off of apples, the background loads fall behind and the scroll seam becomes visible. | ||
|- | |- | ||
|''Door Door''|| [[PPU palettes|Palette RAM]] is not initialized correctly if the VBL flag ([[PPUSTATUS]] bit 7) is set on power-up/reset due to the PPU's [[PPU power up state|power-up state]]. | |||
|- | |||
|''Double Dragon''|| | |''Double Dragon''|| | ||
* "Garbage sprites" (sprite 0 (for [[sprite-0 hit]]) and sprite 1) can be seen in the lower right of the game screen. | * "Garbage sprites" (sprite 0 (for [[sprite-0 hit]]) and sprite 1) can be seen in the lower right of the game screen. | ||
Line 49: | Line 59: | ||
|- | |- | ||
|''Double Dragon III''|| Same status bar issue as ''Double Dragon II''. | |''Double Dragon III''|| Same status bar issue as ''Double Dragon II''. | ||
|- | |||
|''DuckTales''|| The scroll split between the status bar and playfield is placed in the middle of the status bar's bottom-most scanline, causing it to jitter when scrolling horizontally. Additionally, the game uses different sprites for the status bar and playfield that are swapped mid-frame via a [[PPUCTRL]] write, and hides the status bar's sprites whenever the player's metasprite overlaps it, further complicating sprite 0 hit behavior and causing the bottom-most scanline to scroll across the entire screen instead. | |||
|- | |- | ||
|''Duck Maze''|| The original 60-pin release for famiclones relies on decimal mode working as it does in a 6502. Without decimal mode, score counting works wrong, and the game may never finish counting down at the end of a level. (Fixed for HES's 72-pin rerelease.) | |''Duck Maze''|| The original 60-pin release for famiclones relies on decimal mode working as it does in a 6502. Without decimal mode, score counting works wrong, and the game may never finish counting down at the end of a level. (Fixed for HES's 72-pin rerelease.) | ||
|- | |- | ||
|''Eliminator Boat Duel'' || | |''Eliminator Boat Duel'' || | ||
* Occasionally does not boot on Dendy-style PAL famiclones when the | * Occasionally does not boot on Dendy-style PAL famiclones when the [[PPUSTATUS]] read in the 8-cycle [[PPU power up state|warm-up loop]] always coincides with the exact start of vblank. | ||
* Audible buzzing due to the [[APU DMC|DMC channel]] being enabled in its [[CPU power up state|power-on state]] every frame.<ref>[https://forums.nesdev.org/viewtopic.php?t=18278 Eliminator Boat Duel]</ref> | * Audible buzzing due to the [[APU DMC|DMC channel]] being enabled in its [[CPU power up state|power-on state]] every frame.<ref>[https://forums.nesdev.org/viewtopic.php?t=18278 Eliminator Boat Duel]</ref> | ||
|- | |- | ||
Line 63: | Line 75: | ||
|- | |- | ||
|''Ghosts 'n Goblins''|| | |''Ghosts 'n Goblins''|| | ||
* Relies on the VBL flag ([[PPUSTATUS]] bit 7) being clear to [[PPU power up state#Best_practice|wait before enabling NMIs]] during the reset handler. If it is set, the write to [[PPUCTRL]] occurs too early and the game fails to boot. | |||
* Garbage sprites sometimes appear on-screen due to incomplete display lists being uploaded to OAM. (see ''Strider'') | * Garbage sprites sometimes appear on-screen due to incomplete display lists being uploaded to OAM. (see ''Strider'') | ||
|- | |||
|''Gimmick!''||The game's controller polling routine relies on extra [[APU DMC#Conflict with controller and PPU read|DMC DMA controller corruption]] only present on select hardware revisions (original RF, Twin, and Titler Famicoms) to detect if a controller read was corrupted. On NES consoles and the New/AV Famicom, DMC DMA glitches are not as pronounced, causing the routine to accept a corrupted read. This results in occasional spurious inputs such as pausing when holding up, or turning/inching rightwards while idle. The PAL 2A07 CPU does not have this conflict, so the glitch is avoided entirely in the European release. | |||
|- | |- | ||
|''Hebereke''|| | |''Hebereke''|| | ||
* The triangle channel in the title screen music is silent, except after exiting from the password screen. | * The triangle channel in the title screen music is silent, except after exiting from the password screen. | ||
* | * The HUD disappears when the player overlaps its vertical position, due to both using the same CHR ROM sprite bank that is swapped mid-frame. | ||
|- | |- | ||
|''Hottarman no Chitei Tanken''|| If gameplay slows down due to excessive on-screen objects, scrolling may glitch and display garbage values. | |''Hottarman no Chitei Tanken''|| If gameplay slows down due to excessive on-screen objects, scrolling may glitch and display garbage values. | ||
|- | |- | ||
|''The Immortal'' || Uses color $0D (blacker than black) as black and color $0E (normal black) as a darker gray than color $2D while setting all three deemphasis bits, causing picture instability on many television sets and TV capture cards. | |''The Immortal'' || Uses color $0D (blacker than black) as black and color $0E (normal black) as a darker gray than color $2D while setting all three deemphasis bits, causing picture instability on many television sets and TV capture cards. (see [[Color $0D games]]) | ||
|- | |- | ||
|''Ironsword: Wizards and Warriors II'' || Noise channel doesn't work properly, sometimes plays longer notes and sometimes mutes. | |''Ironsword: Wizards and Warriors II'' || Noise channel doesn't work properly, sometimes plays longer notes and sometimes mutes. | ||
|- | |- | ||
|''Kirby's Adventure''|| When Kirby copies a new ability, the status bar icon may flicker or display incorrect attributes (?) | |''Kirby's Adventure''|| | ||
* When Kirby copies a new ability, the status bar icon may flicker or display incorrect attributes. (?) | |||
* Slowdowns occur frequently. | |||
* Jump and attack inputs are sometimes ignored. | |||
|- | |- | ||
|''The Legend of Zelda''|| Vertical scrolling between screens is very messy, jumping by 3-4 scanlines because of an incorrect fine y from the $2006 writes, two reads from $2007, and imprecise timing on these accesses that can cause a $2007 read's y increment to be lost.<ref>[https://www.gridbugs.org/zelda-screen-transitions-are-undefined-behaviour/ Zelda Screen Transitions are Undefined Behaviour]: A deep dive into Zelda scrolling that is largely good until the "Scroll Down to Scroll Up" section, which has significant factual errors.</ref> Vertical scrolling while DPCM is playing can cause the vertical scroll to momentarily jump due to conflicts between 2nd $2006 writes and automatic fine y increments. See [[PPU scrolling]] for details on how these registers interact with scrolling. | |||
|- | |||
|''Mega Man''|| | |||
* When pausing and unpausing the game with the Select button, the high bits of the triangle channel's period are not rewritten until Mega Man's teleporting animation finishes, causing distorted, high-pitched noise due to them being left at 0 until then. | |||
* If Fire Man is defeated and the stage clear orb is obtained while his ground flame remains active, it will incorrectly use tiles loaded for the stage clear text before being deleted, due to them occupying the same space in CHR RAM. | |||
|- | |||
|''Mega Man 3''|| | |''Mega Man 3''|| | ||
* | * The first scanline of the weapon menu and the scanline above Shadow Man in the stage select screen are glitched due to improperly timed scroll splits. | ||
* | * In revision 0 of the PAL version, when the Wily Machine is fought, the floor heavily jitters up and down across the screen. This is because two [[MMC3]] scanline counter IRQs are used for the Machine and the floor, but after the first IRQ, the new reload value (116) is written to $C000 without a write to $C001, which can sometimes happen at the same time the counter is clocked from 0 by PPU A12, overwriting it with the old reload value (58) and causing the split to happen much earlier. This was fixed in later revisions by changing the timing of the $C000 write. | ||
|- | |- | ||
|''Mega Man 5''|| In Gyro Man's stage, inside the two elevators, the floor moves up by a few pixels when the elevator goes up, and move back down when the screen is fast-scrolled. | |''Mega Man 5''|| In Gyro Man's stage, inside the two elevators, the floor moves up by a few pixels when the elevator goes up, and move back down when the screen is fast-scrolled. | ||
|- | |- | ||
|''Micro Machines''|| Graphical problems on PPU revisions prior to 2C02G due to | |''Metroid''|| The ending song of the Japanese version is [https://youtu.be/NXlgXfI-6eQ?t=859 supposed to use volume envelopes], yet the in-game playback plays [https://www.youtube.com/watch?v=YpLP8aGXcWs&t=3208s without them]. The reason is that the memory location that holds the value that will be written to $4080 on the next start of a note is re-used for some other purpose (routine at PC $6779 in revision 3). | ||
|- | |||
|''Micro Machines''|| Graphical problems on PPU revisions prior to 2C02G due to [[OAMDATA]] unreadability. Resetting on Famicom and NES-101 doesn't always work because the game fails to clear [[PPUCTRL]] and [[PPUMASK]] on reset. | |||
|- | |- | ||
|''Mitsume ga Tooru''|| Garbage data is visible in the upper side of the status bar by when shaken by an earthquake, due to the status bar and playfield both sharing the nametables. | |''Mitsume ga Tooru''|| Garbage data is visible in the upper side of the status bar by when shaken by an earthquake, due to the status bar and playfield both sharing the nametables. | ||
Line 109: | Line 132: | ||
|- | |- | ||
|''Strider''|| The NMI handler pushes an incomplete display list to OAM during lag frames, leading to visible garbage sprites.<ref>[https://www.youtube.com/watch?v=01aBYq91KnA "The Garbage Sprites in Strider (NES) - Behind the Code" by Displaced Gamers] (15 minutes)</ref> | |''Strider''|| The NMI handler pushes an incomplete display list to OAM during lag frames, leading to visible garbage sprites.<ref>[https://www.youtube.com/watch?v=01aBYq91KnA "The Garbage Sprites in Strider (NES) - Behind the Code" by Displaced Gamers] (15 minutes)</ref> | ||
|- | |||
|''Super Cars''|| The top of the screen flickers on PPU revisions prior to 2C02G due to [[OAMDATA]] unreadability. | |||
|- | |- | ||
|''Super Mario Bros.''|| | |''Super Mario Bros.''|| | ||
* The status bar shakes horizontally on heavy sprite usage and the music slows down. This can be seen especially in worlds 6-4, 7-4 and 8-4, where the large number of hammer objects created by Bowser's code causes the processing time to overshoot a frame. NMIs are disabled on entry to the NMI code and only reenabled when the CPU is "idle", thus when the overshoot occurs, the CPU "misses" a frame, causing general slowdown and status bar shakiness. | * The status bar shakes horizontally on heavy sprite usage and the music slows down. This can be seen especially in worlds 6-4, 7-4 and 8-4, where the large number of hammer objects created by Bowser's code causes the processing time to overshoot a frame. NMIs are disabled on entry to the NMI code and only reenabled when the CPU is "idle", thus when the overshoot occurs, the CPU "misses" a frame, causing general slowdown and status bar shakiness. | ||
* At various parts of 1-2, in certain CPU/PPU alignments, a single scanline gets glitched. This is caused by | * At various parts of 1-2, in certain CPU/PPU alignments, a single scanline gets glitched. This is caused by writing to [[PPUCTRL]] to reenable NMI at the exact end of the previous scanline, causing the PPU to begin that scanline from the first nametable instead of the second.<ref>https://forums.nesdev.org/viewtopic.php?p=112424#p112424</ref> | ||
* When hitting a <code>?</code> block while maintaining a run at top speed, after the bounce animation finishes, the block disappears for up to two frames before settling in the background. (Updating the nametable at the [[PPU scrolling|scroll seam]] has priority.) | * When hitting a <code>?</code> block while maintaining a run at top speed, after the bounce animation finishes, the block disappears for up to two frames before settling in the background. (Updating the nametable at the [[PPU scrolling|scroll seam]] has priority.) | ||
|- | |- | ||
Line 124: | Line 149: | ||
|- | |- | ||
|''Tetris'' (Bullet-Proof Software)''|| Sets [[APU Triangle]] period to longest value instead of actually muting it. | |''Tetris'' (Bullet-Proof Software)''|| Sets [[APU Triangle]] period to longest value instead of actually muting it. | ||
|- | |||
|''Tetris 2 + Bombliss''|| The 2-player mode will become softlocked (requiring a reset) if the second player presses the start button to pause the game, as the game does not properly account for the start/select buttons being present on the second controller in this scenario. This is possible if expansion port controllers are connected, or if the game is being played on the NES or the New/AV Famicom. | |||
|- | |- | ||
|''Zelda II: The Adventure of Link''|| | |''Zelda II: The Adventure of Link''|| | ||
Reads from | Reads from [[PPUDATA]] during the title screen twice, moving the background upward by 2 scanlines after the split point. | ||
|- | |- | ||
|''Zombie Nation''|| Same as ''Tetris'', above | |''Zombie Nation''|| Same as ''Tetris'' (Bullet-Proof Software), above | ||
|} | |} | ||
== Reliance on power-on mapper state == | == Reliance on power-on mapper state == | ||
{| class="wikitable | {| class="wikitable" | ||
! style="width: 18%" | Game | ! style="width: 18%" | Game | ||
! | ! Problem | ||
|- | |- | ||
|''Digital Devil Story: Megami Tensei II''|| | |''Digital Devil Story: Megami Tensei II''|| | ||
When powered-on with uninitialized SRAM, a "DDS II" logo is flashed from left to right before proceeding with the normal introduction. The logo's background looks garbled because the game has not fully initialized the CHR bank select registers at that point. | When powered-on with uninitialized SRAM, a "DDS II" logo is flashed from left to right before proceeding with the normal introduction. The logo's background looks garbled because the game has not fully initialized the [[INES Mapper 019#CHR and NT Select ($8000-$DFFF) w|CHR bank select registers]] at that point. | ||
|- | |- | ||
|''Mega Man 5''|| Neglects to disable MMC3 | |''Mega Man 5''|| Neglects to [[MMC3#IRQ disable ($E000-$FFFE, even)|disable MMC3 IRQs]] on reset and executes a CLI instruction before the game has fully initialized, causing the game to not boot if an [[IRQ]] was pending at that point. | ||
|} | |} | ||
Line 147: | Line 174: | ||
Note that using power-on RAM content as a seed for ''random'' number generation (such as in Final Fantasy) is not a game bug, even if it makes speedruns harder to verify on console. | Note that using power-on RAM content as a seed for ''random'' number generation (such as in Final Fantasy) is not a game bug, even if it makes speedruns harder to verify on console. | ||
{| class="wikitable | {| class="wikitable" | ||
! style="width: 18%" | Game | ! style="width: 18%" | Game | ||
! | ! Problem | ||
|- | |- | ||
| ''Cheetahmen II'' || Suspected that certain RAM values may affect being able to reach the final two levels of the game (levels 5 and 6).<ref>http://forums.nesdev.org/viewtopic.php?p=178154#p178154</ref> | | ''Cheetahmen II'' || Suspected that certain RAM values may affect being able to reach the final two levels of the game (levels 5 and 6).<ref>http://forums.nesdev.org/viewtopic.php?p=178154#p178154</ref> | ||
Line 162: | Line 189: | ||
|- | |- | ||
| ''F-1 Race'' (Beta Version only) || Title screen will be skipped if $6B and $70 contain non-zero values.<ref>http://forums.nesdev.org/viewtopic.php?p=178168#p178168</ref> Game blindly reads and uses values from $51, $55, $70, $A4, and $0200-02FF (via sprite DMA).<ref>http://forums.nesdev.org/viewtopic.php?p=178015#p178015</ref> | | ''F-1 Race'' (Beta Version only) || Title screen will be skipped if $6B and $70 contain non-zero values.<ref>http://forums.nesdev.org/viewtopic.php?p=178168#p178168</ref> Game blindly reads and uses values from $51, $55, $70, $A4, and $0200-02FF (via sprite DMA).<ref>http://forums.nesdev.org/viewtopic.php?p=178015#p178015</ref> | ||
|- | |||
| ''Famicom Jump II: 最強の7人'' || If save RAM is initialized to all 00s, the game will freeze at the very first power-on with a black screen. It will work normally after a soft reset as well as subsequent power-ons. | |||
|- | |- | ||
| ''Gun.Smoke'' (FDS version only)|| The music player's RAM is not cleared before starting the title screen song, resulting in a garbage first noise channel note, with random properties, if that RAM is not zero. | | ''Gun.Smoke'' (FDS version only)|| The music player's RAM is not cleared before starting the title screen song, resulting in a garbage first noise channel note, with random properties, if that RAM is not zero. | ||
Line 168: | Line 197: | ||
|- | |- | ||
| ''Huge Insect'' || Artifacts show up on the screen when nametable RAM is initialized with random values (the game only appears to initialize one of the 2 nametables). | | ''Huge Insect'' || Artifacts show up on the screen when nametable RAM is initialized with random values (the game only appears to initialize one of the 2 nametables). | ||
|- | |||
| ''Keroppi to Keroriinu no Splash Bomb!'' || Can crash during the final boss if any of $0680-$069F contain any value between $30-$33. This is because the game's playfield data begins 2 rows down from the top of the screen, so when checking for playfield collision, the position of the falling fire is adjusted by $20 and underflows at the top of the screen, using uninitialized RAM after the playfield for these non-existent rows. If the value indicates the fire can land there, the game uses an invalid jump table index and crashes. | |||
|- | |- | ||
| ''Layla'' || The music player's RAM is not cleared before starting the title screen song, resulting in a flubbed first note, sometimes with a frequency sweep, depending on power-on RAM content. | | ''Layla'' || The music player's RAM is not cleared before starting the title screen song, resulting in a flubbed first note, sometimes with a frequency sweep, depending on power-on RAM content. | ||
|- | |- | ||
| ''Minna no Taabou no Nakayoshi Daisakusen'' || Requires that address $11 be initialized to | | ''Minna no Taabou no Nakayoshi Daisakusen'' || Requires that address $11 be initialized to a value other than $00, otherwise the game will not start.<ref>http://forums.nesdev.org/viewtopic.php?p=185663#p185663</ref> A PRG1 version corrects the issue. | ||
|- | |- | ||
| ''Silva Saga'' || When save RAM is initialized with all 0s, the game incorrectly creates 3 blank saved games which do not work properly.<ref>https://forums.nesdev.org/viewtopic.php?f=11&t=11045</ref> | | ''Silva Saga'' || When save RAM is initialized with all 0s, the game incorrectly creates 3 blank saved games which do not work properly.<ref>https://forums.nesdev.org/viewtopic.php?f=11&t=11045</ref> | ||
|- | |- | ||
| ''Super Mario Bros'' (bootleg versions) || Relies on portions of RAM containing $00, otherwise player starts at world 0-1.<ref>http://forums.nesdev.org/viewtopic.php?p=178163#p178163</ref> | | ''Super Mario Bros.'' || Blindly reads and uses variables used for the continue feature's starting world number (accessed by pressing A+Start on the title screen) and the hard mode/second quest toggle. ''Tennis'' is often used to access "glitch worlds" beyond world 8 as a result of this.<ref>[https://www.youtube.com/watch?v=hrFHNgJlJSg "Access Glitch Worlds in Super Mario Bros. via NES Tennis" by Retro Game Mechanics Explained] (13 minutes)</ref> | ||
|- | |||
| ''Super Mario Bros.'' (bootleg versions) || Relies on portions of RAM containing $00, otherwise player starts at world 0-1.<ref>http://forums.nesdev.org/viewtopic.php?p=178163#p178163</ref> | |||
|- | |- | ||
| ''Terminator 2: Judgment Day'' || The copyright screen is skipped if RAM is filled with $00 (more generally, if a high score table checksum happens to be valid).<ref>http://forums.nesdev.org/viewtopic.php?p=180752#p180752</ref> | | ''Terminator 2: Judgment Day'' || The copyright screen is skipped if RAM is filled with $00 (more generally, if a high score table checksum happens to be valid).<ref>http://forums.nesdev.org/viewtopic.php?p=180752#p180752</ref> | ||
Line 184: | Line 217: | ||
== "Impossible" controller input == | == "Impossible" controller input == | ||
Many games | Many games behave oddly when button combinations that would be impossible (or at least very hard) to input on a [[standard controller]] are pressed. This comprises pressing left+right and up+down simultaneously. Such impossible controller input should probably be prevented by default in an emulator, but they can be optionally allowed for experimental purposes. | ||
Such impossible controller input should probably be prevented by default in an emulator, but they can be optionally allowed for | |||
Alternatively, [[Controller reading code|controller reading routines]] in most games combine inputs from both the standard ports and the Famicom's [[expansion port]] (even in international versions) to support [[Four player adapters#Adapters|replacement controllers]], so it is possible to press one direction in a standard controller and simultaneously the opposing direction in the replacement controller to achieve the same effect. | |||
{| class="wikitable" | {| class="wikitable" | ||
! Game !! Problem | ! Game !! Problem | ||
|- | |||
| ''Bad Street Brawler'' || A [[Power Glove]] Gaming Series game which maps a unique attack to left+right. It instantly kills one enemy per stage. | |||
|- | |- | ||
| ''Battletoads'' || Pressing up+down in the vertical tunnel level kills the player instantly. Additionally, pressing left+right causes the player to walk up/back even when in pure 2D stages, which can result in certain areas becoming impossible to complete. | | ''Battletoads'' || Pressing up+down in the vertical tunnel level kills the player instantly. Additionally, pressing left+right causes the player to walk up/back even when in pure 2D stages, which can result in certain areas becoming impossible to complete. | ||
|- | |- | ||
| ''Mega Man 1'' | | ''Mega Man 1'' and ''2'' || By pressing up+down at the top of a ladder, one may enter the "climbing ladder" state briefly above the top of the ladder. This allows "zipping" through walls. | ||
|- | |- | ||
| ''Panic Restaurant'' || Pressing up while crouching (by pressing down, thus pressing up+down simultaneously) the player character's sprite uses garbage data including the damage sprite. This does not occur if up is pressed before down; the player chef merely stands still. | | ''Panic Restaurant'' || Pressing up while crouching (by pressing down, thus pressing up+down simultaneously) the player character's sprite uses garbage data including the damage sprite. This does not occur if up is pressed before down; the player chef merely stands still. | ||
Line 197: | Line 234: | ||
| ''Predator'' || Pressing left+right+A/B in normal levels, or up+down+A/B in the level number screen before 'big mode' levels, skips the current level. Inputting these is possible on a Famicom by connecting a controller to the expansion port and splitting the directional inputs. The game merges these inputs and explicitly checks for the combinations. | | ''Predator'' || Pressing left+right+A/B in normal levels, or up+down+A/B in the level number screen before 'big mode' levels, skips the current level. Inputting these is possible on a Famicom by connecting a controller to the expansion port and splitting the directional inputs. The game merges these inputs and explicitly checks for the combinations. | ||
|- | |- | ||
| ''Spy vs. Spy'' || The character turns into an airplane when pressing left+right. | | ''Spy vs. Spy'' || The character turns into an airplane and other garbage sprites when pressing left+right or up+down. | ||
|- | |||
| ''Star Soldier'' || Cheat code button combinations include left+right and left+right+up+down inputs, which rely on the fact that both controller inputs are ORed bitwise when polling.<ref>[https://taotao54321.github.io/StarSoldierResource/cheat/ Star Soldier cheat codes] (Japanese)</ref> | |||
|- | |- | ||
| ''Super Mario Bros. 2'' || Ladders can be climbed very fast by pressing up+down. | | ''Super Mario Bros. 2'' || Ladders can be climbed very fast by pressing up+down. | ||
Line 204: | Line 243: | ||
|- | |- | ||
| ''Teenage Mutant Ninja Turtles II: The Arcade Game'' || When you jump with a left or right move while pressing up+down, the player character will move in unusual directions and speeds, possibly screen-wrapping. | | ''Teenage Mutant Ninja Turtles II: The Arcade Game'' || When you jump with a left or right move while pressing up+down, the player character will move in unusual directions and speeds, possibly screen-wrapping. | ||
|- | |||
| ''Tetris'' (Nintendo) || Holding left+down+right will cause the current and next piece sprites to flicker, slowing the game down in the process. | |||
|- | |- | ||
| ''Tiny Toon Adventures'' || The player can gain unusual speed when pressing left+right. | | ''Tiny Toon Adventures'' || The player can gain unusual speed when pressing left+right. |
Revision as of 22:53, 24 October 2024
Listed are games that have been tested on NES or Famicom hardware and verified to look wrong or odd. This can be caused by NES hardware limitations, programming errors, or even intentional effects within the game. Refer to this if you're developing an emulator and find a game that looks wrong, before you look for a problem in your emulator. If you are attempting to give your emulator "bug for bug" compatibility, you'll want to make sure that these glitches (or unusual behaviors) appear the same in your emulator as they do on the NES.
This is an incomplete list that concentrates on commercial games. For an overview of common compatibility problems in homebrew games, see Program Compatibility. Sometimes, a bug slips into a game to make it rely on less-than-intentional features of the hardware; for those, see Tricky-to-emulate games.
General bugs
Game | Problem |
---|---|
The Addams Family | The in-game status bar occasionally bumps vertically by 1 pixel, caused by non-solid background pixels overlapping the sprite zero that is used for the status bar split. |
Ai Senshi Nicol | Loading CHR-RAM can fail due to a race condition, causing level graphics to be incorrect. This occurs if an NMI lands between the two PPUADDR writes for the graphics copy, because the NMI handler reads PPUSTATUS, clearing the address write latch. Whether this happens depends on FDS disk access timing, which does not take a well-defined, fixed amount of time. It is not clear if this can happen with real-world timing variance on real hardware, but it is a concern for emulators. |
Akumajou Densetsu |
|
Akumajou Special | The game over screen is sometimes glitched when it occurs in bidirectional scroll stages. (Validated in Game Center CX.) |
Armadillo |
|
Castlevania |
|
Castlevania II - Simon's Quest | Sometimes incorrect tiles are shown on the playfield. |
Castlevania III - Dracula's Curse |
|
Chip 'n Dale Rescue Rangers | As the intro sequence is fading out, the game displays sprites with incorrect tiles in the positions for the player initials and life indicators at the top of the screen. When the screen fades back in, the same positions have the correct graphics. |
Commando | Uninitialized nametables and garbage sprites are frequently visible. |
Crystalis | The scanline above the status bar and above text boxes looks wrong. |
Dizzy The Adventurer | Resets the sound phase every frame, causing a nasty 60Hz buzz. |
Donald Land | When the player progresses too quickly by boosting off of apples, the background loads fall behind and the scroll seam becomes visible. |
Door Door | Palette RAM is not initialized correctly if the VBL flag (PPUSTATUS bit 7) is set on power-up/reset due to the PPU's power-up state. |
Double Dragon |
|
Double Dragon II | The status bar may suddenly change colors: sometimes when scrolling vertically it shows incorrectly for a couple of frames. |
Double Dragon III | Same status bar issue as Double Dragon II. |
DuckTales | The scroll split between the status bar and playfield is placed in the middle of the status bar's bottom-most scanline, causing it to jitter when scrolling horizontally. Additionally, the game uses different sprites for the status bar and playfield that are swapped mid-frame via a PPUCTRL write, and hides the status bar's sprites whenever the player's metasprite overlaps it, further complicating sprite 0 hit behavior and causing the bottom-most scanline to scroll across the entire screen instead. |
Duck Maze | The original 60-pin release for famiclones relies on decimal mode working as it does in a 6502. Without decimal mode, score counting works wrong, and the game may never finish counting down at the end of a level. (Fixed for HES's 72-pin rerelease.) |
Eliminator Boat Duel |
|
Exed Exes | When pausing, the immediate next note of the music will play after the pause jingle completes. |
F-15 City War | The last boss is glitched when playing through the game from start to finish in its original INES Mapper 173 and AVE "1.x" version. It is not glitched when jumping to the last boss through cheating in those versions, and never glitched in the later AVE "1.1" and Gluk Video versions. |
Ghostbusters (J) | Loads the ending text from the wrong CHR bank, causing it to display a blank screen that eventually scrolls "りり" (hiragana "riri") on the screen. |
Ghosts 'n Goblins |
|
Gimmick! | The game's controller polling routine relies on extra DMC DMA controller corruption only present on select hardware revisions (original RF, Twin, and Titler Famicoms) to detect if a controller read was corrupted. On NES consoles and the New/AV Famicom, DMC DMA glitches are not as pronounced, causing the routine to accept a corrupted read. This results in occasional spurious inputs such as pausing when holding up, or turning/inching rightwards while idle. The PAL 2A07 CPU does not have this conflict, so the glitch is avoided entirely in the European release. |
Hebereke |
|
Hottarman no Chitei Tanken | If gameplay slows down due to excessive on-screen objects, scrolling may glitch and display garbage values. |
The Immortal | Uses color $0D (blacker than black) as black and color $0E (normal black) as a darker gray than color $2D while setting all three deemphasis bits, causing picture instability on many television sets and TV capture cards. (see Color $0D games) |
Ironsword: Wizards and Warriors II | Noise channel doesn't work properly, sometimes plays longer notes and sometimes mutes. |
Kirby's Adventure |
|
The Legend of Zelda | Vertical scrolling between screens is very messy, jumping by 3-4 scanlines because of an incorrect fine y from the $2006 writes, two reads from $2007, and imprecise timing on these accesses that can cause a $2007 read's y increment to be lost.[2] Vertical scrolling while DPCM is playing can cause the vertical scroll to momentarily jump due to conflicts between 2nd $2006 writes and automatic fine y increments. See PPU scrolling for details on how these registers interact with scrolling. |
Mega Man |
|
Mega Man 3 |
|
Mega Man 5 | In Gyro Man's stage, inside the two elevators, the floor moves up by a few pixels when the elevator goes up, and move back down when the screen is fast-scrolled. |
Metroid | The ending song of the Japanese version is supposed to use volume envelopes, yet the in-game playback plays without them. The reason is that the memory location that holds the value that will be written to $4080 on the next start of a note is re-used for some other purpose (routine at PC $6779 in revision 3). |
Micro Machines | Graphical problems on PPU revisions prior to 2C02G due to OAMDATA unreadability. Resetting on Famicom and NES-101 doesn't always work because the game fails to clear PPUCTRL and PPUMASK on reset. |
Mitsume ga Tooru | Garbage data is visible in the upper side of the status bar by when shaken by an earthquake, due to the status bar and playfield both sharing the nametables. |
Othello | The original 60-pin release for famiclones relies on decimal mode working as it does in a 6502. Without decimal mode, spots are counted wrong. (Fixed for HES's 72-pin rerelease.) |
Panic Restaurant | The in-game status bar is bumped up by 1 pixel. |
Rad Racer | Steer to the far left, and a background scanline will be seen on the road. |
Rambo | One scanline is occasionally glitched, for the same reason as in Super Mario Bros.[3] |
Rampart (Jaleco) | During build phase, the drums (on the noise channel) drop out fairly early. |
Snow Bros. | When you clear the stage and rise to the next floor, incorrect CHR bank switching results in glitches in the new floor's graphics. |
Solar Jetman (NTSC version) | Some songs use the sweep registers heavily, which are not restored after a sound effect plays that uses the sweep registers as well. The PAL version seems to have corrected this error. |
StarTropics | The music data for two songs were not set up correctly.[4]
|
Strider | The NMI handler pushes an incomplete display list to OAM during lag frames, leading to visible garbage sprites.[5] |
Super Cars | The top of the screen flickers on PPU revisions prior to 2C02G due to OAMDATA unreadability. |
Super Mario Bros. |
|
Super Mario Bros. 3 |
|
Teenage Mutant Ninja Turtles | Sprite overflow (due to large numbers of enemies) causes the status bar to flicker. |
Tetris (Bullet-Proof Software) | Sets APU Triangle period to longest value instead of actually muting it. |
Tetris 2 + Bombliss | The 2-player mode will become softlocked (requiring a reset) if the second player presses the start button to pause the game, as the game does not properly account for the start/select buttons being present on the second controller in this scenario. This is possible if expansion port controllers are connected, or if the game is being played on the NES or the New/AV Famicom. |
Zelda II: The Adventure of Link |
Reads from PPUDATA during the title screen twice, moving the background upward by 2 scanlines after the split point. |
Zombie Nation | Same as Tetris (Bullet-Proof Software), above |
Reliance on power-on mapper state
Game | Problem |
---|---|
Digital Devil Story: Megami Tensei II |
When powered-on with uninitialized SRAM, a "DDS II" logo is flashed from left to right before proceeding with the normal introduction. The logo's background looks garbled because the game has not fully initialized the CHR bank select registers at that point. |
Mega Man 5 | Neglects to disable MMC3 IRQs on reset and executes a CLI instruction before the game has fully initialized, causing the game to not boot if an IRQ was pending at that point. |
Reliance on RAM values
Several games erroneously rely on RAM areas being pre-populated with certain values at power-on, despite RAM contents not being in a consistent state on power-on. Other games rely on similar values, but in PRG-RAM (WRAM), or CHR-RAM.
Note that using power-on RAM content as a seed for random number generation (such as in Final Fantasy) is not a game bug, even if it makes speedruns harder to verify on console.
Game | Problem |
---|---|
Cheetahmen II | Suspected that certain RAM values may affect being able to reach the final two levels of the game (levels 5 and 6).[8] |
Chinese Kungfu: 少林武者 | The game will not display the first self-running demo correctly if $0707 contains the value $FF at startup. Values $00-$09 will cause one of nine self-running demo sequences to play first, while values above that will cause the game to always begin with the first demo sequence. For the Western localization (Challenge of the Dragon, not to be confused with the Color Dreams game of the same name), the developers seemed to have noticed this problem and went out of their way to initialize this memory location with $00. |
Cybernoid | On the title screen, the default selection for the difficulty level changes based on the contents of RAM at power on. Also, the music may not start when starting a game (depending on uninitialized RAM values).[9] |
Dancing Blocks (Sachen) | Game will not boot when addresses $EC and $ED are both set to $FF.[10] |
Erika to Satoru no Yume Bouken | Plays uninitialized sound RAM as a waveform on the title screen, resulting in a buzzy tone on some power-ons[11]. |
F-1 Race (Beta Version only) | Title screen will be skipped if $6B and $70 contain non-zero values.[12] Game blindly reads and uses values from $51, $55, $70, $A4, and $0200-02FF (via sprite DMA).[13] |
Famicom Jump II: 最強の7人 | If save RAM is initialized to all 00s, the game will freeze at the very first power-on with a black screen. It will work normally after a soft reset as well as subsequent power-ons. |
Gun.Smoke (FDS version only) | The music player's RAM is not cleared before starting the title screen song, resulting in a garbage first noise channel note, with random properties, if that RAM is not zero. |
Huang Di | Uses uninitialized RAM at $0100 to determine if Cheat Mode is enabled or not. When it's zero, cheat mode is enabled, allowing infinite jumps in midair. |
Huge Insect | Artifacts show up on the screen when nametable RAM is initialized with random values (the game only appears to initialize one of the 2 nametables). |
Keroppi to Keroriinu no Splash Bomb! | Can crash during the final boss if any of $0680-$069F contain any value between $30-$33. This is because the game's playfield data begins 2 rows down from the top of the screen, so when checking for playfield collision, the position of the falling fire is adjusted by $20 and underflows at the top of the screen, using uninitialized RAM after the playfield for these non-existent rows. If the value indicates the fire can land there, the game uses an invalid jump table index and crashes. |
Layla | The music player's RAM is not cleared before starting the title screen song, resulting in a flubbed first note, sometimes with a frequency sweep, depending on power-on RAM content. |
Minna no Taabou no Nakayoshi Daisakusen | Requires that address $11 be initialized to a value other than $00, otherwise the game will not start.[14] A PRG1 version corrects the issue. |
Silva Saga | When save RAM is initialized with all 0s, the game incorrectly creates 3 blank saved games which do not work properly.[15] |
Super Mario Bros. | Blindly reads and uses variables used for the continue feature's starting world number (accessed by pressing A+Start on the title screen) and the hard mode/second quest toggle. Tennis is often used to access "glitch worlds" beyond world 8 as a result of this.[16] |
Super Mario Bros. (bootleg versions) | Relies on portions of RAM containing $00, otherwise player starts at world 0-1.[17] |
Terminator 2: Judgment Day | The copyright screen is skipped if RAM is filled with $00 (more generally, if a high score table checksum happens to be valid).[18] |
Ultima: Exodus | Relies on PRG-RAM contents before they're initialised; a fresh/new game may see artifacts such as shaking/wobbly text during the initial text intro screens, corruption of text intro screen fonts, and possibly audio anomalies.[19] |
"Impossible" controller input
Many games behave oddly when button combinations that would be impossible (or at least very hard) to input on a standard controller are pressed. This comprises pressing left+right and up+down simultaneously. Such impossible controller input should probably be prevented by default in an emulator, but they can be optionally allowed for experimental purposes.
Alternatively, controller reading routines in most games combine inputs from both the standard ports and the Famicom's expansion port (even in international versions) to support replacement controllers, so it is possible to press one direction in a standard controller and simultaneously the opposing direction in the replacement controller to achieve the same effect.
Game | Problem |
---|---|
Bad Street Brawler | A Power Glove Gaming Series game which maps a unique attack to left+right. It instantly kills one enemy per stage. |
Battletoads | Pressing up+down in the vertical tunnel level kills the player instantly. Additionally, pressing left+right causes the player to walk up/back even when in pure 2D stages, which can result in certain areas becoming impossible to complete. |
Mega Man 1 and 2 | By pressing up+down at the top of a ladder, one may enter the "climbing ladder" state briefly above the top of the ladder. This allows "zipping" through walls. |
Panic Restaurant | Pressing up while crouching (by pressing down, thus pressing up+down simultaneously) the player character's sprite uses garbage data including the damage sprite. This does not occur if up is pressed before down; the player chef merely stands still. |
Predator | Pressing left+right+A/B in normal levels, or up+down+A/B in the level number screen before 'big mode' levels, skips the current level. Inputting these is possible on a Famicom by connecting a controller to the expansion port and splitting the directional inputs. The game merges these inputs and explicitly checks for the combinations. |
Spy vs. Spy | The character turns into an airplane and other garbage sprites when pressing left+right or up+down. |
Star Soldier | Cheat code button combinations include left+right and left+right+up+down inputs, which rely on the fact that both controller inputs are ORed bitwise when polling.[20] |
Super Mario Bros. 2 | Ladders can be climbed very fast by pressing up+down. |
Teenage Mutant Ninja Turtles | If you press the attack button while you jump while pressing up+down, the player character uses a garbage sprite, and attacks will use unusual (i.e. garbage data) hitboxes. |
Teenage Mutant Ninja Turtles II: The Arcade Game | When you jump with a left or right move while pressing up+down, the player character will move in unusual directions and speeds, possibly screen-wrapping. |
Tetris (Nintendo) | Holding left+down+right will cause the current and next piece sprites to flicker, slowing the game down in the process. |
Tiny Toon Adventures | The player can gain unusual speed when pressing left+right. |
Zelda II: The Adventure of Link | Link can gain tremendous speed when pressing left+right. |
Overscan ugliness
Some games display junk tiles in the overscan area, which is usually not seen (or is at least partially obstructed) on real TV sets. Examples include the NTSC versions of Metal Gear (e.g. in the jungle area when gameplay starts) and Solstice (on the title screen).
References
- ↑ Eliminator Boat Duel
- ↑ Zelda Screen Transitions are Undefined Behaviour: A deep dive into Zelda scrolling that is largely good until the "Scroll Down to Scroll Up" section, which has significant factual errors.
- ↑ http://forums.nesdev.org/viewtopic.php?p=154894#p154894
- ↑ "Fixing StarTropics" by Brad Smith (5 minutes)
- ↑ "The Garbage Sprites in Strider (NES) - Behind the Code" by Displaced Gamers (15 minutes)
- ↑ https://forums.nesdev.org/viewtopic.php?p=112424#p112424
- ↑ http://forums.nesdev.org/viewtopic.php?f=10&t=7844
- ↑ http://forums.nesdev.org/viewtopic.php?p=178154#p178154
- ↑ http://tasvideos.org/forum/viewtopic.php?p=463659&sid=7cfe55942ee3420275d8f16b2a59770a#463659
- ↑ http://tasvideos.org/forum/viewtopic.php?p=463659&sid=7cfe55942ee3420275d8f16b2a59770a#463659
- ↑ N163 Sound RAM Initialisation Behaviour
- ↑ http://forums.nesdev.org/viewtopic.php?p=178168#p178168
- ↑ http://forums.nesdev.org/viewtopic.php?p=178015#p178015
- ↑ http://forums.nesdev.org/viewtopic.php?p=185663#p185663
- ↑ https://forums.nesdev.org/viewtopic.php?f=11&t=11045
- ↑ "Access Glitch Worlds in Super Mario Bros. via NES Tennis" by Retro Game Mechanics Explained (13 minutes)
- ↑ http://forums.nesdev.org/viewtopic.php?p=178163#p178163
- ↑ http://forums.nesdev.org/viewtopic.php?p=180752#p180752
- ↑ http://forums.nesdev.org/viewtopic.php?p=185163#p185163
- ↑ Star Soldier cheat codes (Japanese)