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:
- Interaktiv mit den obigen und ggf. weiteren Tasten der Tastatur
- Innerhalb eines Programms mit BASIC-Befehlen oder Routinen des KERNALs:
- Mit dem PRINT-Befehl kann durch Angabe von Steuerzeichen in einer Zeichenkette oder der TAB()- bzw. SPC()-Funktionen definiert werden, wohin sich der Cursor bewegen soll.
- Mit den Befehlen POKE und SYS lassen sich Speicherstellen manipulieren bzw. Routinen des KERNALs aufrufen, um die Position entsprechend zu verändern.
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:
- Invertiertes Kästchen (meist blinkend), wie bei vielen Heimcomputern (z. B. C64/128/116/16, Plus/4 oder VC20).
- Blinkender Unterstrich, wie etwa beim Betriebssystem MS-DOS.
- Bleibender waagerechter oder senkrechter Strich bei Textverarbeitungen, aber auch in Eingabefenstern eines GUIs für einen Text (z. B. in GeoWrite).
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.
Amica Paint Menü
NUFLI-Editor
Character Fox Eingabe
Music Studio Noten Eingabe
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:
- Blockcursor in Strichcursor ändern
- Verdoppeln der Cursorgeschwindigkeit
- Cursor-Positionierung in BASIC
- Cursor-Positionierung mit Assembler-Routine:
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):
- 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]
- ↑ Hannes Rügheimer/Christian Spanik: Chip Special, Das Commodore Adressbuch PEEK + POKE, Vogel Verlag, Seite 52