New on the blog: my last post specifically on Amiga hardware for awhile, I suspect. This works multiplexed sprites into the little shooting gallery game I've been developing as an example, and gives us a reasonable look into the division of labor between hardware and software on the system.

https://bumbershootsoft.wordpress.com/2024/12/21/amiga-500-finishing-the-shooting-gallery-project/

#retrocomputing #amiga #amiga500

Amiga 500: Finishing the Shooting Gallery Project

This week we’ll finish the little Amiga 500 shooting gallery game we’ve been writing. The last step, as it was in its Atari parallels, is to expand the animation and simulation systems …

Bumbershoot Software
Since I'm now at the end, this is also where I end up having to grapple properly with a couple of @TomF 's offhand comments months ago about how the the OCS's sprite system is only redeemable because of the Copper. With one exception from two weeks ago, I never touched the Copper in sprite logic, and even there it was so that I could manage one of my sprites act more like the simpler Atari 2600 logic than like the Atari 800 logic.

I don't think that's what he meant. So instead I sat down and sketched out how far you could get by making every aspect of the system as dynamic as possible, and got a vision of a system that basically erases its existence from the end user's perspective.

If you push everything absolutely as hard as you can, you can end up in a world that looks like a slightly more powerful bob-based system than the full system you actually have.

Which feels like a letdown, but I also think it's inevitable.

@mcmartin So to clarify - I do not consider the built-in "autoincrement" sprite DMA reuse to be very useful. Because they have to be contiguous lists, as soon as sprites start moving, you end up copying a lot of data around very frame - either rearranging sprites in a single DMA channel, more moving sprite data from one DMA channel to another.

It gets even worse if you want 15-colour and/or wider sprites.

At that point, might as well just blit them :-)

@mcmartin The way you solve this is to have the Copper feed the sprite hardware. So each frame the CPU's setting up command lists, but the data stays where it is.

I think comparing the Amiga to the 8-bit Ataris is... sure. Same designers, after all. But its actual contemporaries were the Megadrive and SNES which had vastly better sprite tech. Without the Copper, it can't keep up.

@mcmartin So maybe that's the fundamental disagreement. You decided you'd try to push the thing to its limit without using the Copper.

I long ago decided the Copper is the heart of the machine, and of course I'd be using it! So I never really tried NOT to use it.

@TomF Going back to check, the restriction I set myself was "keep chip memory as static as possible during ordinary operation."

But just to make sure: do I understand you correctly that you'd be fabricating a fresh Copper list every frame, ending each one with a write to COP1LC to flip to the next frame's list? And that this list would include the necessary palette and SPRnPT writes to reset the sprite DMA state for each instance of each sprite?

@mcmartin Correct. Every frame, I would be constructing a whole new Copper list (to be executed on the following frame) that commanded the sprites, the blitter, the framebuffer scroll/distort, and the various colour palette changes on the appropriate scanlines.

So I take that as a fixed assumption. Once you start with that mind-set, you slot all the other pieces of the machine in around that assumption.

...

@mcmartin Specifically for the sprites, I would have each sprite be directly updated by the Copper, and the pixel data for the sprite just sit in the same place it was loaded from disk. If I need a sprite multiple times, the Copper points it at the same data multiple times as we go down the scanlines.
@TomF Checks out. I had to invent some terminology so that I could split hairs as necessary between these cases, but I update parts of the Copper list in place to handle facing changes on the player's blaster.