La voici:
;C prototype: void CopyScreenBufferToScreen (short x, short y, void *src, void *dest1, void *dest2);
;
;void CopyScreenBufferToScreen (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 CopyScreenBufferToScreen
CopyScreenBufferToScreen:
movem.l d3-d7,-(a7)
lsl.w #3,d1
move.w d1,d2
add.w d2,d2
add.w d2,d2
add.w d2,d1 ;d1=y*40
moveq.l #$0F,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
lsr.w #3,d2
add.w d2,d1 ;Octet ou ce commence la copie
adda.w d1,a0 ;Ce place dans la source
lea.l 8000(a0),a1 ;Prépare plan1
move.l #127,d7 ;Prépare la boucle de 128 pixels
moveq.l #-1,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)+
addq.l #8,a0
addq.l #8,a1
dbf d7,\LineStart
movem.l (a7)+,d3-d7
rts
Copie 240x128 pixels du buffer de 320x200 pixels.