L'assembleur 6502/6510 #03 - LDX/CPX INX/DEX BNE/BEQ
HTML-код
- Опубликовано: 19 янв 2025
- Cours n°3 sur l'assembleur 65xx et son application au Commodore 64.
Au programme :
Dans le compilateur :
Ajout de nouveaux labels pour créer une boucle (loop) et une sortie (exit)
Dans le langage assembleur 65xx :
LDX : LoaD X register (en mode absolu)
CPX : ComPare X
INX : INcrement X
DEX : DEcrement X
BNE : Branch on Non Equal
BEQ : Branch on EQual
Les prérequis pour cette vidéo sont les même que dans le cours n°1 : • L'assembleur sur Commo...
J'essai d'être toujours aussi clair et concis que possible, tout en illustrant mes dires avec du code, rédigé au fur et à mesure de la vidéo.
Je vous propose également des exercices pratique corrigés ensemble... Pensez à mettre la vidéo en pause le temps de faire vous même ces exercices !
N'hésitez pas à revenir vers moi dans les commentaires si nécessaire. Toutes les questions sont bonnes à prendre et je répondrai à tout le monde !!!
Voici la liste des liens que je présente dans la vidéo :
Les instructions du processeur 6502/6510 : www.6502.org/us...
Et n'oubliez pas qu'un petit pouce en l'air en signe d'encouragement fait toujours plaisir, et qu'un nouvel abonnement est toujours agréable.
Prenez soin de vous.
J'adore tes videos. Tu as tout compris. Pour moi c'est la meilleure façon d'initier les gens à l'assembleur. la programmation par l'exemple en partant des choses simples et en ne négligeant jamais les choses qui paraissent évidentes. Bravo :)
Totalement d'accord.
Merci pour ton soutien 😜
excellent moyen d'utiliser la formule de la ligne 20 pour centrer le texte
L'informatique c'est aussi des mathématiques !
Encore un super cours. Pour le premier exercice "clear_screen_maison" , j'ai fait 4 boucles qui dessinent un caractère vide avec une augmentation pour chaque boucle de 256 , 513 et 769 à MEMORY_SCREEN afin de balayer tout l'écran. Pour la recopie de l'invite de commande basic, j'ai recopié les 4 premières lignes écran que j'ai descendues, le tout avec de l'adressage absolu. J'ai réutilisé mon clear_screen maison mais sur 2 boucles seulement afin d'effacer seulement le haut de l'écran. C'est bien 256, 513, et 769 qu'il faut utiliser comme offset et non 255, 512 et 768 ?
Bonjour @bond5174 ,
Alors l'effacement de l'écran peut se faire de plein de façons différentes. Les offsets à utiliser pour ta boucle sont 0, 256, 512 et 768 (tu rajoutes 256 à chaque fois). Cependant, ta méthode va poser un problème si tu remplis de 1792 à 2047 car tu vas bien remplir la partie d'écran entre 1792 et 2023 avec le caractère ''espace'', mais aussi la zone mémoire 2024 à 2047. Or, cette zone contient les informations relatives aux sprites (entre 2040 et 2047), ce qui peut être gênant si ton code les utilise.
Tu peux le faire en une seule boucle de 250 valeurs (l'écran fait 1000 octets, donc le plus simple est d'utiliser 4 x 250).
Après, libre à toi de faire autant de boucles que tu le souhaite. Si l'objectif est de travailler avec des lignes, prend un multiple de 40 (par paquet de 6 lignes, ça te donne : offsets 0, 240, 480,720 et la dernière ligne ne sera pas affectée... et tant mieux puisque tu y as recopié la ligne d'entête pour qu'elle y soit affichée).
Je te propose de regarder la solution que je propose dans le cours N°4, et on se retrouve dans les commentaires de celle-ci pour en discuter si tu le souhaites.
@@RetroProgrammation Merci d'avoir corrigé mon erreur. Je regarde la vidéo suivante...
Bon visionnage
Ah oui bien vu l'exercice + la correction, j'ai commencé l'asm il y a pas longtemps donc j'ai pas encore les bonnes habitudes, sur le deuxième exercice j'avais pas pris en compte que les valeur d'un byte bouclait de 0 à 255 ce qui m'a mené à de la répétition de code pour afficher le dernier caractère:
PRINT_COUCOU:
*ldx* 🔸5
loop:
*lda* COUCOU,X
*sta* COUCOU_START,X
*dex*
*cpx* 🔸0
*bne* loop
*lda* COUCOU,X
*sta* COUCOU_START,X
*rts*
ta solution est + propre je trouve
_Edit:_ J'ai pu faire les deux exercices (effacer l'écran et déplacer la deuxième ligne tout en bas). Disons que ça fonctionne mais comme on a pas encore vu la manipulation des high byte / low byte j'ai du diviser mon écran en 4 quarts et donc ajouter 3 adresses en dur.
Salut !
La vidéo 4 sera terminée demain normalement ;)
Pour ce qui est de ton code, si tu veux faire du dex, la solution est plus simple...
PRINT:
ldx #$06
loop:
lda COUCOU - 1,x
sta COUCOU_START - 1,x
dex
bne loop
rts
En fait, tu commence par 6 jusque 1 (donc tu retranches 1 à la position mémoire de COUCOU et COUCOU_START)
et lorsque le dex va mettre X à 0, le flag ZERO (on n'a pas encore vu les flags, donc éventuellement tu aurais pu mettre cpx #$00) sera activé et donc BNE ne sera plus appliqué (il s'appuie sur le flag ZERO pour le branchement)
Du coup, c'est également plus court comme code, et plus rapide, mais moins intuitif pour débuter une formation à l'assembleur.
@@RetroProgrammation Cool on peut rajouter un deuxième offset avec + et - sur l'adresse avant la virgule c'est noté 😎
Du coup je n'ai plus besoin des 3 autres .const que j'avais ajouté pour atteindre toutes les cases de l'écran dans mon CLEAR_SCREEN.
Attention, le -1 que j'ajoute, ce n'est pas un paramètre à l'instruction !!!
Quand j'écris
lda MEM - 1
si MEM = $4000, le compilateur va comprendre et compiler
lda $3FFF
C'est un peu comme si j'avais écrit (MEM - 1) entre parenthèses... et donc le seul offset utilisé par l'instruction lda (ou sta) c'est le "x" qui lui peut varier, alors que MEM - 1 est une constante.
@@RetroProgrammation ok merci pour la précision; en gros si j'ai bien compris ça va réécrire le code avec la bonne vleur en dur donc les pseudos opérations doivent être faites avec des valeurs constantes
C'est bien ça