-
-
Notifications
You must be signed in to change notification settings - Fork 87
PAL and NTSC
The SNES was released in different regions with hardware tuned to match the local television standard:
| Feature | NTSC (Japan / North America) | PAL (Europe / Australia) |
|---|---|---|
| Console | Super Famicom / Super NES US | Super Nintendo (EUR/AUS) |
| Video standard | NTSC | PAL |
| Vertical refresh rate | 60 Hz | 50 Hz |
| Visible scanlines | 224 | 224 (inside a 256-line frame) |
| Total scanlines / frame | 262 | 312 |
| Master clock | ~21.477 MHz | ~21.281 MHz |
| CPU clock (slow) | ~1.79 MHz | ~1.78 MHz |
| CPU clock (fast / FastROM) | ~3.58 MHz | ~3.55 MHz |
| SPC700 (audio CPU) | ~1.024 MHz | ~1.024 MHz |
Many games written for NTSC assume that one VBlank happens every 1/60 of a second. On a PAL console running at 50 Hz there are only 50 VBlanks per second, making the game run ~17% slower — sprites move more slowly, music plays at a lower pitch, and timers run long. This is the infamous "PAL slowdown" players experienced with imported cartridges in Europe.
Conversely, an unmodified PAL game running at 60 Hz on an NTSC console may run faster than intended and, more importantly, may crash because the 50 Hz timing code does not have enough time to finish inside a 60 Hz frame.
When developing a homebrew, you must decide:
- Target only one region — simpler, but limits your audience.
- Support both regions — requires runtime detection and timing adjustments.
Your main game loop is usually driven by the VBlank NMI. On NTSC you have ~16.7 ms per frame; on PAL you have ~20 ms. Any per-frame logic (physics steps, timers, animation counters) must account for this difference.
The SPC700 audio CPU runs at the same frequency on both systems, so audio sample rates are identical. However, if you drive music tempo by counting NMI frames, tempo will differ between regions. Use an SPC-internal timer for tempo whenever possible.
HDMA tables are based on scanline counts. Both PAL and NTSC show 224 active lines in normal mode, so most HDMA effects transfer without change. Be careful with effects that reference the total scanline count or that run past line 224.
The SNES ROM header contains a Destination Code byte at address $00:FFD9. This byte tells the console (and emulators) which region the ROM targets, and it is how a PAL console decides to run at 50 Hz.
Common values used in homebrews:
| Value | Region | Frequency |
|---|---|---|
$00 |
Japan | 60 Hz (NTSC) |
$01 |
North America | 60 Hz (NTSC) |
$02 |
Europe | 50 Hz (PAL) |
$11 |
Australia | 50 Hz (PAL) |
In PVSnesLib the header is defined in your project's .asm source file via the CARTRIDGE_INFO block. For example:
;----------------------------------------------------------------
; ROM Header
;----------------------------------------------------------------
.SNESHEADER
ID "SNES" ; 4-char game code
NAME "MY HOMEBREW " ; 21 chars, pad with spaces
SLOWROM ; or FASTROM
LOROM ; or HIROM
ROMSIZE $08 ; 256 KB = 2^8 KB
SRAMSIZE $00 ; no SRAM
COUNTRY $01 ; $01 = USA/NTSC | $02 = Europe/PAL
LICENSEECODE $00
VERSION $00
.ENDSNESFor a ROM you want to work on both regions, set
COUNTRY $01(NTSC) and handle PAL at runtime (see below). This is the safest default because NTSC timing is tighter — if your code fits inside 16.7 ms it will also fit inside the longer 20 ms PAL frame.
The SNES PPU exposes the current video mode through register $213F (STAT78). Bit 4 of this register indicates the current field — but the reliable way to detect PAL vs NTSC is to read the master clock indirectly by counting scanlines per frame.
PVSnesLib exposes two global variables for this purpose:
snes_50hz // 1 if on a PAL/50Hz SNES
snes_fps // 50 if PAL console (50 Hz) or 60 if NTSC console (60Hz) PVSNesLib also exposes a function to check if the console region is identical to the one put in the cartride:
if (consoleRegionIsOK() == 1) {
// code for same region
} else {
// code if region is not the same
}
}If you develop on a PAL console (common in Europe) but want to test at 60 Hz, or vice-versa, you need to physically modify the console — or use a switchless mod.
FFVIMan's Switch SNES is the most comprehensive French-language reference for SNES region modifications. The site covers the full range of mods:
Emulators like Mesen2 are excellent for development, but real hardware testing is essential to catch timing issues, audio differences, and PPU edge cases that emulators may not reproduce perfectly.
You can find an example of flash cartridge for SNES homebrew testing here Super EverDrive X5 by Krikzz.
- Installation
- PVSneslib and Visual Studio Code
- First steps with No$sns emulator
- Compiling from sources
- Introduction
- Hello World example
- Input and Output
- Graphic Memory Best Practices
- Backgrounds
- Sprites
- Dynamic Sprites
- Meta Sprites
- Sounds and Musics
- HiRom and FastRom
- Map Engine 1: Import maps for Tiled
- Map Engine 2: Update maps in Tiled
- Map Engine 3: Display map on SNES (I)
- Graphic Visual Effects
- Pal and NTSC