Link’s Awakening disassembly progress report – week 1

This article is part of an ongoing “Disassembling Link’s Awakening” series, where I attempt to gain some understanding on how special effects where implemented in this game.

This week I found some time to work again of this Zelda: Link’s Awakening disassembly project. And it got quite a few improvements done!

Export all the graphics

The various graphics used in the game are stored in the ROM as binary files. Until recently, the binary sections containing the pictures weren’t even entirely identified.

This week, the remaining graphic banks were all mapped out, and all of them are now exported as PNG files. When compiling the game, the PNG files are converted back to their original 2bpp format, and inserted into the final binary.

For now, most of the pictures are exported as large sheets containing multiple graphical elements. For instance, this is a portion of the graphics sheet for the dungeons graphics.

A portion of Link’s Awakening dungeons graphics

Of course, it is possible to split these elements into individual items. But for now only a minority some background tiles and sprites are split up individually.

Link’s Awakening title Link’s Awakening palm trees Link’s Awakening sea foam Link’s Awakening Windfish egg

There is still work to do there.

You’ll also notice that most of the graphics are actually stored twice. Now remember that Zelda DX is actually a port on the Game Boy Color of the original “Zelda:Link’s Awakening”, which was initially released on the original monochrome Game Boy. However the remake could still run on the original Game Boy.

So it seems that during the development of the Game Boy Color remake, Nintendo’s developers duplicated all the graphics. This allowed them to tweak the graphics for the color edition—while leaving the original grayscale elements intact when running on a Game Boy or Game Boy Pocket.

You can see below some slight differences of graphics between the original graphics and colored ones.

Link’s Awakening overworld tiles

N.B. All graphics, colored or not, are stored as grayscale images. Color is applied at runtime, using external palette data. This is what allows an identical piece of graphics to get various colors, depending on the context it is used.

Although the gameplay and story of the remake were the same than in the original game, some elements exclusive to the Game Boy Color were added. A notable one is the appearance of a photographer, which will sometime appear during the game to take a picture of Link’s adventures.

Good news: these pictures have been extracted too! However they are often compressed in some way. Space on a cartridge isn’t cheap, and was to be used with precaution. Also the photography scenes sometime contain moving parts and dynamic elements—which had to be encoded into the picture somehow.

This is why, although some of these pictures are recognizable, many of them look like garbled content, or a mixture of different items.

First photo you obtain in the game

Memory locations now show in the debugger

Disassembling the game is mostly about making sense of a bunch of machine code. And one of the most used technique is to reconstruct the labels and comments of the source code.

One good thing about labeling the different parts of the disassembled code is that they’ll get exported into debug symbols. These debug symbols can be read by emulators, debuggers, and other different tools to give meaning to the game code. The more we label, the more we can use these labels to progress further.

But until now, only function labels were exported into debug symbols. But how about the memory location labels, which indicate how are used some specific part of the memory, and are almost as important as function labels? Well, due to the way they were labeled in the disassembly, memory labels were not exported at all.

This week the declaration of the memory labels was rewritten, so that they get exported into the debug symbols. Which means for instance that memory locations now show up in the debugger! This will definitely make reverse-engineering easier in the future.

BGB debugger without the memory location labels BGB debugger with the memory location labels

Awake decompiler

A few years ago, Github user @devdri started working on a tool to help the Game Boy games disassembling efforts : a custom Game Boy decompiler named awake.

The idea is to present the game code into a nice user interface, which allows browsing the code and jumping back and forth easily. It also features many heuristics to make sense of the assembly code: detecting the start and end of procedures, exposing jump tables, and displaying the assembly code as high-level C-style expressions.

Although this project hasn’t been active for the past few years, it seems it could be quite useful on its own. A few missing features would be a nice improvement to this tool though.

So this week I added support for labeling functions and memory locations from the UI. Support for importing debug symbols is also coming soon. Hopefully this will make awake a worthwhile tool for understanding the disassembled code.

Screenshot of the awake Game Boy disassembler

Disassembling guides

It’s not easy to jump into a new project. How is the game even compiled? Do I need a custom toolchain? What are the tools used to explore the code and graphics?

Fortunately some guides are now included in the project README file. You’ll get a quick overview on how to use a debugger to label code, and how the scripts used to extract the graphics data work.

What’s next

For the next weeks I would like to:

And we’ll see how it goes.

🚀 Partager les succès

Si vous travaillez sur un projet dans une petite équipe, il est sans doute facile de suivre ce qui se passe en ce moment. Qui fait quoi, quels sont les sujets du moment, quels sont les dernières modifications visibles et les dernières étapes effectués.

Mais au fur et à mesure que l’équipe grandit, ce sens de « qu’est-ce qui se passe en ce moment » devient plus difficile à appréhender. Et on découvre un jour qu’on n’était pas au courant de telle nouveauté, de tel changement dans l’équipe d’à côté, ou de tel recrutement. Ça a été annoncé, sûrement – mais peut-être pas aux bonnes personnes, ou au bon moment.

Chez Capitaine Train, on avait mis au point une petite convention simple pour rendre les succès plus visible.

“There are things that can give you wings, but I’ll give you a rocket!”

Pour partager les succès, pas besoin d’en faire des caisses. Ce qu’on faisait, c’est simplement de poster un message dans un canal public sur le chat interne (Slack, en l’occurrence).

Une seule règle : mettre un emoji :rocket: 🚀 au début du message.

C’est tout.

Pas besoin d’être bien long ; il s’agit juste de communiquer aux autres une nouveauté dont vous êtes heureux ou fier :

Comme c’est très léger, ça ne prend pas beaucoup de temps à écrire.
Comme c’est rapide, on hésite pas à annoncer la petite nouveauté dont on est fier, même si ce n’est qu’un petit détail.
Comme c’est juste une convention, ça ne rajoute pas un processus de plus.
Et comme c’est sur Slack, ça permet de recueillir les félicitations et les applaudissements (et c’est important, les applaudissements).

Composer les outils pour aller plus loin

La beauté des conventions, c’est que ça active plein de possibilités. On peut s’en servir pour faire plein de belles choses en plus.

Par exemple, pour les changements qui s’y prêtent, on peut ajouter une image à son annonce : une capture d’écran, la photo de la personne recrutée, ou un gif animé qui présente une nouvelle fonctionnalité.

Pour être notifié de ces annonces spécifiquement, il est possible de rajouter :rocket: à la liste des mots-clefs qui déclenchent une notification. Ça peut permettre de mieux filtrer le bruit, et de n’être notifié que de ce qui est important.

Enfin, il est assez simple de générer une newsletter interne, mensuelle ou bimensuelle, à partir de ces annonces. Une simple recherche sur 🚀 renverra tous les messages à inclure dans la newsletter. Il est même possible d’automatiser le processus : coder un petit bot pour Slack qui recopie les :rockets: dans une planche Trello ; et un autre bot qui, une fois les annonces mises au propre, envoie automatiquement une newsletter avec le contenu de la planche.

Brève histoire de la révolution technologique

Lu dans Espejos, d’Eduardo Galeano (2008) :

Croissez et multipliez-vous, avons nous dit, et les machines crûrent et se multiplièrent.
Elles nous avaient promis qu’elles travailleraient pour nous.
Aujourd’hui nous travaillons pour elles.
Les machines que nous avons inventées pour multiplier la nourriture multiplient la faim.
Les armes que nous avons inventées pour nous défendre nous tuent.
Les autos que nous avons inventées pour nous déplacer nous paralysent.
Les villes que nous avons inventées pour nous rencontrer nous isolent.
Les grands médias, que nous avons inventés pour communiquer entre nous, ne nous écoutent ni ne nous voient.
Nous sommes machines de nos machines.
Elles plaident leur innocence.
Elles ont raison.

L’ajout d’une phrase sur Internet et la surveillance est laissé à l’exercice du lecteur.

Pour des prises de décisions ouvertes

Je découvre ce bel article de John Ousterhout au sujet de son processus de prise de décisions ouvertes (en anglais) :

The open decision-making approach includes elements that many people find counterintuitive or contradictory to their “upbringing”:

  • Consensus is easier to achieve than you might think.
  • You don’t have to control decisions as much as you think.
  • Encouraging controversy early in the process results in better decisions and less controversy later.

C’est précisément le genre d’articles que je cherchais quand, il y a quelques années, chez Capitaine Train, je me demandais comment formaliser notre processus de prise de décisions. Ça ressemblait à quelque chose de beaucoup plus léger – essentiellement basé sur du consensus, parce qu’on est de grandes personnes, qu’on sait discuter avec passion, et malgré tout s’incliner devant une décision qu’on aurait prise différemment.

En comparaison, John Ousterhout propose aussi un moment de vote formel en plus du consensus. Ça ne me semble pas forcément nécessaire pour des petits groupes – mais en même temps ça peut aider à ne pas avoir seulement l’avis des plus grandes gueules.

Il décrit aussi des étapes de décisions sous la forme « resseré - élargi - reserré » : dégrossir le problème avec un petit nombre de personnes, ensuite le plus vite possible récolter plein d’avis très largement, et finalement décider à nouveau en comité restreint.

Au final, l’enjeu est toujours de prendre une bonne décision, rapidement – mais surtout de la faire accepter par ceux qui vont l’implémenter. Tout ira tellement plus vite si les personnes concernées comprennent et acceptent le choix qui est finalement fait ! Et tellement plus efficace que laisser les gens traîner des pieds pendant des mois.

Frédéric Lordon : le journalisme post-politique

De Frédéric Lordon, Politique post-vérité ou journalisme post-politique ? :

Ce que le journalisme « de combat » contre la post-vérité semble donc radicalement incapable de voir, c’est qu’il est lui-même bien pire : un journalisme de la post-politique — ou plutôt son fantasme. Le journalisme de la congélation définitive des choix fondamentaux, de la délimitation catégorique de l’épure, et forcément in fine du gardiennage du cadre. La frénésie du fact-checking est elle-même le produit dérivé tardif, mais au plus haut point représentatif, du journalisme post-politique, qui règne en fait depuis très longtemps, et dans lequel il n’y a plus rien à discuter, hormis des vérités factuelles. La philosophie spontanée du fact-checking, c’est que le monde n’est qu’une collection de faits et que, non seulement, comme la terre, les faits ne mentent pas, mais qu’ils épuisent tout ce qu’il y a à dire du monde.

Derrière les phrases un peu longues et le ton agacé, l’article entier est une réflexion intéressant sur les rapports du « journalisme post-vérité » et de la fin des idéologies.

De ce que j’en comprends, l’argument est que si tant d’énergie est mise à nous convaincre que rien ne peut plus changer, qu’il faut se plier à la réalité, celle qui reconduit le monde tel qu’il est – n’est-il pas inévitable que les votes finissent par se tourner vers les candidats qui proclament malgré tout la possibilité de faire changer les choses ?