Cursor

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Einschaltbild des C64 mit wartendem Cursor

Ein Cursor zeigt am Bildschirm an, ob der Computer eingabebereit ist und an welcher Stelle des Bildschirms die Eingabe erwartet wird. Der Cursor wird daher auch Einfügemarke oder Schreibmarke genannt.
Neben dem hier beschriebenen Textcursor ist für grafische Aufgaben und Anwendungen der Pixelcursor eine übliche Positionierungshilfe.


Der Standard-Cursor[Bearbeiten | Quelltext bearbeiten]

Beim C64 mit einem normalen Betriebssystem ist der Cursor ein blinkendes Quadrat in der Größe eines Zeichens. Das Blinken wird erzeugt, indem das Zeichen unter dem Cursor 3-mal pro Sekunde invertiert wird. Nach dem Einschalten oder einem Reset wird der Cursor unter der Meldung READY. angezeigt. Im Direktmodus ist er immer sichtbar, es sei denn, eine Eingabezeile wird gerade ausgeführt.

Der Standard-Cursor ist programmtechnisch Teil des C64-Betriebssystems. Gesteuert wird er über Speicherstellen in der Zeropage und Routinen im Kernal, die auch in BASIC- oder Maschinensprache-Programmen genutzt werden können.

Cursor-Steuerung[Bearbeiten | Quelltext bearbeiten]

Folgende Tasten ändern ausschließlich die Cursor-Position im Direktmodus oder im Eingabemodus (z. B. nach INPUT):

  • Die Cursortasten CRSR ⇔  und CRSR ⇑ ⇓  verändern die Position um eine Spalte bzw. Zeile
  • HOME  setzt den Cursor in die linke obere Ecke des Bildschirms
  • SHIFT +RETURN  setzt den Cursor an den Anfang der nächsten logischen Zeile.


Die Positionierung des Standard-Cursors geschieht:

Die Cursor-Position, allerdings nur die Spalte in der aktuellen logischen Eingabezeile, liefert die BASIC-Funktion POS().

Cursor in Programmen[Bearbeiten | Quelltext bearbeiten]

Neben dem Betriebssystem stellen auch Computerprogramme, bei denen Texteingaben erwartet werden oder Tastaturabfragen erfolgen, einen – oft speziell aussehenden – Cursor zur Verfügung. Je nach den im Programm vorgegebenen Möglichkeiten wird er entweder über die Cursortasten und/oder über den Joystick oder die Maus gesteuert.

Das Programm bestimmt auch, ob und wann der Cursor sichtbar ist. In einem BASIC-Programm ist er unsichtbar, sofern nicht gerade eine INPUT-Eingabe bearbeitet wird oder die Sichtbarkeit mit einer Anweisung absichtlich erzeugt wurde. Seine Position kann so im Hintergrund verändert werden, um auf die aktuelle Schreibposition einer folgenden Ausgabefunktionen Einfluss zu nehmen.
In einem Programm mit Menü-Steuerung ist ein sichtbarer Cursor meistens erforderlich.

Darstellung[Bearbeiten | Quelltext bearbeiten]

Ein Cursor kann unterschiedlich dargestellt werden. Ein Wechsel des Aussehens wird z. B. häufig dazu verwendet, um verschiedene Eingabemodi (z. B. Einfügen oder Überschreiben) anzuzeigen. Beispiele:

Beliebt ist die Verwendung eines Cursor-Sprites, weil damit viele Darstellungsarten möglich sind. Der Programmieraufwand ist allerdings größer als bei der Benutzung des Standard-Cursors.

Die Blinkfunktion des Standard-Cursors funktioniert nur korrekt mit einem Zeichensatz, der invertierte Zeichen enthält. Sind die im Zeichensatz eines Programms nicht vorhanden, muss dieses den Cursor auf eine andere Weise darstellen, denn sonst erscheinen beim Positionieren auf Zeichen plötzlich statt der erwarteten inversen Zeichen völlig andere Zeichen oder ggf. Grafikmüll. Der Ultraflash-Noter z. B. verwendet deshalb ein Sprite als Cursor.

Programmierung[Bearbeiten | Quelltext bearbeiten]

Speicherstellen und ROM-Routinen, die ein Programmierer zur Cursorsteuerung nutzen kann:

Adresse dez (hex) Beschreibung
204 ($CC) Flag für Cursor (0 = blinkt; sonst nicht); das Blinken ist ausgeschaltet, wenn Zeichen im Tastaturpuffer sind oder wenn ein Programm läuft
205 ($CD) Zähler für Cursor-Blinken; wird alle 1/60 Sekunden von 20 heruntergezählt; bei 0 wechselt die Phase des Cursors
206 ($CE) Zeichen unter dem Cursor
207 ($CF) Flag für letzte Blinkphase: 0 bei invertiertem, 1 bei nicht invertiertem Zeichen
211 ($D3) aktuelle Cursorzeile; 0 bis 39
214 ($D6) aktuelle Cursorspalte; 0 bis 24
58634 ($E50C) Cursorposition (und Bildschirm- und Farb-RAM-Zeiger) setzen; Werte in X,Y (Zeile, Spalte) vorgeben
58732 ($E56C) Cursorposition (und Bildschirm- und Farb-RAM-Zeiger) setzen; Werte in Speicheradresse 211 ($D3), 214 ($D6) (Zeile, Spalte) vorgeben
58643 ($E513) Cursorposition holen nach X,Y
65520 ($FFF0) Cursor setzen (Carry=0) bzw. holen (Carry=1); Zeile in X, Spalte in Y; springt nach 58634 ($E50A) bzw. 58643 ($E513); benutzt intern $E56C.
Die Nutzung von $FFF0/der Kernal-Sprungtabelle statt dem direkten Aufruf der Funktionen ist der empfehlenswerte Weg, der z. B. auch mit Paradoxon-Basic funktioniert.


Programmbeispiele:

10 AT=49152
20 SYS AT,spalte,zeile

Version 1: einfach gehalten:

 *=$C000
 AT       JSR $E200   ; prüft auf Komma und weitere Zeichen, holt Byte-Wert nach X 
          STX $D6     ; als Spalte
          JSR $E200
          STX $D3     ; als Zeile
          JMP $E56C   ; Cursor setzen

Version 2: über PLOT-Routine $FFF0, mit Gültigkeitsabfrage:

*=$C000
AT        JSR $E200 
          CPX #$28    ; >= 40?
          BCS Error   ; dann Fehler
          STX $AC     ; Wert für Spalte zwischenspeichern
          JSR $E200 
          CPX #$19    ; >= 25?
          BCS Error 
          LDY $AC     ; Spalte nach Y
          CLC         ; Carry-Flag löschen, damit Cursor setzen ausgeführt wird
          JMP $FFF0   ; Cursor setzen
Error     LDX #$0E    ; Fehler 14 "Illegal Quantity"
          JMP ($0300) ; Fehlerausgabe über Warmstart-Vektor
  • Cursor Position holen (kann auch direkt aus 211/214 ausgelesen werden):
 POKE 783,PEEK(783) OR 1: SYS65525:zeile=PEEK(781): spalte=PEEK(782) 
  • GET mit blinkendem Cursor; Programmzeile 20 verhindert, dass ein inverses Cursorzeichen auf dem Bildschirm verbleibt[1]:
 10 POKE 204,0: POKE 198,0: WAIT 198,1: GET A$
 20 POKE 205,2: WAIT 207,1,1: POKE 204,1

Quellen[Bearbeiten | Quelltext bearbeiten]

  1. Hannes Rügheimer/Christian Spanik: Chip Special, Das Commodore Adressbuch PEEK + POKE, Vogel Verlag, Seite 52