Forum tama's team
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Forum tama's team

cp: ne peut évaluer `brain': Aucun fichier ou dossier de ce type
 
AccueilPortailGalerieRechercherDernières imagesS'enregistrerConnexion
Connexion
Nom d'utilisateur:
Mot de passe:
Connexion automatique: 
:: Récupérer mon mot de passe
Derniers sujets
» Numbers
[C]Scroll Icon_minitimepar Ver2guerre Dim 02 Avr 2023, 00:47

» Mort ?
[C]Scroll Icon_minitimepar godbod Dim 22 Aoû 2021, 12:23

» Network, essai 1
[C]Scroll Icon_minitimepar godbod Dim 09 Juil 2017, 02:18

» GODBOD
[C]Scroll Icon_minitimepar godbod Sam 08 Juil 2017, 14:05

» mon humeur
[C]Scroll Icon_minitimepar Ver2guerre Sam 30 Juil 2016, 19:44

» [A voir] Programme de traduction original : WikiTranslate
[C]Scroll Icon_minitimepar AdRiWeB Lun 01 Fév 2016, 04:50

» Reprise ?
[C]Scroll Icon_minitimepar Emyl Jeu 14 Juin 2012, 21:17

» Euh, ah ?
[C]Scroll Icon_minitimepar Ver2guerre Dim 27 Mai 2012, 12:11

» Problème TI 89 Titanium non visible après mise à jour
[C]Scroll Icon_minitimepar abdoukid Mer 23 Mai 2012, 13:37

» Y'a quelqu'un ?
[C]Scroll Icon_minitimepar Ver2guerre Sam 21 Avr 2012, 23:10

Quick message
Qui est en ligne ?
Il y a en tout 5 utilisateurs en ligne :: 0 Enregistré, 0 Invisible et 5 Invités

Aucun

Le record du nombre d'utilisateurs en ligne est de 367 le Dim 18 Oct 2009, 00:16
Le Deal du moment :
Tablette 11″ Xiaomi- Mi Pad 6 global version ...
Voir le deal
224.97 €

Partagez | 
 

 [C]Scroll

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
tama
Admin
Admin
tama

Nombre de messages : 12376
Age : 32
Localisation : DTC ? :triso:
Humeur : =)
items : o
Personalized field : huh ? oO
Réputation : 3
Points : 9434
Date d'inscription : 08/08/2007

Profil
TI: 84+, 89 tita, 89 tita
TO: infini :p
Spécialité: C 68k

[C]Scroll Vide
MessageSujet: [C]Scroll   [C]Scroll Icon_minitimeJeu 29 Avr 2010, 16:54

Scrolling en C sur 68k
Comment faire pour scroller l'écran en C ?

Aujourd'hui, nous allons voir comment faire "scroller" l'écran dans les 4 directions : haut, bas, gauche, droite (amusez-vous à faire des combos, haut-gauche, bas-droite si vous voulez une fois que vous aurez compris le truc :p)

Codage en mémoire

Voyons déjà comment sont codés les "zolis pixels" que vous voyez à l'écran :
Sur les 68k, l'adresse de l'écran est 0x4c00, le 0x signifiant bien sûr que c'est en héxadécimal... Chaque octet représente 8 pixels, avec un 1 si le pixel est allumé, ou un 0 s'il est éteint. Pour accéder à un pixel bien particulier de l'écran (exemple : le 42ème de la 37ème ligne), il va falloir faire des manipulations avec des masques et des décalages, mais ce n'est pas (tout à fait) le propos ici
On en conclut facilement que 30 octets en mémoire représentent 1 ligne, puisque 8x30 = ... 240 ! La largeur de l'écran des TI92/v200, quel hasard ! ...
Et pour les TI89 alors ? Eh bien, pour chaque ligne, il y a 20 octets utilisés (8x20 ...) et les 10 octets suivants ne "servent à rien", en tout cas les modifier n'a aucune incidence sur l'écran.
Voilà pour le codage en mémoire, passons maintenant au scrolling

Scrolling, haut-bas

D'après ce qui a été dit dans le dernier paragraphe, il est facile d'en déduire comment faire pour "scroller" d'une ligne vers le haut ou d'une ligne vers le bas : il suffit simplement de "décaler tout de 30 octets"
Pour le scrolling vers le haut par exemple, les octets "+0 à +30" seront perdus (la notation est faite exprès), ceux de "+30 à +60" se retrouveront en "+0 à +30" etc ... pour chaque ligne. Et on applique exactement le même principe pour le scrolling vers le bas, de l'autre côté.
Pour cela, on aura donc juste besoin d'une instruction : memcpy, qui s'utilise de la façon suivante : memcpy(destination , source , nbre_d_octets_a_copier)

Avec du code, cela donne pour le scrolling vers le haut :


#define uchar unsigned char /* evite de devoir se trimballer des unsigned char, oui je suis flemmard :p
#define SCR_ADDR 0x4c00 /* constante : adresse de base de l'ecran */

void scroll_up()
{
uchar *screen_addr = (uchar *)SCR_ADDR; /* adresse de base de l'ecran */
uchar *addr;
uchar i;

for(i=1;i< LCD_HEIGHT;i++) /* boucle pour chaque ligne */
{
addr = screen_addr + 30*i; /* recupere l'adresse du premier octet de la ligne courante */
memcpy(addr-30,addr,30); /* copie les 30 octets de la ligne courante sur la ligne d'au-dessus */
}
}



Pas très compliqué, maintenant le scroll à gauche et à droite :

Scrolling, gauche/droite

Le scrolling gauche/droite est un poil plus compliqué, cette fois il va falloir faire des décalages de bits et des opérations binaires (ou binaire, ou le symbole | (1 seul suffit ...)).
Le principe cette fois est de prendre chaque octet (donc chaque groupe de 8 pixels), faire un décalage de 1 bit vers la gauche (ou la droite) (chaque groupe de 8 pixels sera alors décalé de 1 pixel ...). Oui mais wait, que faire du bit le plus à gauche (ou à droite) de chaque groupe ? Le pixel correspondant sera allumé ou éteint selon le pixel qui est à sa droite ou à sa gauche, il faut donc récupérer le bit de poids fort de l'octet suivant (scroll gauche) ou le bit de poids faible de l'octet précédent (scroll droite)

On doit donc appliquer ce principe aux 30 octets de chaque ligne :
- Décalage d'un bit vers la gauche de chaque octet (revient à faire une multiplication par 2, pour le faire à la main, convertissez le nombre en binaire, c'est un unsigned char donc entre 0 et 255, ça tient sur 8 bits, puis décalez tout d'un cran vers la gauche, le bit le plus à gauche étant perdu)
- Retenue du bit de poids fort (ou de poids faible) de l'octet suivant (précédent)
- Ou logique avec l'octet actuellement traité

Ce qui donne pour le scrolling à gauche ce que vous avez vu quelques posts plus haut :


#define uchar unsigned char

void scroll_left()
{
uchar ligne,col,next;
uchar *screen_addr;

/* screen_addr contient l'adresse de depart de l'ecran (0x4c00) */
screen_addr = (uchar *)0x4c00;

for(ligne=0;ligne< LCD_HEIGHT;ligne++)
{
for(col=0;col<29;col++)
{
/* decalage de 1 bit vers la gauche (1 pixel vers la gauche) */
*screen_addr = *screen_addr << 1;

/* recupere le bit de poids fort (1er pixel de l'octet suivant) */
next = *(screen_addr + 1);
next = (next >> 7) & 1;

/* modifie le dernier pixel de l'octet en cours selon la valeur du bit de poids fort de l'octet suivant */
*screen_addr = *screen_addr | next;

/* prochain octet */
screen_addr ++ ;
}

/* saute le 30eme octet de la ligne */
screen_addr ++ ;
}
}



petit arrêt sur les lignes :


next = *(screen_addr + 1);
next = (next >> 7) & 1;
*screen_addr = *screen_addr | next;



la première ligne permet de récupérer l'octet suivant, la seconde fait un décalage de 7 bits vers la droite pour que le bit le plus à gauche (bit de poids fort, MSB) se retrouve tout à droite. On aurait aussi pu faire (next << 1) qui aurait eu le même effet. Le & est un "et logique", c'est-à-dire que le résultat vaudra 1 seulement si le bit de poids fort vaut 1, puisque s'il vaut 0, 0 & 1 = ... 0
On a ainsi le bit de poids fort (0 ou 1) puis on fait un "ou logique", c'est-à-dire que le bit de poids faible de l'octet en cours vaudra 1 si le bit de poids fort de l'octet suivant est à 1 (s'il vaut 0, 0 | 0 = 0 ...)
Compliqué ? En schéma, cela donnerait :
[C]Scroll Tuto_s10

(désolé pour la qualité, c'est fait avec paint et j'étais en mode flemmard :p)

Le scrolling à droite se fait selon le même principe que le scrolling à gauche.
Vous savez maintenant faire un scrolling dans les 4 directions (en principe). Ce tuto a donc atteint son but et donc se termine ici. Posez vos questions si vous en avez :)



(from ti-bank, écrit par ... moi :p)
Revenir en haut Aller en bas
Ver2guerre
chasseur en chef
chasseur en chef
Ver2guerre

Nombre de messages : 3145
Age : 113
Localisation : Partout en même temps (V2g quantique)
Loisirs : #pkill boulet
Humeur : Happy :)
items : [C]Scroll V2gqe7
Personalized field : 12 jetons
Réputation : 8
Points : 7523
Date d'inscription : 15/09/2007

Profil
TI: (TI-89Tita)^2+TI83Plus
TO: 50 [2380 - 2%] {54}
Spécialité: Autres

[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitimeVen 30 Avr 2010, 00:26

Ouh, c'est du bon tuto ça. Merci
Et puis, n'oublie pas de te mettre des TOs :p
Revenir en haut Aller en bas
tama
Admin
Admin
tama

Nombre de messages : 12376
Age : 32
Localisation : DTC ? :triso:
Humeur : =)
items : o
Personalized field : huh ? oO
Réputation : 3
Points : 9434
Date d'inscription : 08/08/2007

Profil
TI: 84+, 89 tita, 89 tita
TO: infini :p
Spécialité: C 68k

[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitimeSam 01 Mai 2010, 14:39

45 << infini :p (non ce n'est pas une commande linux :))
Revenir en haut Aller en bas
Ver2guerre
chasseur en chef
chasseur en chef
Ver2guerre

Nombre de messages : 3145
Age : 113
Localisation : Partout en même temps (V2g quantique)
Loisirs : #pkill boulet
Humeur : Happy :)
items : [C]Scroll V2gqe7
Personalized field : 12 jetons
Réputation : 8
Points : 7523
Date d'inscription : 15/09/2007

Profil
TI: (TI-89Tita)^2+TI83Plus
TO: 50 [2380 - 2%] {54}
Spécialité: Autres

[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitimeDim 02 Mai 2010, 12:21

Argh, de la physique !!
Revenir en haut Aller en bas
Marco
super membre
super membre
Marco

Nombre de messages : 110
Age : 33
Localisation : 78
Loisirs : Musique, cinéma, lecture, toute forme de geekage
items : o
Personalized field :
Réputation : 100
Points : 5460
Date d'inscription : 11/09/2009

Profil
TI: 83+
TO: 200
Spécialité: Basic z80

[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitimeDim 02 Mai 2010, 12:56

tama a écrit:
45 << infini :p (non ce n'est pas une commande linux :))
Je dirais même plus 45 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<...<<< infini
Revenir en haut Aller en bas
http://marco781.free.fr
tama
Admin
Admin
tama

Nombre de messages : 12376
Age : 32
Localisation : DTC ? :triso:
Humeur : =)
items : o
Personalized field : huh ? oO
Réputation : 3
Points : 9434
Date d'inscription : 08/08/2007

Profil
TI: 84+, 89 tita, 89 tita
TO: infini :p
Spécialité: C 68k

[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitimeDim 02 Mai 2010, 21:55

oui c'est vrai aussi :p
Revenir en haut Aller en bas
Marco
super membre
super membre
Marco

Nombre de messages : 110
Age : 33
Localisation : 78
Loisirs : Musique, cinéma, lecture, toute forme de geekage
items : o
Personalized field :
Réputation : 100
Points : 5460
Date d'inscription : 11/09/2009

Profil
TI: 83+
TO: 200
Spécialité: Basic z80

[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitimeDim 02 Mai 2010, 22:10

Référence à mon prof de physique :/
Il serait même capable de dire que ça c'est l'ordre de grandeur de 45 (hahaha on est gâtés ^^").
Revenir en haut Aller en bas
http://marco781.free.fr
tama
Admin
Admin
tama

Nombre de messages : 12376
Age : 32
Localisation : DTC ? :triso:
Humeur : =)
items : o
Personalized field : huh ? oO
Réputation : 3
Points : 9434
Date d'inscription : 08/08/2007

Profil
TI: 84+, 89 tita, 89 tita
TO: infini :p
Spécialité: C 68k

[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitimeDim 02 Mai 2010, 22:22

bah nous notre prof disait que a << b si b/a > 100, donc vu le nombre de "<" ça serait pas assez :p (infini / 45 ? ...)
Revenir en haut Aller en bas
Contenu sponsorisé




[C]Scroll Vide
MessageSujet: Re: [C]Scroll   [C]Scroll Icon_minitime

Revenir en haut Aller en bas
 

[C]Scroll

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum tama's team :: TI :: TI 68k :: Tutoriels-
Créer un forum | ©phpBB | Forum gratuit d'entraide | Signaler un abus | Forum gratuit | Informatique et Internet | Informatique et électronique