
En principe, gcc s'attend à ce que leur contenu reste inchangé...
geogeo> t sûr qu'il y a pas des bugs dans ton code ? Parce qu'il me semble que tu utilises les registres d3-d4 et a2-a5 sans les sauvegarder En principe, gcc s'attend à ce que leur contenu reste inchangé...
;C prototype: void DrawScreen (void *sprt, void *dest); ; ;void DrawScreen (register long *sprt asm("%a0"), ; register void *dest asm("%a1")); section ".data" xdef DrawScreen DrawScreen: move.l d2,-(a7) lea 322(a1),a1 lea 8000(a1),a2 movea.l a0,a3 moveq.l #11,d2 \rep: moveq.l #15,d3 ;Sprite totale \b0: move.l (a0)+,d1 moveq.l #5,d0 ;Gris clair \s1: move.l d1,(a1)+ dbf d0,\s1 swap d1 ror.w #8,d1 move.b d1,(a1) move.l (a0)+,d1 moveq.l #5,d0 ;Gris foncé \s2: move.l d1,(a2)+ dbf d0,\s2 swap d1 ror.w #8,d1 move.b d1,(a2) lea 16(a1),a1 lea 16(a2),a2 dbf d3,\b0 movea.l a3,a0 dbf d2,\rep move.l (a7)+,d2 rts
move.l d2,-(a7)
;C prototype: void DrawScreen (void *sprt, void *dest);
;
;void DrawScreen (register long *sprt asm("%a0"),
; register void *dest asm("%a1"));
section ".data"
xdef DrawScreen
DrawScreen:
move.l d2,-(a7) ; inutile
lea 322(a1),a1 ; pkoi pas.. je connais pas le format de sprite, mais si c'est static l'offset je vosi pas trop l'interet de le calculer a chaque fois..
lea 8000(a1),a2 ; a ma limite la ca ce comprend et encore
movea.l a0,a3 ;
moveq.l #11,d2 ; 12 loops
\rep:
moveq.l #15,d3 ; 16 loops
;Sprite totale
\b0:
move.l (a0)+,d1 ; 32 pxl du premier sprite
moveq.l #5,d0 ; 6 loops
;Gris clair
\s1:
move.l d1,(a1)+ ; on recopie les 32 pixels 6 fois a la suite, soit sur 192 pixel
dbf d0,\s1; deja la le dbf est de loin non negligeable => lent
swap d1
ror.w #8,d1
move.b d1,(a1) ; ... ?? .. ??
move.l (a0)+,d1 ;on passe a l'autre plan..
moveq.l #5,d0
;Gris foncé
\s2:
move.l d1,(a2)+; 8000(a1)... mettre dans l'autre dbf??
dbf d0,\s2
swap d1
ror.w #8,d1
move.b d1,(a2) ;...
lea 16(a1),a1
lea 16(a2),a2;//
dbf d3,\b0
movea.l a3,a0
dbf d2,\rep
move.l (a7)+,d2 ; inutile rts
;C prototype: void DrawScreen (void *sprt, void *dest); ; ;void DrawScreen (register long *sprt asm("%a0"), ; register void *dest asm("%a1")); section ".data" xdef DrawScreen DrawScreen: move.l d2,-(a7) ; inutile lea 322(a1),a1 ;On commence à x=16 et y=8 (plan0) lea 8000(a1),a2 ; Plan1 movea.l a0,a3 ; Sauvegarde l'adresse du sprite moveq.l #11,d2 ; répétion du sprite suivant y \rep: moveq.l #15,d3 ; Réptition pour dessiner les 16 lignes du sprites ;Sprite totale \b0: move.l (a0)+,d1 ; ligne en cours de 32 pixels moveq.l #5,d0 ; Répété suivant x 6 fois ;Gris clair \s1: move.l d1,(a1)+ ; on recopie les 32 pixels 6 fois a la suite, soit sur 192 pixel dbf d0,\s1; je sais c'est lent et je cherche une solution swap d1 ;inverse le sprite, on veux récupére que 16 pixels soit un word ror.w #8,d1 ;On récupérer le bout du motif move.b d1,(a1) ; on termine la ligne soit 208 pixels du motif (32*6+16) move.l (a0)+,d1 ;on passe a l'autre plan.. moveq.l #5,d0 ;Répété suivant x 6 fois soit 32*6 pixels ;Gris foncé \s2: move.l d1,(a2)+; 8000(a1) plan1 dbf d0,\s2 swap d1 ;récupère un bout du motif soit 16 pixels... ror.w #8,d1 move.b d1,(a2) ;... lea 16(a1),a1 ;on passe à la ligne suivant soit 320-224 pixels. lea 16(a2),a2;;idem pour le plan 1 cette fois dbf d3,\b0 ;et on répéte la ligne suivante movea.l a3,a0 ;on répéte le motif suivant 16 autre ligns dbf d2,\rep move.l (a7)+,d2 ; inutile rts
perso je copierai 16 lignes d'ecran. puis apres par coup de movem je recopie les ligne a la suite... mais bon j'ai pas testé, mais je pense qu'on y gagne
move.l (a0)+,d0 move.l d0,d1 move.l d0,d2 ... movem.l d0-d6,(a1) movem.l d0-d6,208*16*1(a1) movem.l d0-d6,208*16*2(a1) ...
Comment ça 75% du temps?
Et pourquoi incompréhensible?