Tricky-to-emulate games: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(Add PPU palettes link for Micro Machines)
m (get rid of the underscores)
Line 11: Line 11:
* ''Fire Hawk'', ''Mig 29 Soviet Fighter'', and ''Time Lord'' need accurate DMC timing because they [[APU DMC#Usage of DMC for syncing to video|abuse APU DMC IRQ]] to split the screen
* ''Fire Hawk'', ''Mig 29 Soviet Fighter'', and ''Time Lord'' need accurate DMC timing because they [[APU DMC#Usage of DMC for syncing to video|abuse APU DMC IRQ]] to split the screen
* ''Galaxian'' requires proper handling of bit 4 of the [[CPU status flag behavior|P register]] for /IRQ.
* ''Galaxian'' requires proper handling of bit 4 of the [[CPU status flag behavior|P register]] for /IRQ.
* ''Huge Insect'' depends on obscure OAMADDR ($2003) behavior; see [[PPU_registers]].
* ''Huge Insect'' depends on obscure OAMADDR ($2003) behavior; see [[PPU registers]].
* ''Marble Madness'' switches CHR banks mid-scanline to draw text boxes (e.g. at the beginning of each level). Getting these to render correctly requires fairly precise timing.
* ''Marble Madness'' switches CHR banks mid-scanline to draw text boxes (e.g. at the beginning of each level). Getting these to render correctly requires fairly precise timing.
* ''Micro Machines'' requires correct values when reading PPU $2004 (OAMDATA) during rendering, and also relies on proper background color selection when rendering is disabled and the VRAM address points to the palette (see the "background palette hack" on [[PPU_palettes|the PPU palettes page]]).
* ''Micro Machines'' requires correct values when reading PPU $2004 (OAMDATA) during rendering, and also relies on proper background color selection when rendering is disabled and the VRAM address points to the palette (see the "background palette hack" on [[PPU palettes|the PPU palettes page]]).
* ''Paperboy'' relies on the open bus behavior of controller reads and expects them to return exactly 0x40 or 0x41; see [[Standard controller]].
* ''Paperboy'' relies on the open bus behavior of controller reads and expects them to return exactly 0x40 or 0x41; see [[Standard controller]].
* ''Punch-Out!!'' requires fetching the 34th tile; otherwise, the ring will be glitched.
* ''Punch-Out!!'' requires fetching the 34th tile; otherwise, the ring will be glitched.
Line 19: Line 19:
* ''Reflect World'' (FDS) uses [[Programming with unofficial opcodes#Watermarking instructions|unofficial]] opcode $89.
* ''Reflect World'' (FDS) uses [[Programming with unofficial opcodes#Watermarking instructions|unofficial]] opcode $89.
* ''Slalom'' does a JSR while the stack pointer is 0, so that half of the return address ends up at $0100 and the other half at $01FF.
* ''Slalom'' does a JSR while the stack pointer is 0, so that half of the return address ends up at $0100 and the other half at $01FF.
* ''Super Mario Bros.'' is probably the hardest game to emulate among the most popular [[NROM]] games, which are generally the first targets against which an emulator author tests his or her work. It relies on JMP indirect, correct palette mirroring (otherwise the sky will be black; see [[PPU_palettes]]), sprite 0 detection (otherwise the game will freeze on the title screen), the 1-byte delay when reading from CHR ROM through $2007 (see [[PPU_registers#The_PPUDATA_read_buffer_.28post-fetch.29|The PPUDATA read buffer]]), and proper behavior of the nametable selection bits of $2000 and $2006.[http://nesdev.org/bbs/viewtopic.php?p=22022#22022] In addition, there are several bad dumps floating around, some of which were ripped from pirate multicarts whose cheat menus leave several key parameters in RAM.
* ''Super Mario Bros.'' is probably the hardest game to emulate among the most popular [[NROM]] games, which are generally the first targets against which an emulator author tests his or her work. It relies on JMP indirect, correct palette mirroring (otherwise the sky will be black; see [[PPU palettes]]), sprite 0 detection (otherwise the game will freeze on the title screen), the 1-byte delay when reading from CHR ROM through $2007 (see [[PPU registers#The PPUDATA read buffer (post-fetch)|The PPUDATA read buffer]]), and proper behavior of the nametable selection bits of $2000 and $2006.[http://nesdev.org/bbs/viewtopic.php?p=22022#22022] In addition, there are several bad dumps floating around, some of which were ripped from pirate multicarts whose cheat menus leave several key parameters in RAM.
* ''Super Mario Bros. 3'' relies on an interaction between the [[sprite priority]] bit and the OAM index to put power-ups behind blocks.
* ''Super Mario Bros. 3'' relies on an interaction between the [[sprite priority]] bit and the OAM index to put power-ups behind blocks.
* ''The Young Indiana Jones Chronicles'' accesses [[PPU_registers|PPUDATA ($2007)]] during rendering to perform a glitchy y scroll (to make the screen shake when cannon balls hit the ground). See the notes on accessing $2007 during rendering on [[The_skinny_on_NES_scrolling|the skinny on NES scrolling page]].
* ''The Young Indiana Jones Chronicles'' accesses [[PPU registers|PPUDATA ($2007)]] during rendering to perform a glitchy y scroll (to make the screen shake when cannon balls hit the ground). See the notes on accessing $2007 during rendering on [[the skinny on NES scrolling]].


[[Game bugs]] lists games that have glitches on NES hardware, so you won't go "fixing" them while breaking your emulator.
[[Game bugs]] lists games that have glitches on NES hardware, so you won't go "fixing" them while breaking your emulator.

Revision as of 17:56, 2 July 2013

The following is a list of games that depend on hard-to-emulate or just obscure behavior:

  • Adventures of Lolo 2, Ms. Pac-Man (Tengen), and Spelunker rely on 1 cycle NMI delay when $2002 bit 7 gets set inside vblank (if $2002 has not been read yet), in which $2002 bit 7 can be read as true
  • Balloon Fight relies on reading the nametables through $2007 to twinkle the stars in the background. (The code is at $D603.)
  • Bases Loaded II glitches after a pitch is thrown (screenshot) if writing $00 then $80 to $2000 during vertical blank does not cause an additional NMI
  • Battletoads requires fairly precise CPU and PPU timing and a fairly robust sprite zero implementation. It leaves rendering disabled for a number of scanlines into the visible frame to gain extra VRAM manipulation time and then enables it. If the timing is off so that the background image appears too high or too low at this point, a sprite zero hit will fail to trigger, hanging the game. This usually occurs immediately upon entering the first stage if the timing is off by enough, and might cause random hangs at other points otherwise.
  • Bee 52 needs accurate DMC timing and relies on $2002 bit 5 (sprite overflow) as well
  • Bill & Ted's Excellent Adventure depends on obscure MMC1 behavior where writes on successive cycles are ignored; see iNES Mapper 001 (the talk page for that page might be informative too). This game also turns off and re-enables rendering midframe to switch CHR banks (e.g. in the black border above dialog boxes).
  • Cobra Triangle and Ironsword rely on the dummy read for the sta $4000,X instruction to acknowledge pending APU IRQs.
  • Crystalis, Fantastic Adventures of Dizzy, Fire Hawk, and Super Off Road do mid-frame palette changes
  • Fire Hawk, Mig 29 Soviet Fighter, and Time Lord need accurate DMC timing because they abuse APU DMC IRQ to split the screen
  • Galaxian requires proper handling of bit 4 of the P register for /IRQ.
  • Huge Insect depends on obscure OAMADDR ($2003) behavior; see PPU registers.
  • Marble Madness switches CHR banks mid-scanline to draw text boxes (e.g. at the beginning of each level). Getting these to render correctly requires fairly precise timing.
  • Micro Machines requires correct values when reading PPU $2004 (OAMDATA) during rendering, and also relies on proper background color selection when rendering is disabled and the VRAM address points to the palette (see the "background palette hack" on the PPU palettes page).
  • Paperboy relies on the open bus behavior of controller reads and expects them to return exactly 0x40 or 0x41; see Standard controller.
  • Punch-Out!! requires fetching the 34th tile; otherwise, the ring will be glitched.
  • Puzznic uses unofficial opcode $89, which is a two-byte NOP on 6502 and BIT #imm on 65C02. (tasvideos discussion)
  • Reflect World (FDS) uses unofficial opcode $89.
  • Slalom does a JSR while the stack pointer is 0, so that half of the return address ends up at $0100 and the other half at $01FF.
  • Super Mario Bros. is probably the hardest game to emulate among the most popular NROM games, which are generally the first targets against which an emulator author tests his or her work. It relies on JMP indirect, correct palette mirroring (otherwise the sky will be black; see PPU palettes), sprite 0 detection (otherwise the game will freeze on the title screen), the 1-byte delay when reading from CHR ROM through $2007 (see The PPUDATA read buffer), and proper behavior of the nametable selection bits of $2000 and $2006.[1] In addition, there are several bad dumps floating around, some of which were ripped from pirate multicarts whose cheat menus leave several key parameters in RAM.
  • Super Mario Bros. 3 relies on an interaction between the sprite priority bit and the OAM index to put power-ups behind blocks.
  • The Young Indiana Jones Chronicles accesses PPUDATA ($2007) during rendering to perform a glitchy y scroll (to make the screen shake when cannon balls hit the ground). See the notes on accessing $2007 during rendering on the skinny on NES scrolling.

Game bugs lists games that have glitches on NES hardware, so you won't go "fixing" them while breaking your emulator.

Troubleshooting games

If a scroll split doesn't work, and a garbage sprite shows up around the intended split point, then the game is probably trying to use a sprite 0 hit, but either the wrong tile data is loaded or the background is scrolled to a position that doesn't overlap correctly. This could be a problem with nametable mirroring, with CHR bankswitching in mappers that support it, or with the CPU and PPU timing of whatever happened above the split. Battletoads, for one, uses 1-screen mirroring and requires exact timing to get the background scroll position dead-on.