Les routines que l'on va voir permettent de
copier des zones de mémoire d'un endroit à un autre.
Elles sont classées en 3 catégories:
COPIE
MEMOIRE
COPIE MEMOIRE TRANSPARENTE
COPIE MEMOIRE SUR VGA AVEC SYNCHRO
VERTICALE
ecrs: pointeur sur
le buffer source de 64000 octets.
ecrd: pointeur sur le buffer de destination de 64000 octets.
void copy_screen(BYTE *ecrs,BYTE *ecrd)
{
asm volatile("
movl %0,%%esi
movl %1,%%edi
movl $16000,%%ecx
cld
rep; movsl
":
: "m" (ecrs),"m" (ecrd));
}
Cette routine copie la zone de mémoire pointée par
ecrs vers la zone de mémoire pointée par ecrd.
Notons que la copie se fait en incrément (cld) et par mots
de 32 bits (rep; movsl)
et c'est pour cette raison que l'on copie 16000 mots longs et non
pas 64000..
C'est cette routine qui copie dans Totalwar le décor de fond dans l'écran final
(réf:Construction d'une image.).
ecrd : pointeur sur le buffer de destination de 64000
octets.
ecrs: pointeur sur le buffer source de 64000 octets
void t_copy_screen(byte *ecrd,byte *ecrs)
{
asm volatile("
movl %0,%%edi
movl %1,%%esi
movl $64000,%%ecx
l_t_copy:
movb (%%esi),%%al
orb %%al,%%al
je l_t_copy1
movb %%al,(%%edi)
l_t_copy1:
incl %%esi
incl %%edi
decw %%cx
jne l_t_copy
"
:
: "m" (ecrd),"m" (ecrs));
}
Dans cet exemple de routine, la
transparence est déterminée par l'index de couleur 0. Même si
cette couleur n'est pas noir, ce index ou point ne sera pas
placé sur l'écran de destination.
C'est cette fonction qui copie l'écran parallax de Totalwar dans l'écran final
(ref:Construction d'une image.).
COPIE MEMOIRE VGA AVEC SYNCHRO VERTICALE
void vstoscreen(unsigned short video,unsigned char *ecran1)
{
while(inportb(0x3DA)&0x8);
while(!(inportb(0x3DA)&0x8));
asm volatile("
pushw %%es
cli
movw %0,%%ax
movw %%ax,%%es
xorl %%edi,%%edi
movl %1,%%esi
movl $16000,%%ecx
cld
rep; movsl
sti
popw %%es
"
:
: "g" (video),"g" (ecran1));
}
Cette routine va permettre de copier un écran
source (ecran1) sur la carte VGA avec une synchronisation sur le balayage
du moniteur (réf:Le synchronisation), ceci permettant une animation fluide.
Sur Totalwar cet écran est prédéfini comme étant ecran1 ou l'offset 64000.
ATTENTION: VIDEO n'est pas un pointeur sur la carte VGA mais un
sélecteur. Pour de plus amples renseignements à ce propos,
consultez la page Accès à la mémoire vidéo
320x200x256c..