Console clocks: where the exact refresh rate comes from¶
REFRESH_RATES.md lists a native rate for every system. This document shows where each number comes from, so it can be checked, and so the next system can be worked out the same way.
A rate such as 59.94 is not a property of "NTSC". It is the result of a clock chain that is different on every console:
frame rate = video clock / (clocks per line × lines per frame)
with the video clock itself made from the console's crystal by a PLL or a divider. The often quoted 4.5 MHz / 286 = 15734.266 Hz line, and 59.94 Hz from it, is the broadcast standard for a 525-line interlaced signal. It is only right for a console that outputs exactly that signal. A console that draws a progressive 240p picture, or has its own idea of a line, has its own rate, and a handheld has no broadcast standard to follow at all.
Audio works the same way. A sample rate is a divided clock (the PS1's 44100 Hz is 33.8688 MHz / 768, the N64's is the video clock divided by a register), not a ratio of the frame rate, and a ratio of the two can only be an estimate.
The NTSC line, and the 263-line rule¶
NTSC's color subcarrier is 315/88 MHz = 3.579545… MHz. A line is 227.5 subcarrier periods, 15734.266 Hz, and a frame is 525 lines in two interlaced fields of 262.5 lines: 59.9401 fields per second.
Consoles that build their video clock from the subcarrier keep this line. For interlaced output (480i) they use 262.5 lines per field and get 59.940 Hz. For progressive output (240p) a field has to be a whole number of lines, and the PlayStation, the Nintendo 64 and the Dreamcast all use 263: 15734.266 / 263 = 59.826 Hz. That is why three unrelated consoles share a rate, and why 240p and 480i games on the same console differ.
The SNES and the Sega consoles also derive their clocks from the subcarrier, but their lines are not the standard length (SNES: 0.07 % short; Sega: 0.22 % long), and they use 262 lines, so they have rates of their own.
Summary¶
| System | Crystal / master clock | Video clock | Clocks per line | Lines per frame | Native rate (Hz) | Emulator reports (Hz) |
|---|---|---|---|---|---|---|
| Game Boy, Game Boy Color | 4.194304 MHz (2^22) | same | 456 dots | 154 | 59.7275 | 59.7275 (Gambatte) |
| Game Boy Advance | 16.777216 MHz (2^24) | same | 1232 | 228 | 59.7275 | 59.7275 (mGBA) |
| NES, Famicom | 21.477272 MHz (6 × subcarrier) | same | 1364 (341 dots of 4; one dot skipped every other frame) | 262 | 60.0988 | 60.098814 (MesenCE with PortareOS's patch; upstream rounds the master clock to 21477272 Hz, 60.098812) |
| SNES | 21.477272 MHz (6 × subcarrier) | same | 1364 (1360 once every other frame) | 262 | 60.0988 | 60.098814 (Snes9x with PortareOS's patch; upstream rounds the master clock to 21477272 and reports 0.034 ppm low) |
| Master System, Game Gear, Mega Drive, Mega CD, 32X | 53.693175 MHz (15 × subcarrier) | same | 3420 | 262 | 59.9227 | 59.9227 (Genesis Plus GX); 60 (PicoDrive) |
| PlayStation | 33.8688 MHz (768 × 44100) | 53.693175 MHz (× 715909/451584) | 3412.5 | 263 (240p), 262.5 (480i) | 59.826, 59.940 | 59.826 for both (SwanStation with PortareOS's patch; upstream 59.8173) |
| Saturn | 28.636364 MHz (8 × subcarrier), or × 61/65 = 26.874126 MHz in the 320-wide modes | same | 1820 dots, or 1708 (both the broadcast line) | 263 (240p), 262.5 (480i) | 59.826, 59.940 | 59.8261 (Beetle Saturn with PortareOS's patch; upstream 59.8265) |
| Nintendo 64 | 14.318182 MHz (4 × subcarrier) | 48.681818 MHz (× 17/5) | 3094 | 263 (240p), 262.5 (480i) | 59.826, 59.940 | 59.826 / 59.94 (ParaLLEl N64 with our patch) |
| Neo Geo MVS | 24.000 MHz | 6.000 MHz (÷ 4) | 384 pixels | 264 | 59.1856 | 59.18 (FBNeo keeps hundredths) |
| Neo Geo AES, Neo Geo CD | 24.167829 MHz | 6.041957 MHz (÷ 4) | 384 pixels | 264 | 59.599 | 59.5999 (NeoCD); FBNeo runs cartridges at the MVS rate |
| Dreamcast, NAOMI, Atomiswave | 27 MHz video clock | 13.5 MHz (÷ 2), 27 MHz for VGA | 858 | 263 (240p), 525 half-lines (480i) | 59.826, 59.940 | 59.827 / 59.9453 (Flycast) |
| GameCube, Wii | 27 MHz video clock (54 MHz progressive) | same | 858 (2 × 429) | 525 half-lines per field | 59.940 | 59.94 (Dolphin) |
| PlayStation 2 | GS CRTC on the standard line | – | – | 525 (480i), 263 (240p) | 59.940, 59.82 | 59.94 always (PCSX2/ARMSX2 vsync timer) |
| PSP | – | – | – | 286 lines | about 59.94 | 60/1.001 (PPSSPP's assumption) |
| Xbox | TV encoder, standard 525-line output | – | – | 525 | 59.940 | 59.94 |
The panel modes in REFRESH_RATES.md follow the emulator's column, not the console's: RetroArch syncs audio and video to the rate the core reports. Where the two differ (SwanStation), the emulator is the one to fix before the mode.
Each console¶
Game Boy and Game Boy Color¶
The CPU crystal is 4.194304 MHz (2^22). The PPU draws a line in 456 dots and a frame in 154 lines (144 visible, 10 VBlank): 456 × 154 = 70224 dots, and 4194304 / 70224 = 59.7275 Hz. The Game Boy Color doubles the CPU clock in its fast mode but not the PPU's, so the rate does not change.
The APU has no sample rate: its channels are mixed as analog signals.
- Pan Docs, Rendering — 456 dots per line, 154 lines, "One frame: 70224 dots @ 59.7 fps": https://gbdev.io/pandocs/Rendering.html
- Gambatte,
libgambatte/libretro/libretro.cpp:#define VIDEO_REFRESH_RATE (4194304.0 / 70224.0)
Game Boy Advance¶
The clock is 16.777216 MHz (2^24). A line is 1232 cycles (308 dots × 4), a frame 228 lines (160 visible, 68 VBlank): 280896 cycles, 16777216 / 280896 = 59.7275 Hz. That is exactly the Game Boy's rate, because 280896 = 4 × 70224 and the clock is 4 × 2^22.
The sound DACs are driven by a timer; the game chooses the rate (commonly 16384 to 32768 Hz, up to 262144).
- GBATEK, LCD Dimensions and Timings — "1232 cycles" per line, "280896 cycles - ca. 59.737 Hz": https://problemkaputt.de/gbatek-lcd-dimensions-and-timings.htm
- mGBA,
src/platform/libretro/libretro.c:info->timing.fps = core->frequency(core) / core->frameCycles(core)
NES and Famicom¶
The master clock is the SNES's, 21.477272 MHz = 6 × the subcarrier, and the PPU's dot clock is a quarter of it. A line is 341 dots, a frame 262 lines, and with rendering on, the pre-render line of every other frame is one dot short. So a frame averages 341 × 262 × 4 − 2 = 357366 master clocks, exactly the SNES's count, and the rate is the same 60.0988 Hz (21477272 / 357366). PAL: 26.601712 MHz, 5 clocks per dot, 312 lines, 50.0070 Hz.
Audio: the APU's channels are mixed as analog signals; there is no sample rate. MesenCE mixes at the APU clock into 96000 Hz, then lowpasses and resamples to 32000 Hz (our patch; upstream reports 44100).
- NESdev wiki, Cycle reference chart — "21.477272 MHz ± 40 Hz", 4 master clocks per dot, "341 × 262 = 89342" dots, "pre-render line is one dot shorter in every odd frame", "60.0988 Hz": https://www.nesdev.org/wiki/Cycle_reference_chart
- MesenCE,
Core/NES/NesConsole.cpp,NesConsole::GetFps:60.0988118623484for NTSC, 21477272 / 357366, whichLibretro/libretro.cppreports astiming.fps. PortareOS's003-exact-ntsc-rate.patchreturns945000000.0 / 44.0 / 357366.0
SNES¶
The master clock is 945/44 MHz = 21.477272 MHz, six times the NTSC subcarrier. A line is 1364 master clocks (341 dots of 4 clocks): 15745.8 Hz, 0.07 % above the broadcast line. A frame is 262 lines. With interlace off, line 240 of every other frame is 4 clocks short (1360), so the average frame is 1364 × 262 − 2 = 357366 clocks, and 21477272 / 357366 = 60.0988 Hz. PAL: 21.281370 MHz, 312 lines, 50.007 Hz.
Audio: the S-DSP runs from its own 24.576 MHz ceramic resonator and outputs a sample every 768 clocks, 32000 Hz by specification. Real units measure about 32040 Hz, because the resonator is a little fast, and Snes9x outputs 32040.
- SNESdev wiki, Timing — master clock "945/44 MHz ≈ 21.4773 MHz (6 times chroma)", "1364 master clocks = 341 dot cycles", short scanline 1360, "S-DSP clock: 24.576MHz", "DAC samplerate: 32000 Hz by specification (÷(24×32))": https://snes.nesdev.org/wiki/Timing
- Snes9x,
libretro/libretro.cpp:info->timing.fps = 21477272.0 / 357366.0for NTSC,21281370.0 / 425568.0for PAL, andS9xGetAudioSampleRate()32040. PortareOS reports the NTSC rate from the exact 945/44 MHz clock (001-exact-ntsc-rate.patchin snes9x-lr); the rounded constant is 0.034 ppm low, which is the difference between the 120.198 mode being exact and being a near miss. PAL's 21281370 is already exact.
Master System, Game Gear, Mega Drive, Mega CD, 32X¶
The master clock is 53.693175 MHz, fifteen times the subcarrier (the Master System's own crystal is a third of that, 10.738635 MHz, with the same result). The VDP's line is 3420 master clocks (342 dots × 10) in both its 256- and 320-pixel modes: 15699.8 Hz, 0.22 % below the broadcast line. A frame is 262 lines: 53693175 / (3420 × 262) = 59.9227 Hz. PAL: 53.203424 MHz, 313 lines, 49.70 Hz.
Audio: the YM2612 is clocked at master / 7 = 7.670454 MHz and produces a sample every 144 clocks: 53267 Hz. The SN76489 runs at master / 15 = 3.579545 MHz. The Mega CD's RF5C164 samples at 32552 Hz, its CD audio at 44100 Hz. The 32X's PWM rate is set by the game.
Genesis Plus GX computes the rate from these constants. PicoDrive, which we use for the 32X, reports a flat 60 Hz.
- Genesis Plus GX,
core/system.h:#define MCLOCK_NTSC 53693175,#define MCYCLES_PER_LINE 3420;libretro/libretro.c:info->timing.fps = system_clock / lines_per_frame / MCYCLES_PER_LINE,lines_per_frame = vdp_pal ? 313 : 262;core/sound/sound.c: "YM2612 internal clock = input clock / 6 = (master clock / 7) / 6" - PicoDrive,
platform/libretro/libretro.c:info->timing.fps = Pico.m.pal ? 50 : 60
PlayStation¶
The crystal is 33.8688 MHz = 768 × 44100, chosen for the CD's sample rate; it clocks the CPU and the SPU. The GPU clock is a PLL from it: 33868800 × 715909 / 451584 = 53.693175 MHz, again fifteen times the subcarrier. A line is the broadcast line, 3412.5 GPU clocks (the GPU alternates 3412 and 3413). A 240p frame is 263 lines: 53693175 / (3412.5 × 263) = 59.826 Hz; 480i is 262.5 lines per field: 59.940 Hz. PAL: 53.203425 MHz, 3406 clocks, 314 lines, 49.76 Hz.
Upstream SwanStation rounds the line to 3413 clocks, so its rate is 53693175 / (3413 × 263) = 59.8173 Hz, 0.015 % below the console. PortareOS patches it (001-ntsc-line-is-3412-5-ticks.patch) to alternate 3413 and 3412 like the console, and Mednafen, which gives 59.826 Hz and lets the PS1 share the N64's panel mode. SwanStation keeps 263 lines for 480i too (the console has 262.5), so 480i games run at 59.826 instead of 59.940.
Audio: the SPU's rate is the crystal / 768 = 44100 Hz exactly.
- psx-spx, GPU Timings — "NTSC video clock = 53.693175 MHz", "263 scanlines per field for NTSC non-interlaced", "3413 video cycles per scanline", "Non-interlaced: 59.826 Hz", "Interlaced: 59.940 Hz": https://psx-spx.consoledev.net/graphicsprocessingunitgpu/#gpu-timings
- Mednafen (Beetle PSX),
mednafen/psx/gpu.c:GPU.LineClockCounter = 3412 + GPU.PhaseChange - 200; … GPU.PhaseChange = !GPU.PhaseChange; - PortareOS,
packages/emulators/libretro/swanstation-lr/patches/001-ntsc-line-is-3412-5-ticks.patch - SwanStation,
src/core/system.h:MASTER_CLOCK = 44100 * 0x300; // 33868800Hz;src/core/gpu.h:NTSC_TICKS_PER_LINE = 3413, … NTSC_TOTAL_LINES = 263, PAL_TICKS_PER_LINE = 3406, … PAL_TOTAL_LINES = 314;src/core/gpu.cpp,SystemTicksToCRTCTicks: × 715909 / 451584 (NTSC), × 709379 / 451584 (PAL)
Saturn¶
The Saturn has two dot clocks and switches between them with the horizontal resolution: 28.636364 MHz, 8 × the subcarrier, for the 352-wide modes, and 61/65 of it, 26.874126 MHz, for the 320-wide ones. A line is 1820 dots in the first and 1708 in the second, and both come to the broadcast line, 15734.26 Hz. A frame is 263 lines in 240p (VDP2 TVSTAT counts 0x107 lines in every NTSC mode): 28636363.6 / (1820 × 263) = 59.826 Hz, the PlayStation's and the N64's rate; 480i alternates 262- and 263-line fields, 59.940 Hz. PAL: 28.4375 MHz, 313 lines, 49.920 Hz.
Ymir emulates this chain: its 352-mode master clock is the exact 39375000 x 8/11 Hz, a line is 455 x 4 of those clocks, a 240p frame 263 lines. The libretro wrapper reported a rounded 59.82; PortareOS patches it (ymir-lr/patches/002-exact-rates.patch) to the chain, 59.826105 Hz.
Audio: the SCSP outputs 44100 Hz.
- Ymir,
libs/ymir-core/include/ymir/sys/clocks.hpp:kNTSCClock = 39375000.0 * 8.0 / 11.0(the 352-mode master clock), andvdp.cpptimes 455 x 4 clocks a line over 263 lines (240p) - the same chain, 59.826105 Hz. Its ownkNTSCFrameRateconstant iskNTSCClock / (455 * 525 * 2)= 59.94, the 525-line broadcast figure, used only by the SDL app's pacing and settings page; the libretro wrapper reported a rounded 59.82. PortareOS's002-exact-rates.patchreports the VDP's chain. Beetle Saturn, which Ymir replaced, emulated the same chain and reported 59.8265 upstream.
Nintendo 64¶
The crystal is not the subcarrier but four times it: 14.318182 MHz for NTSC, 17.734475 MHz for PAL, 14.302448 MHz for MPAL. A Macronix MX8350 (MX8330 on some boards) makes the clocks from it: the video clock VCLK = X1 × 17 / 5 = 48.681818 MHz for NTSC (× 14 / 5 = 49.656530 MHz for PAL), and the TV encoder gets X1 / 4 = the subcarrier on its SCIN pin. A pixel is 4 VCLKs, so the pixel clock is 12.17 MHz and a line has 773.5 pixels.
The VI registers give the line and the frame. VI_H_SYNC holds the line length in quarter pixels, i.e. in VCLKs: NTSC 0xC15 = 3093, so a line is 3094 VCLKs = 227.5 × 13.6, exactly the broadcast line (48681818 / 3094 = 15734.264 Hz). VI_V_SYNC holds the number of half-lines less one: NTSC non-interlaced 0x20D = 525, so 526 half-lines = 263 lines; interlaced 0x20C = 524, 525 half-lines = 262.5 lines. So:
- 240p: 48681818 / (3094 × 263) = 59.826 Hz (awe444's formula, 2 × 4500000 / (286 × 526), is the same number written in broadcast terms)
- 480i: 48681818 / (3094 × 262.5) = 59.940 Hz
- PAL: 0xC69 → 3178 VCLKs, 0x271 → 313 lines: 49.920 Hz progressive, 50.000 Hz interlaced
mupen64plus rounds VCLK to 48681812, which changes nothing at this precision. ParaLLEl N64 originally derived the frame period from a nominal 60 Hz and the game's line count; our patch 003-vi-frame-period-from-h-sync.patch computes it from VI_H_SYNC and VI_V_SYNC as above, and the 119.6522 Hz panel mode is 2 × 59.826.
Audio: the AI's sample rate is VCLK / (AI_DACRATE + 1), so it is whatever divisor the game picks, e.g. 48681818 / 2209 = 22037.9 Hz, never a round number.
- N64brew wiki, Video DAC — crystals "NTSC: 14.31818182 MHz, PAL: 17.734475 MHz, MPAL: 14.30244755 MHz", MX8330/MX8350, "VCLK = X1 × Multiplier / 5", 17 for NTSC, "The encoder receives the FSC clock (X1 ÷ 4) via the subcarrier input (SCIN) pin": https://n64brew.dev/wiki/Video_DAC
- N64brew wiki, Video Interface — "227.5 chroma periods per scanline. NTSC N64 has 13.6 VI clocks per chroma period. 227.5 × 13.6 = 3094", H_TOTAL 3093 (NTSC) / 3177 (PAL), V_SYNC "non-interlaced: 525, interlaced: 524" (NTSC), 625 / 624 (PAL): https://n64brew.dev/wiki/Video_Interface
- N64brew wiki, Audio Interface — the DAC rate register: https://n64brew.dev/wiki/Audio_Interface
- awe444 in Nintendo 64 De-blur, videogameperfection.com forums, page 2 — the crystal is 4 × subcarrier, the MX8350 divides it, and 4500/286 kHz only holds for 525i: https://www.videogameperfection.com/forums/topic/nintendo-64-de-blur/page/2/
- mupen64plus-core,
src/device/rcp/vi/vi_controller.c:vi_clock_from_tv_standardreturns 49656530 (PAL), 48628316 (MPAL), 48681812 (NTSC) - PortareOS,
packages/emulators/libretro/parallel-n64-lr/patches/003-vi-frame-period-from-h-sync.patch
Neo Geo¶
The MVS (arcade) board has a 24.000 MHz crystal. The pixel clock is a quarter of it, 6.000 MHz; a line is 384 pixels, 15625 Hz, and a frame 264 lines: 15625 / 264 = 59.1856 Hz. The AES (home console) has a 24.167829 MHz crystal instead, which puts its line on the broadcast 15734 Hz and its frame at 59.599 Hz. FBNeo runs cartridge games with the MVS timing, but keeps its frame rate as an integer number of hundredths of a hertz, nBurnFPS = (INT32)(100.0 * dFrameRate), so it reports and paces at 59.18 Hz, not 59.1856; the panel mode matches 59.18. NeoCD, which runs the Neo Geo CD, uses the CD's crystal, rounded to 24.168 MHz and a 6.042 MHz pixel clock: 6042000 / (384 × 264) = 59.5999 Hz.
Audio: the YM2610 is clocked at 8 MHz and outputs a sample every 144 clocks: 55555.6 Hz.
- NeoGeo Development Wiki, Framerate — MVS "24.000000MHz main clock", "6.000000MHz" pixel clock, 384 pixels, 264 lines, "15.625kHz", "59.1856 frames/second"; AES "24.167829MHz", "59.599": https://wiki.neogeodev.org/index.php?title=Framerate
- FBNeo,
src/burn/drv/neogeo/neo_run.cpp:#define NEO_HREFRESH (15625.0),#define NEO_VREFRESH (NEO_HREFRESH / 264.0),#define NEO_CDVREFRESH (6041957.0 / (264 * 384));src/burn/burn.cpp,BurnSetRefreshRate:nBurnFPS = (INT32)(100.0 * dFrameRate);src/burner/libretro/libretro.cpp:timing = { nBurnFPS / 100.0, … } - NeoCD,
src/timer.h:MASTER_CLOCK = 24168000.0,PIXEL_CLOCK = 6042000.0,SCREEN_WIDTH = 384,SCREEN_HEIGHT = 264,FRAME_RATE = PIXEL_CLOCK / (SCREEN_WIDTH * SCREEN_HEIGHT);src/burn/drv/neogeo/d_neogeo.cpp: "vsync: ~59.18 Hz (264 scanlines make up a single frame)"
Dreamcast, NAOMI, Atomiswave¶
The video clock is 27 MHz, and the pixel clock is half of it, 13.5 MHz, unless FB_R_CTRL.vclk_div selects the full 27 MHz (the 31 kHz VGA modes). The sync generator's SPG_LOAD register holds the line length and the frame height less one. The standard modes (KallistiOS's table below) use hcount = 857 (858 clocks, at 13.5 MHz exactly the broadcast line) and vcount = 262 for 240p, 263 lines: 27000000 / 2 / (858 × 263) = 59.826 Hz. For 480i, vcount = 524 with the interlace bit set: 525 half-lines per field, 59.940 Hz. VGA: 27 MHz, 858 clocks, 525 lines: also 59.940 Hz.
Flycast recomputes its rate every time the game writes SPG_LOAD, in SH-4 cycles: the 200 MHz SH-4 clock divided by the line cycles, which it truncates to an integer (12711 rather than 12711.1). So it reports 59.827 Hz for a 240p game and 59.9453 Hz for a 480i or VGA game, and starts with 59.9453 before a game sets anything.
Audio: the AICA's sample rate is 44100 Hz.
- Flycast,
core/hw/pvr/spg.cpp:constexpr int PIXEL_CLOCK = 27 * 1000 * 1000;CalculateSync():pixel_clock = PIXEL_CLOCK / (FB_R_CTRL.vclk_div ? 1 : 2),pvr_numscanlines = SPG_LOAD.vcount + 1,Line_Cycles = SH4_MAIN_CLOCK * (SPG_LOAD.hcount + 1) / pixel_clock, halved when interlaced,retro_refresh_av_info(SH4_MAIN_CLOCK / (Line_Cycles * pvr_numscanlines));shell/libretro/libretro.cpp:fps = fps_spg ? fps_spg : SPG_CONTROL.isPAL() ? 50.0 : 59.945300 - KallistiOS,
kernel/arch/dreamcast/hardware/video.c— the mode table'sscanlines, clockscolumns:262, 857for 320×240 NTSC,524, 857for 640×480 NTSC interlaced
GameCube and Wii¶
The video interface runs from a 27 MHz clock (54 MHz for progressive scan). Its half-line length register HLW is 429 samples, so a line is 858 samples of 27 MHz: 63.556 µs, the broadcast line; Dolphin's source states it as 1.001 / (30 × 525). A field is 525 half-lines, so interlaced and progressive both give 59.940 Hz.
Dolphin derives the rate as 2 × (system clock) / (ticks of the even field + ticks of the odd field), where the ticks per half-line come from HLW; for NTSC that is 59.94.
Audio: the DSP outputs 32 kHz (the GameCube's is measured at 32029 Hz); streamed disc audio is 48 kHz.
- Dolphin,
Source/Core/Core/HW/VideoInterface.cpp:CLOCK_FREQUENCIES{{ 27000000, 54000000 }}; "The line is 63.55555..us long, which is derived from 1.001 / (30 * 525)";UpdateRefreshRate():m_target_refresh_rate_numerator = GetTicksPerSecond() * 2; m_target_refresh_rate_denominator = GetTicksPerEvenField() + GetTicksPerOddField();GetNominalTicksPerHalfLine() = GetTicksPerSample() * m_h_timing_0.HLW
PlayStation 2¶
The GS's CRTC outputs the standard signal: 480i at 59.94 Hz, and 240p games at 59.82 Hz, in PCSX2's own words. PCSX2 (and ARMSX2, which is built from it) does not derive the rate from the CRTC at all: its vsync comes from a timer fixed at 59.94 Hz for NTSC, "regardless if the GS is outputting interlace or progressive scan content". So the emulator runs every game at 59.94 Hz, and a 240p game runs 0.2 % faster than on the console.
Audio: the SPU2 outputs 48 kHz.
- PCSX2,
pcsx2/Counters.cpp— "According to the GS: NTSC (interlaced): 59.94, NTSC (non-interlaced): 59.82, PAL (interlaced): 50.00, PAL (non-interlaced): 49.76";UpdateVSyncRate(): "The PS2's vsync timer is an independent crystal that is fixed to either 59.94 (NTSC) or 50.0 (PAL) Hz";pcsx2/Config.h:DEFAULT_FRAME_RATE_NTSC = 59.94f
PSP¶
PPSSPP times the display as 60 Hz divided by 1.001, "to compensate for the classic 59.94 NTSC framerate that the PSP seems to have", with 286 lines per frame; it reports 60 / 1.001 to RetroArch. We have not found a datasheet-level derivation for the PSP's LCD, so the number in REFRESH_RATES.md is PPSSPP's.
Audio: 44100 Hz.
- PPSSPP,
Core/HLE/sceDisplay.cpp: "1.001f to compensate for the classic 59.94 NTSC framerate that the PSP seems to have",timePerVblank = 1.001 / (double)framerate;Core/HW/Display.cpp:hCountPerVblank = 286;libretro/libretro.cpp:info->timing.fps = (60.0 / 1.001) / vsyncSwapInterval
Xbox¶
The Xbox's TV encoder outputs the standard 525-line signal, 59.94 Hz interlaced or progressive. We have not traced xemu's own vblank timer in its source; the table uses the hardware figure.
Arcade (FBNeo)¶
Every board has its own crystal and line count, and every FBNeo driver sets its rate from them (BurnSetRefreshRate); FBNeo reports the driver's rate to RetroArch, and logs it as "Timing set to … Hz". The rates run from about 54 to 61 Hz, so no single panel mode fits, and the default 119.88 Hz mode is used.
- FBNeo,
src/burner/libretro/libretro.cpp:timing = { nBurnFPS / 100.0, … }, "[FBNeo] Timing set to %f Hz"
Checking a rate on the device¶
Start the game from a shell with retroarch -v … and look for the core's fps in the log: RetroArch prints the timing it was given ([Core]: … fps in the av_info lines), and several cores log their own (FBNeo's "Timing set to", Flycast's rate on every SPG_LOAD write). Then compare with modetest -c, which lists the panel modes with their pixel clocks: the mode's rate is clock / (1302 × 1001), and it should be twice the core's number.