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:
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