\documentclass[a4paper]{article}

\usepackage[utf-8]{inputenc}
\usepackage[german]{babel}
\usepackage{url}
\usepackage{alltt}
\usepackage{multicol}

\title{Aus der Kiste der nützlichen Forth--Worte:\\\hfill Cursor toggeln}
\ifx\shorttitle\undefined\else
\shorttitle{Cursor toggeln}
\fi
\author{Fred Behringer}

\begin{document}
\maketitle

Der vorliegende Artikel kann als eine Übung im Sinne des leider nicht
mehr auf unserer Welt weilenden Wissenschaftlers und Forth--Freundes 
Julian Noble betrachtet werden: Julian Noble rief in einer dreiteiligen 
Artikelfolge (Übersetzung in den VD--Heften 2/2002 bis 4/2002) dazu auf, 
mehr Assembler in Forth zu verwenden. Das Einbinden von (assemblierter) 
Maschinensprache geht in Forth wesentlich leichter als in anderen 
Hochsprachen. Noble: \glqq Es wäre besser, Forth den ungläubig Außenstehenden 
über den Assembler schmackhaft zu machen.\grqq

\begin{multicols}{2}

Ich habe die im Vorliegenden aufgeführten Forth--Worte in Turbo--Forth
unter DOS 6.2 auf einer AMD--K6--2/500--Anlage mit SIS--6326--Karte
entwickelt 
und getestet.

Beim Programmieren von Spielen (Tetris, Life, Sudoku, Schiebespiel,
Türme von Hanoi, allgemeine Menüführung) stört oft der \emph{stehen 
gebliebene} blinkende Cursor. In den Forth--Sprachstandards gibt es 
keine Worte zur Manipulation des Cursors. In Turbo--Forth findet man 
das Wort (frame) zur Veränderung der Form des Cursors. Aber für das 
schlichte Aus--, Ein-- oder Umschalten des Cursors (durchaus elementare 
Wünsche) ist auch in Turbo--Forth kein Wort vorgesehen. Dem soll (Forth 
macht's leicht möglich) mit den vier Forth--Worten dieses Artikels 
abgeholfen werden.

Natürlich enthält das Hingeschriebene nichts Neues. Es steht alles in
den Unterlagen. Aber nicht jeder hat alle (nur gelegentlich) benötigten
Unterlagen griffbereit auf seinem Schreibtisch, der Einsteiger schon 
gar nicht.

Ich gehe von einem PC--kompatiblen System aus, dessen Grafik--Karte sich
(für Forth unter DOS) in den VGA--Modus schaltet oder schalten lässt.

Eine Besonderheit der VGA--Karte ist die so genannte \emph{Cursor--Emulation}:
Bei der CGA--Karte ist das Cursor--Rasterfeld kleiner als bei der EGA-- 
oder der VGA--Karte. Der \emph{normale} Unterstrich--Cursor der CGA--Karte 
würde bei der VGA--Karte etwa in der Mitte des dortigen Rasterfeldes zu 
liegen kommen. Aus Gründen der Programm--Kompatibilität hat man deshalb 
seinerzeit (schon bei der EGA--, aber dann eben auch bei der VGA--Karte) 
die \emph{Cursor--Emulation} eingeführt, welche insbesondere dafür sorgt, 
dass der CGA--Unterstrich--Cursor auch bei VGA--Betrieb als Unterstrich 
wiedergegeben wird. Daneben noch einige weitere, mehr oder weniger 
logische Anpassungen, die aber für die Cursor--Formgebung genügend 
viele Variationsmöglichkeiten (Blockcursor etc.) lassen. Im Übrigen
lässt sich die Cursor--Emulation im VGA--Betrieb über die Funktion 
ah=12h, bl=34h des Interrupts 10h (BIOS--Bildschirm--Interrupt) 
abschalten (al=0/1: ein/aus).

Mir geht es nicht um die Feinheiten der Cursor--Gestaltung, sondern um
das generelle Ein-- oder Aus-- oder Umschalten. Und das lässt sich im
VGA--Betrieb über das Kontroll--Register (des Video--Controllers 6845) für 
die Anfangs--Rasterzeile erreichen. Dazu müssen (geht über das 
CPU--Register ch für den BIOS--Interrupt 10h, ah=1) im Kontroll--Register 
die Bits 5--6 (Zählung beginnt bei 0) bearbeitet werden (0/1: Cursor 
ein/aus). Bit 7 hat keine Wirkung. Ich lasse vom Programm alle drei 
Bits (5--7) auf 1 (Cursor aus) oder 0 (Cursor ein) setzen. Es scheint 
aber mit Bit 5 allein oder mit Bit 6 allein auch schon zu gehen (?)

Die Cursor--Emulations--Einrichtung (Interrupt \discretionary{10h/}{12h/34h}{10h/12h/34h}), die
\emph{normalerweise} eingeschaltet ist, rühre ich nicht an. Sie interessiert 
mich im vorliegenden Zusammenhang weniger und ich wollte die Sicht für 
das hier eigentlich zu Sagende nicht versperren. An sich würde es aber 
unter DOS einem Forth--System unserer Zeit, da wir CGA--Karten gar nicht 
mehr kennen, gut anstehen, den VGA--BIOS--Vorgabewert auf \emph{keine 
Cursor--Emulation} zu ändern. Dann würde es nämlich genügen, die untere 
Rasterzeile kleiner als die obere zu wählen, um den Cursor 
auszuschalten. Dann käme man in den Vorschlägen des vorliegenden
Artikels mit curs--shape allein schon durch und könnte sich die drei
anderen Forth--Worte sparen. Über den besagten Interrupt 10h/12h/34h 
(zum Ausschalten der Emulation) habe ich in den Unterlagen 
unterschiedliche Aussagen gelesen. Ich hatte keine Veranlassung, die 
Dinge genauer nachzuprüfen.

An sich kommt man mit curs--shape in der hier vorgeschlagenen Fassung
auch jetzt schon allein durch: In denjenigen Fällen (in allen?), in 
welchen kein Grund zur Cursor--Emulations--Umwandlung besteht (es geht 
ja bei der Emulation hauptsächlich nur um die Bewahrung des 
Unterstrichs als Cursor), scheint die Grundregel zu gelten, die da 
besagt, dass bei einer unteren Rasterzeile, die kleiner als die obere 
ist, der Cursor ausgeschaltet wird. Nachgeprüft habe ich das bei 
oben/unten = 0f/00 bis 00/00. Schwierig ist es nur, aus den Unterlagen 
heraus genau zu erfassen, in welchen Fällen (und wie) die Emulation
eigentlich angewandt wird. Interessant ist der Sonderfall cl/ch=00/00.
Da wird der Cursor wiederum nicht ausgeschaltet. Da ist aber die 
Nummer der unteren Rasterzeile auch nicht (streng) kleiner als die der 
oberen! Mit einem generellen Auf--0--setzen der unteren Rasterzeile käme 
man also zur Ausschaltung des Cursors nicht durch!
\end{multicols}
\vfill
Listing auf der folgenden Seite.
\newpage

\section{Listing}
\begin{quote}
\listinginput[1]{1}{2008-01/CursorTogglen.fs}
\end{quote}
\end{document}