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é...
Et les performances alors ?
GCC ne distingue pas les fonctions asm des fonctions C, donc il devrait sauvegarder tous les registres à chaque fois 

g compris que c'etait ne demo
Non réellement le scrolling sur Ti92+ et V200 est parfait, seulement un écran 2 fois plus grand. De plus je suis un des premiers à faire ça, on verras le résultat mais vous ne serez pas deçus.
;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
rtsmove.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?