Section courante

A propos

Section administrative du site

Les boucles

La manière la plus simple de mettre en oeuvre une boucle (c'est-à-dire de répéter une séquence d'instructions) avec le microprocesseur 6502 est la suivante :

  1. Chargez un registre d'index ou un emplacement mémoire avec le nombre de fois que la séquence doit être exécutée.
  2. Exécutez la séquence.
  3. Décrémentez le registre d'index ou l'emplacement mémoire de 1.
  4. Revenez à l'étape 2 si le résultat de l'étape 3 n'est pas 0.

Les programmes typiques ressemblent à ceci :

  1.       LDX #NTIMES; COUNT = NOMBRE DE REPETITIONS 
  2. LOOP:  .
  3.        .
  4.        . ; instructions à être répété
  5.       DEX 
  6.       BNE LOOP

Rien, sauf une question de clarté, nous empêche de compter (en utilisant les instructons INX, INY ou INC); bien sûr, vous devez modifier l'initialisation de manière appropriée. Un compteur 16 bits est beaucoup plus facile à incrémenter qu'à décrémenter. Dans tous les cas, les instructions à répéter ne doivent pas interférer avec le comptage des répétitions. Vous pouvez entreposer le compteur dans le registre d'index ou dans n'importe quel emplacement de mémoire. Les caractéristiques spéciales du registre d'index X sont son utilisation en pré-indexation et la large disponibilité des modes indexés à zéro page. La particularité du registre d'index Y est son utilisation en post-indexation. Comme d'habitude, les emplacements de mémoire sur la page sont plus courts et plus rapides à utiliser que les emplacements de mémoire sur les autres pages. Bien entendu, si vous utilisez un registre d'index ou un seul emplacement mémoire comme compteur, vous êtes limité à 256 répétitions. Vous pouvez fournir un plus grand nombre de répétitions en imbriquant des boucles utilisant un seul registre ou emplacement mémoire ou en utilisant une paire d'emplacements mémoire, comme illustré dans les exemples suivants :

  1.       LDX #NTIMM; DEBUT DU COMPTEUR EXTERIEUR
  2. LOOPO LDY #NTIML; DEBUT DU COMPTEUR INTERIEUR
  3. LOOPI 
  4.        ; instructions à répété 
  5.       DEY        ; DECREMENTATION DU COMPTEUR INTERIEUR
  6.       BNE LOOPI 
  7.       DEX        ; DECREMENTATION DU COMPTEUR EXTERIEUR
  8.       BNE LOOPO 

La boucle externe restaure le compteur interne (registre d'index Y) à sa valeur de départ (NTIML) après chaque décrémentation du compteur externe (registre d'index X). L'imbrication produit un facteur multiplicatif - les instructions commençant à LOOPI sont répétées NTIMM x NTIML fois. Bien sûr, une approche plus générale (et plus raisonnable) utiliserait deux emplacements de mémoire sur la page au lieu de deux registres d'index. Voici un exemple d'un compteur 16 bits dans deux emplacements de mémoire :

  1.       LDA #NTIMLC; INITIALISE LE LSB DU COMPTEUR
  2.       STA COUNTL 
  3.       LDA #NTIMHC; INITIALISE LE MSB DU COMPTEUR
  4.       STA COUNTH 
  5. LOOP   ; .
  6.        ; instructions à répété
  7.        ; .
  8.       INC NTIMLC  ; INCREMENTE LE LSB DU COMPTEUR
  9.       BNE LOOP 
  10.       INC NTIMHC  ; ET LA RETENUE A MSB DU COMPTEUR SI NECESSAIRE
  11.       BNE LOOP 

L'idée ici est d'incrémenter uniquement l'octet le moins significatif à moins qu'il n'y ait une retenue sur l'octet le plus significatif. Notez que nous ne pouvons reconnaître la retenue qu'en cochant le drapeau de zéro, puisque INC n'affecte pas le drapeau de retenue. Le compte à rebours est beaucoup plus simple que le compte à rebours; la séquence comparable pour décrémenter un compteur 16 bits est la suivante :

  1.          LDA NTIML   ; EST-CE QUE LSB EST UN COMPTEUR DE ZERO ? 
  2.          BNE CNTLSB 
  3.          DEC NTIMH   ; OUI, RETOURNE DE MSB 
  4. CNTLSB   DEC NTIML   ; DECREMENTE LE LSB DU COMPTEUR
  5.          BNE LOOP    ; CONTINUE SI LSB N'A PAS ATTEINT ZERO
  6.          LDA NTIMH   ; OU SI MSB N'A PAS ATTEINT ZERO
  7.          BNE LOOP 

Si nous comptons, cependant, nous devons nous rappeler d'initialiser le compteur au complément de la valeur souhaitée (indiquée par les noms NTIMLC et NTIMHC dans le programme utilisant INC).



Dernière mise à jour : Mardi, le 4 août 2020