Mit Auto-Maus ist es möglich, Mausklicks aufzuzeichnen oder abzuspielen. Das Aufzeichnen und Abspielen geschieht immer nach einem Reset oder nach dem einschalten des Rechners, wobei Auto-Maus aus dem Auto-Ordner gestartet werden muß. Es lassen sich dadurch z.b. auch GEM-Programme automatisch nach einem Reset starten. Man kann aber auch eine Textverarbeitung mit Auto-Maus starten und sich dann einen Text laden lassen. Das Programm müsste auf allen Atari ST-Rechnern laufen auf denen die Line-A-Routinen vorhanden sind.
Alle aufgezeichneten Mausklicks werden in der Datei 'A_MAUS.DAT' abgespeichert. Sollte die Datei ‘A_MAUS.DAT im Auto-Ordner nicht vorhanden sein, wird Maus REC 2.0 ausgegeben. Jetzt wird jeder Mausklick mit der linken Maustaste aufgezeichnet. Dabei merkt sich Auto-Maus die aktuelle Position und die vergangene Zeit seit dem letztem Mausklick. Die Anzahl der Mausklicks ist auf 25 begrenzt. Es kann aber im Listing der Wert von A_KLICK höher gesetzt werden, dadurch sind mehr Mausklicks möglich. Sind die 25 Mausklicks erreicht, kann man den Mauszeiger nicht mehr bewegen. Die Daten der Mausklicks werden mit Alternate + Help abgespeichert, und es erfolgt ein Reset. Dies kann auch vor dem 25. Mausklick geschehen. Dabei wird die Datei 'A_MAUS.DAT' im Auto-Ordner erzeugt.
Sollte Auto-Maus die Datei 'A_MAUS.DAT' im Auto-Ordner finden, wird + Auto-Maus 2.2 + ausgegeben. Danach werden die gespeicherten Mausklicks abgespielt. Während des Abspielens ist es nicht möglich, den Mauszeiger zu bewegen. Das Abspielen kann man durch das Drücken beider Maustasten abbrechen.
Will man einen Menüeintrag mit Auto-Maus ansprechen, muß man beim Aufnehmen zuerst den Mauszeiger in die obere Menüleiste schieben und danach die linke Maustaste drücken. Beim Abspielen werden nur die Positionen genau angesteuert, bei denen die linke Maustaste gedrückt wurde.
Wenn sich das Programm mit der AES -Funktion APPL_INIT (AES 10) anmelden läßt, wurde Auto-Maus nicht aus dem Auto-Ordner gestartet, und das Programm wird abgebrochen.
Die aktuelle Mausposition wird über die negativen Line-A-Variablen geholt. Dazu muß man zuerst deren Adresse ermitteln. Die x-Position steht dann in GCURX (-$25A) und die y-Position in GCRY (-$258). Ob der Maus-Interrupt eingeschaltet ist, steht in MOUSE_FLAG (-$153).
Den Mausvektor liest man aus der Struktur, die Kbdvbase (Xbios 34) liefert. Er wird aber nach dem Starten der Programme aus dem Auto-Ordner von GEM überschrieben. Deshalb installiert das Programm eine VBL-Routine (NEU_VBL), die den Mausvektor mit einem Merker belegt. Die VBL-Routine überprüft, ob der Merker noch gesetzt ist. Wenn dies nicht mehr der Fall ist, wurde er von GEM überschrieben. Jetzt wird der Mausvektor auf eine eigene Routine nach dem XBRA-Protokoll umgebogen. Diese Routine untersucht jedes Mauspaket nach einer gedrückten linken Maustaste ($FA). Ist die linke Maustaste gedrückt, merkt sich das Programm die Position (GCRX,GCRY) und die Zeit über die Systemvariable _frclock ($466) seit dem letzten Mausklick. Sollte kein Speicher mehr für die Mausklicks vorhanden sein, werden die Mauspakete nicht mehr an die Originalroutine weitergegeben, so daß sich die Maus nicht mehr bewegen läßt.
Der Hardcopy-Vektor (scr_dump $502) wird auf eine eigene Routine umgebogen. Diese Routine übemimmt das Abspeichern. Sie wird mit Alternate + Help aufgerufen.
Beim Abspielen wird zuerst der Mausvektor gesperrt. Danach werden die Mausklicks an die original Mausroutine gesendet. Diese übernimmt dann die Positionierung und das Ausführen der Klicks mit der Maus. Die Mausklicks werden aus einer VBL-Routine (NEU_VBL/ SP_10) an die original Mausroutine gesendet. Zwischen dem Absenden von Mausklicks muß immer eine Pause (WAIT_RELASE und WAIT_PRESS ) erfolgen, damit das aktuelle Programm auf die Mausklicks reagieren kann. Die Maus wird nach Ausführen eines Klicks an die nächste Klickposition verschoben. Ist der letzte Klick ausgeführt, wird der Mausvektor mit dem Zeiger auf die original Mausroutine überschrieben.
Auto-Maus ist mit MAS dem Makro Assembler von Borland (Turbo C) programmiert.
*--------------------------*
* Auto Maus *
* Ralf Stachs *
* -------------------------*
* (c) 1991 MAXON Computer *
* -------------------------*
*************
* Auto Maus 2.0 und Maus REC 2.0
*
* 2.1 Pause zwischen PRESS und RELASE
* 2.2 Pause zwischen MOVE und PRESS
*
*************
;A_KLICK ->Anzahl der Klicks
;WAIT_RELASE->Anzahl der VBL Aufrufe zwischen PRESS und RELASE
;WAIT_PRESS ->Anzahl der VBL Aufrufe zwischen MOVE und PRESS
;WAIT_RELASE+WAIT_PRESS nicht größer 10
A_KLICK equ 25
WAIT_RELASE equ 5
WAIT_PRESS equ 2
;TRAPS
GEMDOS equ 1
BIOS equ 13
XBIOS equ 14
RESI_ANFANG:
jmp INSTALL ;Auto Maus installieren
;Klick Steuerung
;Verzögerung/X-Position/Y-Position bei Mausklick
START_DAT:
dc.b "MAUS_1" ;Kennung
KLICK_1:dc.l 0 ;Pausenzeit
dc.w 0,0 ;X-Position/Y-Position
ds.l A_KLICK*2 ;Platzhalter für 25 Klick-Steuerungen
ENDE_DAT:dc.l -1 ;Ende der Klick-Steuerung
;S_DAT = Belegter Speicher des DAT File
S_DAT equ ENDE_DAT-START_DAT
;VBL-Routine Maus positionieren und Doppelklick ausführen
dc.b "XBRA" ;XBRA Protokoll
dc.b "RS_5" ;eigene Erkennung
dc.l 0 ;alter Vektor
;Mausvektor sperren oder verbiegen auf MAUS_REC
;**********************************************
NEU_VBL:
tst.b VEK_SET ;GEM Mausvektor schon gesetzt
bne SP_15 ;ja
move.l MAUS_VEKTOR,a1 ;Adresse Mausvektor a1
lea OLD_M_VEK,a0 ;alter Mausvektor (RTS)
cmp.l (a0)+,(a1)+ ;alter Mausvektor noch da
beq SP_11 ;ja
move.l -(a1),OLD_M_VEK ;alten Mausvektor merken
move.l #MAUS_REC,(a1) ;Vektor auf eigene Mausroutine
;aufnehmen oder abspielen
tst.b REC_PLAY ;Maus aufnehmen
beq SP_10 ;nein
;Klicksteuerung aufnehmen (verbiegen auf MAUS_REC)
;*************************************************
;Startzeit merken
move.l $466,TIME ;_frclock
;vbl-Slot löschen
move.l VBL_SLOT,a0
move.l #0,(a0)
SP_11: rts
;Klicksteuerung abspielen (Mausvektor sperren)
;*********************************************
SP_10: move.b #1,MAUS_AUS ;Mausbewegung von A_MAUS
move.b #1,VEK_SET ;GEM Mausvektor gesetzt
move.l $466, TIME ;_frclock merken
move.l KLICK_ADR,a0 ;Adresse der aktuellen Klick-Steuerung
; .1 Pausenzeit / .w X-Position /.w Y-Position
tst.l (a0) ;erste Pausenzeit gleich 0
beq SP_23 ;dann abspielen
rts
;Maus abpielen
;*************
SP_15:
;Maus aus (MOUSE_FLAG)?
move.l M_FLAG_ADR,a1 ;Adresse Mouse Flag
tst.b (a1) ;Maus ausgeschaltet
bne ENDE
tst.b LAST ;zum letztem Mal RELEASE
bne SP_23 ;ja
btst.b #1 $FF8800 ;Floppy A selektiert
beq ENDE ;ja
btst.b #2,$FF8800 ;Floppy B selektiert
beq ENDE ;ja
;Pausenzeit berechnen
move.l KLICK_ADR,a0 ;Adresse der aktuellen Klick-Steuerung
;.l Pausenzeit / . w X-Position /.w Y-Position
move.l $466,d0 ;_frclock in d0
sub.l TIME,d0 ;Pausenzeit berechnen
;nach x VBL Aufrufen linke Maustaste loslassen
cmp.l #WAIT_RELASE,d0 ;x VBL-Aufrufe Pause
blt ENDE ;kleiner x
bgt SP_90 ;größer x
move.w sr,-(sp) ;Status retten
ori #$700,sr ;Interupts sperren
move.l OLD_M_VEK,a2 ;Mausvektor in a2
lea RELASE,a0 ;Adresse Mauspaket in a0
jsr (a2) ;in Mausroutine springen
move.w (sp)+,sr ;alten Status herstellen
bra ENDE
;Klickzeit erreicht
SP_90: cmp.l (a0)+,d0 ;Pausenzeit <= Zähler
bis ENDE ;ja
;Maus Positionieren
move.b #0,MOVE+1 ;X Wert in Mauspaket auf 0
move.b #0,MOVE+2 ;Y Wert in Mauspaket auf 0
;X-Verschiebung berechnen
move.l X_POS,a2 ;Adresse der X-Position
move.w (a2),d0 ;ist X-Position in d0
move.w (a0)+,d1 ;soll X-Position in d1
sub.w d0,d1 ;soll X-Pos. Minus ist X-Pos.
beq Y_WERT ;soll X-Pos gleich ist X-Pos.
bmi SP_2 ;negativer X-Wert
;positiver X-Wert
cmp.w #127,d1 ;größer gleich 127
bge SP_3 ;ja
move.b d1,MOVE+1 ;X-Bewegung
bra Y_WERT
SP_3: move.b #127,MOVE+1 ;max Mausbewegung
bra Y_WERT
;negativer X-Wert
SP_2: cmp.w #-127,d1 ;kleiner gleich -127
bls SP_4 ;ja
move.b d1,MOVE+1 ;X-Bewegung
bra Y_WERT
SP_4: move.b #-127,MOVE+1 ;max Mausbewegung
;Y-Verschiebung berechnen
Y_WERT: move.l Y_POS,a2 ;Adresse der Y-Position
move.w (a2),d0 ;ist Y-Position in d0
move.w (a0),d1 ;soll Y-Position in d1
sub.w d0,d1 ;soll Y-Pos minus ist Y-Pos.
beq POS_OK ;soll Y-Pos gleich ist Y-Pos
bmi SP_5 ;negativer Y-Wert
;positiver Y-Wert
cmp.w #127,d1 ;größer gleich 127
bge SP_6 ;ja
move.b d1,MOVE+2 ;Y-Bewegung
bra POS_OK
SP_6: move.b #127,MOVE+2 ;max Mausbewegung
bra POS_OK
;negativer Y-Wert
SP_5: cmp.w #-127,d1 ;kleiner gleich -127
bls SP_7 ;ja
move.b d1,MOVE+2 ;Y-Bewegung
bra POS_OK
SP_7: move.b #-127,MOVE+2 ;max. Mausbewegung
;X-Position OK
POS_OK: move.l KLICK_ADR, a0 ;Adresse von aktueller Klick-Steuerung
add.l #4,a0 ;Adresse von Soll-X-Position
move.l X_POS,a1 ;Adresse ist X-Position
cmp.w (a0)+,(a1)+ ;Soll-X-Position gleich ist X-Position
bne MOVE_MAUS
;Y-Position OK
move.l Y_POS,a1 ;Adresse ist Y-Position
cmp.w (a0)+,(a1)+ ;soll Y-Position gleich ist Y-Position
beq KLICK ;ja
;Maus auf Zielpunkt bewegen
MOVE_MAUS:
move.w sr,-(sp) ;Status retten
ori #$700,sr ;Interrupts sperren
move.l OLD_M_VEK,a2 ;Mausvektor in a2
lea MOVE,a0 ;Adresse Mauspaket
jsr (a2) ;in Mausroutine springen
move.w (sp)+,sr ;alten Status herstellen
rts
;X und Y Position ereicht
;Pause abgelaufen?
KLICK: sub.b #1,SAVE_PRESS ;Pause minus 1
tst.b SAVE_PRESS ;noch Pause
bne ENDE ;ja
;neue Pause setzen x VBL Aufrufe Pause für PRESS
move.b #WAIT_PRESS,SAVE_PRESS
;Klick ausführen
move.w sr,-(sp) ;Status retten
ori #$700,sr ;Interupts sperren
move.l OLD_M_VEK,a2 ;Mausvektor in a2
lea PRESS,a0 ;Adresse Mauspaket in a0
jsr (a2) ;in Mausroutine springen
move.w (sp)+,sr ;alten Status herstellen
;letzte Klick-Steuerung
move.l KLICK_ADR,a0 ;Adresse von aktueller Klick-Steuerung
add.l #8,a0 ;Adresse der nächsten Klick-Steuerung
move.l (a0),d0 ;Pausenzeit oder Ende
cmp.l #-1,d0 ;Ende
bne NEXT_KLICK ;nein
;ende der Klick-Steuerung
move.b #WAIT_RELASE+2,LAST ;x VBL-Aufrufe Pause
;linke Maustaste loslassen
SP_23: sub.b #1,LAST ;minus 1
cmp.b #1,LAST ;Zeit für RELASE0?
bne ENDE ;nein
;RELASE
move.w sr,-(sp) ;Status retten
ori #$700,sr ;Interupts sperren
move.l OLD_M_VEK,a2 ;Mausvektor in a2
lea RELASE,a0 ;Adresse Mauspaket in a0
jsr (a2) ;in Mausroutine springen
move.w (sp)+,sr ;alten Status herstellen
;Mausvektor wieder herstellen
SP_91: move.b #0,MAUS_AUS ;Mausbewegung von Maus
move.l MAUS_VEKTOR,a0 ;Adresse des Mausvektors
move.l (a0),d0 ;Vektor in d0
cmp.l #MAUS_REC,d0 ;ist Vektor verändert worden
bne SP_33 ;ja
move.l OLD_M_VEK,(a0) ;alten Mausvektor herstellen
;vbl-Slot löschen
SP_33: move.l VBL_SLOT,a0 ;Adresse VBL-SLOT
move.l #0,(a0) ;löschen
rts
NEXT_KLICK:
move.l a0,KLICK_ADR ;Adresse neue Klick-Steuerung
move.l $466,TIME ;_frclock merken
ENDE: rts
;Neue Mausroutine
;****************
;Mausroutine für Aufnahme
dc.b "XBRA" ;XBRA-Protokoll
dc.b "RS_6" ;eigene Erkennung
OLD_M_VEK:
dc.l 0 ;alter Vektor
MAUS_REC:
;Aufnahme abspielen
tst.b REC_PLAY ;Aufnahme abspielen
beq SP_16 ;ja dann alte Routine anspringen
;Aufnahme beendet
tst.b END_REC ;Rec ende
bne SP_32 ;nein
rts
SP_32: movem.l d0/a0-a2,-(sp) ;Register retten
;Maus aus
move.l M_FLAG_ADR,a1 ;Adresse von MOUSE_FLAG
tst.b (a1) ;Maus ausgeschaltet
bne SP_14 ;ja dann zu alter Mausroutine
;Maus Header?
move.b (a0)+,d0 ;Header Kopf in d0
;linke Maustaste dann Zeit und Koordinaten merken
cmp.b #$fa,d0 ;linke Maustaste gedrückt
beq SP_25 ;ja
move.b d0,HEADER ;Maustaste merken
bra SP_14 ;zur GEM Mausroutine
;testen, ob Maustaste losgelassen
SP_25: cmp.b #$fa,HEADER ;letzte Maustaste links
bne SP_26 ;nein dann merken
;Klick weder merken, noch weitergeben
movem.l (sp)+,d0/a0-a2 ;Register zurückschreiben
rts
SP_26: move.b d0,HEADER ;Maustaste merken
;Zeit und Koordinaten merken
move.l KLICK_ADR,a2 ;Adresse aktuelle Klick-Steuerung
move.l $466,d0 ;_frclock in d0
sub.l TIME,d0 ;Pausenzeit berechnen
move.l d0,(a2)+ ;Pausenzeit speichern in Klick-Steuerung
;bei Doppelklick gleiche Position
cmp.l #$f,d0 ;größer als $f
bgt SP_35 ;ja
;letzte x/y-Position gleich neue x/y-Position
move.l a2,a1 ;Adresse aktuelle Klick-Steuerung
sub.l #8,a1 ;Adresse letzte x/y-Position
move.l (a1),(a2)+ ;letzte x/y-Position gleich neue x/y-Position
bra SP_34
SP_35 : move.l X_POS,a1 ;Adresse X-Pos.
move.b (a0)+,d0 ;X-Mausbewegung in d0
ext.w d0 ;d0 vorzeichenrichtig auf .w
add.w (a1),d0 ;plus X-Pos.
move.w d0,(a2)+ ;X-Pos. merken
move.l Y_POS,a1 ;Adresse X-Pos
move.b (a0)+.d0 ;Y-Mausbewegung in d0
ext.w d0 ;d0 vorzeichenrichtig auf .w
add.w (a1).d0 ;plus Y-Pos.
move.w d0,(a2)+ ;Y-Pos. merken
;letzte Klick-Steuerung?
SP_34: move.l (a2),d0 ;Pausenzeit oder -1
cmp.l #-1,d0 ;letzte Klick-Steuerung
beq SP_30 ;ja
;nächste Klick-Steuerung
move.l #-1,(a2) ;vorläufiges Ende kenzeichnen
move.l $466,TIME ;neue Startzeit setzen
move.l a2,KLICK_ADR ;Adresse der nächsten Klick-Steuerung
bra SP_14
;letzte Klick-Steuerung
SP_30: move.b #0,END_REC ;Aufnahme beendet
;alte Mausroutine anspringen
SP_14: movem.l (sp)+,d0/a0-a2 ;Register zurückschreiben
SP_16: tst.b MAUS_AUS ;Mausbewegung von A_MAUS
bne SP_21 ;ja
move.l OLD_M_VEK,-(sp) ;alte Mausroutine
SP_36: rts ;anspringen
;beide Maustasten gedruckt, dann abbrechen nur beim Abspielen
;************************************************************
SP_21: movem.l d0/a0-a1,-(sp) ;Registerretten
move.b (a0),d0 ;Header Kopf in d0
cmp.b #$fb,d0 ;beide Maustasten gedrückt
bne SP_24 ;nein
;Maus abspielen abbrechen
bsr SP_91 ;VBL-Slot löschen
;Mausvektor wiederherstellen
SP_24: movem.l (sp)+,d0/a0-a1 ;Register zurückschreiben
rts
;Speichert die Daten der Klick-Steuerung
;***************************************
;Speichern der Klick-Steuerung in A_MAUS.DAT
dc.b "XBRA" ;XBRA Protokoll
dc.b "RS_7" ;eigene Erkennung
OLD_SCR_VEK: dc.l 0 ;alter Vektor
SAVE_KLICK:
;A_MAUS DAT File öffnen
move.w #0,-(sp) ;Diskettenname
pea FNAME ;Pfad mit Dateinamen
move.w #$3c,-(sp) ;Fcreate aufrufen
trap #GEMDOS
addq.l #8,sp
move.w d0,FILE_HANDLE ;Handle merken
;Daten schreiben
pea START_DAT ;Adresse des Buffers
move.l #S_DAT,-(sp) ;Anzahl der Bytes
move.w FILE_HANDLE,-(sp)
move.w #$40,-(sp) ;Fwrite
trap #GEMDOS
lea $c(sp),sp
;File schließen
move.w FILE_HANDLE,-(sp)
move.w #$3E,-(sp) ;Fclose aufrufen
trap #GEMDOS
addq.l #4,sp
;Reset ausführen
move.l $fc0004.a0 ;Reset-Adresse laden
jmp (a0) ;Reset ausführen
;Variablen und Flags
:********************
;MAUS_VEKTOR -> Adresse des Vektors der Mausroutine
;OLD_M_VEK -> alter Mausvektor
;X_POS -> Adresse X-Position des Mauszeigers
;Y_POS -> Adresse Y-Positxon des Mauszeigers
;M_FLAG_ADR -> Adresse von MOUSE_FLAG
; 0 Maus wird angezeigt
; 1 Maus wird nicht angezeigt
;VBL_SLOT -> Adresse des VBL-Slot
;TIME -> Zähler für Verzögerung
;KLICK_ADR -> Adresse der aktuellen Klick-Steuerung
;FILE_HANDLE -> Kennung von A_MAUS DAT
;REC_PLAY -> Flag 0 Maus abspielen
; 1 Maus aufnehmen
;OLD_SCR_VEK -> alte Hardcopyvektor
;VEK_SET -> Flag 0 Bios-Mausvektor gesetzt
; 1 GEM-Mausvektor gesetzt
;MAUS_AUS -> Flag 0 Mausbewegung von A_MAUS
; 1 Mausbewegung von Maus
;END_REC -> Flag 0 Aufnahme beendet
; 1 Aufnahme aktiv
;LAST -> Speicher für WAIT_RELASE beim letzten RELASE
; 0 = Klicksteuerung abspielen
; 0 <> Pausenzeit
; 1 = Auto Maus beenden letztes RELASE
;SAVE_PRESS -> Speicher für Pausenzeit vor Press
; 0 = Pause zuende
MAUS_VEKTOR: dc.l 0
X_POS: dc.l 0
Y_POS: dc.l 0
M_FLAG_ADR: dc.l 0
VBL_SLOT: dc.l 0
TIME: dc.l 0
KLICK_ADR: dc.l KLICK_1
FILE_HANDLE: dc.w 0
REC_PLAY: dc.b 0
VEK_SET: dc.b 0
MAUS_AUS: dc.b 0
HEADER: dc.b 0
END_REC: dc.b 1
LAST: dc.b 0
SAVE_PRESS: dc.b WAIT_PRESS
EVEN
;Maus Pakete
;***********
;PRESS ->Linke Maustaste gedrückt
;RELASE ->Keine Maustaste gedrückt
;MOVE ->Mauszeiger bewegen
PRESS: dc.b $fa,0,0
EVEN
RELASE: dc.b $f8,0,0
EVEN
MOVE: dc.b $f8,0,0
EVEN
;Pfad von A_MAUS.DAT
;*******************
FNAME: dc.b "A:\AUTO\A_MAUS.DAT",0
RESI_ENDE:
;Installierung von Auto Maus
;***************************
TEXT
EVEN
;gesamt-PRG Speicher belegen
INSTALL:
move.l sp,a6 ;Adresse BASEPAGE
lea USTACK,sp ;neuer Stack
move.l 4(a6),a6 ;Speicher belegen
move.l $c(a6),a4
adda.l $14(a6),a4
adda.l $1c(a6),a4
pea 256(a4)
pea (a6)
clr.w -(sp)
move.w #74,-(sp) ;Mshrink aufrufen
trap #GEMDOS
lea 12(sp),sp
;Start aus Autoordner? (AES anmelden)
lea contrl,a0 ;Adresse contrl nach a0
move.w #10,(a0)+ ;Opcode
clr.w (a0)+ ;Einträge int_in
move.w #1,(a0) ;Einträge int_out
clr.w (a0)+ ;Einträge addr_in
clr.w (a0) ;Einträge addr_out
move.l #aes_data,d1 ;Adresse AES-Array
move.w #$c8,d0 ;AES_Aufruf
trap #2
tst.w aes_global ;starten aus AUTO-Ordner
beq SP_31 ;nein keine ap_version
;vom Desktop gestartet
pea STRING_5
move.w #9,-(sp)
trap #GEMDOS
addq.l #6,sp
;auf Taste warten
move.w #2,-(sp) ;von Tastatur
move.w #2,-(sp) ;Bconin
trap #BIOS
addq.l #4,sp
;PRG beenden
clr.w -(sp)
trap #GEMDOS
;aus Auto-Ordner gestartet
;Laufwerk A und B desaktivieren
SP_31: move.w #6,-(sp) ;Laufwerk A und B
move #30.-(sp) ;Ongibit aufrufen
trap #XBIOS
addq.l #4,sp
;Adresse KBDVECS holen
move.w #34,-(sp) ;Kbdvbase aufrufen
trap #XBIOS
addq.l #2,sp
;Adresse des Vektors der Mausroutine berechnen
add.l #16.d0
move.l d0,MAUS_VEKTOR
;Anfangsadresse der Line-A Variablen
dc.w $a000 ;Adresse der Line-A Variablen
;Adresse MOUSE-FLAG berechnen
sub.l #$153.a0 ;Adresse MOUSE-FLAG berechnen
move.l a0,M_FLAG_ADR ;Adresse merken
;Adresse GCURY berechnen
move.l d0,a0 ;Adresse der Line-A Variablen
sub.l #$258,a0 ;Adresse GCURY berechnen
move.l a0,Y_POS ;Adresse GCURY merken
;Adresse GCURX berechnen
move.l d0,a0 ;Adresse der Line-A Variablen
sub.l #$25a,a0 ;Adresse GCURX berechnen
move.l a0,X_POS ;Adresse GCURX merken
;alten Vektor sichern
lea OLD_M_VEK,a0 ;Adresse zum speichern des alten Mausvektor
move.l MAUS_VEKTOR,a2 ;Adresse des Vektors der Mausroutine in a0
move.l (a2),(a0) ;alten Mausvektor speichern BIOS (rts)
;aktuelles Laufwerk für A_MAUS.DAT lesen
move.w #$19,-(sp) ;Dgetdrv aufrufen
trap #GEMDOS
addq.l #2,sp
add.b #"A",d0 ; Laufwerksbuchstabe berechnen
move.b d0,FNAME ; Laufwerksbuchstabe in Pfad setzen
;A_MAUS DAT suchen
pea BUF ;Anfangsadresse der DTA setzen
move.w #$1a,-(sp) ;Fsetdta aufrufen
trap #GEMDOS
addq.l #6,sp
move.w #0,-(sp) ;normale Datei
pea FNAME ;Suchname (A_MAUS.DAT)
move.w #$4e,-(sp) ;Fsfirst aufrufen
trap #GEMDOS
addq.l #8,sp
cmp.b #"A",BUF ;A_MAUS.DAT gefunden
beq PLAY ;ja dann PLAY
;Maus aufnehmen
;**************
;Flag für MAUS-REC
move.b #1,REC_PLAY ;Flag abspielen oder aufnehmen
;Kopf ausgeben
pea STRING_3
move.w #9,-(sp)
trap #GEMDOS
addq.l #6,sp
;VBL und Mausroutine resident halten
bra SP_13
;Maus abspielen
;**************
PLAY:
;Klick-Steuerung laden
;File öffnen
move.w #0,-(sp) ;nur lesen
pea FNAME ;Pfad mit Dateinamen
move.w #$3d,-(sp) ;Fopen aufrufen
trap #GEMDOS
addq.l #8,sp
move.w d0,FILE_HANDLE ;Handle merken
;Kennung des DAT File
pea START_DAT ;Adresse des Buffers
move.l #S_DAT,-(sp) ;Anzahl der Bytes
move.w FILE_HANDLE,- (sp)
move.w #$3f,-(sp) ;Fread
trap #GEMDOS
lea $c(sp),sp
cmp.l #S_DAT,d0 ;Größe der geladenen Daten O.K.
bne SP_99 ;nein
lea KENNUNG_DAT,a0 ;Vorgabe-Kennung
lea START_DAT,a1 ;Kennung der geladenen Datei
cmp.l (a1)+,(a0)+ ;Kennung richtig
beq SP_100 ;ja
;Falsche Kennung oder Größe der von A_MAUS.DAT falsch
SP_99 pea STRING_4
move.w #9,-(sp)
trap #GEMDOS
addq.l #6,sp
;auf Taste warten
move.w #2,-(sp) ;von Tastatur
move.w #2,-(sp) ;Bconin
trap #BIOS
addq.l #4,sp
;PRG beenden
clr.w -(sp)
trap #GEMDOS
;File schließen
SP_100: move.w FILE_HANDLE,-(sp)
move.w #$3E,-(sp) ;Fclose aufrufen
trap #GEMDOS
addq.l #4, sp
;Kopf ausgeben
pea STRING_1
move.w #9,-(sp)
trap #GEMDOS
addq.l #6,sp
;Unterprogramm im Supervisor-Modus ausführen
SP_13: lea VBL_INST,a0 ;Adresse von VBL_INST nach a0
pea (a0)
move.w #$26,-(sp) ;Supexec aufrufen
trap #XBIOS
addq.l #6,sp
;Speicherplatz für VBL- und Mausroutine
clr.w -(sp)
pea RESI_ENDE-RESI_ANFANG+256
move.w #49,-(sp) ;Ptermres aufrufen
trap #GEMDOS ;Initialisierung Ende
;Unterprogramm im Supervisor-Modus
;*********************************
;VBL installieren
VBL_INST:move.w $454,d0 ;Anzahl der VBL-Routinen (nvbls)
lsl #2,d0 ;Anzahl*4
move.l $456,a0 ;Zeiger auf VBL (_vblqueue)
clr d1 ;Zähler
WEITER: tst.l 4(a0,d1) ;VBL-Slot frei
beq FREI ;ja
add #4,d1 ;nächster Slotpointer
cmp.w d0,d1 ;alle Slots abgefragt
bne WEITER
;VBL nicht initialisieren
pea STRING_2 ;alle Slots besetzt
move.w #9,-(sp)
trap #GEMDOS
addq.l #6, sp
;PRG beenden
clr.w -(sp)
trap #GEMDOS
FREI: lea 4(a0,d1),a2 ;Adresse Slot in a2
lea NEU_VBL,a1 ;Adresse neue Routine
move.l a1,(a2) ;neue Routine einhangen
lea VBL_SLOT,a1 ;Slot Adresse
move.l a2,(a1) ;sichern
tst.b REC_PLAY ;Maus aufnehmen
beq SP_12 ;nein
;Hardcopyroutine auf eigene Routine verbiegen
move.l $502,OLD_SCR_VEK ;alter Hardcopy-Vektor speichern
move.l #SAVE_KLICK,$502 ;Zeiger auf neue Routine
SP_12: rts
DATA
STRING_1:dc.b 13,10,"+-------------------+"
dc.b 13,10,"+ Auto Maus 2.2 +"
dc.b 13,10,”+ by 11/89 Ralf Stachs +"
dc.b 13,10,"+ ST-Computer +"
dc.b 13,10,"+----------------------+"
dc.b 13,10,0
EVEN
STRING_3:dc.b 13,10,">********************<"
dc.b 13,10,"> Maus REC 2.0 <"
dc.b 13,10,"> by Ralf Stachs <"
dc.b 13,10,"> ST-Computer <"
dc.b 13,10,">********************<"
dc.b 13,10.0
EVEN
STRING_2: dc.b 13,10,"Alle VBL-Slots besetzt",13,10,0
EVEN
STRING_4: dc.b 13,10,13,10,"*** Fehler bei Laden von A_MAUS.DAT"
dc.b 13,10,”*** Taste drücken",13,10,0
EVEN
STRING_5: dc.b 13,10,13,10,27,"E*** A_MAUS.PRG nur"
dc.b " aus dem Auto-Ordner starten"
dc.b 13,10,"*** Taste drucken", 13,10,0
EVEN
KENNUNG_DAT: dc.b "MAUS 1"
EVEN
aes_data: dc.l contrl
dc.l aes_global
dc.l init_in
dc.l init_out
dc.l addr_in
dc.l addr_out
BSS
aes_global: ds.w 15
contrl: ds.w 10
init_in: ds.w 128
init_out: ds.w 128
addr_in: ds.l 128
addr_out: ds.l 128
BUF: ds.b 100
ds.b 256
USTACK: ds.w 0