TIGCC ne sauvegarde rien d'autre que d0-d2/a0-a1 (en longwords), le reste, tu t'en occupes.
Donc pour ton problème à mon avis, il faut que tu utilises de l'ASM inline, ce sera plus simple.
Flanker, as-tu eu ces problèmes en faisant du C+ASM ou que de l'ASM ?
Parceque l'histoire du switch... (je ne sais meme pas ce que c'est un switch).
;extern void FastDraw16(register signed short asm("d0"), register signed short asm("d1"),
; register signed short asm("d2"),
; void* sprite asm("a1"), void* silhouette asm("a2"), void* destination asm("a0"));
FastDraw16:
movem.l a2-a6/d3-d7,-(a7)
; movem.l a2-a3,-(a7)
; movem.w d3,-(a7)
subq.w #1,d2 ;pour la boucle de hauteur
lsl.l #6,d1 ;multiplication par 64 (largeur de l'ecran)
lsl.l #4,d1 ;multiplication par 16 (hauteur des cases)
lsl.l #1,d0 ;sprite de 2 octets de large
add.l d0,d1
add.l d1,a0 ;l'octet a modifié est pointé
move.w a2,d1
beq.s \affs
move.w d2,d3
move.l a0,a3
\transp
move.w (a3),d1
moveq.w #0,d0
move.w (a2)+,d0 ;a2 pointe la silhouette
not.w d0
and.w d0,d1
move.w d1,(a3)
lea.s 64(a3),a3
dbra.s d3,\transp
\affs
move.w (a0),d1
move.w (a1)+,d0 ;a1 pointe le sprite
or.w d0,d1
move.w d1,(a0)
lea.s 64(a0),a0
dbra.s d2,\affs
\pass_no_sprite
; movem.w (a7)+,d3
; movem.l (a7)+,a2-a3
movem.l (a7)+,a2-a6/d3-d7
rts
// Affiche un sprite en tenant compte de la transparence et des dimensions
void dispBGSprite(unsigned short* sprite, unsigned short i, unsigned short j)
{
void* transp;
unsigned short a,b,c;
a=*(sprite++); // Transparence
b=*(sprite++); // Largeur
c=*(sprite++); // Hauteur
transp = sprite + 2*16; // Adresse Silhouette
if (b==2)
{
if (a=1)
{
FastDraw16(i,j,c, sprite, transp, map_clair);
FastDraw16(i,j,c, sprite+16, transp, map_fonce);
}
else
{
FastDraw16(i,j,c, sprite, NULL, map_clair);
FastDraw16(i,j,c, sprite+16, NULL, map_fonce);
}
}
else if (b==4)
{
if (a=1)
{
FastDraw32(i,j,c, sprite+16, transp, map_fonce);
FastDraw32(i,j,c, sprite, transp, map_clair);
}
else
{
FastDraw32(i,j,c, sprite+16, NULL, map_fonce);
FastDraw32(i,j,c, sprite, NULL, map_clair);
}
}
}
; movem.w (a7)+,d3 ; movem.l (a7)+,a2-a3