4

If I start vanilla "Mesen-S" and load in Super Mario Kart, it says:

This game requires a firmware file for the DSP1B chip.

If I feed the emulator that "DSP ROM" file, it then runs Super Mario Kart.

However, if I load in Stunt Race FX, famous for being one of the games for SNES which uses the special "Super FX" chip, it just runs immediately without asking me to locate any special DSP ROM, or having such a thing for the Super FX chip.

Why is this? How can this be?

(Until now, I didn't know that SMK even used any special hardware/chip at all; I thought it was "vanilla SNES".)

  • 2
    I'm not sure I totally understand the question. The Super FX chip does not require extra firmware (it's basically a CPU; the game gives it instructions directly, and it can be emulated directly). The DSP chips require special firmware, which is illegal to distribute (just like "regular" game ROMs). There are many different chips in SNES games, some of which require firmware and some that don't. en.wikipedia.org/wiki/List_of_Super_NES_enhancement_chips – tobiasvl Sep 11 '20 at 11:29
  • 1
    @tobiasvl I think you have answered the question, whether you understand it or not. This could well be posted as a suitable answer. – Mark Williams Sep 11 '20 at 15:54
  • @MarkWilliams Hehe. Fair enough. I don't know any details about the DSP firmware or anything, but I expanded my comment into an answer. – tobiasvl Sep 12 '20 at 10:23
3

The source code for Mesen-S is available online at https://github.com/SourMesen/Mesen-S . I found the following code in https://github.com/SourMesen/Mesen-S/blob/master/Core/NecDsp.cpp :

switch(type) {
    case CoprocessorType::DSP1: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, FirmwareType::DSP1, "dsp1.rom", "dsp1.program.rom", "dsp1.data.rom", programRom, dataRom, embeddedFirware); break;
    case CoprocessorType::DSP1B: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, FirmwareType::DSP1B, "dsp1b.rom", "dsp1b.program.rom", "dsp1b.data.rom", programRom, dataRom, embeddedFirware); break;
    case CoprocessorType::DSP2: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, FirmwareType::DSP2, "dsp2.rom", "dsp2.program.rom", "dsp2.data.rom", programRom, dataRom, embeddedFirware); break;
    case CoprocessorType::DSP3: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, FirmwareType::DSP3, "dsp3.rom", "dsp3.program.rom", "dsp3.data.rom", programRom, dataRom, embeddedFirware); break;
    case CoprocessorType::DSP4: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, FirmwareType::DSP4, "dsp4.rom", "dsp4.program.rom", "dsp4.data.rom", programRom, dataRom, embeddedFirware); break;
    case CoprocessorType::ST010: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, FirmwareType::ST010, "st010.rom", "st010.program.rom", "st010.data.rom", programRom, dataRom, embeddedFirware, 0xC000, 0x1000); break;
    case CoprocessorType::ST011: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, FirmwareType::ST011, "st011.rom", "st011.program.rom", "st011.data.rom", programRom, dataRom, embeddedFirware, 0xC000, 0x1000); break;
    default: break;
}

It appears that these coprocessors are supported by loading an additional firmware file, whereas some others are emulated directly. I suspect this is because the various DSP chips are really just maths coprocessors, and therefore very simple to emulate, whereas the more advanced SuperFX chip is more of a graphics accelerator and requires its own emulation.

All the code that emulates the DSP chips is the same for all the models, with a few conditional statements that affect the ST010 and ST011. They just need to have relevant firmware loaded, to ensure they work accurately, as they are not interchangeable

3

If I feed the emulator that "DSP ROM" file, it then runs Super Mario Kart.

The physical DSP chips have special firmware, which is illegal to distribute (just like "regular" game ROMs).

This is somewhat similar to how some other consoles have a BIOS or "boot ROM" that's run when the console starts up. This isn't firmware for the CPU per se, but code that's required for the console to initialize correctly.

However, if I load in Stunt Race FX, famous for being one of the games for SNES which uses the special "Super FX" chip, it just runs immediately without asking me to locate any special DSP ROM, or having such a thing for the Super FX chip.

Super FX is basically a CPU. It's a coprocessor that can do the calculations needed for rendering advanced graphical effects, including 3D polygons. It does not require any special software to run; the game gives it instructions directly (like with the regular CPU) and so it can be emulated directly.

(Until now, I didn't know that SMK even used any special hardware/chip at all; I thought it was "vanilla SNES".)

There are many different chips in SNES cartridges, some of which require firmware and some that don't. This is one advantage of having cartridge-based games; the cartridges not only contain the game code in a ROM, but can also expand the base console with extra hardware to enhance the game.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.