1
elle me ralenti un peu mon prog alors si vous voyez comment l'optimiser, vous genez po grin


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;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
2
on peut s'en servir dans un programme C?
si oui, comment?
(je ne comprend pas l'asm)
3
ben disons que c assez specifique a mon prog et la routine se sert de certaines données qui lui ont ete fournies avant
mais avec qqs modifs oui
le pb est que je ne sais po non plus coment s'en servir dans un prog en C sad
4
c'est pas grave..
la je suis dans ma période php!
5
>gugusg : il suffit de mettre la routine asm dans un fichier .asm, de l'inclure dans le projet TIGCC, de faire un xdef _nom_de_la_fonction au début de la source, de bien sauver tous les registres et les restaurer (sauf a0-a1 et d0-d2, c'est pas utile), et de mettre le prototype de la fonction dans le fichier .c (par ex [i:b3c5275f02]void rotation (void *sprite_p0 asm("a2)), void *sprite_p1 asm("a3"));[/i:b3c5275f02]
6
ok a par le prototype
(je fait po de C sad )
7
ExtendeD>aah, intéressant ça!! smilesmilesmile
me suis tjrs demandé comment inclure des fonctions asm avec gcc...
8
Ouais, parce que le GNU asm, c'est pas la fête...
9
ben je vais tester cette routine dans un prog C!
j'ai po tout compris pour passer les arguments
swal si tu comprend po qq chose tu me le dit smile