MPP 2: Zeropage, oh, Zeropage

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.

Dieser Beitrag wurde unter C128, C64, CBM, Soft veröffentlicht. Setze ein Lesezeichen auf den Permalink.

2 Antworten zu MPP 2: Zeropage, oh, Zeropage

  1. Edwing sagt:

    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 🙂

  2. wte sagt:

    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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.