ASMtrad CPC

Apprenez l'assembleur Z80

Scrolling texte soft:

Afin de reussir cet exercice final (dont je ne vous donnerai que des indices), relisez bien le cours sur la réalisation d'une fonte.

Nous en étions resté à regarder si celle-ci était bien stockée comme nous le désirons.

Notre fonte est donc bien découpée en colonnes.

Une lettre fait donc 4 octets de large pour 16 lignes de haut, mais il faut l'afficher en colonne d'un octet.

Pour calculer l'adresse de la lettre dans notre fonte il faudra donc en revanche bien considérer 4*16 octets...
Ainsi, le A est en: #4000+0*(4*16) et le B est en #4000+1*(4*16) et ainsi de suite.

Comme notre table ASCII commence en 65 pour le A majuscule (voir dans la documentation du site pour la table des caractères ASCII), on pourra faire comme suit:

                lit_le_texte        LD          HL,TEXTE            ;HL pointe sur le texte
                                    LD          A,(HL)              ;On prend l'octet contenu à l'adresse HL et on le met dans le registre A
                                    SUB         65                  ;on enlève 65 à la valeur lue

Ainsi, si c'est un A qui est lu, après le LD A,(HL), le registre A contient 65.
En enlevant 65 à cette valeur, on obtient bien 0 ce qui nous arrange bien pour trouver la lettre dans la fonte !!!

Et ca marche aussi avec toutes les lettres...

On Prend la lettre "C" par exemple.
Sa valeur ASCII est 67.
Si on enlève 65 à cette valeur, alors on obtient 2...
Hors notre lettre C est bien en 2 :) (n'oubliez pas le 0).

Nos lettres dans la fonte font 4*16 octets.
Ce qui nous fait 64 octets de longueur pour une lettre. Il faut donc multiplier la valeur calculée précédemment par 64.

Pour cela comme nous l'avons vu il suffit de faire des additions.

Notre valeur est dans A. Mais si on la multiplie par 64 on risque de dépasser très rapidement 255, ce qui est la valeur max pour un reg 8 bits...
Mettons donc notre valeur dans un reg 16bits:

                                    LD          L,A                 ;on recopie A dans L
                                    LD          H,0                 ;on met 0 dans H

HL contient donc bien notre valeur 8 bits de base. Sauf que là on va pouvoir la multiplier sans soucis.

                                    ADD         HL,HL               ;*2
                                    ADD         HL,HL               ;*4
                                    ADD         HL,HL               ;*8
                                    ADD         HL,HL               ;*16
                                    ADD         HL,HL               ;*32
                                    ADD         HL,HL               ;*64

Ouf on y est. (si vous ne vous rappelez plus pourquoi multiplier revient à additionner, revenez en arrière dans les cours).

Plus qu'à additionner cette valeur à l'adresse de la fonte.

                                    LD          DE,#4000
                                    ADD         HL,DE

Pour rappel, une addition sur 16bits passe toujours par HL qui contient donc toujours le resultat.

Hop c'est fini.

Regardons voir.

Imaginons qu'on lit la lettre "S"
"S" c'est la lettre de valeur 83.
On lui retire donc 65. On obtient 18.
18*64=1152.
#4000+1152(décimal 1152 notez bien). On obtient: #4480.

Allons donc voir ce qu'on trouve en RAM à cette adresse...

Fantastique c'est bien la lettre "S".

Pour faire un scroll texte nous avons donc besoin d'afficher la première colonne a droite.
Nous pour l'exemple on va partir de #C04F (Ce qui est l'octet le plus en haut à droite de l'écran standard).

Affichons donc une colonne

Vous savez afficher un sprite normalement.
A noter quand même qu'ici, un simple LDI suffit plutôt qu'un LDIR dans votre routine.
Encore mieux: donnez les adresses directement plutôt que de les calculer. Vous gagnerez du cpu...

Voici donc la première colonne affichée:

Le but est donc de combiner l'affichage des lettres par colonne avec un scroll soft.

Scrollons les 16 premières lignes (ca aussi vous savez faire):

Parfait notre Lettre c'est décalée d'un octet à gauche.
Nous pouvons donc afficher la colonne suivante, et ainsi de suite. Notez qu'on affiche donc toujours au même endroit !!!

Une colonne en plus:

Puis on scroll; on réaffiche une colonne, etc etc, jusqu'à ce qu'une lettre soit bien affichée en entier.
Ensuite on lit a lettre suivante, etc etc.

Voici en gros comment commencer puis continuer.

Etape 1:

                    -Scroll
                    -Lecture du texte
                    -Calcul de la lettre dans la fonte
                    -Affichage d'une colonne

C'est ce qu'on vient de faire en gros.

Etape 2:

                                        -Scroll
                    Compteur_lettre                                             ; si lettre pas finie alors on saute au label AFFICHAGE
                                        -Lecture du texte
                                        -Calcul de la lettre dans la fonte
                    AFFICHAGE
                                        -Affichage d'une colonne
                                        -JP Compteur_lettre

Voila, rien de plus simple.

N'oubliez pas après avoir affiché une colonne de sauvegarder HL pour la colonne suivante !!!

Suggestion: Il vaut mieux scroller avant d'afficher afin d'éviter une double colonne à droite !!!

Bon courage !!!