oamstack from XeO³

Bion, ajouter des sprites dans tous les sens, c’est sympa. Continuer à avoir des sprites dans le 2eme niveau, c’est mieux. L’ennui, c’est que le GuiEngine, comme son nom l’indique, a été au départ conçu pour gérer des interfaces graphiques (SEDS et LEDS), et pas des jeux, ce qui signifie qu’il n’y a pas la possibilité à ce niveau de libérer des sprites — ou plus précisément, les OAM, c.à.d. les zones en mémoire vidéo qui décrivent l’emplacement et les propriétés des sprites. Qu’à celà ne tienne: m’inspirant du “stack allocator” pour 6502 du projet XeO³, je rajoute une petite surcouche …

I was making sure that sprites could be reclaimed and that you keep seeing little stars even if you got hit > 60 times … Just one problem here : Engine::allocate is the only way to inform the GuiEngine of how much sprites it should sync to the DS video memory … As the level is reset, that number is reset to 0, but since all the Gobs of the level have just been “pushed” in the oamstack … well … Engine::allocate() is never called and thus no sprite show up … at all. Trivial to fix, but reminds me that you should always think twice when you alter the behaviour of something … And that was a nice occasion to mention Dailly, Kekule & Russel’s work on XeO3 : the Ultimate shoot’m’up for Commodore Plus/4 (which has some armalyte taste, if you ask me) and how this code gets inspiration from the 6502 “stack allocator” for bullets in that game.

Ca n’a pas tout à fait marché, mais presque: le GuiEngine retient le nombre de sprites qu’il a effectivement alloué et ne copiera en VRAM que ceux-là. Or, lorsque le niveau recommence, tous les OAMs précédemment restent dans la “pile de sprites recyclés” alors que le GuiEngine pense qu’il n’y en a aucun en service. Le résultat ? Bin le jeu tourne, mais plus aucun sprite ne s’affiche. C’est plutôt bête comme chou à régler, donc je vais aller règler ça pendant que vous découvrez en détail cet étonnant projet XeO³ mené par Mike Dailly, un (ancien ?) programmeur de chez DMA design dont je suis le blog depuis un moment.

edit: Btw, yes, this implies u8 oamstack[128] because there is at most 128 OAMs per screen and that the game is only on one screen. I can’t think of another allocation scheme that would save me more and don’t disturb run-time operations. I’d love to extend the mechanism to GameObject structure themselves (which have higher allocation overhead)

edit++: funny, they seem to use the same kind of “script-encoded-into-asm-constants” approach than I used in 2000 for Out’m’UP :).

6 thoughts on “oamstack from XeO³

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.