je ferait sa technique pour les 16 premieres lignes puis:
movem.l d0-d6/a1-a7,(a0)+
en bref bourin de base

), tu es obligé de relire => tu perds tout ce que tu as gagné avec le movem puisque c'est 2x plus lent, or comme je l'ai dit dans mon post précédent tu pas dépasser 50% plus rapide : résultat, gain négatif ou nul.geogeo :Oui, c'est tout à fait possible. Tu as une vieille version de fonction daffichage de sprite, je n'avais pas encore implémenté cette technique.
Sasume je voudrais savoir un truc:
J'ai regardé la source de FastGraySPrite32_OR_R en détail et je me demande si on peu l'optimiser, pour cela il suffirais seulement d'utiliser ta routine de scrolling de 32 pixels et de la répéter pour chaque ligne?? En bref ce baser sur la fonction de scrolling.
;C prototype: void DrawScreen (void *sprt, void *dest);
;
;void DrawScreen (register long *sprt asm("%a0"),
; register void *dest asm("%a1"));
section ".data"
xdef DrawScreen
;Motif de 32x32 répété sur une zone de 234x200 pixels
DrawScreen:
movem.l d3-d7/a2-a3,-(a7)
lea 256(a0),a0
lea 7988(a1),a1
lea 8000(a1),a2
movea.l a0,a3
;Réptition 6 motifs par colonnes soit 192 pixels de hauteur
moveq.l #5,d7
;Répétion du motif en hauteur
\draw_up
moveq.l #31,d6
;Répétition du motif sur 32 pixels de hauteur et 216 pixels de largeur.
\rep:
move.l -(a0),d0
move.l d0,d1
move.l d0,d2
move.l d0,d3
move.l d0,d4
move.l d0,d5
move.w (a0),-(a2)
movem.l d0-d5,-(a2)
move.l -(a0),d0
move.l d0,d1
move.l d0,d2
move.l d0,d3
move.l d0,d4
move.l d0,d5
move.w (a0),-(a1)
movem.l d0-d5,-(a1)
sub.l #14,a1
sub.l #14,a2
dbf d6,\rep
movea.l a3,a0
dbf d7,\draw_up
movem.l (a7)+,d3-d7/a2-a3
rts

;C prototype: void Font0_DrawChar (short x, short y, void *sprite, void *dest);
;
;void Font0_DrawChar (register short x asm("%d0"),
; register short y asm("%d1"),
; register void *sprite asm("%a0"),
; register void *dest asm("%a1"));
section ".data"
xdef Font0_DrawChar
Font0_DrawChar:
movem.l d3-d7/a2-a6,-(a7)
;y*40
lsl.w #3,d1
move.w d1,d2
add.w d2,d2
add.w d2,d2
add.w d2,d1
moveq.l #$0F,d3 ;15=0b1111
move.w d0,d2 ;d2=x
and.w d3,d0 ;d0=Bit à décaler
not.w d3
and.w d3,d2 ;d2=octet
lsr.w #3,d2
add.w d2,d1 ;Octet ou ce commence la copie
adda.w d1,a1 ;Ce place dans la source
;Masks
moveq.b #-1,d1 ;Tout les bits de 2^8 activé.
lsl.b d0,d1 ; d1 = mask1
move.b d1,d2
not.b d2 ; d2 = mask2
;d0=Bit à décaler
;d1=mask1
;d2=mask2
moveq.l #7,d7
;Dessine le caractère
\rep_draw_char:
move.b (a0),d3
lsl.b d0,d3
move.b (a0)+,d4
rol.b d0,d4
move.b d4,d5
and.b d2,d5
or.b d5,d3
move.b d3,8000(a1)
move.b d3,(a1)+
swap.b d4
move.b d4,8000(a1)
move.b d4,(a1)+
adda.l #38,a1
dbf d7,\rep_draw_char
movem.l (a7)+,d3-d7/a2-a6
rts

movem n'a absolument aucun intérêt, et est même néfaste, si tu recharges les registres à chaque fois. Essaye plutôt d'implémenter les optimisations que je t'ai données, ce sera bien plus efficace (et si tu ne me crois pas, fais un bench...)
Sasume :
P.S. : Comment se fait-il que swap.b ne soit pas rejeté par a68k ?
Kevin Kofler :Et apparemment, tu n'es pas pour changer ça
Il arrive que A68k accepte un peu tout et n'importe quoi.
:Bugs.txt
A68k accepts some incorrect extensions like moveq.w, dbra.s or btst.w.
I don't know whether I should fix this one because some sources seem to rely on this. Kevin Kofler
