|
|
23.01.2025 | Archiv # Recherche # Links # Kontakt # Gästebuch # Impressum |
Index Login Die Anzeige des Archivs erfolgt grafisch. Ändern |
Kurs: Programmieren (Teil 8)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. 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. 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. 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. 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. 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. 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
Kurzlink hierhin: http://geos-printarchiv.de/1384 |
Letzte Änderung am 01.11.2019 |