← ST-Computer 12 / 1988

Mini-Maus-Bibliothek

Programmierpraxis

Eines der Probleme, unter denen Assembler-Programmierer oft leiden, ist die Abfrage der derzeitigen Position der Maus. Einen Lösungsvorschlag stellt die folgende Mini-Maus-Bibliothek für den GST Macro-Assembler dar, die sicher auch leicht auf andere Assembler übertragen werden kann. Sie stellt dem Programmierer eine Anzahl nützlicher Makros zur Beeinflussung und Abfrage des Mauszeigers zur Verfügung. Die Bibliothek kann durch einen am Anfang des Quelltextes plazierten INCLUDE-Befehl nachgeladen werden.

Folgende Funktionen stehen dann zur Verfügung:

1 GEM_INIT:
Diese Funktion muß am Anfang jedes Programmes stehen, das die Funktionen aus der Maus-Bibliothek benutzt. Beim Aufruf werden einige für GEM-Funktionen nötige Variablen (siehe unten) initialisiert.

2 GEM_EXIT:
Sollte vor Beendigung des Programms aufgerufen werden. Dadurch wird es beim GEM abgemeldet. Weitere GEM-Aufrufe sind danach nicht mehr möglich.

3 MOUSEON:
Mittels einer Funktion des Line-A-Emulators wird der Mauszeiger eingeschaltet.

4 MOUSEOFF
Bevor man innerhalb eines Programmes Texte oder Grafiken auf dem Bildschirm ausgeben läßt, sollte man mit dieser Funktion den Mauszeiger ausschalten, da er sonst diese Ausgaben wieder zerstören kann.

5 DEFMOUSE form
Mit dieser Funktion des AES kann der Mauszeiger auf eine von acht vordefinierten Formen geschaltet werden. Der Parameter form kann alle Adressierungsarten des M68000 annehmen, es muß aber in Wortgröße darauf zugegriffen werden können (gerade Adresse im Speicher!). Dabei gilt für form:

0: Pfeil
1: Schreibmarke
2: Biene
3: zeigende Hand
4: flache Hand
5: dünnes Fadenkreuz
6: dickes Fadenkreuz
7: hohles Fadenkreuz

6 GETMOUSE x,y,buttons
Dieser Macro gibt nach Aufruf einer VDI-Funktion die Bildschirmkoordinaten und den Status der Maustasten in den Parametern x, y und buttons zurück. Diese Parameter können alle Adressierungsarten, bis auf “immediate” (z.B. #34) annehmen. Auch auf sie muß wieder in Wortgröße zugegriffen werden können.

Der Quelltext, in den die Maus-Bibliothek eingebunden werden soll, muß folgende Bedingungen erfüllen:

  1. Er darf keine der unten genannten Variablen enthalten.
  2. Die Programmsektionen müssen die korrekten Namen TEXT, DATA und BSS tragen, da GEM INIT zwischen diesen Sektionen umschaltet.

Das Demoprogramm testet alle diese Macros. Es gibt auf Druck irgendeiner Maustaste aus, welche es war, und an welcher Position sich der Mauszeiger befindet.

Verwendete Variablen in der Mausbibliothek:

AESPB bzw. VDIPB: Anfangsadressen von Listen, die die Adressen von Variablenarrays enthalten, die für AES- bzw. VDI-Aufrufe benötigt werden.

CONTROL,GLOBAL,INT_IN,INT_OUT, ADDR_IN, ADDR_OUT: Arrays, in denen die Parameterübergabe an bzw. von AES und VDI stattfindet. ADDR_IN und ADDR_OUT entsprechen bei VDI- Aufrufen den Arrays POINTSJN bzw. POINTS_ OUT. Die beiden eigentlich völlig verschiedenen Felder wurden zusammengelegt, um etwas Speicherplatz zu sparen.

VDIHANDLE: Zwischenspeicher für die Nummer des Grafiktreibers. Diese Nummer wird für alle VDI-Aufrufe benötigt.

Verwendete Variablen im Demoprogramm:

X,Y: Speicherstellen für die Koordinaten der Maus.

BUTTON1,BUTTON2: Zwischenspeicher für den Status der Maus.

MAUSFORM: Zähler für den Parameter, der die Form der Maus bestimmt.

DEZPUF: Puffer, in dem die Ziffern, die das Unterprogramm DEZOUT erzeugt, vor der Ausgabe abgelegt werden.

************************************************* * * * Makrobibliothek für Mausprogrammierung * * * * geschrieben 1988 von Ralph Egelseer * * * ************************************************* ;------------------------------------------------ ;- Initialisierung des GEM ;------------------------------------------------ gem_init MACRO SECTION data aespb DC.L control,global,int_in,int_out, addr_in,addr_out vdipb DC.L control,int_in,addr_in,int_out,addr_out SECTION bss control DS.W 12 global DS.W 15 int_in DS.W 128 int_out DS.W 128 addr_in DS.W 128 addr_out DS.W 128 vdihandle DC.W 1 SECTION text MOVE.W #10,control ;Appl_Init CLR.W control+2 MOVE.W #1,control+4 CLR.L control+6 MOVE.L #aespb,D1 MOVE.W #200,D0 TRAP #2 MOVE.W int_out,D0 ;Bei Fehler: Programm abbrechen CMP.W #-1,D0 BNE geminit1 CLR.W -(SP) TRAP #1 geminit1 MOVE.W #77,control ;Graf_Handle CLR.W control+2 MOVE.W #5,control+4 CLR.L control+6 MOVE.L #aespb,D1 MOVE.W #200,D0 TRAP #2 MOVE.W int_out,vdihandle ;Handleretten ENDM ;------------------------------------------------ ;- verlassen des GEM ;------------------------------------------------ gem_exit MACRO MOVE.W #19,control ;Appl_Exit CLR.W control+2 MOVE.W #1,control+4 CLR.L control+6 MOVE.L #aespb,D1 MOVE.W #200,D0 TRAP #2 ENDM ;------------------------------------------------ ;- Mauszeiger einschalten ;------------------------------------------------ mouseon MACRO DC.W $A009 ENDM ;------------------------------------------------ ;- Mauszeiger ausschalten ;------------------------------------------------ mouseoff MACRO DC.W $A00A ENDM ;------------------------------------------------ ;- Form des Mauszeigers bestimmen; >form< v. bis 7 ;------------------------------------------------ defmouse MACRO form MOVE.W #78,control ;graf_mouse MOVE.W #1,control+2 MOVE.W #1,control+4 MOVE.W #1,control+6 CLR.W control+8 MOVE.W [form],int_in MOVE.L #aespb,D1 MOVE.W #200,D0 TRAP #2 ENDM ;------------------------------------------------ ;- Holt die Koordinaten der Maus nach >mousex< u. ;- >mousey<, den Status nach >mousebut< ;------------------------------------------------ getmouse MACRO mousex,mousey,mousebut MOVE.W #124,control ;vq_mouse CLR.W control+2 CLR.W control+6 MOVE.W vdihandle,control+12 MOVE.L #vdipb,D1 MOVE.W #115,D0 TRAP #2 MOVE.W addr_out,[mousex] MOVE.W addr_out+2,[mousey] MOVE.W int_out,[mousebut] ENDM

Listing 1: Makrobibliothek für die Mausprogrammierung

*************************************************** * * * Demoprogramm für die Mausbibliothek * * * * geschrieben 1988 von Ralph Egelseer * * * *************************************************** INCLUDE maus.mac SECTION text gem_init mouseoff PEA clrtext ; Bildschirm löschen MOVE.W #9,-(SP) TRAP #1 ADDQ.L #6, SP PEA starttext ; Startmeldung ausgeben MOVE.W #9,-(SP) TRAP #1 ADDQ.L #6,SP CLR.W mausform loop1 mouseon defmouse mausform loop2 getmouse x,y,button1 ; Warten bis Taste gedrückt TST.W button1 BEQ.S loop2 loop3 getmouse x,y,button2; Warten bis Taste losgelassen TST.W button2 BNE.S loop3 mouseoff PEA xtext ; X-Koordinate ausgeben MOVE.W #9,-(SP) TRAP #1 ADDQ.L #6,SP MOVE.W x,D0 BSR dezout PEA ytext ; Y-Koordinate ausgeben MOVE.W #9,-(SP) TRAP #1 ADDQ.L #6,SP MOVE.W y,D0 BSR dezout CMP.W #1,button1 ; Linke Taste gedrückt? BNE lab1 PEA lttext ; Ja: entspr. Text ausgeben MOVE.W #9,-(SP) TRAP #1 ADDQ.L #6,SP BRA lab2 lab1 PEA rttext ; Text für rechte Taste ausgeben MOVE.W #9,-(SP) TRAP #1 ADDQ.L #6,SP lab 2 PEA tasttext ; Ergänzenden Text ausgeben MOVE.W #9,-(SP) TRAP #1 ADDQ.L #6,SP ADDQ.W #1,mausform ; Mausform weiterschalten ANDI.W #7,mausform MOVE.W #7,-(SP) ; Tastendruck abwarten TRAP #1 ADDQ.L #2,SP CMP.W #'q',D0 ; Q-Taste gedrückt? BNE loop1 ; Nein: Nochmal das Ganze mouseon gem_exit CLR.W -(SP) ; Zurück zum Desktop TRAP #1 ; Ausgabe der unteren 16 Bit von DO als Dezimalzahl dezout LEA.L dezpuf,A6 dloop1 AND.L #$FFFF,D0 DIVU #10,D0 SWAP D0 ADDI.W #48,D0 MOVE.B D0,(A6)+ SWAP D0 TST.W D0 BNE dloop1 dloop2 MOVE.B -(A6),D0 MOVE.W D0,-(SP) MOVE.W #2,-(SP) TRAP #1 ADDQ.L #4,SP CMP.L #dezpuf,A6 BHI.S dloop2 RTS SECTION data clrtext DC.B 27,'E',0 starttext DC.B 'Demoprogramm für Maus-Makro-Bibliothek',13,10,10,0 xtext DC.B 'X = ',0 ytext DC.B ' ; y = ',0 tasttext DC.B 'gedrückt.',13,10,10,0 lttext DC.B ' ; Linke Taste ',0 rttext DC.B ' ; Rechte Taste ',0 SECTION bss x DS.W 1 y DS.W 1 button1 DS.W 1 button2 DS.W 1 mausform DS.W 1 dezpuf DS.B 5

Listing 2: Demoprogramm für die Mausbibliothek

Ralph Egelseer