\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}