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

Index
Register
Login

Die Anzeige des Archivs erfolgt grafisch. Ändern

Kurs: Programmieren (Teil 8)

Autor: R. Bonse

Nachdem wir in den letzten Kursteilen unter dem Menüpunkt "geos-Info" eine Dialogbox programmiert haben, wollen wir nun den Menüpunkt "geos" noch um das Anbieten von Hilfsprogrammen (Desk-Accessories) erweitern.

Wir hatten dies ja im Kurs Teil 3 (GUP 17) als Anforderung an unser Programm gestellt. Das Anzeigen und Starten von Hilfsprogrammen bedarf einiger Änderungen und Ergänzungen im Quelltext der CD-Verwaltung.

A. Fügen Sie auf der ersten Seite des Listings zwischen "w 319" und "LoadWr0,MenüTab" die Zeile

   jsr        HP_Einbindung

ein.

B. Da das geos-Menü umgestaltet wird, ersetzen Sie bitte das geosSub-Menü und die Konstantendefinition ab dem Label gMLinks bis vor dem Label InfoText durch folgendes Listing:

   :gMLinks   = 0
   :gMRechts  = gMLinks+80
   :gMOben    = 15

   :geosSub
         b    gMOben
   :gMUnten   b  0
         w    gMLinks
         w    gMRechts
   :gMAnzahl  b  0

         w    InfoText
         b    MENU_ACTION
         w    DoInfo

         w    HP_Platz
         b    MENU_ACTION
         w    HP_Aufruf

         w    HP_Platz+17
         b    MENU_ACTION
         w    HP_Aufruf

         w    HP_Platz+2*17
         b    MENU_ACTION
         w    HP_Aufruf

         w    HP_Platz+3*17
         b    MENU_ACTION
         w    HP_Aufruf

         w    HP_Platz+4*17
         b    MENU_ACTION
         w    HP_Aufruf

         w    HP_Platz+5*17
         b    MENU_ACTION
         w    HP_Aufruf

         w    HP_Platz+6*17
         b    MENU_ACTION
         w    HP_Aufruf

         w    HP_Platz+7*17
         b    MENU_ACTION
         w    HP_Aufruf
   :HP_Platz  s  17*8

C. Die beiden neuen Routinen, die zum Anzeigen und Starten der Hilfsprogramme nötig sind, geben Sie bitte wieder am Ende Ihres Quelltextes ein (s. Teil 6):

   :HP_Einbindung
        LoadW     r6,HP_Platz
        LoadB     r7L,DESK_ACC
        LoadB     r7H,8
        LoadW     r10,0
        jsr  FindFTypes

        lda  #8
        sec
        sbc  r7H
        clc
        adc  #1
        sta  a0L
        ora  #VERTICAL
        sta  gMAnzahl

        LoadB     a1L,14
        ldx  #a0L
        ldy  #a1l,
        jsr  BBMult

        ldy  a0L
        iny
        tya
        clc
        adc  geosSub
        sta  gMUnten

        rts

   :HP_Aufruf

        tax
        dex
        stx  a0L
        jsr  GotoFirstMenu

        LoadW   r0,COLOR_MATRIX
        LoadW    r1,FarbSpeicher
        LoadW    r2,1000
        jsr      MoveData

        LoadB    a1L,17
        idx  #a0L
        idy  #a1L
        jsr  BBMult

        lda  a0L
        clc
        adc  #<HP_Platz
        sta  r6L

        lda  a0H
        adc  #>HP_Platz
        sta  r6H
        LoadB   r0L,0
        LoadB   r10L0
        jsr  GetFile

        LoadW   r0,FarbSpeicher
        LoadW r1,COLOR_MATRIX
        LoadW   r2,1000
        jsr  MoveData

        LoadB   r2L,16
        LoadB   r2H,199
        LoadW   r3,0
        LoadW   r4,319
        jsr  RecoverRectangle

        rts

   : FarbSpeicher
        s       1000

Zur Besprechung des Listings:

1. Das Menü geosSub

Uns sind beim Starten des Programms natürlich weder die Anzahl noch die Namen der Hilfsprogramme bekannt. Wir behelfen uns damit, daß wir in der Menüdefinition Platz für maximal acht Hilfsprogramme bereitstellen; also sozusagen acht Blankomenüpunkte eintragen.
Die Beschränkung auf acht Hilfsprogramme wird auch von anderen Anwendungen üblicherweise vorgenommen.

Im Unterschied zum alten Listing ist die Konstante "gMUnten" verschwunden. Wir benutzen den Namen jetzt allerdings als Label für eine Adresse, da sich die Tiefe des Untermenüs aus der Anzahl der Unterpunkte berechnet.
Die Routine HP_Einbindung ermittelt den korrekten Wert und trägt diesen bei der Adresse gMUnten ein. Es ist daher egal, welchen Byte-Wert wir dieser Adresse als erstes im Quelltext zuweisen; wir haben einfach eine Null eingetragen.
Mit dem neu hinzugekommenen Label gMAnzahl verhält es sich genauso.

Als nächstes folgt die Definition des Menüpunktes Info. Diese hat sich gegenüber dem alten Listing nicht verändert. Was neu ist, sind die Vordefinitionen der Hilfsprogramm-Menüpunkte.
Jeder Menüpunkt besitzt zunächst einen Zeiger auf seinen Menünamen. Dort haben wir die Label "HP_Platz" + "x*17" eingetragen. Die Namen können maximal 16 Byte lang sein. Da die Hilfsprogramm-Namen als String mit einem Nullbyte abgeschlossen werden müssen, ergibt sich also ein Bedarf von 17 Byte pro Namen. Ab dem Label HP_Platz haben wir deswegen mit Hilfe des s-Op-codes Raum für 17*8 Bytes reserviert.

2. Die Routine HP_Einbindung

Wir wollen uns in der CD-Verwaltung darauf beschränken nur die Hilfsprogramme des aktuellen Laufwerks anzubieten (Dies wird auch von den meisten uns bekannten Anwendungen so gehandhabt). Dazu erstellen wir mittels der Geos-Routine "FindFTypes" eine Namensliste der Hilfsprogramme.
In Register r6 benötigt die Routine eine Adresse, ab der die Filenamen abgelegt werden sollen. Die Adresse für diesen Bereich haben wir bereits bei der Menüdefinition festgelegt (HP_Platz).
In r7L trägt man den Filetyp ein, nachdem gesucht werden soll (hier DESK_ACC für Hilfsprogramme). Die maximale Anzahl der zu übertragenden Filenamen (hier 8) schreibt man nach r7H.
Schließlich bestimmt das Register r10, nach welcher Fileklasse gesucht werden soll. Dabei wird r10 als Zeiger auf eine Class von Geos interpretiert. Trägt man hier nun den Wert $0000 ein, so wird ein Test auf die richtige Fileklasse unterlassen und jedes File mit dem richtigen Typ (hier DESK_ACC) wird übernommen.

Die Namen werden, falls sie kürzer als 16 Bytes sind, mit Nullbytes aufgefüllt und auch mit einem Nullbyte abgeschlossen. Damit haben wir also die gesuchten Namen genauso vorliegen, wie wir sie für den Menüaufbau benötigen.

Um die Einbindung der Hilfsprogramme im Menü abzuschließen, müssen wir noch die Anzahl der Menüpunkte und den Wert der unteren Koordinate des Menüs bestimmen. (Es können ja durchaus weniger als acht Hilfsprogramme auf der Diskette vorliegen!) Zur Lösung hilft uns auch hier die Routine FindFTypes weiter, denn diese gibt in r7H zwar nicht die Anzahl der übernommen Filenamen zurück, doch steht hier die Anzahl der noch verbleibenden Einträge. Wir ziehen also im Programm nach jsr FindFTypes von dem Wert 8 den Inhalt von r7H ab und erhalten so die benötigte Anzahl der Hilfsprogramme.

Da unter dem Menüpunkt geos auch noch der Punkt Info erscheint, müssen wir diesen Wert um 1 erhöhen. Schließlich dürfen wir nicht vergessen, daß in dem Byte, welches über die Anzahl der Menüpunkte bestimmt, auch die Ausrichtung (horizontal, vertikal) des Menüs festgelegt wird. Daher folgt der Befehl ora #VERTICAL.

Nach Abspeichern des Wertes müssen wir noch die untere Koordinate des Menüs berechnen.
Für jeden Menüpunkt rechnet man 14 Pixel plus einen Pixel für den Rahmen plus den Wert der oberen Koordinate (dieser steht bei uns in der Adresse geosSub ).

Da die Routine HP_Einbindung die Menüdefinition verändert, muß deren Aufruf noch vor dem Aufruf von DoMenu erfolgen.

3. Die Routine HP_Aufruf

Für das korrekte Starten der Hilfsprogramme ist die Routine HP_Aufruf verantwortlich. In der Definition des geosSub-Menüs haben wir bei der Vordefinition der neuen Menüpunkte als Menüpunktroutine immer die selbe Routine HP_Aufruf angegeben. Wir können aber trotzdem unterscheiden, welcher Menüpunkt angeklickt wurde, denn DoMenu übergibt der aufgerufenen Routine die Nummer des Menüpunktes im Akku (Erster Eintrag Info hat die Nummer 0). Wir erniedrigen diesen Wert in unserer Routine um 1 und sichern ihn in dem Arbeitsspeicher a0L. Es folgt zum Abbau des Menüs der Befehl jsr GotoFirstMenu.

Von BSW/Geoworks wurde vereinbart, daß Anwendungen die Vordergrundgrafik sowie deren Farben nach der Rückkehr des Hilfsprogramms selber wieder setzen muß. Allerdings müssen Hilfsprogramme, wenn sie die beiden oberen Kachelreihen (y-Koordinate 0-15) nutzen wollen, diesen Bereich selber sichern. Aus diesem Grund sichern wir die Farben unserer Grafik (1000 Bytes ab COLOR_MATRIX) in dem Bereich FarbSpeicher mit Hilfe der Geos-Routine MoveData.

Nach dem Laden eines Hilfprogramms muß ein Swap-File angelegt werden, welches den von dem Hilfsprogramm überschriebenen Speicher enthält. Das müssen wir aber nicht extra programmieren, denn die Geos-Routine GetFile nimmt uns die Arbeit ab. In r6 erwartet GetFile einen Zeiger auf den Namen des zu ladenen und zu speichernden Programms. Wir multiplizieren dazu a0L mit 17 und addieren darauf den Wert von HP_Platz. In r0L müssen wir noch eine 0 eintragen, damit das Hilfsprogramm von GetFile auch gestartet wird.

Das Byte r10L sollte ebenfalls den Wert 0 erhalten. Das Byte war ursprünglich dafür vorgesehen, dem Hilfsprogramm mitzuteilen, ob und welche Bildschirminformationen gerettet werden müssen. Dieses wurde aber in der weiteren Entwicklungsphase von Geos wieder fallengelassen.
Um also kompatibel mit den alten Hilfsprogrammen zu bleiben, sollte das Byte r10L auf Null gesetzt werden.

Die Routine GetFile startet das Hilfsprogramm und legt ein Swapfile an, das Hilfeprogramm übernimmt das Restaurieren des gesicherten Bereichs und löscht das Swapfile. Somit müssen wir nur noch die Farben zurücksetzen und laut BSW/Geoworks-Konventionen den Vordergrundbildschirm ohne die beiden oberen Kachelreihen wiederherstellen.

Für das Zurückschreiben der Farben benutzen wir - wie beim Sichern - wieder die Routine MoveData. Den Vordergrundbildschirm restaurieren wir, indem wir mit Hilfe der Routine RecoverRectangle einen rechteckigen Bereich von der Hintergrundgrafik in den Vordergrund kopieren. Man übergibt der Routine in r2L und r2H die obere und untere Grenze und in r3 und r4 die linke und die rechte Grenze.

 

Ralf Bonse

 

 

 




Dieser Artikel ist Bestandteil von:

Ausgabe 23

! - - - - - M I C R O F I L M - - - - - ! | Editorial | Produktion & Versand | Das Jahrestreffen 1992 | Der Wettbewerb | M&T Reaktionen | Rechtsstreit um geoROM | 8 Mhz Karte | Berichte von den Regionalgruppen | Übersetzungen | Tip zu GEOS LQ | CLI & Hexer | Neue GT Disketten | KONFIGURIEREN HD | Büro-Kurs (Teil 6): Arbeiten mit GeoFile | GeoMakeBoot von CMD | Kurs: Programmieren (Teil 8) | Berührungsängste (Teil 4) | Die neue GeoThek (4) | CMD Hard- und Software Angebote | GeoBox Online | Tommy's Superscanner Graphiken | Aktuelles | Der Wettbewerb (II) | Certified Software Programme direkt vom Distributor | Neue Bücher von Data Becker, TEWI und Vogel Verlag | Scannen und PC/Geos | Anmerkung zum Quattro Pro Einstieg in der GUP 22: | Viren Verseuchung ? | Quattro Pro Einstieg (II. Teil) | Neue PD Disketten, DOS Spezial Disketten, Font Katalog


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/1384


Letzte Änderung am 01.11.2019