93143 wrote: Mon Oct 27, 2025 12:12 am
NeoOne wrote: Sun Oct 26, 2025 9:09 amI remember reading an interview with Argonaut where they said the Super FX can only update the SNES graphics tiles at a set speed. So even if the game had somehow been made faster, the frame rate could not have been 60fps because of this screen update restriction.
They were probably talking about DMA. The S-PPU can't see the cartridge, and the Super FX renders to a framebuffer in Game Pak RAM, on the cartridge. So you have to DMA the finished framebuffer into VRAM in order to see it.
Normally you get about 6 KB of DMA per TV frame (on an NTSC SNES; PAL gets way more), minus overhead and other operations, because VRAM is locked during active display and HBlank. But you can letterbox the screen with forced blanking to get more time.
Typically a Super FX game's framebuffer is something like 224x192 and usually 4bpp, and can in principle be transferred in two blanking periods for a maximum sustainable frame rate of 30 fps. But there are other things that also have to be transferred during VBlank/forced blank, like palette, sprite attributes, and perhaps tilemap information and auxiliary tile data, so 20 fps may be more practical. Star Fox is capped at 20 fps.
There's an additional wrinkle, in that Star Fox, Vortex, and probably a majority of Super FX games were (for budgetary reasons) given insufficient Game Pak RAM to double buffer on the Super FX side. This means that the Super FX has to wait for the whole framebuffer to be transferred before it can start drawing the next frame; all it can do while waiting is clear the parts that have already been transferred. This is why Vortex is basically as slow as Star Fox despite running on a 21 MHz GSU1; essentially, to sustain 20 fps, the game would have to finish rendering in less than one TV frame. Star Fox manages this at the very beginning of the training mission.
Will you have any problems to do with that?
Yes and no, I think. The way I've set up the playfield size and letterboxing, I can transfer a 4bpp rendered layer at 30 fps, or a 2bpp layer at 60 fps, with enough room for the other stuff I have to transfer. Most scenarios will have to use the 4bpp 30 fps mode, but I doubt I'd be able to render some of the busier patterns at a reliable 60 fps anyway. But there are some patterns that do work at 2bpp 60 fps, and some are twitchy enough to need it...
I plan to run all motion and collisions at 60 Hz for accuracy reasons. Only certain components of the visuals will have to run at 30.
It's possible to re-use of sprites using raster interrupt but yes sadly the 96 sprite limit always there though

Maybe for some bullet patterns it could use a single group of animated sprites though (Neo Geo is not short on graphics ROM!). That would be a nice trick.
Perhaps. But I think there are enough scenarios with several hundred bullets that are either heavily clustered or in highly chaotic patterns (or both) that tricks like these wouldn't work everywhere. These sorts of workarounds might fit better in an original game where you can design the game to work with the techniques, rather than a port.
The Neo Geo is certainly famous for its game sizes. Somebody once suggested that it could brute-force Space Harrier that way...
On the Y sorting I think you said a bin sort. Wouldn't this be slower than just using bit shifts to the right on object coordinates to just get a "screen zone" number
...no, I said "sorting into bins". Right shift is probably one of the quickest ways to do bin assignment.
Reviewing my code for the 128x128 collisions test, it looks like I used a hash table in WRAM (not the fastest place to put it, but I wanted to keep the ROM small) to assign sprites to cells based on the high byte of Y concatenated with the high 7 bits of X (you can cat bytes quickly on 65C816 by using 8-bit mode; you load one byte, swap the active and hidden halves of the accumulator, and load the other byte)...
The SNES CPU seems underrated. I always thought a lot of developers back in the day were coding it wrong.
I believe it is. You can do some
pretty impressive-looking stuff with it if you know what you're doing. As for coding it wrong, I've played a very impressive slowdown removal hack of Gradius III that doesn't use the SA-1 (not to be confused with the more famous one that does), and unless they've fixed it recently, you basically can't play it on Arcade difficulty because the slowdown in the options menu is gone so you have to actually be Takahashi Meijin to tap the button fast enough to enable the secret mode...
I heard some SNES game used slower memory with slower CPU speed which seems crazy now. I think Castlevania was one
Virtually all early SNES games did that, because it was cheaper.
The SNES CPU has funny timing. It's hardwired to access different regions of the memory map at different speeds. There are three types of bus access cycles: Fast (6 master clock cycles per CPU cycle), Slow (8 clocks per cycle), and XSlow (12 clocks per cycle).
Internal (non-bus) cycles are always Fast. Most MMIO access is Fast, except for the serial ports which are XSlow*. WRAM is Slow, annoyingly enough. ROM is Slow,
unless you set bit 0 of $420D, in which case ROM in the top half of the memory map is Fast.
Real code is mostly a mix of Fast and Slow cycles; if you set $420D.0 and run your code from bank $80 or higher, it will be closer to 3.58 MHz, and if you don't it will be closer to 2.68 MHz. (Minus the DRAM refresh, of course, which steals ~3% of every scanline...)
Nintendo required the purchase of 120 ns ROM to allow the use of the "FastROM" setting. Otherwise you could cheap out and use 200 ns ROM. Understandably, the prevalence of FastROM increased over the commercial lifetime of the console. (Note that Rendering Ranger R², the game I linked above, used SlowROM despite being a late release; this makes it even more impressive IMO.)
*
Fortunately you don't need them much, or at all if you're using standard controllers and you can just use the S-CPU's controller autoread feature, which runs in the background and doesn't steal cycles. This hasn't stopped Sega fanboys from claiming the SNES is capped at 1.79 MHz if a controller is plugged in (or was that guy just a troll?)...