J'ai pensé à faire avec des .l et des .w si il y a plus de 16 pixels, mais d'abord je voulais faire une routine qui marche avec des .b avant d'être confrontée aux problèmes d'alignement. Cela accélèrera nettement la routine sur de grands rectangles, c'est sûr.
Voici ma routine (200% plus rapide que ScrRectFill dans les mêmes conditions):
Bon, c'est sûr, j'ai viré le checking...
Et au fait: il semble sur VTI que le movem.w (%sp)+,%d0-%d7 de la fin écrase aussi la partie haute des registres de données. Ne peut-il pas y avoir des problèmes avec d'autres programmes ? (Mais ça, c'est très facile à corriger).
// C Source File
// Created 05/09/2001; 13:42:36
void FastFilledRect(short x1,short y1,short x2,short y2,short mode,void *plane);
asm("xdef FastFilledRect
FastFilledRect:
movem.w %d0-%d7,-(%sp)
movem.l %a0/%a2-%a3,-(%sp)
/*moveq #0,%d0
moveq #0,%d1
moveq #0,%d2
moveq #0,%d3
moveq #0,%d4
moveq #0,%d5
moveq #0,%d6
moveq #0,%d7*/
lea 0.w,%a2
lea 0.w,%a3 | pas utile je pense, j'ai des lea.l sur a3.
move.w 32(%sp),%d0 | x1
move.w 34(%sp),%d1 | y1
move.w 36(%sp),%d2 | x2
move.w 38(%sp),%d3 | y2
| Suppress checking... This slows down the routine.
/*moveq #-16,%d4 | bounds checking
cmp.w %d0,%d4
bge end
cmp.w %d2,%d4
bge end
moveq #-128,%d4
cmp.w %d1,%d4
bge end
cmp.w %d3,%d4
bge end*/
| let's verify parameter mode
/*cmpi.w #3,56(%sp)
bge end*/
move.w %d2,%d4
sub.w %d0,%d4 | dx
sub.w %d1,%d3 | dy
tst.w %d3
bgt.s continueFR
move.w %d3,%d5 | dy<0
add.w %d1,%d5
move.w %d5,%d1
neg.w %d3
continueFR:
tst.w %d4
bge.s calc_start_addrFR
neg.w %d4
exg %d0,%d2
calc_start_addrFR:
move.w %d0,%d5
move.w %d1,%d6
mulu.w #30,%d6
lsr.w #3,%d5
add.w %d5,%d6
move.l 42(%sp),%a0
adda.l %d6,%a0
| a0=address of the rectangle in memory.
move.w %d2,%d1
lsr.w #3,%d1
sub.w %d5,%d1
move.w %d1,%d7
lea byte_1st_vals,%a3
move.w %d0,%d6
lsl.w #3,%d5
sub.w %d5,%d6
cmpi.w #1,%d7
blt.s dx_1bFR | if 0 then it's only one byte.
bgt.s dx_3pbFR | if 2 or more then it's 3 bytes or more.
| 2 bytes: use of words impossible because of address errors...
| damn the 68000, this would increase speed...
move.b 0(%a3,%d6),%d5
move.b %d2,%d6
move.b %d6,%d7
lsr.b #3,%d6
lsl.b #3,%d6
sub.b %d6,%d7
lea byte_last_vals,%a3
move.b 0(%a3,%d7),%d7
move.w #28,%a2
clr.w -(%sp) | to get rid of move.w %d0,-(%sp) in dx_3pb
move.w 42(%sp),%d4
bra draw2FR
dx_1bFR:
move.w %d4,%d5
neg.w %d5
addq.w #7,%d5
move.b 0(%a3,%d5),%d6
move.w %d0,%d1
lsr.w #3,%d1
lsl.w #3,%d1
sub.w %d1,%d0
sub.w %d0,%d5
lsl.w %d5,%d6
move.w #29,%a2
clr.w -(%sp) | to get rid of move.w %d0,-(%sp) in dx_3pb
move.w 42(%sp),%d4
bra.s draw1FR
dx_3pbFR:
move.b 0(%a3,%d6),%d6
move.w %d2,%d5
move.w %d5,%d7
lsr.w #3,%d5
lsl.w #3,%d5
sub.w %d5,%d7
lea byte_last_vals,%a3
move.b 0(%a3,%d7),%d7
move.w %d0,%d4
move.w %d2,%d1
lsr.w #3,%d1
lsr.w #3,%d4
sub.w %d4,%d1
move.w %d1,%d0
subq.w #2,%d0
neg.w %d1
add.w #29,%d1
move.w %d1,%a2
move.w %d0,-(%sp)
move.w 42(%sp),%d4
bra.s draw3pFR
draw1FR:
cmpi.w #1,%d4
blt.s _clr1FR
bgt.s eor1FR
or1FR:
or.b %d6,(%a0)+
adda.l %a2,%a0
dbf %d3,or1FR
bra finish
_clr1FR:
not.b %d6
clr1FR:
and.b %d6,(%a0)+
adda.l %a2,%a0
dbf %d3,clr1FR
bra finish
eor1FR:
eor.b %d6,(%a0)+
adda.l %a2,%a0
dbf %d3,eor1FR
bra finish
draw2FR:
cmpi.w #1,%d4
blt.s _clr2FR
bgt.s eor2FR
or2FR:
or.b %d5,(%a0)+
or.b %d7,(%a0)+
adda.l %a2,%a0
dbf %d3,or2FR
bra finish
_clr2FR:
not.b %d5
not.b %d7
clr2FR:
and.b %d5,(%a0)+
and.b %d7,(%a0)+
adda.l %a2,%a0
dbf %d3,clr2FR
bra.s finish
eor2FR:
eor.b %d5,(%a0)+
eor.b %d7,(%a0)+
adda.l %a2,%a0
dbf %d3,eor2FR
bra.s finish
draw3pFR:
cmpi.w #1,%d4
blt.s clr3pFR
bgt.s eor3pFR
or3pFR:
moveq #-1,%d5
_orFR:
or.b %d6,(%a0)+
loop2FR:
move.b %d5,(%a0)+
dbf %d0,loop2FR
or.b %d7,(%a0)+
adda.l %a2,%a0
move.w (%sp),%d0
dbf %d3,_orFR
bra.s finish
clr3pFR:
not.b %d6
not.b %d7
_clr3pFR:
and.b %d6,(%a0)+
loopFR:
clr.b (%a0)+
dbf %d0,loopFR
and.b %d7,(%a0)+
adda.l %a2,%a0
move.w (%sp),%d0
dbf %d3,_clr3pFR
bra.s finish
eor3pFR:
eor.b %d6,(%a0)+
loop3FR:
not.b (%a0)+
dbf %d0,loop3FR
eor.b %d7,(%a0)+
adda.l %a2,%a0
move.w (%sp),%d0
dbf %d3,eor3pFR
finish:
addq.l #2,%sp
end:
movem.l (%sp)+,%a0/%a2-%a3
movem.w (%sp)+,%d0-%d7
rts
.even
")