
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;ROTATION D'UN SPRITE DE 16*16
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rotation:
lea voiturep0b,a2 ;sprite de d'arrivée
lea voiturep1b,a3 ;sprite de d'arrivée2
moveq #0,d3 ;efface le sprite d'arrivée
move.l d3,d4
move.l d3,d5
move.l d3,d6
move.l d3,d7
move.l d3,a0
move.l d3,a1
move.l d3,a4
movem.l d3-d7/a0/a1/a4,(a2)
movem.l d3-d7/a0/a1/a4,(a3)
lea costable(pc),a0 ;table de cos*256
lea sintable(pc),a1 ;table de sin*256
move.w direction,d5 ;va chercher dans la table
add.w d5,d5 ;de sin et cos les valeurs
move.w 0(a0,d5.w),d4 ;cos dans d4
move.w 0(a1,d5.w),d5 ;sin dans d5
lea voiturep0b,a2 ;adresse de voiturep0b
lea voiturep1b,a3 ;adresse de voiturep1b
sub.l a5,a5 ;y
moveq #15,d6 ;16 de haut
bouclerotation2:
sub.l a4,a4 ;x
moveq #15,d7 ;16 de large
bouclerotation:
move.w a4,d0
neg d0
addq.w #7,d0 ;8-x>x
move.w d0,d1
move.w a5,d2
neg d2
addq.w #7,d2 ;8-y>y
move.w d2,d3
muls d4,d0 ;x*cosalpha
muls d5,d1 ;x*sinalpha
muls d4,d2 ;y*cosalpha
muls d5,d3 ;y*sinalpha
sub.w d3,d0 ;x*cosalpha-y*sinalpha->x
add.w d1,d2 ;y*cosalpha+x*sinalpha->y
asr.w #8,d0 ;x/256->x
asr.w #8,d2 ;y/256->y
neg d0 ;4
addq.w #7,d0 ;4 ;8-x->x
neg d2 ;4
addq.w #7,d2 ;4 ;8-y->y
tst d0 ;on verifie que x et y
blt continue ;sont dans le sprite
cmp #15,d0
bgt continue
tst d2
blt continue
cmp #15,d2
bgt continue
move.w d2,d3 ;sauvegarde y
lea voiturep0(pc),a0 ;teste si le pixel est allumé
add.w d2,d2 ;sur le sprite d'arrivé
add.w d2,a0
move.w (a0),d2
btst.w d0,d2
beq suite
move.w a4,d2 ;si oui on allume sur le sprite
move.w (a2),d1 ;d'arrivé
bset.w d2,d1
move.w d1,(a2)
suite:
lea voiturep1(pc),a1 ;idem pour l'autre plane
add.w d3,d3
add.w d3,a1
move.w (a1),d3
btst.w d0,d3
beq continue
move.w (a3),d1
bset.w d2,d1
move.w d1,(a3)
continue: ;continue la boucle
lea 1(a4),a4 ;ajoute 1 en x
dbf d7,bouclerotation
lea 2(a2),a2 ;passe à la ligne suivante
lea 2(a3),a3 ;sur les 2 sprites de departs
lea 1(a5),a5 ;ajoute 1 en y
dbf d6,bouclerotation2
rts