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