Basic optimieren - Teil 4
mad/os

Die Befehle PEEK, POKE und ihre Variationen sind sehr universell verwendbar. Mit ihrer Hilfe können Teile des Arbeitsspeichers schnell und ohne Umwege verändert werden. Auch der Textbildschirm läßt sich auf diese Weise beschreiben. Dazu muß man jedoch wissen, wie dieser sogenannte Bildschirmspeicher aufgebaut ist.

Der untere Arbeitsspeicher bis 1 Megabyte ist zuerst einmal in sogenannte Segmente unterteilt. Aller 16 Bytes beginnt ein neues Segment, das immer genau 64 Kilobytes groß ist. Die Segmente überlagern sich also mehrfach. Der Bildschirmspeicher des Textmodus beginnt nun bei der Segmentadresse &HB800. Anders ausgedrückt ist das dort, wo das 736ste Kilobyte des Arbeitsspeichers zu finden ist. Der darauf folgende Bereich stellt ein direktes Abbild des Bildschirminhaltes dar. Jede Änderung darin wird augenblicklich sichtbar.

In einem Programm muß zuerst, und das ist sehr wichtig, mit Hilfe des Befehles DEF SEG die gewünschte Segmentadresse eingestellt werden. Wird dieser Befehl weggelassen, dann zerstört das Programm irgendwelche Daten im Arbeitsspeicher und wird mit hoher Wahrscheinlichkeit einen Systemabsturz verursachen! Ein korrektes Programm könnte zum Beispiel so aussehen.

SCREEN 0: CLS
DEF SEG=&HB800
CALL NurText (3, 8, "Das ist ein Test.")
CALL NurFarbe (3, 8, 3, 10, 14+4*16)
DEF SEG

Die beiden Unterprogramme sind konkrete Beispiele, was man mit diesem Wissen anfangen kann. Die Prozedur NurText arbeitet ähnlich wie PRINT. Sie gibt jeden beliebigen Text an jeder beliebigen Bildschirmposition aus. (T ist übrigens nur eine Hilfsvariable, siehe auch Teil 1 des Kurses.)

SUB NurText (Zeile, Spalte, Text$)
  T = Zeile*160 + Spalte*2 - 164
  FOR I = 1 TO LEN(Text$)
    POKE T + I*2, ASC(MID$(Text$, I, 1))
  NEXT
END SUB

Im Gegensatz zu PRINT wird hier keinerlei Farbe benutzt. Statt dessen wird ganz einfach die auf dem Bildschirm schon vorhandene Farbe beibehalten. Die zweite Prozedur mit dem Namen NurFarbe komplettiert das Ganze. Sie schreibt nur Farbe und keinerlei Text auf den Bildschirm.

SUB NurFarbe (Ze1, Sp1, Ze2, Sp2, Farbe)
  FOR A = Ze1 TO Ze2
    T = A*160 - 161
    FOR B = Sp1 TO Sp2
      POKE T + B*2, Farbe
    NEXT
  NEXT
END SUB

Sinnvoll eingesetzt, können diese Unterprogramme für interessante Effekte sorgen. So sind zum Beispiel Tabellen denkbar, die erst mit PRINT auf den Bildschirm gebracht und dann mit NurFarbe eingefärbt werden. Die Prozedur erwartet neben den Bildschirmkoordinaten auch einen Farbwert. Dieser errechnet sich nach der Formel "Vordergrund + Hintergrund * 16". Das folgende Beispiel zeigt alle 256 möglichen Kombinationen an.

DEFINT A-Z: CLS: DEF SEG=&HB800
FOR H=0 TO 15
  FOR V=0 TO 15
    POKE V*160+H*2, 4                'das Zeichen als ASCII-Code
    POKE V*160+H*2+1, V+H*16     'die Farbe um ein Byte versetzt
  NEXT
NEXT
DEF SEG

Jetzt wäre es natürlich schön, wenn man auch die Farben 8 bis 15 für den Hintergrund verwenden könnte. Und mit der folgenden Funktion geht das tatsächlich.

SUB Blinken (Status)
  REG 1, &H1003: REG 2, Status
  CALL INTERRUPT &H10
END SUB

Mit dem Status Null wird blinkender Text deaktiviert und statt dessen mit hellen Hintergrundfarben angezeigt. Diese Einstellung bleibt dann so lange erhalten, bis der Grafikmodus umgestellt wird.

Im nächsten Teil des Kurses geht es um den Grafikmodus 13. Obwohl PowerBASIC diesen Modus nicht kennt, läßt er sich gut und vor allem schnell nutzen.

mad/os