diff --git a/emulators/superzsnes.yml b/emulators/superzsnes.yml index 396d0b09..0a60fad8 100644 --- a/emulators/superzsnes.yml +++ b/emulators/superzsnes.yml @@ -6,8 +6,8 @@ upstream: "https://www.zsnes.com" version_source: url: "https://www.zsnes.com/" pattern: 'Latest Release Notes \((v[0-9.]+[a-z]?)\)' -profiled_date: "2026-08-08" -core_version: "v0.230b" +profiled_date: "2026-10-20" +core_version: "v0.320" display_name: "Nintendo - SNES / SFC (SUPER ZSNES)" cores: - superzsnes @@ -19,33 +19,42 @@ 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 and Android. The desktop builds are Unity - Mono, so the emulator is Assembly-CSharp.dll and the per-game tables are - serialized into the level0 scene. The Windows and Linux 0.230b builds carry - the same tables and the same emulation sources. + 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 6 and the high nibble is 0, + 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 alone. - The DSP1 constructor picks the filename from a table keyed on the CRC32 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. + 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. + 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, SPC7110, S-RTC, Cx4, OBC-1, 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 enhancement data, the audio replacement data and - testgame.smc are Unity resources inside the build. Save RAM, save states, - cheats, bps patches and MSU-1 packs are all named after the loaded ROM. + 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. @@ -60,7 +69,7 @@ files: size: 8192 crc32: 465c4e1c validation: [crc32] - source_ref: "Assets/Scripts/SpecialChips/DSP1.cs:88-89 (name and expected CRC32 1180454428), DSP1.cs:151-155 (compare, warn on mismatch), Assets/Scripts/SpecialChips/DSP1Core.cs:756-769 (8192-byte layout)" + 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" @@ -69,7 +78,7 @@ files: description: "NEC uPD7725 DSP-2 microcode" required: true size: 8192 - source_ref: "Assets/Scripts/SpecialChips/DSP1.cs:98-114 (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 1, title CRC32 0x84690f8b)" + 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" @@ -78,7 +87,7 @@ files: description: "NEC uPD7725 DSP-3 microcode" required: true size: 8192 - source_ref: "Assets/Scripts/SpecialChips/DSP1.cs:98-114 (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 2, title CRC32 0xfa7f8076)" + 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" @@ -87,7 +96,7 @@ files: description: "NEC uPD7725 DSP-4 microcode" required: true size: 8192 - source_ref: "Assets/Scripts/SpecialChips/DSP1.cs:98-114 (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 3, title CRC32 0x42578645)" + 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 @@ -99,7 +108,7 @@ files: system: nintendo-snes description: "Seta ST010 microcode" required: true - source_ref: "Assets/Scripts/SpecialChips/DSP1.cs:98-114 (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 4, title CRC32 0x04e7aca6)" + 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" @@ -107,7 +116,7 @@ files: system: nintendo-snes description: "Seta ST011 microcode" required: true - source_ref: "Assets/Scripts/SpecialChips/DSP1.cs:98-114 (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 5, title CRC32 0xc96d71c1)" + 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" @@ -115,5 +124,5 @@ files: system: nintendo-snes description: "Seta ST018 firmware" required: true - source_ref: "Assets/Scripts/SpecialChips/DSP1.cs:98-114 (table lookup, no CRC32 check), SUPERZSNES_Data/level0 (VersionNo.dspDetections entry 6, title CRC32 0x85885c5e)" + 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)."