;* Demo-Programm zur Programmierung von animierten Sprites *

;*** Labels definieren ***

ExecBase     = 4

AllocMem     = -198
FreeMem      = -210
OpenLib      = -408
CloseLib     = -414
OpenWindow   = -204
CloseWindow  = - 72
GetSprite    = -408
FreeSprite   = -414
ChangeSprite = -420
MoveSprite   = -426
ViewPortAdr  = -300
SetRGB4      = -288

LeftButton   = $BFE001
Chip         = 2

Hoehe        = 15 ;*** Hier wird die Hoehe der Sprites eingesetzt  ***
Anzahl       = 4  ;*** Hier wird die Anzahl der Sprites eingesetzt ***
Nummer       = 2  ;*** Nummer des Sprites, das benutzt werden soll ***

;*** Intuition-Bibliothek öffnen ***

Start:

 move.l ExecBase,a6
 move.l #IntName,a1
 jsr OpenLib(a6)
 move.l d0,IntBase

;*** Grafik-Bibliothek öffnen ***

 move.l ExecBase,a6
 move.l #GfXName,a1
 jsr OpenLib(a6)
 move.l d0,GfxBase

;*** Fenster öffnen ***

 move.l IntBase,a6
 move.l #Fenster,a0
 jsr OpenWindow(a6)
 move.l d0,WinHd

;*** ViewPort-Adresse des Windows holen ***

 move.l IntBase,a6
 move.l WinHd,a0
 jsr ViewPortAdr(a6)
 move.l d0,ViewPort

;*** Chip-Memory reservieren und Sprite-Daten hineinschreiben ***

;Zuerst wird die Anzahl der zu verschiebenden Bytes berechnet.
;Die Anzahl der Bytes berechnet sich folgendermaßen:
;(4 * Höhe der Sprites + 8) * Anzahl Bewegungsphasen

 move.l #4*Hoehe,d0
 add #8,d0
 move.l d0,SprBytes
 move.l #Anzahl,d1
 mulu d1,d0
 move.l d0,ByteZahl  ;d0=(4*Hoehe+8)*Anzahl
 move.l #Chip,d1     ;Kennung für CHIP-Memory
 move.l ExecBase,a6
 jsr AllocMem(a6)
 move.l d0,MemAdr
 tst.l d0
 beq Fehler          ;Falls kein CHIP-Memory reserviert werden konnte

 move.l d0,a0
 move.l #sprdat0,a1
 move.l ByteZahl,d0
kopier:
 move.b (a1)+,(a0)+  ;Bytes verschieben
 dbf d0, kopier

;*** Nun werden die Farben des Sprites definiert ***
;(Die RGB-Werte der Farben finden Sie in hexadezimaler Schreibweise in den
;letzten drei Zahlen der ersten Zeile der vom Movie-Maker Profressional
;erzeugten Daten)

 move.l #Nummer,d4
 lsr.l  #1,d4         ;d4/2
 lsl.l  #2,d4         ;d4*2
 addi.l #17,d4        ;d4=17+4*int(Nummer/2) (= Farbregister!)

 move.l d4,d0
 addq   #1,d4
 move.l #$F,d1        ;Rot-Anteil
 move.l #$2,d2        ;Grün-Anteil
 move.l #$8,d3        ;Blau-Anteil
 move.l ViewPort,a0
 move.l GfxBase,a6
 jsr SetRGB4(a6)

 move.l d4,d0
 addq   #1,d4
 move.l #$F,d1        ;Rot-Anteil
 move.l #$F,d2        ;Grün-Anteil
 move.l #$F,d3        ;Blau-Anteil
 move.l ViewPort,a0
 move.l GfxBase,a6
 jsr SetRGB4(a6)

 move.l d4,d0
 move.l #$F,d1        ;Rot-Anteil
 move.l #$F,d2        ;Grün-Anteil
 move.l #$0,d3        ;Blau-Anteil
 move.l ViewPort,a0
 move.l GfxBase,a6
 jsr SetRGB4(a6)

;*** Sprite initialisieren ***

 move.l MemAdr,d0
 move.l d0,Sprite   ;Adresse der Sprite-Daten neu ( jetzt CHIP-Memory) einstellen
 move.l #Nummer,d0
 move.l GfxBase,a6
 jsr FreeSprite(a6) ;Sprite löschen (falls schon belegt)

 move.l #Sprite,a0
 move.l #Nummer,d0
 move.l GfxBase,a6
 jsr GetSprite(a6)  ;Sprite definieren

 move.l ViewPort,a0
 move.l #Sprite,a1
 move.l #30,d0      ;X-Koordinate
 move.l #13,d1      ;Y-Koordinate
 move.l GfxBase,a6
 jsr MoveSprite(a6) ;Sprite auf dem Bildschirm darstellen

;*** Hauptschleife ***

move.l #0,SprNr    ;Nummer der ersten Bewegungsphase

Loop:
 move.l SprNr,d0
 move.l #1,d1
 add.l d1,d0
 move.l d0,d7
 cmp.l #Anzahl,d0
 bcs.s ok
 clr.l d0  ;Von vorne beginnen
ok:
 move.l d0,SprNr
 move.l SprBytes,d1
 mulu d1,d0
 move.l MemAdr,d1
 add.l d1,d0

 move.l GfxBase,a6
 move.l ViewPort,a0
 move.l #Sprite,a1
 move.l d0,a2
 jsr ChangeSprite(a6)

 move.l #$ffffffff,d0
wait:
 move.l 0,d1
 dbcs d0,wait
 andi.b #64,LeftButton ;Testen, ob linke Maustaste gedrueckt wurde
 bne Loop      

;*** Sprite löschen ***

 move.l GfxBase,a6
 move.l #Nummer,d0
 jsr FreeSprite(a6)

;*** Speicher wieder freigeben ***

 move.l ByteZahl,d0
 move.l MemAdr, a1
 move.l ExecBase,a6
 jsr FreeMem(a6)

;*** Fenster schliessen ***

Fehler:
 move.l IntBase,a6
 move.l WinHd,a0
 jsr CloseWindow(a6)

;*** Grafik-Bibliothek schliessen ***

 move.l ExecBase,a6
 move.l GfxBase,a1
 jsr CloseLib(a6)

;*** Intuition-Bibliothek schliessen ***

 move.l ExecBase,a6
 move.l IntBase,a1
 jsr CloseLib(a6)

 clr.l d0
 rts ;Programm beenden


;*** Daten für Fenster ***

even
Fenster:
 dc.w 0, 0, 96, 30      ;X-, Y-Pos., Breite, Höhe
 dc.b 1, 2              ;Farben
 dc.l 0, $1000          ;IDCMP-Flags, Window Aktiv                  
 dc.l 0,0               ;Gadget, Checkmark
 dc.l WinName           ;Zeiger auf Fenster-Namen
 dc.l 0                 ;Zeiger auf Screen
 dc.l 0                 ;keine Bitmap
 dc.w 0, 0, 96, 30      ;Mindest-, Maximalgröße
 dc.w 1                 ;WBENCHSCREEN
WinName: dc.b "Sprite-Demo",0

;*** Namen der zu öffnenden Libraries ***

even
IntName: dc.b "intuition.library",0
even
GfxName: dc.b "graphics.library",0

;*** Speicherplätze für Variablen ***

even
IntBase:  dc.l 0 ;Zeiger auf intuition.library
GfxBase:  dc.l 0 ;Zeiger auf graphics.library
ViewPort: dc.l 0 ;Adresse des ViewPorts
WinHd:    dc.l 0 ;Zeiger auf Window-Struktur
MemAdr:   dc.l 0 ;Adresse des reservierten CHIP-Speichers
ByteZahl: dc.l 0 ;Anzahl der reservierten Bytes
SprBytes: dc.l 0 ;Anzahl der Bytes pro Sprite
SprNr:    dc.l 0 ;Nummer der gerade aktiven Bewegungsphase

;*** Hier folgen nun die vom Programm erzeugten Daten ***

;* 1:04:15:000:F28:FFF:FF0 *

even
Sprite:
 dc.l sprdat0
 dc.w 15
 dc.w 0, 0
 dc.w 2

sprdat0:
 dc.w $0000, $0F00
 dc.w $07C0, $0000
 dc.w $1FF0, $0000
 dc.w $2388, $1C70
 dc.w $4104, $38E0
 dc.w $4104, $30C0
 dc.w $E38E, $1040
 dc.w $FFFE, $2008
 dc.w $FFFE, $2008
 dc.w $FFFE, $5014
 dc.w $FFFE, $0820
 dc.w $7FFC, $07C0
 dc.w $7FFC, $0000
 dc.w $3FF8, $0000
 dc.w $1FF0, $0000
 dc.w $07C0, $0000
 dc.w 0, 0

sprdat1:
 dc.w $0000, $0F00
 dc.w $07C0, $0000
 dc.w $1FF0, $0000
 dc.w $2388, $1C70
 dc.w $4104, $2288
 dc.w $4104, $2288
 dc.w $E38E, $0000
 dc.w $FFFE, $2008
 dc.w $FFFE, $2008
 dc.w $FFFE, $600C
 dc.w $FFFE, $1830
 dc.w $77DC, $17D0
 dc.w $783C, $0820
 dc.w $3FF8, $07C0
 dc.w $1FF0, $0000
 dc.w $07C0, $0000
 dc.w 0, 0

sprdat2:
 dc.w $0000, $0F00
 dc.w $07C0, $0000
 dc.w $1FF0, $0000
 dc.w $2388, $1C70
 dc.w $4104, $0E38
 dc.w $4104, $0618
 dc.w $E38E, $0410
 dc.w $FFFE, $2008
 dc.w $FFFE, $2008
 dc.w $FFFE, $701C
 dc.w $EFEE, $2828
 dc.w $77DC, $17D0
 dc.w $701C, $1010
 dc.w $3838, $0820
 dc.w $1FF0, $07C0
 dc.w $07C0, $0000
 dc.w 0, 0

sprdat3:
 dc.w $0000, $0F00
 dc.w $07C0, $0000
 dc.w $1FF0, $0000
 dc.w $2388, $1C70
 dc.w $4104, $2288
 dc.w $4104, $2288
 dc.w $E38E, $0000
 dc.w $FFFE, $2008
 dc.w $FFFE, $2008
 dc.w $FFFE, $600C
 dc.w $FFFE, $1830
 dc.w $7FFC, $0FE0
 dc.w $7FFC, $07C0
 dc.w $3FF8, $0000
 dc.w $1FF0, $0000
 dc.w $07C0, $0000
 dc.w 0, 0

Ende:
