Skip to content

Tricky‐to‐Emulate Games

James Groth edited this page Dec 21, 2024 · 12 revisions

This is a list of games that I observed as being tricky to emulate for one reason or another, which I hope will be helpful to anyone else who wants to write an emulator for one of these consoles.

Most of these are due to games depending on features or hardware quirks that few other games depend on. Some of these are due to requiring a higher level of timing accuracy than many other games.

This list is by no means comprehensive; it's simply a list of games that gave me trouble or that I noticed giving someone else trouble.

See also this link for some more details on some of the Genesis games: https://gendev.spritesmind.net/forum/viewtopic.php?f=2&t=1308

Master System / Game Gear

Ys (Japan)

Status bar rendering depends on an SMS1 VDP hardware bug related to certain bits in VDP register #2 masking out part of the nametable address


Codemasters games

Uses the VDP's infrequently-used 224-line mode


F-16 Fighting Falcon

Uses the TMS9918 Graphics II mode


Game Gear Sonic games

Alex Kidd: The Lost Stars

Plays PCM samples through the PSG's tone channels by rapidly adjusting their volumes


Genesis

Aleste

Langrisser II

Uses VRAM-to-VRAM copy DMA


Contra: Hard Corps

Thunder Force IV

Depends on correct emulation of VRAM fill DMA quirks


Galaxy Force II

Stage select graphics depend on correctly emulating X=0 sprite masking quirks


Mega Turrican

Factor 5 logo is sensitive to VINT timing


Sonic 3D Blast

Special stages are sensitive to HINT timing and the HV counter


Legend of Galahad

Depends on stalling the 68000 during memory-to-VRAM DMA or there will be glitched graphics in the bottom part of the screen

Depends on correct HINT counter implementation or there will be a glitchy line near the bottom of the title screen


Mickey Mania

3D chase stages depend on the VDP fetching fewer sprite tiles for the next line if forced blanking is enabled during part of HBlank

This is difficult to emulate accurately, so some emulators (including mine in a previous version) fake this by checking for a certain number of X=0 sprites at the start of the sprite attribute table after filtering to which sprites are on the current line. This doesn't work for certain demos (e.g. Titan Overdrive's 512-color screen) but it fixes Mickey Mania


The Chaos Engine / Soldiers of Fortune

Screen tearing if VDP FIFO timing is not emulated


Sol-Deace

Spinning planet animation in the intro depends on VDP FIFO timing


Double Clutch

Title screen graphics depend on VDP FIFO timing


Sonic the Hedgehog

Depends on the 256/320 sprite pixel per scanline limit to hide the bottom half of Sonic on the title screen


Sonic the Hedgehog 2

Combat Cars

Uses double-screen interlaced mode (320x448i)


Sunset Riders

Title screen animation depends on the HV counter latch bit


Panorama Cotton

Sensitive to HINT timing and the HV counter

Requires correct emulation of the HINT pending flag when HINTs are disabled


Monster World IV

Intro text scroll is sensitive to HINT timing


Castlevania: Bloodlines

Reflection effect in Stage 2 depends on the sprite attribute table cache


The Adventures of Batman & Robin

Graphical effects during the Two-Face fight depend on writes to VDP nametable address registers taking effect immediately (these registers are not latched)

Some music is prone to have buzzing/popping noises if audio resampling is inaccurate, e.g. song number 1 in music test


Many EA games

EA logo animation depends on officially undocumented VDP port behaviors


Lemmings

Depends on correctly handling 68000 interrupt priority and acknowledging when both HINT and VINT are pending


Gargoyles

Depends on the 68000 TAS instruction never writing to memory because it can't lock the bus

Trivia: This game does not work on the Model 3 Genesis actual hardware because that model does allow TAS to lock the bus and write to memory, which breaks this game


Bass Masters Classic: Pro Edition

Captain Planet & the Avengers

Depends on ignoring writes to higher-numbered VDP registers while the VDP is in mode 4 (SMS mode)


Clue

Depends on emulating VDP FIFO timing and memory refresh delay or main menu graphics will be corrupted


Super Airwolf

Depends on emulating memory refresh delay or there will be a glitched line in the intro animation


Wonder Boy in Monster World

Mega Man: The Wily Wars

Rings of Power

Many sports games

Uses an EEPROM flash memory chip for save data instead of battery-backed SRAM


OutRunners

Requires fairly accurate VDP DMA timing or graphics will be corrupted


Phantasy Star IV

Depends on emulating the mapper register at $A130F1 (controls whether ROM or SRAM is mapped to the SRAM address range)


Super Street Fighter II

Only officially licensed game that uses a bank-switching mapper


Battletoads

Some graphics depend on the VDP ignoring sprite Y bit 9 outside of double-screen interlaced mode


Streets of Rage

Streets of Rage 2

After Burner II

Earthworm Jim 2

Some music sounds wrong if YM2612 DAC crossover distortion is not emulated (aka the "ladder effect")


After Burner II

Music depends on initializing all YM2612 L/R panning flags to 1


Alien Soldier

Some music depends on skipping attack phase if an operator is keyed on while attenuation is already at 0 (e.g. "3-Prayer" in sound test)


Earthworm Jim

Music tempo is heavily affected by whether games can read the YM2612 busy flag from $4000-$4003 or only $4000

This is technically a difference in behavior between early Model 1 consoles (busy only at $4000) and later consoles (busy at $4000-$4003)


Trouble Shooter

Has bizarre code for reading controller inputs; will not read button presses correctly if not handled properly


Arkagis Revolution

Depends on the Z80 BUSACK bit in $A11100 changing almost immediately in response to writes to the Z80 BUSREQ bit ($A11100) or the Z80 RESET bit ($A11200)


Danny Sullivan's Indy Heat

Depends on unused bits in the Z80 BUSACK register ($A11100) not all reading 0; in actual hardware they're open bus


Sesame Street: Counting Cafe

Depends on the 68000 getting to execute one more instruction before handling VINT if it re-enables VINTs while a VINT is pending


Alex Kidd in the Enchanted Castle

Somewhat sensitive to the sprite overflow flag in the VDP status register


Triple Play 96

Triple Play: Gold Edition

Has an unusual ROM address mapping where it expects the third MB of its 3MB ROM to be mapped to $300000-$3FFFFF ($200000-$20FFFF should be SRAM)


Tyrants: Fight Through Time / Mega Lo Mania

Ex-Mutants

Depends on the 68000 being able to read the VINT flag in the VDP status register as 1 slightly before the 68000 handles the interrupt


Ex-Mutants

Audio driver depends on undocumented Z80 behavior regarding how the BIT instruction sets the S and P/V flags


Dynamite Headdy

Depends on the VDP control port write flag (first/second) getting reset if a game writes to the VDP data port while it is in read mode; otherwise the intro graphics may be randomly corrupted


Joe & Mac

Depends on the 68000 not being allowed to write to Z80 audio RAM unless the Z80 is removed from the bus and not reset; otherwise it will freeze during the title screen animation


Blaster Master 2

Leaves the Z80 in interrupt mode 0 instead of switching it to interrupt mode 1; should still execute rst $38 when handling interrupts because the Z80 will always read opcode 0xFF from the bus during mode 0 interrupt handling


Virtua Racing

Requires emulating the SVP coprocessor (Sega Virtua Processor)


Sega CD

Batman Returns

Robo Aleste

Snatcher

Depends on acknowledging INT5 when handled by the sub CPU even if the interrupt handler doesn't acknowledge the interrupt in the CDC's STAT3/DTACK registers


Snatcher

Does VDP DMAs that read all the way to the end of word RAM ($240000); some background graphics will be corrupted if not handled correctly

Puts the sprite attribute table at the highest possible address in VRAM ($FE00 in H32 mode)


Batman Returns

Depends on the sub CPU's TAS instruction being able to write to memory, unlike the main CPU's TAS instruction

Depends on correctly setting the 68000's zero flag after DIVU/DIVS instructions (should be set based only on the 16-bit quotient, not the full 32-bit value written to the register)

Depends on correctly handling sub CPU INT1 masking

Intro animation depends on semi-accurate graphics ASIC timing or it will run too fast


Dragon's Lair

Space Ace

Depends on correctly handling byte-size writes to the communication flags registers (writing to either flags register address should modify the writing CPU's 8-bit flags value)


Dungeon Explorer

Depends on not allowing the main CPU or the Z80 to write to PRG RAM unless the sub CPU is removed from the bus; otherwise it will freeze after the title screen


Final Fight CD

Sound effects depend on PCM current address registers returning the channel's start address if the channel is not playing


Lunar: The Silver Star

Lunar: Eternal Blue

Depends on CDD status byte 1 reading 0x0F (not ready) while the drive is seeking, track skipping, or stopped


Marko's Magic Football

Map graphics depend on halting the sub CPU if it accesses word RAM while it's in 2M mode and owned by the main CPU


Radical Rex

Depends on the CDD continuing to read at least one more sector if it receives a command while the drive is playing


Time Gal

Extremely sensitive to there being a long enough delay between the game sending a CDD Read/Play command and the drive reading the first sector


Silpheed

Extremely sensitive to timing accuracy between the two 68000s due to sloppy code around word RAM handoffs; will randomly freeze during gameplay if not handled correctly


Shining Force CD

Requires RAM cartridge emulation to be able to completely finish the game; the 8KB backup RAM isn't large enough to fit save files for both stories


Ecco: The Tides of Time

FMV cutscenes depend on resetting CDC DMA state on all writes to the CDC device destination register


Shadow of the Beast II

Depends on correctly handling word RAM bank interleaving in 1M mode


JP V1.00 BIOS

Depends on VRAM fill DMA timing to avoid triggering a data race between the two 68000s that causes a freeze


JP V2.00 BIOS

Depends on PRG RAM write protection not applying to writes from the main CPU


32X

After Burner Complete

Depends on correct handling of 68000 divide by zero exceptions

Depends on the SH7604 user break address registers being R/W; the slave SH-2 abuses them to store audio processing state


BC Racers

Requires semi-accurate emulation of SH-2 CPU cache and SH-2 memory access timing or it will run way too fast

Does some truly strange things with the PWM chip when playing some sound effects, including using different sample rates for different sound effects


Brutal Unleashed: Above the Claw

Requires close synchronization of the two SH-2s whenever they access the 32X communication ports; otherwise background scrolling won't work and eventually the game will freeze

What happens is that the slave SH-2 sometimes writes to one of the communication ports twice in quick succession, and if the master SH-2 doesn't see the first write then the game will break


Metal Head

Depends on the 32X VDP's FEN bit briefly reading 1 at the start of every line (during DRAM refresh); otherwise it will freeze after the splash screen

If SH-2 CPU cache is emulated, depends on SH7604 DMA reads ignoring CPU cache


Mortal Kombat II

Depends on 32X VDP auto fill timing and the FEN bit reading 1 during auto fills, or else there will be a glitched frame every time user inputs change


NBA Jam: Tournament Edition

NFL Quarterback Club

Uses an EEPROM chip for save data instead of battery-backed SRAM


NFL Quarterback Club

Sets the Genesis VDP to H32 mode in menus and expects the 320x224 32X VDP output to overlay the 256x224 Genesis VDP output, with 5 H320px pixels for every 4 H256px pixels


SoulStar X

Depends on the frame buffer being mirrored at $04040000-$0405FFFF in the SH-2 memory map


Virtua Fighter

Depends on frame buffer swaps taking effect immediately while the 32X VDP is in blank mode, even during active display

Depends on what seem to be undocumented SH7604 DIVU register mirrors; it expects $FFFFFF18 to mirror $FFFFFF10 (DVDNTH), and $FFFFFF1C to mirror $FFFFFF14 (DVDNT / DVDNTL)


Virtua Racing Deluxe

Depends on the DREQ FIFO discarding any writes from the 68000 that occur after the DREQ length decrements to 0


WWF Raw

Requires emulation of SH-2 CPU cache (or a hack to fake it) or menu graphics will be missing

What happens is that it writes to cartridge ROM addresses and expects to be able to read back the written values, which works on actual hardware because the cache is write-through and the reads will hit in cache


X-Men: Mind Games

Depends on the SH7604 division unit saturating quotients to signed 32-bit


Zaxxon's Motherbase 2000

Depends on emulating 68000 line 1010/1111 exceptions

Pushes the stack pointer onto the stack using mov.l r15, @-r15 instructions and depends on the original R15 value being written to memory, not the decremented R15 value


Primal Rage

Sound effects depend on the PWM timer interval bits in $A15130 being read-only for the 68000; otherwise it will incorrectly change the timer interrupt interval from 1 to 16 which breaks nearly all sound effects

Uses different PWM sample rates for different sound effects

Clone this wiki locally