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



Links

Copyright-Bestimmungen: siehe Über diese Seite
Classic Computer Magazines
[ Join Now | Ring Hub | Random | << Prev | Next >> ]