Files
libretro/emulators/superzsnes.yml
T
Abdessamad Derraz 7f945574cd fix: give SUPER ZSNES DSP refs their addresses
The DSP refs named IL2CPP methods only. They now carry the addresses
the v0.320 Windows GameAssembly.dll gives DSP1..ctor and
DSP1Core.LoadROM, with the CRC32 constant and the 8 KB buffer sites.
2026-11-10 13:35:17 +01:00

136 lines
6.7 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"
version_basis:
kind: package
url: "https://www.zsnes.com/files/SuperZSNES_v0.320.zip"
pattern: 'SuperZSNES_(v\d+\.\d+)\.zip'
artifact: "SuperZSNES_v0.320.zip"
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. Method addresses are those the
Windows GameAssembly.dll (sha256 5643f3364802cea8) assigns to the metadata
methods (global-metadata.dat version 39, sha256 99a8e5dbfa9f6028).
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.dll v0.320 DSP1..ctor at 0x1805587d0 (name and expected CRC32 0x465C4E1C loaded at 0x1805588e8, compare, warn on mismatch, zero-filled 0x2000 buffer at 0x180558e33), DSP1Core.LoadROM at 0x180555280 (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.dll v0.320 DSP1..ctor at 0x1805587d0 (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.dll v0.320 DSP1..ctor at 0x1805587d0 (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.dll v0.320 DSP1..ctor at 0x1805587d0 (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.dll v0.320 DSP1..ctor at 0x1805587d0 (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.dll v0.320 DSP1..ctor at 0x1805587d0 (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.dll v0.320 DSP1..ctor at 0x1805587d0 (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)."