Mini-Maus-Bibliothek

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
Aus: ST-Computer 12 / 1988, Seite 94

Links

Copyright-Bestimmungen: siehe Über diese Seite