SNES Coprocessors: DSP-1 and Friends
jsgroth.dev
jsgroth.dev
The ability to plug in a coprocessor many times faster than the main CPU is such a fascinating option (used all through the 80’s too, eg the Z80 boards for Apple ][) only to be limited to a niche genre…
I've seen better ways to do things like SIN lookup tables lately that weren't common knowledge in the mid-90s.
You could get away with it by reducing freedom of motion and achieving something akin to f-zero.
Also, trig tables were very common. Near discovered that the the entire CX4 processor's hardware ROM was just a lookup table.
https://www.youtube.com/watch?v=xFKFoGiGlXQ
Jez (CEO of Argonaut) once offered me an interview for the Starfox/DSP team, so I almost worked on this thing. He was very active on the coding groups on Usenet around that time.
Snesdrunk has pointed me to a couple of performance-focussed romhacks, the only one I can remember right now is https://www.romhacking.net/hacks/7163/
It’s hard to fathom, for people used to modern computing, just how limited the SNES’ 65816 is. Even at the time it was pretty underpowered.
I don’t know about the specific techniques you’re referring to (though I’d be surprised if they weren’t known about back then, when lookup tables were king!) but something to bear in mind is that, in general, most advances in math programming knowledge since that era hinge on the availability of floating point, which is a non-starter for the SNES.
The tiny amount of ROM available was also a limiting factor - I think Pilotwings was only 512kb, at most 1mb. There wasn’t even a lot of space for lookup tables!
https://www.youtube.com/watch?v=xFKFoGiGlXQ
I was writing software texturers etc in the late 80s/early 90s, and even recently I've seen x86 people humble me with all sorts of info that I had no idea about at the time, concerning pipelining etc. I would just sit all day randomly reordering assembler instructions and reprofiling teapot renders to see if anything would move the needle.
The N64 had an FPU and could work with floating point values. The SNES...couldn't. You're talking about pipelining; this video is talking about caches. Well, the 65816 has no pipeline. The 65816 has no cache.
If you were writing doing 3D graphics in the late 80s or early 90s, you might've been working with a 286 or 386. These are chips that run circles around the SNES' 65816. And the R4000 in the N64? Forget about it. It was running at a clock speed nearly two orders of magnitude higher than the SNES' CPU, and could do vastly more per cycle to boot.
Is this a mistake, or was there really some BCD-type magic going on?
Say instead of in meters, if the unit is 1/65536 of a meter, than you can describe those integers as 16.16 fixed point meters.
Not to say that the SNES wasn't a 2D powerhouse thanks to it's powerful raster effects and developers eventually got better at working around the anemic CPU, but earlier games chugged, particularly if publishers cheaped out and used slower ROMs for the carts which cut the already slow CPU speed from 3.58mhz down to 2.68mhz. Mode 7 was a neat trick, but on the whole the core SNES hardware was really bad at 3D.