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


COPIE MEMOIRE

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.).

 


COPIE MEMOIRE TRANSPARENTE

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..