6502 Assembler Programmierung

Vor einigen Tagen kam mein Sohn im Gespräch auf das Thema Programmierung . Das ganze Gespräch will ich hier nicht wiedergeben, aber irgendwann sind wir bei dem legendären Send More Money Problem gelandet. Kennt das jemand?

Ein amerikanischer Student macht eine Weltreise. Als er gerade Europa besichtigt, geht ihm das Geld aus. Er schickt eine Postkarte nach Hause mit dem folgenden Inhalt:


 SEND
+MORE
-----
MONEY

Wenn man jeden Buchstaben durch eine Ziffer ersetzt, erhält man den Betrag, den sich der Student wünscht.

Diese Art von Symbolrätsel nennt man Alphametik. Dabei werden unterschiedliche Buchstaben durch unterschiedliche Ziffern so ersetzt, dass die mathematische Operation sinnvoll ist. Heutzutage findet man den richtigen Geldbetrag natürlich im Internet. (Schaut nicht nach 😉 Die Rechnung lautet 9567 + 1085 = 10652.)

Mein Sohn wollte wissen, wie man das Rätsel mit dem Computer lösen kann. Ende der 1980er Jahre habe ich das mal in 6502 (bzw. 6510) Assembler gelöst. Der 6502 war der Mikroprozessor, der im Apple II+ und später in modifizierter Form als 6510 im Commodore C-64 (von dem hatte ich damals 3, einer davon funktioniert auf jeden Fall heute noch) eingebaut war.

Natürlich konnte man auch diese Computer bereits in höheren Programmiersprachen programmieren. Ich entschied mich damals aus Zeitgründen für Assembler, da ich im ersten Ansatz einen ziemlich dummen Algorithmus umsetzen wollte, nämlich das stumpfsinnige Durchprobieren aller Möglichkeiten. Um die Laufzeiten möglichst niedrig zu halten, wollte ich direkt in Maschinensprache/Assembler programmieren.

Mich würde einmal interessieren, ob es da draußen in der weiten Welt noch jemanden gibt, der mal in 6502-Assembler programmiert hat und möglichweise den folgenden Code noch halbwegs versteht? Würde mich über eure Kommentare unterhalb des Artikels freuen!

Meine Lösung sieht als Hex-Dump folgendermaßen aus (per Mausklick gibt es eine größere Darstellung):

SW-Dump des Send More Money Programms

Send More Money: schwer lesbares Programm in 6510 Maschinencode

Das ist ein Originalausdruck mit Nadeln auf Rollenpapier (2 Streifen nebeneinander auf ein Blatt A4 geklebt.).

Wer genau hinsieht, entdeckt einen kleinen Rechtschreibfehler: ich habe das Problem damals immer „Sent More Money“ genannt, obwohl es natürlich „Send More Money“ heißen muss.

Ein bißchen leichter lesbar ist das Programm in Assembler-Code:

Screenschot des des Send More Money Disassemblings - Seite 1

Disassembling des Send More Money Programms – Seite 1

Screenshot des Send More Money Disassemblings - Seite 2

Disassembling des Send More Money Programms – Seite 2

Screenschot des Send More Money Disassemblings - Seite 3

Disassembling des Send More Money Programms – Seite 3

Zugegeben: besonders elegant war das Programm nicht, aber es hat alle Lösungen ausgespuckt:

Alle 25 Lösungen des Send More Money Problems als Bildschirmabschrift

Alle vom Bildschirm abgeschriebenen Lösungen des Send More Money Problems

Letztendlich korrekt ist hierbei nur die letzte Lösung, denn eine 0 als erste Ziffer ist für Alphametiken nicht zugelassen.

Natürlich zeigt auch das Disassembling oben nicht, wie ich das Programm entwickelt habe. Üblicherweise arbeitet man nicht mit festen Speicheradressen für Variablen und Unterprogramme, sondern mit Symbolen. Ein Unterprogramm hat zum Beispiel bei der Anzeige jeder neuen Lösung auf dem Bildschirm zusätzlich ein akustisches Signal ausgegeben. Das sah dann im Original so aus:

Unterprogramm in Assembler zur Ausgabe eines akustischen Signals

Unterprogramm AKUSIG in 6510 Assembler – in meiner Original-Handschrift

Aber auch das war nicht der Anfang. 🙂 Davor habe ich für jedes Unterprogramm einen Programmablaufplan entwickelt. Alles noch handgezeichnet:

Handgezeichneter Programmablaufplan des UP AKUSIG

Das kann aber jetzt dann jeder nachvollziehen, oder?

1989 habe ich das ganze Programm auch noch mal in Turbo-Pascal programmiert. Aber darauf gehe ich in diesem Artikel nicht weiter ein.

Sehr schön ist das Problem und ein progammtechnischer Ansatz in dem Artikel Von Professor Urban dargestellt.

Für alle, die nun – wie ich – wieder Lust auf 6502-Assembler bekommen haben, habe ich noch eine Buch-Empfehlung: Programmierung des 6502 von Rodnay Zaks.

Das Buch steht bei mir seit 1983 im IT-Bücherregal und ist sowohl für Einsteiger als auch für Fortgeschrittene wärmstens zu empfehlen.


Auch wenn heute kaum noch jemand direkt in Assembler programmiert, so macht es doch Spaß, sich auf diese Tiefe hinabzubegeben und kleinere Probleme damit zu lösen.

(Vielleicht, mein Sohn, ist das ja auch für dich ein Anreiz!)

Du kannst die Kommentare als RSS 2.0-Feed abonnieren. Du kannst selber einen Kommentar schreiben, oder von deiner eigenen Website einen Trackback setzen.

Dein Kommentar