Logo: Geos Online Print Archiv
G.O.P.A. - Geos Online Print Archiv
29.11.2022 Archiv  #  Recherche  #  Links  #  Kontakt  #  Gästebuch  #  Impressum

Index
Register
Login

Die Anzeige des Archivs erfolgt grafisch. Ändern

Kurs: Programmieren (Teil 2)

Autoren: H. J. Ciprina, R. Bonse

Hiermit beginnt nun der Programmierkurs. Der einleitende Teil stand in der GUP 15; wer diese nachbestellen möchte, findet die nötigen Hinweise im Impressum auf Seite 2.

 

Jetzt geht's los! Geben Sie das Listing "Menü1.src" ein. Beachten Sie bitte, daß jede Zeile mit einem <Return> abgeschlossen sein muß!Profi-Ecke

   ;Menü1.src
   ;
   ;Löschen des Bildschirms
   ;Installation eines Menüpunktes
   ;Autor: H.J.Ciprina
   ;erstellt am: 17.02.91

   if   .p
        t     "TopSym"
        t     "TopMac"
   endif

   :HMOben    =0
   :HMUnten   =HMOben+14
   :HMLinks   =0
   :HMRechts  =HMLinks+100

   :Start
      LoadB dispBufferOn,ST_WR_FORE!ST_WR_BACK
                             ;Vorder- und Hintergrund-
                             ;Bildschirm ansprechen
      lda     #0             ;Flächenfüllmuster
      jsr     SetPattern     ;setzen

      jsr     i_Rectangle    ;Rechteck zeichnen
      b       0              ;obere  y-Koordinate
      b       199            ;untere y-Koordinate
      w       0              ;linke  x-Koordinate
      w       319            ;rechte x-Koordinate

      LoadW r0,MenüTab       ;Zeiger auf MenüTabelle
      lda     #0             ;Maus auf den 1. Menüpunkt
      jsr     DoMenu         ;Menüs darstellen

      rts                    ;zurück zur MainLoop

   :MenüTab
      b       HMOben         ;obere  y-Koordinate
      b       HMUnten        ;untere y-Koordinate
      w       HMLinks        ;linke  x-Koordinate
      w       HMRechts       ;rechte x-Koordinate
      b       1!HORIZONTAL   ;1 Menü horizontal

      w       QuitText       ;Zeiger auf Text
      b       MENU_ACTION    ;hervorzurufende Aktion
      w       DoQuit         ;Routine bei Klick aufrufen

   :QuitText
      b       "Ende",0       ;Text mit Null beendet

   :DoQuit
      jmp     EnterDeskTop   ;zurück zum DeskTop

Nach Eingabe des Textes assemblieren Sie bitte diesen. Sofern Sie keinen Fehler beim Abschreiben gemacht haben, können Sie nun direkt vom MegaAssembler aus das fertige Programm aufrufen! Von DeskTop aus müssen Sie das Programm mit dem Namen "Objektcode" starten, denn so heißt Ihr Programm (standardmäßige Voreinstellung im MegaAssembler).
Probieren Sie das Programm ruhig ein paar Mal aus. Die Maus läßt sich frei bewegen, sobald sie in der oberen Menüzeile anklicken, wird das Programm nach DeskTop verlassen.
Sicherlich haben Sie auch schon den Fehler in diesem Programm bemerkt: Egal wo sie in der Menüzeile klicken, das Programm wird immer verlassen, die Menüzeile ist somit zu breit!
Bevor wir jedoch die Unkorrektheit verbessern, besprechen wir zunächst das Listing.

Die ersten Zeilen beginnen alle mit einem Semikolon, diese Zeilen leiten also einen Kommentar ein. Es empfiehlt sich am Anfang eines Listings in einigen Kommentarzeilen den Namen des Listings, den Zweck des Programms sowie den Autor und das Erstellungsdatum zu vermerken. Leerzeilen im Listing überliest der Assembler.
Die folgende Anweisung if ist ein sogenannter Assembleropcode, also nichts anderes als ein Befehl für den Assembler. "if" leitet eine bedingte Assemblierung ein.
Der MegaAssembler ist ein 2-Pass-Assembler. Im ersten Pass werden u.a. alle Variablen- und Makronamen vermerkt. Da die "TopSym" und die "TopMac"-Datei nur aus Variablen- und Makrodefinitionen bestehen, reicht es vollständig aus, daß diese nur im ersten Pass eingelesen werden. Wenn Sie die Zeilen "if .p" und "endif" löschen, werden Sie feststellen, daß der MegaAssembler zweimal die "TopSym" und die "TopMac" einliest und damit auch mehr Zeit benötigt.
Die Anweisung .p bedeutet, das nun folgende ist nur im ersten Pass zu tun!
Die in den nächsten Zeilen folgenden "t"s sind ebenfalls Obcodes, sie weisen den Assembler an, eine Datei von der Diskette nachzuladen. Sofern unter GEOS-Programmen beide Laufwerke angesprochen werden können, sucht der MegaAssembler die Datei zunächst auf dem Startlaufwerk, dann auf dem Zweitlaufwerk. Die bedingte Assemblierung wird immer mit endif abgeschlossen!
Anschließend definieren wir vier Variablen mit einer festen Wertzuweisung. Die Variable HMOben weisen wir den Wert Null zu. Der Variablen HMUnten weisen wir einen Wert in Abhängigkeit von HMOben zu. HMUnten berechnet sich aus dem Wert von HMOben plus dem Wert 14. In unserem Programm erhält dann HMUnten den Wert 0 + 14 = 14! Analog gehen wir bei den Wertzuweisungen von HMLinks und HMRechts vor.
Die vier Variablen legen die Positionen des Menüs fest. Verändern Sie bitte einmal die Werte für HMOben (0 185) und HMLinks (0 219), assemblieren Sie das Listing erneut und beobachten Sie, wie sich die Menüzeile auf dem Bildschirm verschiebt. Verändern Sie hingegen HMUnten bzw. HMRechts, so wird das Menü breiter oder schmaler.
Durch die Abhängigkeit HMUnten von HMOben bzw. HMRechts von HMLinks kann man sehr schnell durch Ändern der Wertzuweisungen für HMOben und HMLinks sein Menü an eine andere Stelle positionieren, ohne daß dessen Höhe und Breite verändert wird. Weist man dagegen allen Variablen einen festen Wert zu, so muß man bei einer neuen Positionierung des Menüs sämtliche Werte neu berechnen.
Da die Wertzuweisungen nur im ersten (Assembler-) Pass erfolgen müssen, können Sie auch das endif nach den Variablen setzen.

Den Beginn des eigentlichen Programms haben wir mit dem Label Start gekennzeichnet. Diese Sprungmarke hat zwar hier keine besondere Bedeutung für dieses Programm, sie wird in späteren Programmen aber eine Funktion erlangen. Nach dem Label folgt direkt ein <Return> im Quelltext, die Sprungmarke bezieht sich dann auf den nächsten folgenden Assemblerbefehl (hier Makro: LoadB).

Die Zeile:
LoadB dispBufferOn,ST_WR_FORE!ST_WR_BACK
weist die Grafikroutinen von GEOS an, den Vorder- und Hintergrundbildschirm zu benutzen. Der Vordergrundbildschirm ist der sichtbare Bildschirm. Der Hintergrundbildschirm wird bspw. bei dem Abbau von Menüs benutzt, um den vom Menü verdeckten Teil der Grafik zu restaurieren.
Die Bildschirme sind bei GEOS64 bzw. GEOS128 im 40-Zeichenmodus 320 Punkte breit und 200 Punkte hoch (80-Zeichenmodus 640 x 200 Punkte). Man kann nun GEOS anweisen, eine Information nur in den Vorder- oder Hintergrundspeicher zu schreiben. Der Wert in der Speicherstelle dispBufferOn (= $002f) entscheidet, in welchen Bildschirm geschrieben wird. Ist Bit 7 gesetzt, so wird in den sichtbaren Bildschirm geschrieben, ist Bit 6 gesetzt in den unsichtbaren. In beide Bildschirmbereiche wird dann geschrieben, wenn Bit 7 und Bit 6 gesetzt sind. Bit 7 wird repräsentiert durch die Konstante ST_WR_FORE, Bit 6 durch ST_WR_BACK. Das Setzen beider Bits geschieht mittels einer Oder-Verknüpfung (!) der beiden Konstanten.

Alle GEOS-Programme sollten dann den Bildschirm löschen oder mit einem Muster füllen. Auch das Löschen ist für GEOS letztendlich das Setzen eines (leeren) Musters. Welches Muster verwendet werden soll, wird über die Routine SetPattern ($c139) festgelegt. Dazu braucht man der Routine im Akku nur die Nummer des Flächenfüllmusters zu übergeben. Sie finden alle Flächenmuster in Anhang J des Buches (1). Probieren Sie ruhig ein paar verschiedene Muster aus!
Mit SetPattern wird aber noch nicht eine Fläche gefüllt. Zum Flächenfüllen eines rechteckigen Bereichs gibt es die Routinen Rectangle ($c124), i_Reclangle ($c19f), GraphicsString ($c136) und i_GraphicsString ($c1a8). Im Beispiel haben wir i_Rectangle verwendet, um Ihnen eine GEOS-spezifische Inlineroutine ans Herz zu legen. Inlineroutinen übergibt man keine Parameter, sondern sie holen sie sich selber. Damit sie die Parameter finden können, stehen die Werte immer direkt hinter dem Inlineaufruf. Inlineroutine müssen immer mit jsr aufgerufen werden.
Die Routine i_Rectangle benötigt je ein Byte für die obere und die untere y-Koordinate sowie je ein Word für die linke und die rechte x-Koordinate. In y-Richtung genügt ein Byte, da die Koordinate nie größer als 199 werden darf und ein Byte maximal den Wert 255 annehmen kann. Für die x-Koordinate reicht ein Byte nicht aus, deshalb muß diese Koordinate als Word abgelegt werden. Beachten Sie bitte, daß von einem Word zunächst das Low-Byte dann das High-Byte abgelegt wird. Diese Arbeit nimmt uns der MegaAssembler durch den w-Opcode ab.
Die Inlineroutine i_Rectangle liest selbständig die Koordinaten aus und löscht den gesamten Bildschirm indem sie ihn mit einem leeren Muster füllt.

In den nächsten drei Zeilen wird ein Menü installiert. Den eigentlichen Menüaufbau übernimmt die Routine DoMenu ($c151). Dieser muß man in den Speicherstellen $02 und $03 einen Zeiger auf die im Speicher befindliche Menütabelle übergeben, in der GEOS alle Informationen über das Menü findet. Da ein Zeiger grundsätzlich eine Adresse beinhaltet, benötigt man für den Zeiger zwei Bytes (Low-Byte, High-Byte; also Wordformat), die diese Adresse aufnehmen.
Sehr viele GEOS-Routinen benötigen Parameter bzw. Zeiger auf Tabellen, deshalb hat BSW einen speziellen Bereich der Zeropage für diese Zwecke reserviert. Der Bereich fängt bei $0002 an und endet bei $0021. Zur Unterscheidung dieser Adressen sind sie mit r0L,r0H, r1L, r1H, ....., r15L, r15H durchnummeriert. Die Adresse r0L ($0002) kann maximal den Wert $ff (255) annehmen, nimmt man aber die Adresse r0H ($0003) hinzu, kann man schon den kompletten Speicher des C64 erreichen. Aus diesem Grund sind die beiden Adressen r0L und r0H zu dem Label r0 zusammengefasst. Findet man im Quelltext das Label r0, so kann man davon ausgehen, daß mit einem Word oder einer Adresse gearbeitet wird.

Zum Belegen der Speicherstellen, die r0 repräsentiert, verwenden wir das Makro LoadW. Dieses arbeitet ähnlich wie LoadB; das Low-Byte der Adresse, die durch MenüTab festgelegt wird, wird nach r0L und das High-Byte nach r0H transferiert. Damit zeigt r0 auf die Menütabelle. Die Routine DoMenu benötigt in r0 genau diesen Zeiger auf die Menütabelle.
Desweiteren kann man bestimmen, über welchem Menüpunkt der Mauspfeil nach dem Aufbau des Menüs erscheinen soll. Dazu belegt man den Akku mit der Nummer (-1) des gewünschten Menüpunktes. Beachten Sie bitte, daß die meisten Makros den Akku verändern, deshalb darf die Anweisung lda #0 erst nach dem Makro erfolgen.
Mittels rts wird zur MainLoop zurückgekehrt.

Anschließend folgt die Menütabelle. Diese besteht aus einem Menükopf sowie den Einträgen zu den einzelnen Menüpunkten. Im Kopf wird die Position des Menüs sowie dessen Ausrichtung und die Anzahl der Menüpunkte festgelegt.
Menüs sind immer rechteckige Bereiche. Sie benötigen zuerst die beiden y-Koordinaten (je ein Byte), sowie die x-Koordinaten (je ein Word) in Pixel. Das danach folgende Byte bestimmt sowohl die Anzahl der Menüpunkte als auch die Ausrichtung (horizontal oder vertikal). Diese werden durch das Ausrufezeichen (!) geodert. Das oberste Bit (Bit 7) gibt die Ausrichtung an, Bit 6 entscheidet, ob der Menübereich verlassen werden darf und die Bits 0 bis 5 geben die Anzahl der Menüpunkte an. Insgesamt können 31 verschieden Menüpunkte angeboten werden; wir verwenden hier aber zunächst nur einen. Auf die Bits 6 und 7 gehen wir in einem der nächsten Kursteile genauer ein.

Nach dem Tabellenkopf folgt nun der Eintrag zu unserem Menüpunkt. Er besteht aus einem Zeiger auf einen String (Word), einem Spezifikationsbyte und einem Zeiger auf eine Routine (Word), die beim Anklicken des Menüpunktes aufgerufen wird. Zu beachten ist, daß ein String grundsätzlich mit einem Nullbyte abgeschlossen sein muß, damit GEOS das Ende des Textes erkennt.
Durch das Setzen des Spezifikationsbyte auf den Wert MENU_ACTION (= $00) wird GEOS angewiesen, beim Anwählen des Menüpunktes sofort mit einer Aktion, hier durch Aufruf der Routine DoQuit zu reagieren. Neben MENU_ACTION gibt es noch zwei weitere Menüpunktarten, auf die wir im weiteren Kurs eingehen werden. Wichtig ist jedoch hier die Routine DoQuit, die für das Beenden unserers Programmes zuständig ist. Sie besteht nur aus einem einzigen Befehl: jmp EnterDeskTop.
Da es auf Grund des MainLoop-Prinzips von GEOS nicht genügen würde, ein rts zum Verlassen des Progammes zu schreiben, gibt es die besondere Routine EnterDeskTop ($c22c). Diese beendet das Programm und startet DeskTop.

 

H. J. Ciprina / R. Bonse

 

 

 




Dieser Artikel ist Bestandteil von:

Ausgabe 16

! - - - - - M I C R O F I L M - - - - - ! | Editorial | Einladung zum Clubtreffen! | Mitgliederstatistik | Schon gewußt, ... | Regionales | Der Brief | GeoBox: Hilfe oder Ende ?! | GEOS für Einsteiger - Druckertreiber und Printer Edit | Kurs: Programmieren (Teil 2) | Deut. Distributor | Neues aus den USA | Druckertreiber | Japan. Zeichensätze | Die Festplatte | Neues von GEOS LQ | Maus - Trick | Die GeoThek | DTP 4 - Layout - Planung einer kompletten Zeitschrift | Hard- & Software Sensationen! | Sonderbeilage PC/GEOS zur GEOS - USER - POST 16


Kurs Programmieren

Kurs: Programmieren (Teil 1) | Kurs: Programmieren (Teil 2) | Kurs: Programmieren (Teil 3) | Kurs: Programmieren (Teil 4) | Kurs: Programmieren (Teil 5) | Kurs: Programmieren (Teil 6) | Kurs: Programmieren (Teil 7) | Kurs: Programmieren (Teil 8)


Kurzlink hierhin: http://geos-printarchiv.de/1156


Letzte Änderung am 01.11.2019