C64 Basic lernen – Hardware
In diesem Betrag gebe ich eine Einführung in die „Manipulation der Hardware“ vom C64 und wie man über PEEK und POKE den Retro Rechner so richtig ausreizen kann. Einmal verstanden gelingt so jedes ambitionierte Projekt.
C64 Basic lernen – Hardware
Im letzten Artikel gab es eine kompakte Einführung in die Programmierung in Basic am Commodore 64. Damit ist es jetzt möglich Text Ein- und Ausgabe zu machen und damit Berechnungen anzustellen. Diese Programme funktionieren so auf allen Heim Computern mit Basic und in leichter Abwandlung auch auf aktueller Hardware in einem Basic Dialekt. Interessant wird es, wenn man Ein- und Ausgaben um die jeweilige zugrunde liegende Hardware erweitert.
PEEK und POKE
Hardware in dem Sinn wird natürlich nicht manipuliert, man kann aber über den Speicher spezifische Funktionen der Hardware nutzen. Über die gezielte Manipulation bestimmter Speicheradresse im 64k großen RAM Speicher lassen sich Werte über die Hardware des Commodore 64 einlesen und verändern. Außerdem kann man so mit externer Hardware wie Datassette, Diskettenlaufwerk oder Drucker kommunizieren. In jedem Fall braucht man mehr Wissen als nur darüber wie man programmiert. Das habe ich bereits in meinem DOS programmieren Tutorial mit der VGA Ausgabe gezeigt. Dort verhält es sich ähnlich! Das klingt nun jetzt vermutlich alles sehr kompliziert, am besten starten wir mit dem bekannten einfachen Beispiel zu dem Thema. Wir manipulieren die angezeigten Farben:
Das Programm hat 3 Zeilen. Ich gebe den aktuellen Wert der RAM Adresse 53280 aus, danach ändere ich diesem im RAM auf 5 und gebe ihn sofort wieder aus. Das erzeugt folgende Ausgabe:
Offenbar war zuerst dort 6 gespeichert, nach der Änderung steht dort wie erwartet 5. Doch was passiert noch? Plötzlich ist der Rahmen grün!
Wie kommt man auf diese Zahlen? Basis ist eine Dokumentation der Speicheradressen. Der Bereich von $D000 bis $D02E gehört dem VIC. Der VIC ist die Grafikeinheit vom C64. Das heißt manipuliert man dort Werte, dann ändert sich die Ausgabe am Bildschirm. Gerade das Thema Grafikausgabe ist sehr komplex, da es unterschiedliche Modi gibt und man dort sehr viel ändern kann. Im Textmodus kann man einige Farben ändern. Die Dokumentation erklärt welche Adresse welchen Wert enthält. An der Adresse $D020 (Dezimal 53280) steht die aktuelle Farbe des Rahmens. Der C64 hat 64 tausend Bytes, dieses eine Byte kontrolliert diese Farbe. Der C64 versteht nur 16 Farben, diese können in 4 Bits abgebildet werden. Da ein Byte aber 8 Bits hat, werden die höheren 4 Bits nicht verwendet, diese sind immer 1. Aus diesem Grund muss man diese ausmaskieren (AND 15 im Code!).
Disco
Im nächsten kurzen Programm setze ich die Farbe basierend auf der Variable. Diese ändere ich in jedem Schleifendurchlauf, sollte der Wert größer 15 sein beginnt man wieder bei 0 (Anmerkung: es gibt nur 16 Farben!). Der Code:
Vom Ergebnis habe ich keinen Screenshot gemacht. Am besten selber probieren. Der Rahmen wird nun in allen Farben flackern. Du wirst erkennen, dass der Bildschirm nicht immer komplett mit einer Farbe gezeichnet wird, sondern dass fast immer der Wechsel von einer zur nächsten Farbe mitten im Bild passiert. Es sind so immer 2-3 Farben gleichzeitig für einen Bruchteil einer Sekunde zu sehen. Was passiert? Der VIC gibt dem Monitor die Information mit welcher Farbe gezeichnet wird. Bevor das Bild aber vollständig gezeichnet worden ist ist der Prozessor schon beim nächsten Durchlauf. Obwohl der C64 nicht mal mit 1 MHz Taktfrequenz läuft ist die Schleife schneller durchlaufen als das Bild gezeichnet werden kann. Und das wird sehr oft pro Sekunde gezeichnet! Was erkennt man?
- Der Prozessor läuft und macht seine Berechnungen
- unabhängig davon zeichnet der Bildschirm dank den Informationen vom VIC das aktuelle Bild
- das aktuelle Bild wird aus den Informationen aus dem RAM Speicher erstellt
- der RAM wir gemeinsam genutzt, der Prozessor kann jederzeit während des Bildaufbaus Daten ändern
Das klingt im ersten Moment nach einer tollen Sache. Wenn man gerne ein Spiel programmieren will ist das aber eines der Herausforderungen. Man sollte Game Loop und Scanline (die aktuell gezeichnete Linie von Pixel am Bildschirm) synchronisieren. Macht man das nicht kommt es zu Artefakten am Bildschirm, meist ein Flackern von Grafiken.
Sing mir ein Lied!
Ok, mit Basic kann man also auch zeichnen. Man kann sogar mehr. Mit Basic kann man alles steuern, was der C64 aufgrund seiner Hardware kann. Neben dem Grafikchip VIC hat der auch einen Soundchip, den SID. Das Thema Soundausgabe ist ähnlich Komplex wie die Grafikausgabe. Ein einfaches Beispiel:
Wer gerne mehr damit machen will findet im Internet genug Grundlagen. Das Thema 8bit SID Musik ist in den letzten Jahren sehr gehyped worden und es entwickeln gefühlt so viele Künstler damit 8bit Musik wie nie zuvor.
Fazit
Das Programmieren am C64 macht erst richtig Spaß, wenn man sich in die Hardware einarbeitet und experimentiert. Gerade bei diesen Beispielen kommt man aber mit BASIC sehr schnell an Grenzen. Insbesondere wenn man Synchron zum Bildaufbau Berechnungen anstellen möchte erkennt man wie langsam BASIC im Vergleich zu Assembler Code ist.