GitHub - xraymemory/simearth-realtime: SimEarth (SNES) ROM hack: 1 real year = 1 game year. The full simulation takes 4.5 billion real years.

GitHub

4 min read Original article ↗

demo

A ROM hack of SimEarth: The Living Planet (SNES, 1992) that forces the simulation to run in real time — 1 real year equals 1 game year. The full game will take approximately 4.5 billion real years to complete.

What it does

The original SimEarth lets the player control simulation speed, compressing thousands or millions of years into seconds. This patch removes that compression entirely:

  • 1 real year = 1 game year. The simulation advances one year every 31,557,600 real seconds (365.25 days at 60fps).
  • All speed settings are unified. Stop, slow, medium, and fast all run at the same real-time rate.
  • All scenario time steps are forced to 1 year per tick, regardless of the scenario type (geologic timescales originally advanced 500-2500 years per tick).
  • The status bar shows a real-time elapsed clock in the format DDDDDDDDDDd HH:MM:SS, replacing the game's original date display. The day counter is 32-bit, supporting up to 11.7 million years of continuous display.

How it works

The patch modifies 11 locations in the ROM, totaling roughly 400 bytes of new 65816 assembly injected into free regions of the original 1MB LoROM image. No original code is removed — only redirected.

Timing chain

The SNES runs at ~60.1 fps (NTSC). The original game's NMI handler maintains a frame counter at zero-page $00 that ticks every frame and a seconds counter at $01 that increments every 60 frames.

The patch extends this with a cascade of counters stored in WRAM bank $7F:

NMI fires (every frame)
  |
  v
Frame counter $00 increments (0-59)
  |
  v (every 60 frames)
Seconds counter $7F:9CF4 (0-59)
  -> Minutes $7F:9CF5 (0-59)
    -> Hours $7F:9CF6 (0-23)
      -> Days $7F:9CF7-9CFA (32-bit, max ~11.7 million years)

Separately, a 32-bit frame counter at $7F:9CF0-9CF3 accumulates total frames. When it reaches 1,893,456,000 (60 x 60 x 24 x 365.25), the game advances one simulation tick and the counter resets.

Display system

The clock display replaces the game's speed/date indicator on the status bar. A display routine in bank $1A builds the string DDDDDDDDDDd HH:MM:SS in the game's character buffer at $0E00, then transfers it to the tilemap via the game's own $E53E routine.

The days portion uses a custom 32-bit binary-to-BCD converter (extending the game's built-in 16-bit BCD routine) that operates in the 65816's decimal mode (SED). It outputs up to 10 BCD digits with leading zero suppression. Hours, minutes, and seconds use a separate binary-to-ASCII converter that always displays both digits.

Patch components

Component Location Size Purpose
R1 (NMI handler) $1B:F589 46 bytes Frame counting + second-tick dispatch
Clock chain $1A:AD01 87 bytes sec/min/hr/day cascade with 32-bit day increment
R2 (State gate) $1B:F5B7 41 bytes Year gate: advance simulation every 1,893,456,000 frames
BCD32 converter $1B:FA80 93 bytes 32-bit binary to BCD via 65816 decimal mode
Days display $00:F015 34 bytes BCD digits to character buffer with suppression
R3 (Display routine) $1A:A703 70 bytes Format and render DDDDDDDDDDd HH:MM:SS
bin2ascii $1A:F980 33 bytes Binary byte to 2 ASCII digits for HH:MM:SS
Trampoline $00:F05A 4 bytes Cross-bank call to game's tilemap transfer
Display stub $00:88F5 5 bytes Entry point, replaces all speed display handlers
Jump table $00:8A40 8 bytes All 4 speed entries redirect to display stub
Time steps 7 locations 2 bytes each Force all scenario time steps to 1 year

Usage

Building from source

The patcher requires Python 3 and an unmodified copy of the original ROM:

cp "SimEarth - The Living Planet (USA).sfc" .
python3 patch_simearth_realtime.py

This reads the original ROM and produces SimEarth - Realtime (USA).sfc with a corrected checksum. The original ROM is not modified. The patcher verifies the expected bytes at each patch site before writing.

Notes

  • The timing is locked to the SNES's native frame rate. Emulators that run slightly below 100% speed will cause the clock to drift proportionally.
  • On real hardware, the NTSC SNES runs at 60.0988 fps, not exactly 60. The clock uses a 60-frame second, so it will gain approximately 1 second every 10 minutes on real hardware. Over geological timescales, this is negligible.
  • The day counter wraps at 4,294,967,295 days (~11,767,033 years). If you leave it running that long, congratulations.

License

The patch code (patch_simearth_realtime.py) is public domain. SimEarth is property of Maxis/EA.