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.
