Auto-Maus

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.

Mausklicks abspielen

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.

Programmbeschreibung

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


Ralf Stachs
Aus: ST-Computer 10 / 1991, Seite 90

Links

Copyright-Bestimmungen: siehe Über diese Seite