          ;Speedy - Mausbeschleuniger
          ;Von Bernd Lehnemann 1991 auf KICK-ASS Assembler

_LVOCloseLibrary = -414
_LVOOpenLibrary = -552
_LVOCreatePort =  -306
_LVODeletePort =  -312
_LVOAllocMem =    -198
_LVOFreeMem =     -210
_LVOOpenDevice =  -444
_LVOCloseDevice = -450
_LVODoIO  =       -456
_LVOCopyMem =     -624
ln_Name   =       10
is_Code   =       18
mn_ReplyPort =    14
NT_MESSAGE =      5
NT_INTERRUPT =    2
IND_ADDHANDLER =  9
MEMF_PUBLIC =     1
io_Data   =       40
ie_Qualifier =    8
ie_Code   =       6
ie_Class  =       4
ie_X      =       10
ie_Y      =       12
IECLASS_RAWMOUSE = 2
IECODE_NOBUTTON = $FF

          move.l  4.s,a6               ;arp.lib öffnen
          lea     ArpName(pc),a1
          moveq   #36,d0
          jsr     _LVOOpenLibrary(a6)
          move.l  d0,d7
          beq     NoArpLib
          move.l  d0,a6
          lea     PortName(pc),a0      ;MessagePort einrichten
          moveq   #0,d0
          jsr     _LVOCreatePort(a6)
          move.l  d0,mn_ReplyPort+IOStdReq ;und eintragen
          beq     NoPortError
          move.l  4.s,a6
          lea     InpName(pc),a0       ;Device öffnen
          moveq   #0,d0
          lea     IOStdReq(pc),a1
          moveq   #0,d1
          jsr     _LVOOpenDevice(a6)
          tst.l   d0
          bne.s   NoDevError
          moveq   #HandlerEnd-HandlerStart,d0 ;Speicher belegen
          moveq   #MEMF_PUBLIC,d1
          jsr     _LVOAllocMem(a6)
          move.l  d0,IOStdReq+io_Data  ;Adressen berechnen
          beq.s   NoMemError
          add.l   d0,Interrupt+ln_Name
          add.l   d0,Interrupt+is_Code
          move.l  d0,a1                ;Handler kopieren
          moveq   #HandlerEnd-HandlerStart,d0
          lea     HandlerStart(pc),a0
          jsr     _LVOCopyMem(a6)
          lea     IOStdReq(pc),a1      ;Handler installieren
          jsr     _LVODoIO(a6)
          tst.b   d0
          beq.s   CloseDevice          ;Alles O.K.
CannotInstall: moveq #20,d0             ;Kann nicht installieren
          move.l  IOStdReq+io_Data(pc),a1 ;Speicher wieder freigeben
          moveq   #HandlerEnd-HandlerStart,d0
          jsr     _LVOFreeMem(a6)
NoMemError: move.l #20,ReturnCode       ;Fehler: kein Speicher
CloseDevice: move.l 4.s,a6              ;Device schließen
          lea     IOStdReq(pc),a1
          jsr     _LVOCloseDevice(a6)
          bra.s   RemPort
NoDevError: move.l #20,ReturnCode       ;Fehler: kein input.device
RemPort:  move.l  d7,a6                ;MessagePort abmelden
          move.l  mn_ReplyPort+IOStdReq(pc),a1
          jsr     _LVODeletePort(a6)
          bra.s   CloseArp
NoPortError: move.l #20,ReturnCode      ;Fehler: kein MsgPort
CloseArp: move.l  4.s,a6
          move.l  d7,a1                ;arp.lib schließen
          jsr     _LVOCloseLibrary(a6)
          bra.s   NormExit
NoArpLib: move.l  #20,ReturnCode       ;Fehler: keine arp.lib
NormExit: move.l  ReturnCode(pc),d0
Exit:     rts

HandlerStart: ;Ab hier wird installiert
Interrupt: dc.l   0,0                  ;Interrupt-Struktur
          dc.b    NT_INTERRUPT,51
          dc.l    IntName-HandlerStart,0,HandlerCode-HandlerStart
IntName:  dc.b    'Mausbeschleuniger',0
          even
HandlerCode: move.l a0,a1
Loop:     cmp.b   #IECLASS_RAWMOUSE,ie_Class(a1)
          bne.s   NextOne
          cmp.w   #IECODE_NOBUTTON,ie_Code(a1)
          bne.s   NextOne
          btst    #7,ie_Qualifier(a1) ;IEQUALIFIER_RELATIVEMOUSE
          beq.s   NextOne
          asl     ie_X(a1)            ;Koordinaten verdoppeln
          asl     ie_Y(a1)
NextOne:  move.l  (a1),a1             ;nächster Event in Liste
          cmp.l   #0,a1
          bne.s   Loop
HC_Exit:  move.l  a0,d0               ;Zeiger auf InputEvents
          rts
HandlerEnd: ;Bis hier wird installiert

InpName:  dc.b    'input.device',0
          even
IOStdReq: dc.l    0,0
          dc.b    NT_MESSAGE,0
          dc.w    0,0,0,0,48
          dc.l    0,0
          dc.w    IND_ADDHANDLER,0
          dc.l    0,0,0
ReturnCode: dc.l  0
ArpName:  dc.b    'arp.library',0
          even
PortName: dc.b    'Read KICKSTART',0
          even



