Zeropage

Aus C64-Wiki
Wechseln zu: Navigation, Suche

Die ersten 256 Byte im Speicher (entspricht einer Page), also der Bereich von 0 bis 255 bzw. $0000-$00FF, wird auch Zeropage (Page 0 bzw. Seite 0) genannt (siehe auch Speicherbelegungsplan). Bei den Prozessoren der 6502-Familie (wie dem im C64 verbauten 6510) kommt der Zeropage eine besondere Bedeutung zu, da zur Adressierung einer Speicherzelle nur ein Byte gebraucht wird (das Highbyte ist definitionsgemäß 0). Befehle mit Zeropage-Adressierung sind daher besonders kompakt und schnell. Außerdem müssen die Pointer für die indirekte Adressierung in der Zeropage liegen (ausgenommen beim indirekten JMP-Befehl). Somit kann die Zeropage als eine Art externe Registererweiterung angesehen werden.

Nur die Speicherstellen $00, $01 in der Zeropage und danach der Bereich $0100-$01FF (Page 1) haben eine durch die Hardware vorgegebene Funktion; die anderen Speicherstellen werden vom KERNAL bzw. von BASIC benutzt und bekommen dadurch ihre jeweilige Bedeutung.

Maschinensprache-Programme müssen für zeigerbasierte Adressierung Zeropage-Adressen benutzen. Sollen parallel Funktionen aus dem KERNAL oder Basic-Interpreter (z.B. zur String-Ausgabe) verwendet werden, dürfen die entsprechenden Zeropage-Adressen nicht verwendet werden. Empfohlen wird deshalb in der Regel die Nutzung von 251/$FB bis 254/$FE.

Erweiterte Zeropage
Dieser Bereich unmittelbar nach der Zeropage beginnend mit Page 1 erstreckt sich bis inklusive Page 3 und wird einfacherweise auch erweiterte Zeropage (engl. extended zeropage) genannt. Dieser Begriff ist aber technisch nicht genau spezifiziert. [1]
Neben der durch die Hardware festgelegten Zuordnung der Page 1 als Prozessor-Stapel und diverser Zweitnutzung gewisser Bereiche darin, folgen danach die Systemvariablen des BASIC-Interpreters und des KERNALs.

Belegung der Zeropage (0/$00-255/$FF) des C64[Bearbeiten]

Hex-Adresse Dez-Adresse Normalwert Beschreibung
$00 0 47 Datenrichtungsregister für MOS 6510 Prozessorport (0 Eingang; 1 Ausgang)
$01 1 55 Prozessorport
  • Bit 0 LoRam - siehe PLA
  • Bit 1 HiRam - siehe PLA
  • Bit 2 CharEn - siehe PLA
  • Bit 3 Datenausgabe Datasette;
  • Bit 4 Datasettentaste gedrückt (0), nicht gedrückt (1);
  • Bit 5 Stromversorgung Datasettenmotor an (0), aus (1);
  • Bit 6,7 ungenutzt
$02 2 unbenutzt
$03-$04 3-4 170,177 ($B1AA) Vektor für Umwandlung Fließkommazahl nach Ganzzahl (Low/High-Byte)
$05-$06 5-6 145,179 ($B391) Vektor für Umwandlung Ganzzahl nach Fließkommazahl (Low/High-Byte)
$07 7 34 Suchzeichen (kann über BASIC-Programme genutzt werden)
$08 8 34 Hochkomma-Flag: Anführungszeichen am Ende einer Zeichenkette und zu BASIC-Texteingaben; Umwandlung von BASIC-Befehlen in Tokens
$09 9 0 Speicher für die Cursor-Position nach Ausführen des BASIC-Befehls TAB( oder SPC(
$0A 10 0 Interpreter-Flag: 0 = LOAD; 1 = VERIFY wird benötigt zur Unterscheidung des ausgeführten Befehls wegen identischer Routinen
$0B 11 0 Eingabepufferzeiger, Anzahl der Elemente (DIM), Länge der Token-Zeile
$0C 12 0 DIM-Flag: Für neue Dimensionierungen
$0D 13 255 Variablentyp-Flag: 0 numerisch; 255 Zeichenkette
$0E 14 0 Zahlenvariablen-Flag: 0 Fließkomma; 128 Ganzzahl
$0F 15 0 Flag: DATA-Zeilen lesen / ausführen von LIST; Merker für die Durchführung einer Garbage Collection
$10 16 0 FN-Flag: Unterscheidung Funktionsvariable zu Feldvariable
$11 17 0 Flag: Verzweigt zu 0 = INPUT, 64 = GET oder 152 = READ
$12 18 0 Vorzeichen-Flag: Überprüft vor Aufruf von Funktionen das Vorzeichen, Merker bei Vergleichsoperatoren
$13 19 0 Aktives E/A-Gerät-Flag: 0 = Direkteingabe, Tastatur, Datasette, RS-232, Userport,Bildschirm, Drucker, Floppy; INPUT-Kommentar
$14 - $15 20 - 21 0 - 0 Integer-Adresse/Ganzzahlige Werte für die Befehle ON, GOTO, GOSUB und LIST
$16 22 25 ($19) Zeiger auf das nächste freie Element des String-Descriptor-Stacks
$17 - $18 23 - 24 Temporärer Zeiger auf Descriptor der zuletzt verwendete Zeichenkette
$19 - $21 25 - 33 String-Descriptor-Stack: max. 3 String-Descriptoren bestehend jeweils aus Längenbyte+Adressenbytes.
$22 - $25 34 - 37 Hilfszeiger des Interpreters
$26 - $2A 38 - 42 Fließkommaergebnis der Multiplikation und Division
$2B - $2C 43 - 44 1,8 ($0801) Zeiger auf die Startadresse des BASIC-Programmspeichers
$2D - $2E 45 - 46 3,8 ($0803) Zeiger auf das BASIC-Programmende bzw. Beginn des BASIC-Variablenspeichers (Low-Byte)
$2F - $30 47 - 48 Zeiger auf den Beginn der BASIC-Variablenfelder
$31 - $32 49 - 50 Zeiger auf das Ende der BASIC-Variablenfelder (eins nach dem letzten verwendeten Byte).
Markiert den freien Basic-Speicher bis hin zu $33/$34.
Bei String-Felder ist im Bereich für BASIC-Variablenfelder nur der String-Descriptor enthalten und die Inhalte der Zeichenketten sind in einem gesonderten Zeichenkettenbereich (String-Heap) abgelegt (siehe $33/$34).
$33 - $34 51 - 52 Zeiger auf die Untergrenze des Zeichenkettenbereichs (String-Heap). Bewegt sich von $37/$38 ausgehend hin zu niedrigeren Adressen (höchstens bis $31/$32).
$35 - $36 53 - 54 Hilfszeiger für Zeichenketten
$37 - $38 55 - 56 0,160 ($A000) Zeiger auf BASIC-RAM-Ende
$39 - $3A 57 - 58 0,255 (65280) Momentan ausgeführte BASIC-Zeilennummer; $3A dient auch als Flag für den Direktmodus (aktiv wenn $3A den Wert 255 enthält)
$3B - $3C 59 - 60 0,0 Vorherige BASIC-Zeilennummer, Flag für CONT bei RUN/STOP  bzw. STOP
$3D - $3E 61 - 62 0,0 Zeiger für CONT
$3F - $40 63 - 64 Momentan gelesene DATA-Zeile
$41 - $42 65 - 66 Zeiger für das nächste DATA-Element
$43 - $44 67 - 68 Zeiger auf Eingabequelle für INPUT, GET und READ
$45 - $46 69 - 70 Aktuell genutzter Variablenname
$47 - $48 71 - 72 Zeiger für aktuelle Variable
$49 - $4A 73 - 74 Variablenzeiger für FOR-NEXT-Schleife
$4B - $4C 75 - 76 Zwischenspeicher für Programmzeiger bei mathematischen Berechnungen oder Nutzung von READ
$4D 77 Maske für Vergleichsoperationen Kleiner, Größer oder Gleich
$4E - $4F 78 - 79 Zeiger für FN
$50 - $52 80 - 82 Hilfszeiger für Zeichenketten
$53 83 3 Startwert der Descriptor-Länge in Variablen und String-Descriptor-Stack bei der Garbage Collection
$54 84 76 ($4C) Konstanter Wert (Opcode des Assemblerbefehls JMP für folgenden Sprungvektor)
$55 - $56 85 - 86 Sprungvektor für Funktionen
$57 - $5B 87 - 91 Register für TAN (Akku #3)
$5C - $60 92 - 96 Register für TAN (Akku #4)
$61 - $66 97 - 102 Fließkomma-Akku #1, FAC
  • $61 = 97 Fließkomma-Akku #1: Exponent
  • $62-$65 = 98-101 Fließkomma-Akku #1: Mantisse
  • $66 = 102 Vorzeichen
$67 103 Zeiger Polynomauswertung
$68 104 Fließkomma-Akku #1: Überlauf; Runden
$69 - $6E 105 - 110 Fließkomma-Akku #2, ARG
  • $69 = 105 Fließkomma-Akku #2: Exponent
  • $6A-$6D = 106-109 Fließkomma-Akku #2: Mantisse
  • $6E = 110 Fließkomma-Akku #2: Vorzeichen
$6F 111 Ergebnis des Vorzeichenvergleichs Fließkomma-Akku #1 zu #2
$70 112 Fließkomma-Akku #2: Runden
$71 - $72 113 - 114 Zeiger für Polynomauswertung (Low-/High-Byte)
$73 - $8A 115 - 138 CHRGET-Routine, holt nächstes Zeichen/Byte aus BASIC-Text; mit:
  • $79 (117) CHRGOT-Einsprung
  • $7A - $7B (118 - 119) Zeiger in Basic-Text
$8B - $8F 139 - 143 Letzter Wert von RND / Startwert des Zufallsgenerators
$90 144 0 Statuswort ST (STATUS)
$91 145 255 Flag für die Tasten RUN/STOP  und RVS ON  bzw. RVS OFF , sowie hilfsweise Abfrage des Joystickports #1
$92 146 Zeitkonstante für Kassettenbetrieb
$93 147 0 Letzter Lesebefehl (0=LOAD, 1=VERIFY)
$94 148 Flag für IEC-Bus (serieller Ausgang) zurückgestelltes Zeichen
$95 149 zurückgestelltes Zeichen für IEC-Bus
$96 150 Flag für Kassettenende (EOT) bzw. Kassettenmotorflag (Byte 0 = Motor ausgeschaltet)
$97 151 Zwischenspeicher für Register
$98 152 Anzahl der geöffneten Files
$99 153 aktuelles Eingabegerät (normale Gerätenummer: 0)
$9A 154 aktuelles Ausgabegeräte für CMD (normale Gerätenummer: 3)
$9B 155 Paritätsbyte für Kassettenbetrieb
$9C 156 Flag für Byte empfangen
$9D 157 128 Ausgabemodus (normal: 0, plus 64 Betriebssystemmeldungen, plus 128 Direktmodusmeldungen)
$9E 158 Prüfsumme bei Kassettenbetrieb
$9F 159 Fehlerkorrektur bei Kassettenbetrieb
$A0 - $A2 160 - 162 interne Uhr für TI bzw. TI$ (Zählwert 1/60s)
$A3 163 Bit-Zähler bei serielle Ausgabe Flag für (EOI)
$A4 164 Zähler bei Bandbetrieb
$A5 165 Zähler für Schreiben auf Band
$A6 166 Zeiger in Kassettenpuffer
$A7 - $AB 167 - 171 Flags für Schreiben und Lesen von Kassette
  • $A7 = 167: empfangenes Bit
  • $A8 = 168: Bit-Zähler
  • $A9 = 169: Flag für Startbit
  • $AA = 170: Puffer für empfangene Bytes
  • $AB = 171: Paritätskontrolle
$AC - $AD 172 - 173 Zeiger für Kassettenpuffer und Programmstart
$AE - $AF 174 - 175 Zeiger auf Programmende für LOAD / SAVE
$B0 - $B1 176 - 177 Zeitkonstante für Kassette
$B2 - $B3 178 - 179 Zeiger auf Kassettenpufferstart
$B4 180 Bit-Zähler Kassette / Band Timer (1 = gesetzt)
$B5 181 Band EOT / Nächstes Bit für RS-232 (Senden)
$B6 182 RS-232 Bytepuffer
$B7 183 Länge des Filenamens
$B8 184 aktuelle logische Filenummer
$B9 185 aktuelle Sekundäradresse
$BA 186 aktuelle Gerätenummer
$BB - $BC 187 - 188 Zeiger auf den Filenamen
$BD 189 RS-232 Parität Kassette
$BE 190 Blockzähler für Kassette
$BF 191 Wortpuffer für serielle Ausgabe
$C0 192 0 Flag für Kassettenmotor (0 = aus, 1 = ein)
$C1 - $C2 193 - 194 Startadresse für LOAD
$C3 - $C4 195 - 196 Endadresse für LOAD
$C5 197 64 gedrückte Taste
$C6 198 0 Zeichenanzahl im Tastaturpuffer
$C7 199 0 Flag für Reverse-Darstellung auf Bildschirm
$C8 200 Zeiger für Zeilenlänge bei Eingabe
$C9 201 Zeiger auf Eingabecursor (Zeile)
$CA 202 Zeiger auf Eingabecursor (Spalte)
$CB 203 64 Momentan gedrückte Taste (64 = keine Taste gedrückt)
$CC 204 1 Flag für Cursor (0 = blinkt); Normalwert=1 im Direktmodus, 0 im Programm
$CD 205 0 oder 1 Flag für Blinkzustand des Cursors
$CE 206 Zeichen unter Cursor
$CF 207 Blinkflag
$D0 208 Flag für Eingabe Tastatur und Bildschirm
$D1 - $D2 209 - 210 Zeiger auf aktuelle Bildschirmzeile
$D3 211 Aktuelle Cursorspalte
$D4 212 0 Flag für Steuerzeichenmodus (0 = aus; sonst ein, wie z.B. nach Inst/Del  oder " )
$D5 213 Länge der logischen Bildschirmzeile (40 oder 80)
$D6 214 Aktuelle Cursorzeile
$D7 215 letzte Taste
$D8 216 Anzahl der ausstehende Inserts
$D9 - $F0 217-240 Tabelle mit Highbytes der Bildschirmzeilenanfänge
$F1 241 unechte Bildschirmzeile
$F2 242 Bildschirmzeile Marke
$F3 - $F4 243 - 244 Zeiger auf aktuelle Position im Farb-RAM
$F5 - $F6 245 - 246 129,235 ($EB81) Zeiger auf Tastaturdekodiertabelle
$F7 - $F8 247 - 248 Zeiger auf Eingabepuffer RS-232
$F9 - $FA 249 - 250 Zeiger auf Ausgabepuffer RS-232
$FB - $FE 251 - 254 Freie Bytes in Page 0 für Betriebssystem
$FF 255 BASIC-Zwischenspeicher

Belegung der erweiterten Zeropage (256/$100 - 1023/$3FF) des C64[Bearbeiten]

Hex-Adresse Dez-Adresse Normalwert Beschreibung
Seite 1: $0100-$01FF
$100-$1FF 256 - 511 Prozessor-Stack, darin:
  • $100-$10A = 256-266: Puffer für Umwandlung einer Fließkommazahl in eine Zeichenkette
  • $100-$13E = 256-318: Bandfehler-Meldung
  • $13F-$1FF = 319-511: BASIC-Stack (gemeinschaftlich mit Prozessor-Stack)
Seite 2: $0200-$02FF
$200 - $258 512 - 600 System-/BASIC-Eingabepuffer
$259 - $262 601 - 610 KERNAL-Tabelle; Aktive logische Dateinummer
$263 - $26C 611 - 620 KERNAL-Tabelle; Gerätenummer für jede Datei
$26D - $276 621 - 630 KERNAL-Tabelle; Sekundäradresse jeder Datei
$277 - $280 631 - 640 Tastaturpuffer
$281 - $282 641 - 642 0,8 ($0800) Zeiger: Startadresse im RAM für Betriebssystem (Low-/High-Byte)
$283 - $284 643 - 644 0,160 ($A000) Zeiger: Endadresse im RAM für Betriebssystem (Low-/High-Byte)
$285 645 Flag für Zeitüberschreitung im seriellen Bus (IEC-Bus)
$286 646 14 Textfarbe (Farbwerte 0-15, danach wiederholen sie sich)
$287 647 Farbe unter Cursorposition
$288 648 4 Bildschirmspeicher-Anfang (Seite/Page), nur High-Byte, Normaladr. = $0400
$289 649 10 Länge des Tastaturpuffers
$28A 650 0 Flag: Tastenwiederholung für CRSR , Inst/Del , Space  0; keine Taste 64; alle Tasten 128
$28B 651 6 Geschwindigkeit für Tastenwiederholung
$28C 652 16 Verzögerungszeit für Tastenwiederholung
$28D 653 Tastencodes der Steuertasten (addieren sich):
  • Bit 0 - Shift 
  • Bit 1 - C= 
  • Bit 2 - Cntrl 
$28E 654 Merker für zuletzt gedrückte Steuertaste
$28F - $290 655 - 656 72,235 ($EB48) Zeiger auf Tastatur-Dekodierung
$291 657 0 Zeichensatzumschaltung via Tastenkombination Shift +C= : mit 128 gesperrt; mit 0 erlaubt
$292 658 Automatischen Scrollen abwärts ein (nur bei Wert 0) / aus
$293 659 Kontrollregister Emulation ACIA 6551 - RS-232 (Übertragungsgeschwindigkeit / Übertragungslänge)
$294 660 Befehlsregister Emulation ACIA 6551 - RS-232 für Parität, Duplex und Handshaking
$295 - $296 661 - 662 nicht Standard (Bit-Zeit), d.h. frei wählbare Übertragungsgeschwindigkeit vorgesehen, aber nicht eingebaut (Low-/High-Byte)
$297 663 RS-232: Status für Abbruch, Data Set Ready, Clear to Send, Puffer voll/leer, Fehler bei Parität oder Bit-Folge
$298 664 RS-232: Anzahl der zu übertragenden Bits
$299 - $29A 665 - 666 Baudrate: Full Bit Time (Mikrosek.) (Low-/High-Byte)
$29B 667 RS-232: Zeiger auf Ende des Eingabepuffers (receive)
$29C 668 RS-232: Zeiger auf Start des Eingabepuffers (receive)
$29D 669 RS-232: Zeiger auf Start des Ausgabepuffers (send)
$29E 670 RS-232: Zeiger auf Ende des Ausgabepuffers (send)
$29F - $2A0 671 - 672 IRQ-Vektor während Datasette-/Kassettenbetrieb (Low-/High-Byte)
$2A1 673 RS-232 / CIA 2 NMI-Flag
$2A2 674 Temporäre Speicherung für Lesen von Datasette/Kassette (High-Byte) / CIA 1 Timer A
$2A3 675 Temporäre Speicherung für Lesen von Datasette/Kassette (IRQs) / CIA 1 IRQ
$2A4 676 Temporäre Speicherung für Lesen von Datasette/Kassette (Timer A) / CIA 1 Flag Timer A
$2A5 677 Zwischenspeicher für (das Link-Byte beim) Bildschirm-Scrolling
$2A6 678 1 oder 0 PAL- (1) /NTSC-Flag (0) für C64-Version
$2A7 - $2BF 679 - 703 ungenutzt (89 Byte frei)
$2C0 - $2FF 704 - 767 Platz für Spritedatenblock 11, da nicht genutzt
Seite 3: $0300-$03FF
Basic-Vektoren $0300-$030B (768 bis 779)
$300 - $301 768 - 769 139,227 ($E38B) Vektor: BASIC-Fehlermeldungen
$302 - $303 770 - 771 131,164 ($A483) Vektor: BASIC-Warmstart
$304 - $305 772 - 773 124,165 ($A57C) Vektor: Umwandlung von BASIC-Text in Token
$306 - $307 774 - 775 26,167 ($A71A) Vektor: BASIC-Text auflisten / Umwandlung Token in BASIC-Text
$308 - $309 776 - 777 228,167 ($A7E4) Vektor: BASIC-Befehl ausführen
$30A - $30B 778 - 779 134,174 ($AE86) Vektor: BASIC-Token-Auswertung / arithmetische Element holen / Vektor für SYS
$30C 780 Speicher 6502 A-Register / Akku für SYS
$30D 781 Speicher 6502 X-Register / SYS
$30E 782 Speicher 6502 Y-Register / SYS
$30F 783 Speicher 6502 P-Register / Status-Register für SYS
$310 784 76 ($4C) Konstanter Wert (Opcode des Assemblerbefehls JMP für den folgenden USR-Sprungvektor)
$311 - $312 785 - 786 72,178 ($B248) Vektor: Startadresse für den Befehl USR (Low-/High-Byte), vorbelegt mit Fehlerausgaberoutine ?ILLEGAL QUANTITY ERROR
$313 787 frei
$314 - $315 788 - 789 49,234 ($EA31) Vektor: Hardware Interrupt (IRQ)
$316 - $317 790 - 791 102,254 ($FE66) Vektor: BRK-Interrupt
$318 - $319 792 - 793 71,254 ($FE47) Vektor: nicht maskierter Interrupt (NMI)
$31A - $31B 794 - 795 74,243 ($F34A) Vektor: KERNAL OPEN (F40A)(F34A)
$31C - $31D 796 - 797 145,242 ($F291) Vektor: KERNAL CLOSE
$31E - $31F 798 - 799 14,242 ($F20E) Vektor: KERNAL CHKIN-Routine; Eingabe (F2C7)(F209)
$320 - $321 800 - 801 80,242 ($F250) Vektor: KERNAL CHKOUT-Routine; Ausgabe
$322 - $323 802 - 803 51,243 ($F333) Vektor: KERNAL CLRCHN-Routine; Wiederherstellung E/A; löschen aller offenen Kanäle
$324 - $325 804 - 805 87,241 ($F157) Vektor: KERNAL CHRIN-Routine; INPUT
$326 - $327 806 - 807 202,241 ($F1CA) Vektor: KERNAL CHROUT-Routine
$328 - $329 808 - 809 237,246 ($F6ED) Vektor: KERNAL STOP-Routine (F770)(F6ED)
$32A - $32B 810 - 811 62,241 ($F13E) Vektor: KERNAL GETIN-Routine; GET
$32C - $32D 812 - 813 47,243 ($F32F) Vektor: KERNAL CLALL-Routine; CLOSE; Schließen aller offenen Kanäle
$32E - $32F 814 - 815 102,254 ($FE66) Benutzer-IRQ / Warmstart-Vektor
$330 - $331 816 - 817 158,244 ($F49E) Vektor: KERNAL LOAD-Routine / RAM laden (F4A5)
$332 - $333 818 - 819 221,245 ($F5DD) Vektor: KERNAL SAVE-Routine / RAM speichern (F5ED)
$334 - $33B 820 - 827 nicht genutzt (8 Byte frei)
$33C - $3FB 828 - 1019 Datasetten-/Kassettenpuffer (192 Byte)
$340 - $37F 832 - 895 Platz für Spritedatenblock 13 (nur bei Nichtnutzung des Datasetten-/Kassettenpuffers!)
$380 - $3BF 896 - 959 Platz für Spritedatenblock 14 (nur bei Nichtnutzung des Datasetten-/Kassettenpuffers!)
$3C0 - $3FF 960 - 1023 Platz für Spritedatenblock 15 (nur bei Nichtnutzung des Datasetten-/Kassettenpuffers!)
$3FC - $3FF 1020 - 1023 nicht genutzt

Einzelnachweise[Bearbeiten]

  1. Blog-Posting "MPP 2: Zeropage, oh, Zeropage" von WTE mit Hinweis auf die erweiterte Zeropage

Weblinks[Bearbeiten]