Reviving the Neo Geo: My Custom ASM Dev Setup

Publié le par illusionrip

Depuis la fin des années 90, la Neo Geo a toujours été ma machine de cœur.

J'en possède plusieurs et j'ai aussi une collection de jeux d'époque.

Il y a quelques années, j'ai décidé de réparer ces machines afin d'acquérir une solide expérience, pour passer à l'étape supérieure, avec un objectif clair depuis le début : le développement sur Neo Geo.

Ce rêve prend forme.

J'ai dû me remettre à l'assembleur — certains vont me traiter de fou, car il existe déjà des choses en C.

Dans ma jeunesse, je codais en ASM sur Amiga dans la scène demo française. J'étais loin d'être un tueur, mais j'adorais ce langage.

Étant sur Mac (je sais, c'est mal), j'ai décidé de me faire mon setup from scratch, depuis que la version en ligne de commande de MAME est disponible.

Les autres émulateurs Mac ne sont pas terribles, et le debugger de MAME est vraiment excellent.

Je suis parti sur la base de mon jeu de cœur, Art of Fighting.

------------------------------------------------------------------

Since the late '90s, the Neo Geo has always been my machine of choice — my one true love.

I own several units, and I've also built up a collection of period games.

A few years ago, I decided to repair these machines to build solid experience, with the goal of eventually taking things to the next level. And from the very start, I had one clear objective: developing on the Neo Geo.

That dream is finally taking shape.

I had to get back into assembly — some will call me crazy, since C tooling already exists.

Back in my younger days, I coded in ASM on the Amiga, in the French demoscene. I was nowhere near a killer coder, but I loved that language.

Being on a Mac (I know, I know), I decided to build my setup from scratch, now that MAME's command-line version is finally here.

The other Mac emulators aren't great, and MAME's debugger is genuinely excellent.

I started with my favorite game as the base: Art of Fighting.

 
 
Reviving the Neo Geo: My Custom ASM Dev Setup

Le but étant de pouvoir me servir de la PROM pour injecter mon code et recompiler tout l'aof.zip.

Mais très vite, si je voulais récupérer des infos graphiques déjà présentes dans le jeu, je devais pouvoir aller regarder du côté des sprites et du fix layer.

Il existe des outils basiques en ligne, et je voulais vérifier si une police de caractères était présente dans la cartouche.

J'avais trouvé ma police de caractères : elle commençait à la tile 30303, et dans le désordre, s'il vous plaît !

----------------------------------------------------

The goal being to use the PROM to inject my own code and recompile the entire aof.zip.

But very quickly, I realized that if I wanted to pull graphical assets already present in the game, I needed to dig through the sprites and the fix layer.

There are some basic tools available online, and I wanted to check whether a font was hiding somewhere on the cartridge.

I found my font: it started at tile 30303 — and scattered completely out of order, if you please!

Reviving the Neo Geo: My Custom ASM Dev Setup

C'était la découverte parfaite pour s'essayer à un petit sine scroll avec ce texte, avec une palette définie à la main.

--------------------------------------

It was the perfect find to try my hand at a small sine scroll effect using that text, with a hand-defined palette.

Reviving the Neo Geo: My Custom ASM Dev Setup

Uhhh, ça marche ! Ça scroll sur une table sinus à 256 entrées.

Prochain entraînement : l'affichage d'un sprite de personnage complet. Mais comment chercher dans les CROMs ? Tant qu'on y est, autant essayer de faire, en Python, mon propre éditeur de sprites, relié à ce setup de dev.

Python, ce n'est pas du bas niveau, mais pour faire de petits projets, c'est largement suffisant.

-----------------------------------------------

Uhhh, it works! It scrolls along a 256-entry sine table.

Next training exercise: displaying a full character sprite. But how do you even search through the CROMs? While I'm at it, I might as well build my own sprite editor in Python, hooked up to this dev setup.

Python isn't exactly low-level, but for small projects, it's more than enough.

Reviving the Neo Geo: My Custom ASM Dev Setup

Mais c'est toujours pareil : et si on faisait ci, et si on faisait ça...

Du coup, l'idée me vient de pouvoir travailler sur un savestate de MAME, et d'essayer de reconstruire l'image sauvegardée dans le savestate à partir des informations qu'il contient (sprites, fix layer et palettes).

Du coup, j'ajoute une fonction qui ouvre une nouvelle fenêtre pour reconstruire l'affichage à partir d'un savestate pris en cours de jeu.

-------------------------------------------

But it's always the same thing: what if I did this, what if I did that...

So the idea comes to me: what if I could work on a MAME savestate and try to reconstruct the saved image from the information it contains (sprites, fix layer, and palettes)?

So I add a feature that opens a new window to rebuild the display from a savestate taken mid-game.

Reviving the Neo Geo: My Custom ASM Dev Setup

Mouais, on peut mieux faire : le fix layer est absent, les sprites des persos aussi.

Du coup, grâce au Neo Wiki et à ses fondateurs, on récupère beaucoup d'infos sur les palettes, les registres vidéo, la structure des sprites, et plein d'autres renseignements obscurs.

Les persos, c'était n'importe quoi : j'ai repéré un problème de byteswap qui me faisait chercher les sprites des persos à deux fois l'emplacement mémoire où ils se trouvaient réellement.

Après corrections, les persos sont là, et le fix, entre-temps, a été « fixé ».

Mais pas de décor quand l'image est en taille normale (j'entends : sans dézoomer).

-----------------------------------------------------

Meh, could do better: the fix layer is missing, and so are the character sprites.

So, thanks to the Neo Wiki and its founders, I picked up a ton of info on palettes, video registers, sprite structure, and plenty of other obscure details.

The characters were a total mess: I spotted a byteswap issue that was sending me to look for the character sprites at exactly twice the memory address where they actually lived.

After fixing that, the characters showed up — and in the meantime, the fix layer got "fixed" too.

But still no background when the image is at normal size (meaning: without zooming out).

Reviving the Neo Geo: My Custom ASM Dev Setup

Problème du bit de shrink, qui permet de gérer les « zooms » sur la machine : il manque toujours un morceau.

Ce petit logiciel est pratique, car il permet de récupérer les 256 palettes du jeu. Mais comment savoir quelle palette correspond à quelle image, et surtout à quel sprite ?

---------------------------------------------

There's an issue with the shrink bit, which handles "zoom" effects on the machine — there's still a piece missing.

This little tool is handy since it lets me pull out the game's 256 palettes. But how do you figure out which palette matches which image, and especially which sprite?

Reviving the Neo Geo: My Custom ASM Dev Setup

Les jambes sont manquantes.

Une erreur de paramétrage sur les sticky bits, qui permettent de coller les sprites ensemble, et les jambes reviennent.

J'ai aussi fixé la bande du haut sur le décor dézoomé, en allant chercher, dans l'éditeur de CROM, où commençaient les décors de cette bande.

Mais j'ai aussi changé de stratégie pour la récupération des données. Le savestate me posant trop de soucis, et grâce aux conseils du talentueux Aurélien, je me suis fait un script qui va directement sauvegarder le contenu de la VRAM quand je fais une pause dans MAME, et ça vient écrire le dump directement dans le dossier de mon setup de programmation.

-----------------------------------------------

The legs are missing.

A parameter error on the sticky bits — which glue sprites together — and the legs are back.

I also fixed the top strip on the zoomed-out background by digging through the CROM editor to find where the backgrounds for that strip started.

But I also changed my strategy for grabbing the data. The savestate was causing me too much trouble, so — thanks to the talented Aurélien's advice — I built myself a script that saves the VRAM content directly whenever I pause MAME, writing the dump straight into my dev setup's folder.

Petite précision : j'ai lu « des vrai » comme "la VRAM" (mémoire vidéo), vu le contexte technique — dis-moi si tu voulais dire autre chose.

Reviving the Neo Geo: My Custom ASM Dev Setup
Reviving the Neo Geo: My Custom ASM Dev Setup

J'essaye sur d'autres, dans différents stages, pour voir si la structure est bien recomposée. Et la réponse est : vvvooouuiiiii !

----------------------------------------

I try it on others, across different stages, to see if the structure gets rebuilt correctly. And the answer is: yyyeeeaahhh!

Reviving the Neo Geo: My Custom ASM Dev Setup

Alors, je me dis : est-ce que l'on pourrait ajouter des fonctions supplémentaires qui quadrilleraient la reconstruction, et qu'avec notre souris, en survolant une zone, nous aurions les infos sur l'adresse du sprite ou de l'élément du fix layer, ainsi que sa palette, avec la palette de 16 couleurs qui s'affiche à côté pour en avoir un aperçu ?

Fonction supplémentaire : en balayant avec deux doigts (Mac oblige), on déclenche un zoom/dézoom sur la zone qui nous intéresse, pour être sûr de bien sélectionner le bon sprite.

Bien sûr, on peut aussi extraire les palettes dans un fichier.

English version

So I start wondering: could I add some extra functions that would grid out the reconstruction, so that hovering the mouse over an area would show info on the sprite's address, or the fix layer element, along with its palette — with the 16-color palette displayed alongside for a quick preview?

Extra feature: swiping with two fingers (Mac life) triggers a zoom/unzoom on the area of interest, to make sure I'm selecting the right sprite.

And of course, you can also export the palettes to a file.

Reviving the Neo Geo: My Custom ASM Dev Setup
Reviving the Neo Geo: My Custom ASM Dev Setup
Reviving the Neo Geo: My Custom ASM Dev Setup

Il est 23h50... du matin. Ça fait une journée que je bosse dessus, ma femme ne me parle plus, mes enfants m'appellent tonton !!!!

Et une idée satanique d'Aurélien : griser les zones et ne laisser en couleur que la zone survolée.

Ça marche un peu, mais pas tout le temps.

Bref, à peaufiner, mais l'idée est très bonne (de toute façon, quand t'es proche du soleil, t'as que des bonnes idées).

--------------------------------

It's 11:50pm... in the morning. I've been at this for a full day straight — my wife isn't talking to me anymore, and my kids are calling me "uncle" !!!!

And then a diabolical idea from Aurélien: grey out all the zones and only leave the hovered-over zone in color.

It kind of works, but not all the time.

Anyway, needs polishing, but it's a really good idea (then again, when you're that close to the sun, all your ideas are good ones).

Reviving the Neo Geo: My Custom ASM Dev Setup
Reviving the Neo Geo: My Custom ASM Dev Setup
Reviving the Neo Geo: My Custom ASM Dev Setup

J'ai mal à la tête, mes yeux me brûlent.

Mais maintenant, grâce à tout ça, c'est beaucoup plus facile de chercher des sprites dans la CROM : tu connais la palette exacte utilisée, il te suffit d'indiquer la palette que tu veux, et les sprites deviennent facilement reconnaissables.

On peut charger toutes les palettes directement depuis le dump.

On peut aussi lancer le jeu avec le système de trace et de sauvegarde de dump depuis l'application.

--------------------------------------

My head hurts, my eyes are burning.

But now, thanks to all this, it's a lot easier to hunt for sprites in the CROM: you know the exact palette in use, you just set the palette you want, and the sprites become easy to spot.

You can load all the palettes directly from the dump.

You can also launch the game with the trace and dump-saving system straight from the app.

 
 
Reviving the Neo Geo: My Custom ASM Dev Setup

Et au final, l'identification m'a permis de faire mon sine scroll text depuis mon setup de dev, avec MAME, VS Code et VASM pour la compilation.

Je bosse sur des raster bars (vive les interruptions), des starfields avec des sprites d'AOF, l'affichage de personnages, et plein d'autres trucs.

Le but est de sortir une demo à l'ancienne l'année prochaine, et peut-être, pourquoi pas, un jeu... On m'a déjà proposé, mais je n'étais pas prêt.

Pourquoi faire ça en 2026, alors que la console a plus de 30 ans ??? Et pourquoi pas ? Il y en a bien qui font une réédition de la console avec un nouveau hardware, 30 ans après, et apparemment les gens sont super hypés.

--------------------------------------------------

And in the end, that identification work let me build my sine scroll text right from my dev setup, with MAME, VS Code, and VASM for compiling.

I'm working on raster bars (long live interrupts), starfields with AOF sprites, character display, and plenty of other stuff.

The goal is to release an old-school demo next year, and maybe — why not — a game one day... I've already had an offer, but I wasn't ready.

Why do this in 2026, when the console is over 30 years old??? Well, why not? Plenty of people are releasing reissues of the console with new hardware, 30 years later, and apparently people are super hyped about it.

Reviving the Neo Geo: My Custom ASM Dev Setup
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
N
Bravo pour le boulot monstre !<br /> Nico
Répondre