C64 Assembler Programmierung – Text Ein- und Ausgabe
Wie kann man am Commodore 64 mit Assemblers Text ein- und ausgeben? Wie lässt sich mit Text optimal arbeiten, welche Möglichkeiten habe ich als Programmierer die Ausgabe grafisch ansprechend zu gestalten?
C64 Assembler Programmierung – Text Ein- und Ausgabe
Nach den vielen theoretischen Beiträgen wird es nun Zeit für die Praxis. Wenn ich an meine Ausbildung als Programmierer zurückerinnere, dann bestand das erste Jahr fast ausschließlich aus Text Ein- und Ausgabe.
Text Ausgabe
Ein einfaches „Hallo Welt“ Beispiel mit einer Text Ausgabe habe ich in meinem GitHub Projekt verfügbar. Ein Text ist nichts anderes als ein Datensatz mit einer bestimmten Länge, der irgendwo im Speicher liegt. Zu diesem Zweck erstellt man eine Sprungmarke am Ende der Quelldatei mit den Daten. Daten kann man im CBM Studio mit Datentypen auszeichnen, so definiert man den gewünschten Text mit ptext. Nach dem Text soll noch ein Zeilensprung passieren, diesen fügen wir noch samt String Ende (binät 0) als byte ein. 13 ist dabei laut PETSCII Zeichentabelle ein Return.
Was macht eigentlich der Code? Ich bediene mich hier eines fiesen Tricks und zwar ruft der Code eine BASIC Funktion auf die an der Adresse $AB1E steht. Das ist die Print Funktion, der man mit der Adresse der Daten den String als Parameter übergibt. Der JMP Befehl führt diese BASIC Funktion mit dem Parameter „Hello World“ unendlich oft aus. Ohne eine BASIC Funktion zu verwenden geht das natürlich auch, dazu habe ich ein modifiziertes Hello World Programm erstellt:
Mit line und column definieren wir eine Cursorposition ab der ein Text ausgegeben werden soll. Ich setze das X-Register für den Index auf 0 und gehe in einer Schleife alle Zeichen des Datensatz HELLOWORLD durch. BEQ bricht ab, wenn 0 erreicht wird. Mit dem Befehl an Adresse $FFD2 wird das aktuell im Accumulator stehende Symbol an der Cursorposition ausgegeben. Das ist zwar wieder eine fertige Funktion, dieses Mal aber nicht von BASIC sondern vom KERNAL ROM. Eine Liste der Kernal Rom Funktionen.
Text Eingabe
Die Eingabe von Text funktioniert ähnlich der Ausgabe. Auch dafür gibt es eine KERNAL ROM Funktion. In meinem Beispiel (das Beispiel ist originär nicht von mir: Quelle) verwende ich diese um Zeichen von einem Command Prompt zu lesen. Es gibt eine Filterung, so dass nur Hexadezimale Symbole (0-9 und A-F) erlaubt sind. Das in Hexadezimal abgebildete Byte wird im Programm in Binärcode ausgegeben.
Der interessante Bereich ist die Funktion nach dem SCANKBD Label. Es wird die Funktion an Position $FF9F um den aktuellen Status des Keyboards in den entsprechenden Zeichenbuffer zu laden. Mit $FFE4 liest man das Byte der Standardeingabe (dem Keyboard) in den Akkumulator. Von da weg kann man nun jegliche Checks des Inputs machen. Beispielsweise eine Taste definieren, die die Endlosschleife der Eingabe abbricht (hier: Q) oder Filter die nicht gültige Codes ignoriert (hier: es werden nur 0-9 und A-F verarbeitet).
Text schöner zeichnen
Der C64 hat unterschiedliche Grafikmodi, wir beschäftigen uns nun erstmal mit dem „Textmodus“. Streng genommen ist der „Textmodus“ keiner der Grafikmodi, dafür gibt es den Textmodus gleich in 3 Ausführungen:
- Standard
Das ist der Standard Textmodus mit 25 Zeilen zu je 40 Zeichen. Es gibt einen Zeichensatz aus 128 Zeichen (+128 inverse Zeichen) bei dem jedes Zeichen aus 8×8 Pixel besteht. Es gibt zwei mögliche Farben. Gesetzte Bits im 8×8 Raster haben die aktuell definierte Vordergrundfarbe, nicht gesetzte Bits die Hintergrundfarbe.
- Multicolor
Setzt man im Grafikspeicher $D016 Bit 4, dann wird der Multicolor Modus aktiv, bei dem pro 8×8 Pixel Zeichen 4 unterschiedliche Farben möglich werden. Die zwei zusätzliche Farben muss man mit einer reduzierten Auflösung bezahlen, man nun nur noch 4×8 Pixel setzen, ein Pixel besteht in der Zeile nun aus 2 Pixeln die den selben Zustand haben. Aktiviert man diesen Modus mit POKE 53270,PEEK(53270) OR 16, dann sieht das so aus:
- Erweitert
Beim erweiterten Modus kann man die Anzahl der möglichen Hintergrundfarben auf 4 erhöhen. Das wir dadurch möglich, dass nun nur noch 64 verschiedene Zeichen möglich sind. Aus dem 256 Zeichen (64 klein, 64 groß und für beide jeweils mit inversen Farben) werden nun 64 Zeichen mit Hintergrundfarbe 1 und die selben 64 Zeichen mit den jeweils 3 anderen Hintergrundfarben.
Verwirrt? Der C64 hat nur wenig Speicher, noch weniger Videospeicher. Aus diesem Grund sind die Entwickler kreativ gewesen und haben unterschiedliche Modi entwickelt die die paar Byte unterschiedlich nutzen. Mal werden mehr Farben dargestellt, mal wieder eine höhere Auflösung. Generell gilt die Regel: je mehr Farben gleichzeitig möglich, desto niedriger wird die Auflösung. Je nach gesetzten Modus gibt es bestimmte Adressen im Speicher die die jeweilige Farbe enthalten. Diese muss man nur noch mit eine der 16 zur Verfügung stehenden füllen.
Welcher Textmodus darf es sein?
Anders als bei anderen Umgebungen muss man bei dem Retrosystem viel mehr Konzeptionsarbeit leisten. Man muss erstens die verfügbaren Modi kennen, zum anderen muss man sich auf einen festlegen. Erst dann lässt sich das Interface und die Interaktion mit dem Benutzer planen. Mit viel Liebe zum Detail lassen sich trotz der massiven Limits auf dem C64 „schöne“ Masken basteln.
Fazit
Ich habe in diesem Tutorial gezeigt wie man in C64 Assembler mit Text Ein- und Ausgabe umgeht. Wichtiges Fazit dazu ist das Kernal Rom, welches nützliche Funktionen dazu bereitstellt. Im Anschluss gabs noch eine kurze Einführung zu den zur Verfügung stehenden Modi, mit denen man Text unterschiedlich darstellen kann.