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