Files
libretro/emulators/superzsnes.yml
T

129 lines
6.1 KiB
YAML

emulator: SUPER ZSNES
type: standalone
core_classification: other
source: "https://www.zsnes.com"
upstream: "https://www.zsnes.com"
version_source:
url: "https://www.zsnes.com/"
pattern: 'Latest Release Notes \((v[0-9.]+[a-z]?)\)'
profiled_date: "2026-10-20"
core_version: "v0.320"
display_name: "Nintendo - SNES / SFC (SUPER ZSNES)"
cores:
- superzsnes
- SUPERZSNES
systems:
- nintendo-snes
mode: standalone
notes: |
Super Famicom emulator by zsKnight and _Demo_, written from scratch with a
GPU-rendered PPU and unrelated to the ZSNES codebase. Shipped as binaries
only, for Windows, macOS, Linux, Android and iOS. Since v0.320 the desktop
builds are Unity IL2CPP: the emulator is compiled into GameAssembly with
its names in il2cpp_data/Metadata/global-metadata.dat, and the per-game
tables are serialized into the level0 scene. The build calls itself
v0.320b. The Windows and Linux archives (SuperZSNES_v0.320.zip, sha1
c934d6b74a050ef8857595a0529ee0e0006e2d93, and SuperZSNES_v0.320.tar.gz,
sha1 7630f6bbcda789a329ee4198ec11934feaf56e32, from zsnes.com/files)
carry the same VersionNo object in level0.
One NEC uPD7725 interpreter serves every cartridge whose header declares a
DSP. RomLoader.GetROMType reads the cartridge type byte at $FFD6 and returns
COProcessorType.DSP when the low nibble is 3 to 8 and the high nibble is 0,
or when the high nibble is F and the subtype byte at $FFBF is 1 or 2.
MainMemoryMap.InitSpecialChips builds the DSP1 object for that type. The
DSP1 constructor picks the filename from VersionNo.dspDetections, where each
name carries a list of CRC32 values of the 21 raw header title bytes, taken
as Latin-1 and re-encoded UTF-8, falling back to dsp1b.rom when no entry
matches. Words are assembled little endian, 2048 24-bit program words from
offset 0 then 1024 16-bit data words from offset 6144, and a shorter file
leaves the remaining words at zero.
Three locations are tried in order: the folder holding the loaded ROM, the
Unity persistent data folder (ZEMU Software Inc./SUPERZSNES), then the
folder holding the executable. None of them goes through the srm and bps
path overrides. When all three miss, a "Need DSP ROM" dialog names the file
and the chip runs on a zero-filled 8192-byte buffer. The image is kept
across resets and reloaded only when another name is selected.
No other file is read. SA-1, S-DD1, Super FX, OBC-1 and Cx4 are emulated
from code alone, the Cx4 data ROM coming from CX4DataRom.GenerateDataRom.
SPC7110, S-RTC, Super Game Boy and the ST01x and ST018 enum entries build
no chip. The SPC700 IPL is a 64-byte array in CPUSPC700, and the built-in
enhancement data, the audio replacement data and testgame.smc are Unity
resources inside the build. Save RAM, save states, cheats, bps patches,
MSU-1 packs and the .zsmod, .zsaudiomod and .zlua enhancement files are
all named after the loaded ROM.
files:
# NEC uPD7725 microcode, program and data ROM in one file.
# The name is chosen by CRC32 of the 21-byte header title, and dsp1b.rom is the
# default when no entry in the table matches.
- name: "dsp1b.rom"
aliases: ["SNES_dsp1b.rom"]
system: nintendo-snes
description: "NEC uPD7725 DSP-1B microcode"
required: true
size: 8192
crc32: 465c4e1c
validation: [crc32]
source_ref: "GameAssembly DSP1..ctor (name and expected CRC32 0x465C4E1C, compare, warn on mismatch), DSP1Core.LoadROM (8192-byte layout)"
note: "Default for every DSP cartridge with no table entry, so it covers DSP-1 and DSP-1A titles as well. A mismatched CRC32 warns and the data is used anyway."
- name: "dsp2.rom"
aliases: ["SNES_dsp2.rom"]
system: nintendo-snes
description: "NEC uPD7725 DSP-2 microcode"
required: true
size: 8192
source_ref: "GameAssembly DSP1..ctor (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 0, title CRC32 0x84690f8b)"
note: "Selected for header title 'DUNGEON MASTER' (Dungeon Master)."
- name: "dsp3.rom"
aliases: ["SNES_dsp3.rom"]
system: nintendo-snes
description: "NEC uPD7725 DSP-3 microcode"
required: true
size: 8192
source_ref: "GameAssembly DSP1..ctor (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 1, title CRC32 0xfa7f8076)"
note: "Selected for the half-width katakana header title of SD Gundam GX, 'SD' then $B6 $DE $DD $C0 $DE $D1 then 'GX'."
- name: "dsp4.rom"
aliases: ["SNES_dsp4.rom"]
system: nintendo-snes
description: "NEC uPD7725 DSP-4 microcode"
required: true
size: 8192
source_ref: "GameAssembly DSP1..ctor (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 2, title CRC32 0x42578645)"
note: "Selected for header title 'TOP GEAR 3000' (Top Gear 3000)."
# Seta parts. The table routes their cartridges to the same uPD7725
# interpreter, which reads the first 8192 bytes and checks neither size nor
# hash.
- name: "st010.rom"
aliases: ["SNES_st010.rom"]
system: nintendo-snes
description: "Seta ST010 microcode"
required: true
source_ref: "GameAssembly DSP1..ctor (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 3, title CRC32 0x04e7aca6)"
note: "Selected for header title 'F1 ROC II' with $00 as the 21st byte (F1 ROC II: Race of Champions)."
- name: "st011.rom"
aliases: ["SNES_st011.rom"]
system: nintendo-snes
description: "Seta ST011 microcode"
required: true
source_ref: "GameAssembly DSP1..ctor (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 4, title CRC32 0xc96d71c1)"
note: "Selected for header title '2DAN MORITA SHOUGI' with $00 as the 21st byte (Hayazashi Nidan Morita Shougi)."
- name: "st018.rom"
aliases: ["SNES_st018.rom"]
system: nintendo-snes
description: "Seta ST018 firmware"
required: true
source_ref: "GameAssembly DSP1..ctor (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 5, title CRC32 0x85885c5e)"
note: "Selected for header title 'NIDAN MORITASHOGI2' (Hayazashi Nidan Morita Shougi 2)."