[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