&&
------------------------------------------------------------------------------
                     CURSUS ASSEMBLER  -  CHANGEPOINTER
------------------------------------------------------------------------------

Changepointer is een programma dat de muis-pointer verandert. De data van de
nieuwe muis staat in het programma bij SpriteData.


De uitleg achter elke regel is vrij uitgebreid. Daarom weinig tekst tussen de
regels in.




; Deze routine zet een eigen ontworpen muis aan totdat u de muisknop drukt.
;
; Wat adressen van library-aanroepen die we later nodig hebben.

ExecBase=       4                       ; Adres van de Exec.library.
OpenLibrary=    -408                    ; Routine om een library te openen.
CloseLibrary=   -414                    ; En om deze library weer te sluiten.
AllocMem=       -198                    ; Geheugen reserveren.
FreeMem=        -210                    ; Geheugen weer vrij geven.
SetPointer=     -270                    ; De nieuwe muis aanzetten.
ClearPointer=   -60                     ; En de oude weer teruggeven.
&&
; Als eerste moeten we de Intuition.library openen en de pointer daarheen
;    opslaan.

start: move.l   ExecBase,a6             ; Pointer naar de Exec.library.
       lea      intname,a1              ; Pointer naar de naam van library.
       jsr      OpenLibrary(a6)         ; Open de Intuition.library.
       move.l   d0,intbase              ; Sla de pointer naar de lib. op.

; Nu moeten we geheugen reserveren voor de sprite die de muis gaat vervangen.
;    De sprite-data die daar komt te staan staat achter in dit programma.

       move.l   #[enddata-sprdata],d0   ; De lengte van de sprite-data.
       moveq    #2,d1                   ; In CHIP-geheugen.
       move.l   ExecBase,a6             ; Pointer naar de Exec.library.
       jsr      AllocMem(a6)            ; Allokeer geheugen voor de sprite.
       move.l   d0,dest                 ; Sla het adres van het geheugen op.
       beq      notallocated            ; Geen geheugen beschikbaar!!

; Nu moeten we onze sprite-data naar het stukje gereserveerde geheugen ver-
;    plaatsen.

       move.l   #[enddata-sprdata-1],d0 ; Weer de lengte van de sprite-data.
       lea      sprdata,a0              ; Hier staat de sprite-data.
       move.l   dest,a1                 ; En hier moet de sprite heen.
copy:  move.b   (a0)+,(a1)+             ; Hier kopieeren we.
       dbf      d0,copy                 ; Als we niet klaar zijn dan terug.
&&
; Nu gaan we alle gegevens voor de muis-zet-routine instellen en roepen deze
;    routine daarna aan.

       move.l   intbase,a6              ; Pointer naar de Intuition.library.
       move.l   52(a6),a0               ; Pointer naar de oude muis.
       move.l   dest,a1                 ; De plaats van de muis-sprite-data.
       moveq    #16,d0                  ; De hoogte van de sprite.
       moveq    #16,d1                  ; De breedte van de sprite.
       moveq    #-7,d2                  ; Hot-point X-coordinaat.
       moveq    #-7,d3                  ; Hot-point Y-coordinaat.
       jsr      SetPointer(a6)          ; En zet de nieuwe muis aan.

; We wachten nu op het drukken van de muisknop om de oude muis weer terug te
;    zetten.

wait:  btst     #6,$bfe001              ; Testen op de muisknop.
       bne      wait                    ; Nee, dus wachten we verder.
       move.l   52(a6),a0               ; Pointer naar de oude muis.
       jsr      ClearPointer(a6)        ; Zet de oude muis weer terug.

; Ook het gereserveerde geheugen moeten we teruggeven.

       move.l   dest,a1                 ; De plaats van het geheugen.
       move.l   #[enddata-sprdata],d0   ; Het aantal bytes geheugen.
       move.l   ExecBase,a6             ; Pointer naar de Exec.library.
       jsr      FreeMem(a6)             ; Geef het geheugen vrij.
&&
; Deze routine lopen we aan het eind door. Als we geen geheugen konden vinden
;    om te reserveren, dan sluit de library.

notallocated:
       move.l   intbase,a1              ; Pointer naar de Intuition.library.
       jsr      CloseLibrary(a6)        ; Sluit deze library.
       rts                              ; Einde.

; Hier staat de muis. De muis is 16 bits breed, we hebben dus 16 getallen
;    nodig. Deze zijn 1 of 0, aan of uit.
; Tevens heeft de muispointer 4 kleuren, dus twee bitplanes. Elke lijn moet
;    daarom in de twee bitplanes opgegeven worden. Deze staan achter elkaar in
;    de data.
; Verder staan aan het begin en aan het eind twee nullen. Daar zet de Amiga
;    zelf wat gegevens in.
&&   
even
sprdata:
       dc.w  0,0
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000001111000000 , %0000000000000000
       dc.w  %1111111111111111 , %0000000110000000
       dc.w  %0000001111000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  %0000000110000000 , %0000000000000000
       dc.w  0,0
enddata:
&&
; Wat pointers waar we dingen in opslaan.

dest:    dc.l   0
intbase: dc.l   0
intname: dc.b   "intuition.library",0



















Het programma, en de source, staan in de directory Assembler op deze diskette.

- EINDE ----------------------------------------------------------------------
&&
