LE SCROLLING VERS LA GAUCHE
LE SCROLLING VERS LA DROITE
LE SCROLLING VERS LA GAUCHE ROULEAU
LE SCROLLING VERS LA DROITE ROULEAU
LE SCROLLING PAR BANDES


LE SCROLLING VERS LA GAUCHE

La fonction qui suit effectue un décalage d'un point de la droite vers la gauche. Elle répète cette procédure jusqu'à la ligne 199. Il vaut mieux bien sur scroller dans un écran prévu pour ça et seulement après le copier.

void scrolling_vers_gauche(unsigned char *ecran)
{
asm volatile("
cld
movl %0,%%esi
movl %%esi,%%edi
incl %%esi
movl $319,%%ecx
movb $200,%%dl
loop_scroll_vg:
pushl %%esi
pushl %%edi
pushl %%ecx
rep; movsb
popl %%ecx
popl %%edi
popl %%esi
addl $320,%%edi
addl $320,%%esi
decb %%dl
jne loop_scroll_vg
":
: "m" (ecran));

};


LE SCROLLING VERS LA DROITE

Mêmes remarques que pour le scrolling vers la gauche.

void scrolling_vers_droite(unsigned char *ecran)
{
asm volatile("
std
movl %0,%%esi
movl %%esi,%%edi
addl $318,%%esi
addl $319,%%edi
movl $319,%%ecx
movb $200,%%dl
loop_scroll_vd:
pushl %%esi
pushl %%edi
pushl %%ecx
rep; movsb
popl %%ecx
popl %%edi
popl %%esi
addl $320,%%edi
addl $320,%%esi
decb %%dl
jne loop_scroll_vd
":
: "m" (ecran));

};


LE SCROLLING VERS LA GAUCHE ROULEAU

Le contenu de l'écran est décale d'un point vers la gauche et le point le plus à gauche 0,y est replacé en 319,y. Le scrolling tourne sur lui-même. Il n'y a pas beaucoup d'utilisation pratique de ce type de scrolling.

void scrolling_rouleau_vers_gauche(unsigned char *ecran)
{
asm volatile("
cld
movl %0,%%esi
movl %%esi,%%edi
incl %%esi
movb (%%edi),%%bl
movl $319,%%ecx
movb $200,%%dl
loop_scroll_rvg:
pushl %%esi
pushl %%edi
pushl %%ecx
rep; movsb
popl %%ecx
popl %%edi
popl %%esi
movb %%bl,319(%%edi)
addl $320,%%edi
addl $320,%%esi
movb (%%edi),%%bl
decb %%dl
jne loop_scroll_rvg
":
: "m" (ecran));

};


LE SCROLLING VERS LA DROITE ROULEAU

Même fonction que celui vers la gauche, seul le point de sauvegarde change.

void scrolling_rouleau_vers_droite(unsigned char *ecran)
{
asm volatile("
std
movl %0,%%esi
movl %%esi,%%edi
addl $318,%%esi
addl $319,%%edi
movb (%%edi),%%bl
movl $319,%%ecx
movb $200,%%dl
loop_scroll_rvd:
pushl %%esi
pushl %%edi
pushl %%ecx
rep; movsb
popl %%ecx
popl %%edi
popl %%esi
movb %%bl,-319(%%edi) /*restitue point */
addl $320,%%edi
addl $320,%%esi
movb (%%edi),%%bl /*sauve point*/
decb %%dl
jne loop_scroll_rvd
":
: "m" (ecran));

};


LE SCROLLING PAR BANDES

A votre convenance, les routines pré-citées peuvent être modifiées afin de scroller sur une ligne de départ et sur un certain nombre de ligne. Je ne vous les donne pas mais je vais vous indiquer comment les modifier.

void scrolling_rouleau_vers_droite(unsigned char *ecran)
{
asm volatile("
std
movl %0,%%esi
movl %%esi,%%edi

addl $318,%%esi
addl $319,%%edi
movb (%%edi),%%bl
movl $319,%%ecx
movb $200,%%dl

Dans cette fonction, le premier groupe de ligne rouge récupère l'adresse de l'écran (paramètre %0 soit ecran. Pour déplacer le debut de la ligne il faut ajouter à esi et edi autant de ligne*320 qu'on a besoin.
Le nombre de ligne à scroller est à charger dans
dl donc à la deuxième ligne rouge.
Par exemple pour scroller à partir de la
10 lignes sur 60 lignes il faut mettre:

std
movl %0,%%esi
movl %%esi,%%edi

addl $10*320,%%esi
addl $10*320,%%edi

addl $318,%%esi
addl $319,%%edi
movb (%%edi),%%bl
movl $319,%%ecx
movb $60,%%dl

C'est pareil pour le scrolling horizontal normal.