[edit] Ça venait d'ailleur de ça, les petits parasites en bas de l'écran



;C prototype: void DrawGrayBuffer2 (short x, short y, void *src, void *dest1, void *dest2);
;
;void DrawGrayBuffer2(register short x asm("%d0"),
; register short y asm("%d1"),
; register void *src asm("%a0"),
; register void *dest1 asm("%a2"),
; register void *dest2 asm("%a3"));
section ".data"
xdef DrawGrayBuffer2
DrawGrayBuffer2:
movem.l d2-d7/a1,-(a7)
add.w d1,d1 ;d1=y*2
move.w d1,d2 ;d2=d1=y*2
lsl.w #4,d1 ;d1=32*y
add.w d2,d2 ;d2=4*y
add.w d2,d1 ;d1=y soit y*36
moveq.l #15,d3 ;15=0b1111=décalage sur 32 bits
move.w d0,d2 ;d2=x
and.w d3,d0 ;d0=Bit à décaler
not.w d3
and.w d3,d2 ;d2=octet
add.w d2,d1 ;Octet ou ce commence la copie
adda.w d1,a0 ;Ce place dans la source
lea.l 8568(a0),a1 ;Prépare plan1
moveq.l #127,d7 ;Prépare la boucle de 128 pixels
moveq.l #$FFFFFFFF,d1 ;Tout les bits de 2^32 activé.
lsl.w d0,d1 ; d1 = mask1
move.w d1,d2
not.w d2 ; d2 = mask2
;d0=Bit à décaler
;d1=mask1
;d2=mask2
;d7=boucle
\LineStart:
move.l (a0)+,d3
lsl.l d0,d3
move.l (a0)+,d4
rol.l d0,d4
move.w d4,d5
and.w d2,d5
or.w d5,d3
move.l d3,(a2)+ ; 1
move.l (a1)+,d5
lsl.l d0,d5
move.l (a1)+,d6
rol.l d0,d6
move.w d6,d3
and.w d2,d3
or.w d3,d5
move.l d5,(a3)+
and.w d1,d4
move.l (a0)+,d3
rol.l d0,d3
move.w d3,d5
and.w d2,d5
or.w d5,d4
move.l d4,(a2)+ ; 2
and.w d1,d6
move.l (a1)+,d5
rol.l d0,d5
move.w d5,d4
and.w d2,d4
or.w d4,d6
move.l d6,(a3)+
and.w d1,d3
move.l (a0)+,d4
rol.l d0,d4
move.w d4,d6
and.w d2,d6
or.w d6,d3
move.l d3,(a2)+ ; 3
and.w d1,d5
move.l (a1)+,d6
rol.l d0,d6
move.w d6,d3
and.w d2,d3
or.w d3,d5
move.l d5,(a3)+
and.w d1,d4
move.l (a0)+,d3
rol.l d0,d3
move.w d3,d5
and.w d2,d5
or.w d5,d4
move.l d4,(a2)+ ; 4
and.w d1,d6
move.l (a1)+,d5
rol.l d0,d5
move.w d5,d4
and.w d2,d4
or.w d4,d6
move.l d6,(a3)+
and.w d1,d3
move.l (a0)+,d4
rol.l d0,d4
move.w d4,d6
and.w d2,d6
or.w d6,d3
move.l d3,(a2)+ ; 5
and.w d1,d5
move.l (a1)+,d6
rol.l d0,d6
move.w d6,d3
and.w d2,d3
or.w d3,d5
move.l d5,(a3)+
and.w d1,d4
move.l (a0)+,d3
rol.l d0,d3
move.w d3,d5
and.w d2,d5
or.w d5,d4
move.l d4,(a2)+ ; 6
and.w d1,d6
move.l (a1)+,d5
rol.l d0,d5
move.w d5,d4
and.w d2,d4
or.w d4,d6
move.l d6,(a3)+
and.w d1,d3
move.l (a0)+,d4
rol.l d0,d4
and.w d2,d4
or.w d4,d3
move.l d3,(a2)+ ; 7
and.w d1,d5
move.l (a1)+,d6
rol.l d0,d6
and.w d2,d6
or.w d6,d5
move.l d5,(a3)+
swap.w d4
swap.w d6
move.w d4,(a2)+
move.w d6,(a3)+
lea.l 6(a0),a0
lea.l 6(a1),a1
dbf d7,\LineStart
movem.l (a7)+,d2-d7/a1
rts
Euh, j'ai une optimisation : add.w d1,d1
add.w d1,d1
move.w d1,d2
lsl.Ça prendra 2 cycles en moins !

Sasume
: Au fait, ce n'est pas la peine de sauver a1, tigcc le fait automatiquement.
Sasume
: geogeo recherche de la vitesse, sinon il n'aurait pas laissée la boucle déroulée.
lea (7).w,a4 loop: ... subq.w #1,a4 cmpa.w #0,a4 bne.s loop

Que tu la clippes ?
Au fait, relis le post ./33
Moi j'en ai une autre:
mulu #36,d1
Ça prendra 6 octets en moins! Avec certains ici, on se demande pourquoi Motorola a mis des instructions de multiplication dans leurs processeurs...

;C prototype: void ClearScreenBuffer (void *buffer);
;
;void ClearScreenBuffer (register void *buffer asm("%a0"));
section ".data"
xdef ClearScreenBuffer
ClearScreenBuffer:
move.l d1,-(a7)
move.l #237,d1
\clear_bcl:
clr.l (a0)
clr.l 4(a0)
clr.l 8(a0)
clr.l 12(a0)
clr.l 16(a0)
clr.l 20(a0)
clr.l 24(a0)
clr.l 28(a0)
clr.l 32(a0)
clr.l 36(a0)
clr.l 40(a0)
clr.l 44(a0)
clr.l 48(a0)
clr.l 52(a0)
clr.l 56(a0)
clr.l 60(a0)
clr.l 64(a0)
clr.l 68(a0)
lea 72(a0),a0
dbf d1,\clear_bcl
move.l (a7)+,d1
rts
ClearScreenBuffer:
movem.l d2-d7/a2,-(a7)
moveq #0,d0
moveq #0,d1
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
moveq #0,d6
movea.l d0,a1
movea.l d0,a2
move.l #476,d7
clear_bcl:
movem.l d0-d6/a1-a2,-(a0)
movem.l d0-d6/a1-a2,-(a0)
movem.l d0-d6/a1-a2,-(a0)
movem.l d0-d6/a1-a2,-(a0)
dbf d7,clear_bcl
movem.l (a7)+,d2-d7/a2
rts
ClearScreenBuffer:
movem.l d2-d7/a2,-(a7)
moveq #0,d0
moveq #0,d1
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
moveq #0,d6
movea.l d0,a1
movea.l d0,a2
move.l #476,d7
clear_bcl:
movem.l d0-d6/a1-a2,[12](a0)[/12]
movem.l d0-d6/a1-a2,[12]36(a0)[/12]
movem.l d0-d6/a1-a2,[12]72(a0)[/12]
movem.l d0-d6/a1-a2,[12]108(a0)[/12]
[12]adda.w #144,a0[/12]
dbf d7,clear_bcl
movem.l (a7)+,d2-d7/a2
rtsça devrait fonctionner comme ça (le postincrement n'est pas possible pour le 2e argument de movem)
|C prototype: void ClearScreenBuffer (void *buffer);
|
|void ClearScreenBuffer (register void *buffer asm("%a0"));
.data
.globl ClearScreenBuffer
.even
ClearScreenBuffer:
movem.l %d0-%d7/%a1-%a6,-(%a7)
[u]lea (0x42F0,%a0),%a0[/u] |8568*2
moveq #0,%d0
moveq #0,%d1
moveq #0,%d2
moveq #0,%d3
moveq #0,%d4
moveq #0,%d5
moveq #0,%d6
movea.l %d0,%a1
movea.l %d0,%a2
movea.l %d0,%a3
movea.l %d0,%a4
movea.l %d0,%a5
movea.l %d0,%a6
move.l #50,%d7
clear_bcl:
|336 octets=84 long
movem.l %d0-%d6/%a1-%a6,-(%a0) |52 octets=13 long
movem.l %d0-%d6/%a1-%a6,-(%a0)
movem.l %d0-%d6/%a1-%a6,-(%a0)
movem.l %d0-%d6/%a1-%a6,-(%a0)
movem.l %d0-%d6/%a1-%a6,-(%a0)
movem.l %d0-%d6/%a1-%a6,-(%a0)
movem.l %d0-%d5,-(%a0)
dbf %d7,clear_bcl
movem.l (%a7)+,%d0-%d7/%a1-%a6
rts
