01b7446a66d5e7a4d3361d70fb00eaa6e6b2c531
The SSE2/NEON FIR added in df8a6e8 was not bit-exact with the scalar
code it replaced:
* It packed int32 samples to int16 with PACKSSDW saturation, on the
assumption that NES audio stays inside int16. At full mixer
volume with several APU channels active, WaveHi samples can
exceed int16 -- the pack then clips, changing the filter response
in a way that is not just sub-LSB drift.
* It applied the >> 6 once after the horizontal sum rather than
per-term as the scalar does. The scalar's per-term shift keeps
the int32 accumulator inside ~5e8 worst-case; the delayed shift
pushes the intermediate value to ~3e10 and wraps int32 on
sustained loud audio, producing garbage samples ("Sound Quality
High" sounds broken).
* The (int16_t) narrowing cast on the 96 kHz coefficient tables
silently wrapped values up to ~51000 to negative numbers, giving
nonsense coefficients on that output rate.
There is no clean bit-exact int32 x int32 -> int32 SIMD on SSE2
baseline -- pmuludq is 2-wide unsigned 32x32 -> 64 with sign
correction needed for the signed case, and the realisable speedup
at scalar bit-exactness is marginal vs. the ~1.4% of frame budget
the scalar already costs. Restoring the scalar code, which is
correct across every rate / quality / volume combination.
FCE Ultra mappers modified
FCEU "mappers modified" is an unofficial build of FCEU Ultra by CaH4e3, which supports a lot of new mappers including some obscure mappers such as one for unlicensed NES ROM's.
Sequential targets Light Guns support added
Support for Sequential targets Light Guns has been added. "Gun Aux A" serves as light sensor logic input.
Description
Languages
C
97.7%
Python
2%
C++
0.2%