Zeropage

Aus C64-Wiki
Zur Navigation springenZur Suche springen

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 High-Byte 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 | Quelltext 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 Aktuelles Eingabe-Dateinummer: 0 = Standardeingabe (Tastatur), > 0 = eine andere geöffnete Datei
$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 (121) CHRGOT-Einsprung
  • $7A - $7B (122 - 123) 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 (Dateien)
$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 60,3 ($033C) 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 (Dateinamens)
$B8 184 aktuelle logische Dateinummer
$B9 185 aktuelle Sekundäradresse
$BA 186 aktuelle Gerätenummer
$BB - $BC 187 - 188 Zeiger auf den Filenamen (Dateiname)
$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 Cursor bei Eingabe (Zeile)
$CA 202 Zeiger auf Cursor bei Eingabe (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-20 Countdown bis Wechsel des Blinkzustand des Cursors (invertierend/unsichtbar)
$CE 206 Zeichen unter Cursor
$CF 207 Blinkflag; 0=Cursor aktuell unsichtbar, 1=Cursor aktuell sichtbar/invertierend
$D0 208 Flag für Eingabe Tastatur und Bildschirm
$D1 - $D2 209 - 210 Zeiger auf Anfang der aktuellen (logischen!) Zeile im Bildschirmspeicher (siehe $F3-$F4 für Farb-RAM)
$D3 211 Aktuelle (logische!) Spalte des Cursors (0..79)
$D4 212 0 Flag für Steuerzeichenmodus (0 = aus; sonst ein, wie z.B. nach Inst/Del  oder " )
$D5 213 Maximaler Spaltenindex einer logischen Bildschirmzeile (39 oder 79); entspricht 40 oder 80 Zeichen
$D6 214 Aktuelle Zeile des Cursors (0..24)
$D7 215 letzte Taste
$D8 216 Anzahl der ausstehende Inserts
$D9 - $F2 217-242 Tabelle mit High-Bytes der Bildschirmzeilenanfänge
26 Bytes, ein Byte pro Bildschirmzeile, Bit 0…6 ist das High-Byte auf Basis des Bildschirm-RAM-Starts in $288/648 und ergibt mit dem Low-Byte aus Tabelle ab $ECF0/60656 die Zeilenstartadresse. Bit 7 gelöscht zeigt an, dass die Zeile mit der Vorzeile eine logisch Zeile länger als 40 Zeichen bildet.
$F2/242 steht für eine eine fiktive 26. Zeile bei der Scroll-Routine.
$F3 - $F4 243 - 244 Zeiger auf Anfang der aktuellen (logischen!) Zeile im Farb-RAM (siehe $D1-$D2 für Bildschirmspeicher)
$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 | Quelltext 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-$1FB (319-507): BASIC-Stack (gemeinschaftlich mit Prozessor-Stack)
  • $1FC-$1FF (508-511): BASIC-Zeilenstruktur (Link-Adresse, Zeilennummer) zum folgenden BASIC-Eingabepuffer zugehörig, die zusammen eine BASIC-Zeile bilden.[2]
    Eingabepuffer-Erweiterung für INPUT.[3]
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 am 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: Statusregister Emulation ACIA 6551: zeigt Abbruch, fehlendes Data-Set-Ready, fehlendes Clear-to-Send, Puffer voll/leer, Fehler bei Parität oder Bit-Folge an
$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 | Quelltext bearbeiten]

Weblinks[Bearbeiten | Quelltext bearbeiten]