Autorenarchiv: christian

Tamagotchi ROM Reverse Engineering: Die Mechanik hinter der Evolution

Das erste Tamagotchi kennt sechs erwachsene Formen und eine Geheimfigur. Welche Form sich entwickelt, hängt von der Pflege ab – zumindest laut den unzähligen Anleitungen im Netz, die sich bei den genauen Bedingungen allerdings regelmäßig widersprechen.

Um Licht ins Dunkel zu bringen, habe ich das Original-ROM in einem Emulator ausgeführt und den Arbeitsspeicher direkt analysiert. Das Ergebnis: Das Spiel zählt im Hintergrund lediglich zwei spezifische Variablen. Ausgerechnet der Disziplin-Balken, um den sich fast alle Online-Guides drehen, spielt für die Verzweigung überhaupt keine Rolle.

Der vollständige Code steht auf GitHub bereit: github.com/Sagestum/tamagotchi-carebot

Das Projekt ist in Zusammenarbeit mit dem KI-Programmierassistenten Claude Code entstanden: Claude hat die Experimente entworfen sowie ausgewertet, während ich die Fragestellungen vorgegeben und die historischen Quellen beigesteuert habe.

Wie es anfing

Die eigentliche Emulation gibt es schon: TamaLIB von Jean-Christophe Rona bildet den Prozessor nach und ist bewusst von jeder Hardware unabhängig. Darum herum ist ein serverseitiger C-Wrapper entstanden, der das Ur-Tamagotchi kontinuierlich im Hintergrund weiterrechnen lässt. Über eine kleine Web-Schnittstelle lässt sich der Zustand im Browser betrachten und steuern. Der entscheidende Baustein für die Untersuchung war jedoch ein integrierter Memory-Inspector: Er erlaubt es, während der laufenden Simulation direkt in den 4-Bit-Arbeitsspeicher des Epson-Prozessors zu schauen und Variablen in Echtzeit zu tracken.

  • eine dünne C-Hülle, die die ROM lädt, eine gewünschte Zahl Prozessortakte rechnet und Display, Ton und Speicher herausgibt,
  • ein Python-Server ohne weitere Abhängigkeiten, in dem das Tier lebt,
  • eine Weboberfläche mit dem Ei, den drei Tasten und dem Display.
Die Oberfläche im Browser
Die Oberfläche im Browser

Weil der Emulator nicht auf die echte Zeit warten muss, lässt sich das Tempo hochdrehen: im Server bis etwa 2600-fach. Ein Tamagotchi-Tag dauert dann eine gute halbe Minute. Das ist die Grundlage für alles Weitere.

Der Care-Bot

Ein Tamagotchi will alle paar Stunden etwas – als Baby sogar alle paar Minuten. Also bekam es einen Aufpasser: den Care-Bot. Er liest Hunger, Glück und Häufchen direkt aus dem emulierten Arbeitsspeicher ab, erkennt Krankheit, Schlaf oder Tod an den Mustern auf dem Display und drückt dann genau dieselben drei Tasten wie ein Mensch: A wählt ein Icon, B bestätigt, C bricht ab. Selbst das Stellen der Uhr und das nächtliche Lichtausschalten übernimmt er.

Dafür mussten wir zuerst herausfinden, wo im Speicher was steht. Das ging mit klassischer Handarbeit und Geduld: Füttern und nachsehen, welche Zelle sich um 4 erhöht; warten und beobachten, welche fällt.

Die Frage: Was bestimmt den Charakter?

Nach dem ersten Langzeittest saß da plötzlich ein Tier, das ich überhaupt nicht eingeplant hatte. Ich wollte die Evolution gezielt steuern können. Sämtliche Online-Guides sprechen zwar von „Pflegefehlern“ und dem Disziplin-Balken, widersprechen sich bei den exakten Schwellenwerten aber gewaltig. Zur Geheimfigur hält sich hartnäckig die Behauptung, ein voller Disziplin-Balken sei Pflicht.

Statt weiter Anleitungen zu vergleichen, haben wir direkt die ROM gefragt.

Vorgehen

Erster Schritt: Sieben Leben. Sieben Tamagotchis liefen parallel im Zeitraffer, jedes mit anderer PfleErster Schritt: Sieben Leben

Sieben Tamagotchis liefen parallel im Zeitraffer – jedes mit einer anderen Pflegestrategie: fehlerfrei, komplett ohne Schimpfen, mit absichtlich ignoriertem Hunger, mit vernachlässigtem Glück oder mit Licht, das nachts brennen gelassen wurde. Alle fünf emulierten Sekunden haben wir den gesamten Arbeitsspeicher (640 Zellen zu je 4 Bit) mit dem vorherigen Stand verglichen und jede Änderung protokolliert.

Die meisten Speicherzellen ändern sich ständig. Interessant sind jedoch jene, die sich in einem Leben nur ein Dutzend Mal verändern – und zwar in den vernachlässigten Leben, nicht aber im fehlerfreien. So fielen zwei Zähler auf:

  • 0x42 (Pflegefehler): Zählt hoch, wenn ein Ruf wegen Hunger oder Langeweile etwa 15 Minuten lang unbeantwortet bleibt oder das Licht beim Schlafen 65 Minuten an bleibt.
  • 0x51 (Verpasste Erziehung): Zählt hoch, wenn das Tier ohne ersichtlichen Grund ruft und 15 Minuten lang nicht geschimpft wird.
  • 0x43 (Disziplin-Balken): Speichert direkt den Wert für die Statusanzeige und steigt um 4 Punkte pro Schimpfen.

Zweiter Schritt: Alle Kombinationen

Reines Beobachten zeigt nur, welche Ereignisse zusammen auftreten. Um herauszufinden, was die ROM wirklich für die Transformation auswertet, haben wir einen Spielstand kurz vor der Verwandlung geladen, die Zähler manuell im RAM manipuliert und das Ergebnis beobachtet.

Das haben wir im Zeitraffer durchgespielt: für alle 16 × 16 Kombinationen der beiden Zähler, für das Kind sowie für jede Art von Teenager – und das zusätzlich mit variierenden Werten für den Disziplin-Balken (0x43). Im Zeitraffer dauert diese automatisierte Testreihe nur wenige Minuten.

Ergebnis

Es zählen nur die beiden Zähler. Beide laufen ab der Kind-Stufe, gehen nur aufwärts und werden nie zurückgesetzt. Der Disziplin-Balken ändert an keiner Verwandlung etwas.

VerwandlungPflegefehlerverpasste Schimpf-Rufewird zu
Marutchi (Kind)0–2egalTamatchi
ab 3egalKuchitamatchi
Tamatchi0–20Mametchi
0–21Ginjirotchi
0–2ab 2Maskutchi
ab 30–1Kuchipatchi
ab 32–3Nyorotchi
ab 3ab 4Tarakotchi
Kuchitamatchiegal0–1Kuchipatchi
egal2Nyorotchi
egalab 3Tarakotchi

Dazu kommt eine Besonderheit. Hat schon das Kind drei oder mehr Schimpf-Rufe verpasst, merkt sich die ROM das in einer weiteren Zelle (0x50), und der Teenager ist von einer zweiten Art. Er sieht gleich aus, hat aber andere Grenzen:

VerwandlungPflegefehlerverpasste Schimpf-Rufewird zu
Tamatchi, zweite Art0–3ab 2Maskutchi, vier Tage später Oyajitchi
ab 4bis 7Nyorotchi
ab 4ab 8Tarakotchi
Kuchitamatchi, zweite Artegalbis 5Nyorotchi
egalab 6Tarakotchi

Die Entwicklungsstufen

Die Bilder stammen direkt vom emulierten Display, 32 × 16 Pixel.

Was davon dem Netz widerspricht

Der Disziplin-Balken entscheidet nicht. Die bekannte Faustregel – „100 % Disziplin ergibt Mametchi, 75 % Ginjirotchi, 50 % oder weniger Maskutchi“ – beschreibt das Resultat im Alltag zwar grob, greift aber technisch daneben. Wer keinen Schimpf-Ruf verpasst, hat am Ende sowohl einen vollen Balken als auch null verpasste Rufe. Die ROM wertet jedoch ausschließlich die verpassten Rufe aus. Manipuliert man den Disziplin-Balken manuell im Speicher, hat das keinerlei Einfluss auf die Entwicklung.

Die Grenze zum Kuchitamatchi liegt bei drei Pflegefehlern, nicht bei zwei.

Die Geheimfigur braucht keinen vollen Balken. Die Geheimfigur braucht keineswegs einen vollen Disziplin-Balken. Oyajitchi entsteht immer aus einem Maskutchi, aber nur dann, wenn dessen Tamatchi bereits von der zweiten Art war (also schon im Kindesalter mindestens drei Schimpf-Rufe verpasst hatte). Entschieden ist das Schicksal somit bereits bei der Verwandlung zum Teenager: Dieser spezielle Maskutchi trägt in Speicherzelle 0x50 eine 6, während alle anderen Erwachsenen dort eine 15 haben. Was man danach tut, spielte in den Testreihen keine Rolle mehr: Sowohl mit als auch ohne Schimpfen wandelte er sich nach vier Tagen zu Oyajitchi. Ein Erfahrungsbericht aus der Community von jemandem, der dies mit elf echten Geräten durchprobiert hat, deckt sich exakt mit dieser RAM-Logik.

Nebenbefunde

  • Im Baby-Alter zählt nichts. Die ersten 65 Minuten kann man das Tier ignorieren, ohne dass ein Zähler steigt.
  • Das Spiel ist entschieden, bevor man drückt. Beim Spiel „links oder rechts“ steht in 0x84 schon vor dem Tastendruck, ob die Runde gewonnen wird. Das Tier dreht sich danach passend: bei „gewonnen“ in die gewählte Richtung, sonst in die andere. 40 Runden, jede aus demselben Spielstand mit beiden Tasten und fünf Wartezeiten wiederholt, gingen immer gleich aus.
  • Schimpfen ohne Anlass bewirkt nichts, auch nicht während eines Hunger-Rufs.
  • Ein Ei schlüpft erst, wenn die Uhr gestellt ist.
  • Der Bot hatte selbst einen Fehler. Während eines Schimpf-Rufs verweigert das Tier Futter und Spiel. Der erste Bot versuchte in dieser Zeit zu füttern, wenn der Hunger gerade niedrig war, der Ruf verstrich, und der Zähler stieg. So kam das Tier zustande, das ich nicht bestellt hatte: ein Maskutchi, aus dem Oyajitchi wurde.
  • Lebensdauer. Bei guter Pflege nach Erreichen der Form, je ein Lauf im Zeitraffer, in Tagen seit dem Schlüpfen: Oyajitchi 24, Mametchi 20, Ginjirotchi 16, Maskutchi 16, Kuchipatchi 8, Tarakotchi 7, Nyorotchi 5. Nyorotchi starb gut einen Tag nach der Verwandlung, trotz Medizin.

Ein Ziel wählen

Mit der gewonnenen Erkenntnis lässt sich das Wachstum nun gezielt steuern. Eine interaktive Übersicht zeigt den gesamten Stammbaum: die aktuelle Position, das zu erwartende Ergebnis bei ab jetzt fehlerfreier Pflege sowie den Pfad zu einem frei wählbaren Wunsch-Charakter.

Der Care-Bot berechnet dafür die exakte Anzahl an nötigen Pflegefehlern und verpassten Rufen, führt diese punktgenau herbei und pflegt das Tamagotchi ansonsten makellos. Da die internen Zähler im RAM nur steigen und nicht zurückgesetzt werden können, werden unerreichbare Entwicklungszweige im Stammbaum automatisch ausgegraut.

Der Wachstumsbaum mit gewähltem Ziel
Der Wachstumsbaum mit gewähltem Ziel

Im Zeitraffer vom Ei an hat der Bot jedes der sieben Ziele erreicht.

Die RAM-Adressen

Jede Adresse hält 4 Bit.

AdresseBedeutung
0x10/0x11Uhr Sekunden (BCD, niedrig/hoch)
0x12/0x13Uhr Minuten (BCD, niedrig/hoch)
0x14/0x15Uhr Stunden (binär, hoch × 16 + niedrig); ein frisches Ei zeigt 32 = nicht gestellt
0x2D8, solange das Ruf-Icon leuchtet
0x40Hunger 0–15; Herzen = (Wert + 1) / 4, abgerundet; Mahlzeit +4; fällt in Schritten von 4
0x41Glück 0–15, gleiche Rechnung; Snack oder gewonnenes Spiel +4
0x42Pflegefehler 0–15
0x43Disziplin-Balken, +4 pro Schimpfen bei einem Schimpf-Ruf; bei jeder Verwandlung neu gesetzt
0x46/0x47Gewicht (BCD)
0x49wird 1, wenn das Tier krank war, bei der Verwandlung wieder 0 (nicht weiter geprüft)
0x4BLicht: 15 an, 0 aus
0x4DAnzahl Häufchen
0x50Unterart: 1 Kind; Tamatchi 2 oder 3; Kuchitamatchi 4 oder 5; Erwachsene 15, nur der Maskutchi, der Oyajitchi wird, hat 6
0x51verpasste Schimpf-Rufe 0–15
0x54zählt bei jedem Aufwachen hoch (vermutlich das Alter, nicht geprüft)
0x5DCharakter: 0 Ei oder tot, 1 Babytchi, 2 Marutchi, 3 Tamatchi, 4 Kuchitamatchi, 5 Mametchi, 6 Ginjirotchi, 7 Maskutchi, 8 Kuchipatchi, 9 Nyorotchi, 10 Tarakotchi, 11 Oyajitchi
0x84im Spiel: ungleich 0, wenn die kommende Runde gewonnen wird

Was das nicht zeigt

Untersucht ist ein einziger ROM-Dump, tama.b mit der SHA-1-Prüfsumme 4b4979cf92dc9d2fb6d7295a38f209f3da144f72. Es gab mehrere Fassungen des Geräts, und die Neuauflage von 2018 verhält sich nach Berichten anders. Die Tabellen gelten für diese ROM.

Die Verwandlungstabellen beruhen auf dem vollen Raster aller Zählerstände. Schwächer belegt sind die Lebensdauern (ein Lauf je Form) und die Aussage zur Geheimfigur (zwei Läufe je Fall). Ob 0x54 wirklich das Alter aus dem Status-Bild ist, haben wir nicht nachgeprüft.

Zum Nachmachen

Der Code steht unter der GPL-2.0, wie TamaLIB. Die ROM liegt nicht bei, sie ist urheberrechtlich geschützt. Beim ersten Start fragt der Server danach und nimmt nur die Datei mit der passenden Prüfsumme an. Die Experimente, aus denen die Tabellen stammen, liegen im Ordner lab/ und lassen sich wiederholen.

https://github.com/Sagestum/tamagotchi-carebot