I rewrote his S-DSP emulator in pure C++. Only took me seven hours, not bad. anomie's took a few days.
Now, given, it's extremely similar of course. First, the algorithms are going to be mostly the same regardless of who writes the code. Second, I really didn't see a reason to waste too much time on this reverse engineering a bunch of stuff myself, so I pretty much just took the code and "rewrote" (read: copied) it in my unique style, and changed a few things here and there. Code flow, variable names, tables, exact algorithms, etc were blatant, direct copies.
Things I did change:
- counter rate 0 is now hardcoded to not ever hit zero
- counter read is now boolean instead of unsigned short
- a lot of multiplication was converted to shifts
- broke up the program into ~9 source files
- no more global functions anywhere, all in one class
- removed the hooks for things like external channel muting -- will re-add if I ever add an option like that to bsnes
- modified VREG to not need the voice regs handle passed to it
- all voice functions take a reference instead of pointer to the voice structs now
- packed 32-line timing table expanded to multi-line
- left everything in their own small chunk functions ... kind of torn on whether I want to merge that with the main timing function. I like the encapsulation, but it would remove the need to keep so many struct-based state variables
- added a few more comments on parts that confused me at first
- removed assignment inside conditional stuff; even though I do that myself on occasion in other code I write, heh
- yadda yadda, more minor stuff like that
Going to keep working at it -- wanted to get it working now, so that finding regressions will be easier. I want to remove the double writes for the ring buffer, make a decision on whether I want to rely on sign extension, or use sclip<> for that, implement a compile-time option to bypass libco (will save 2.048 million co_switch calls a second) since the S-DSP's entire operation fits into a single switch table quite easily, convert a lot of the mul / div stuff to shifts, convert those clever split up branches in the envelope and BRR decoding routines to switch / case tables, remove the shift tables from the BRR decoding, and try and figure out what's going on with some of the code so that I can try and document it :)
I'll see if I can contribute something back, too. Perhaps I can look into what happens when you enable mute or something.
New WIP up which has the new core enabled by default. For those without WIP access, I've posted the new source for reference. Comments welcome.
Code: Select all
byuu.org/files/bsnes_dsp.zip