Unlängst habe ich über Möglichkeiten zur Unterscheidung verschiedener Commodore-Rechner geschrieben. Heute geht es darum, diese Informationen zu nutzen, um Programme entwickeln zu können, die sich unterschiedlicher Hardwarebasis anpassen können. Für die weiteren Beschreibungen beschränke ich mich auf die 8-Bit-Rechner mit 40-Zeichen-Darstellung (PET, CBM, P500, C64, Plus4, C128), da ansonsten der Aufwand für die Anpassung der Bildschirmdarstellung zu groß wäre bzw. die Darstellungsmöglichkeiten zu stark einschränken würden.
Unabhängig von später zu behandelnden Sonderfällen, die durch individuelle Eigenheiten oder spezifische Inkompatibilitäten einzelner Rechnertypen ausgelöst werden, gibt es einige Unterscheidungsmerkmale, die alle (oder zumindest mehrere) Rechner betreffen und die im Programm am Besten über das Vorbelegen einer Variable mit einem jeweils systemspezifischen Wert gelöst werden müssen. Ich nenne das jetzt hier einfach mal eine Systemvariable. Was sich hier kompliziert anhört, wirkt in einem Beispiel ganz simpel und verständlich: Anstatt mit POKE 1024,0
im linken oberen Bildschirmeck eines C64 einen Klammeraffen erscheinen zu lassen, verwendet man eine Variable: P=1024
und einen flexiblen POKE-Befehl: POKE P,0
. Durch Anpassen des Werts der Variable P für verschiedene Systeme kann der POKE-Befehl auf allen Rechnern im linken oberen Eck den gewünschten Klammeraffen erzeugen.
Neben dem Basiswert des Bildschirmspeichers könnten auch Werte für I/O-Register als Systemvariable interessant sein, um zum Beispiel die Hintergrund- und Rahmenfarbe festlegen zu können:
Computer | Screen-RAM | Color-RAM | Hintergrundfarbe | Rahmenfarbe |
PET 2001 | 32768 | – | – | – |
CBM 3/4/8001 Series | 32768 | – | – | – |
P 500 / CBM 500 | 53248 | 54272 | 55329 | 55328 |
C 64 / SX 64 | 1024 | 55296 | 53281 | 53280 |
C16 / C116 / Plus 4 | 3072 | 2048 | 65301 | 65305 |
C 128 / C 128 D | 1024 | 55296 | 53281 | 53280 |
Eine weitere Spielwiese ist die Belegung der „Zeropage“. Bei Commodore-Rechnern ist die Besonderheit zu beachten, dass mit dem Begriff Zeropage oft die „erweiterte Zeropage“, also der Bereich bis $03ff (beim C128 sogar bis $12ff), angesprochen wird und nicht nur die Zeropage, wie sie die CPU sieht. Und so soll der Begriff auch hier verstanden werden. Wobei klar sein muss, dass der Begriff „erweiterte Zeropage“ technisch gesehen Unsinn ist. Möglicherweise hat Commodore (oder eigentlich Microsoft) diesen Begriff dadurch provoziert, dass beim ROM-Update vom PET 2001 zu den Rechnern der CBM 3001 Series diverse Kernel- und BASIC-ROM-Variable und -Zeiger aus der Zeropage in den Bereich ab $0200 bis $033a verlegt wurden und umgekehrt. In jedem Fall war ein Begriff für den Gesamtbereich des von Kernel und BASIC benötigten RAM-Speichers erforderlich.
In der (erweiterten) Zeropage finden sich Daten zur zuletzt genutzten Peripherie (Gerätenummer für Nachladeoperationen), zu Tastatureingaben (Tastaturpuffer und Zeiger in den selben), Sprungektoren, z.B. für den IRQ, und vieles mehr. Die nachfolgende Tabelle listet einige dieser Daten in einer synoptischen Darstellung für die hier betrachteten Geräte auf:
Label | PET 2001 | CBM 3/4/8001 | P 500 | C 64 | Plus 4 | C 128 |
FA | 241 | 212 | 159 | 186 | 174 | 186 |
NDX | 525 | 158 | 209 | 198 | 239 | 208 |
STKEY | 521 | 155 | 169 | 145 | 145 | 145 |
KEYD | 527 | 623 | 939 | 631 | 1319 | 842 |
SFDX | 515 | 151 | 205 | 203 | 198 | 212 |
LSTX | 547 | 166 | 225 | 215 | 2038 | 213 |
SHFLAG | 516 | 152 | (224) | 653 | 1347 | 211 |
RPTFLG | – | (228) | – | 650 | 1344 | 2594 |
PNT | 224/225 | 196/197 | 200/201 | 209/210 | 200/201 | 224/225 |
PNTR | 226 | 198 | 203 | 211 | 202 | 236 |
TBLX | 245 | 216 | 202 | 214 | 205 | 235 |
IIRQ | 537/538 | 144/145 | 768/769 | 788/789 | 788/789 | 788/789 |
TBUFFR | 634/826 | 634/826 | (1024) | 828 | 819 | 2816 |
FA: Aktuelle Gerätenummer – Diese Adresse ist relevant für alle Programme, die andere Programmteile nachladen. So können Kassetten- und Diskversionen unterschieden werden und das Nachladen erfolgt immer vom richtigen Laufwerk.
NDX: Anzahl der Zeichen im Tastaturpuffer (Warteschlange) – Durch Beschreiben mit dem Wert Null (0) wird der Tastaturpuffer „gelöscht“.
KEYD: Tastaturpuffer – In der Regel umfasst der Tastaturpuffer 10 Zeichen.
STKEY: Flag für STOP-Taste – Bei einigen Rechnern kann hier auch die RVS-Taste abgefragt werden. Prinzipiell stehen die 8 Bits für 8 Tasten. Welche das sind, ist jedoch systemspezifisch (abhängig von der Verdrahtung der Tastaturmatrix); nur die STOP-Taste ist immer dabei.
SFDX: Nummer der augenblicklich gedrückten Taste – In der Regel systemspezifische Indexnummer in die Tastaturdekodiertabelle. Bei CBM-Rechnern mit neuen ROMs, neuem Board und CRTC-Chip (40xx/80xx) ist es allerdings der dekodierte PETSCII-Code. Wer es in VICE testen will, kann dazu den 4032 (neue ROMs) mit dem 4032B (alte ROMs) vergeichen.
LSTX: Nummer der zuletzt gedrückten Taste – Analog zu SFDX.
SHFLAG: Flag für SHIFT-Taste – Neben der SHIFT-Taste werden hier (sofern vorhanden) auch die Tasten CONTROL und COMMODORE durch ein Bit repräsentiert. Beim P 500 beeinflussen auch andere Tasten den Inhalt dieser Speicherzelle.
RPTFLG: Ermöglicht Tastenwiederholung – Dieses Flag bestimmt die Art der Repeatfunktion: $80 = aktiv für alle Tasten, $40 = keine Tasten, $00 nur für Cursorsteuerung. Bei den CBM-Rechnern hat nur der CBM 80xx eine Repeatfunktion. Beim P 500 konnte ich das Flag nicht zweifelsfrei identifizieren.
PNT: Zeiger auf aktuelle Zeile (Text) – Pointer auf den Zeilenanfang.
PNTR: Aktuelle Cursor-Spalte
TBLX: Aktuelle Cursor-Zeile
IIRQ: IRQ-RAM-Vektor – Über diesen Vektor werden eigene Interruptgesteuerte Routinen eingebunden.
TBUFFR: Kassettenpuffer – Immer wieder beliebt für kleine, unterstützende Assemblerroutinen.
Üblicherweise werden nur wenige der hier aufgeführten Systemvariablen in die Systemerkennungsroutine integriert werden. Dafür kommen noch ein paar systemspezifische Systemadressen hinzu, die jeweils nur für ein Rechnersystem relevant sind, um dort Sonderfunktionen auslösen bzw. steuern zu können. Darüber wird allerdings erst im nächsten Teil berichtet.
Hallo, nette Übersicht über die Screen-I/O-Adressen auf den verschiedenen Rechnern. Überhaupt ein sehr schönes Blog, Kompliment 🙂
Vielleicht sollte man aber beim C128 statt $d020 & $d021 lieber die Shadowregister angeben, weil ja ein POKEn in die Hardwareregister sofort wieder vom Basic überschrieben wird? Man kann ja in einer kleinen Fußnote erläutern, dass es sich nicht um die „tatsächlichen“ Register handelt und diese natürlich dieselben wie beim C64 sind. (Gut, dass in der Tabelle nicht von Sprites die Rede ist, da würd ja dasselbe gelten)
Natürlich kann man auch erwähnen, dass man dieselben Register wie beim C64 verwenden kann, nachdem man den BASIC-IRQ abgeschaltet hat – die Befehle, die diesen benötigen, darf man ja eh nicht verwenden (es sei denn man ist so dirty Spezialeffekte einzubauen wie z.B. eine Titelmelodie per PLAY, die nur ausgeführt werden IF BASIC=7.0 😉
Viele Grüße,
Edwing 🙂
Danke für Dein Kompliment. Man freut sich immer wieder, wenn man merkt, dass man nicht nur für sich selber schreibt. 😉
Der grundsätzliche Hinweis auf die Möglichkeit den BASIC-IRQ beim C128 abschalten zu können, sollte in dieser Reihe nicht fehlen. Er wäre aber passender im Teil 3 (MPP 3: Jedem seine Extrawurst) aufgehoben.
Denn Rahmen und Hintergrundfarbe ($d020/$d021) sind vom BASIC-IRQ unberührt. Zwar werden beide Werte (direkt) durch den jeweils zugehörigen BASIC-Befehl COLOR überschrieben, aber wenn man den nicht verwendet (und das vermeidet man ja durch Verwendung von BASIC 2.0) passiert nichts. Schattenregister spielen in diesem Fall (ausnahmsweise) keine Rolle.