Yes, I ran into the same bug. Thank _Demo_ for the solution.

<__Demo__> it turns out the superfx was accessing data in lower part of banks
<__Demo__> so it needs to simply contain the same data as the upper part from the superfx side

In case it's not clear, he's saying $00-3f:0000-7fff should be identical to $00-3f:8000-ffff. A15 is ignored.

Though there are some slight differences between each PCB revision, this memory map will work for all SuperFX games.

Code
sfxbus.map(MapLinear, 0x00, 0x3f, 0x0000, 0x7fff, memory::gsurom);
sfxbus.map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::gsurom);
sfxbus.map(MapLinear, 0x40, 0x5f, 0x0000, 0xffff, memory::gsurom);
sfxbus.map(MapLinear, 0x60, 0x7f, 0x0000, 0xffff, memory::gsuram);

cpubus.map(MapLinear, 0x00, 0x3f, 0x6000, 0x7fff, memory::gsuram, 0x0000, 0x2000);
cpubus.map(MapLinear, 0x00, 0x3f, 0x8000, 0xffff, memory::gsurom);
cpubus.map(MapLinear, 0x40, 0x5f, 0x0000, 0xffff, memory::gsurom);
cpubus.map(MapLinear, 0x60, 0x7d, 0x0000, 0xffff, memory::gsuram);
cpubus.map(MapLinear, 0x80, 0xbf, 0x6000, 0x7fff, memory::gsuram, 0x0000, 0x2000);
cpubus.map(MapLinear, 0x80, 0xbf, 0x8000, 0xffff, memory::gsurom);
cpubus.map(MapLinear, 0xc0, 0xdf, 0x0000, 0xffff, memory::gsurom);
cpubus.map(MapLinear, 0xe0, 0xff, 0x0000, 0xffff, memory::gsuram);

The RAM ones with "0x0000, 0x2000" at the end are simply saying "keep mirroring the first 8k", the same way SNES WRAM does to $00-3f|80-bf:0000-1fff.

By the way, how are you emulating these chips so fast? Are you reusing eg Snes9x's core, or is someone extremely talented working on it? smile