Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le documentLes cours d'assembleur de Prehis-To
Retour à la liste

Initiation à l’assembleur 6809

Cours n°12

Quelques astuces

Récupération d’un pointeur dans une table par le registre Y ou S

Imaginez que vous vouliez récupérer un pointeur de la table pointée par X dans Y avec auto-incrémentation de X. L’expression « LDY ,X++ » équivaut à « LEAY [,X++] » à ceci près que « LDY ,X++ » utilise 3 octets à l’assemblage alors que « LEAX [,X++] » n’utilise que 2 octets. Le seul désavantage est que le premier est plus rapide que le second : vous perdrez en vitesse d’exécution ce que vous gagnerez en place. Il faudra choisir.

Test de la valeur dans les registres X ou Y

Nous avons vu que le simple chargement d’une valeur dans les registres X et Y positionnait le flag Z de CC. Au lieu d’utiliser l’expression « CMPY #$0000 », gourmande en temps et en place, préférez :

        LEAY   ,Y          Teste le registre
        BNE    ZZZZ        Si <> 0, branchement en ZZZZ

Récupération d’un code en sortie de programme

Une technique très utilisée. Si le programme poursuit son exécution en EXIT0, la valeur 1 est chargée dans A, l’exécution passe sur un « TST $8602 » puis rencontre le RTS. Si le programme branche l’exécution en EXIT1, la valeur 2 est chargée dans A puis l’exécution rencontre le RTS. Cela évite d’avoir à écrire un branchement à la place du code de « TST » qui prendrait un octet de plus. Il est à noter que le code de l’instruction « CMPX » ($8C) est aussi très utilisé mais altère le flag C de CC réservé bien souvent pour fixer une erreur :

  EXIT0 LDA    #$01         Charge la valeur 1 dans A
        FCB    $7D          Code instruction de « TST » en étendu
  EXIT1 LDA    #$02         Charge la valeur 2 dans A
        RTS                 Retour de sous programme

De même, pour ne pas casser la continuité d’un programme et lorsque l’on n’utilise qu’une instruction de code simple :

        FCB     $21    Code instruction du BRN
        CLRA           Charge la valeur 0 dans A

Mise à jour d’un flag dès l’entrée d’un programme

Selon que l’on entre à l’offset 0 ou à l’offset 1 d’un tel programme, A ou B est nul ou non :

        LDA   #$4F      ou          FCB   $86      Code du LDA
                                    CLRA           Met A à 0
        LDB   #$5F      ou          FCB   $C6      Code du LDB
                                    CLRB           Met B à 0

Récupération de l’opposé d’une valeur 16 bits

L’opposé d’une valeur, c’est sa complémentation + 1, soit :

        COMA            | Complémente
        COMB            | la valeur
        ADDD   #$0001   Ajoute 1 à la valeur

Restauration du CC avec récupération du flag d’erreur C

Une conclusion de routine savamment utilisée par les routines du Moniteur Disque. Le CC étant altéré pendant le programme, il est nécessaire de le protéger en pile dès le début du programme. Les routines du Moniteur Disque fixant l’erreur par un CLRA/CLRB (C de CC mis à 0) ou un COMA/COMB (C de CC mis à 1), le problème réside dans le fait qu’il faille, en sortie, en même temps préserver ce flag d’erreur et restaurer le CC initial :

        PSHS   A,CC     Empile le CC
        ...
        PULS   A        Récupère le CC initial dans A
        EXG    A,CC     Echange les deux CC
        LSRA            Transfère le CC d’erreur sur C du CC initial
        PULS   A,PC     Retour de sous-programme

Comparaison entre deux registres

Préférez empiler les registres pour une simple comparaison plutôt que réserver un espace mémoire :

        STU    ,--S     Empile le registre à comparer
        CMPX   ,S++     Compare et dépile le registre

Transfert rapide d’une zone

Pour les transferts rapides de zone, rien ne vaut l’utilisation de la pile. Le nombre de séquences dépendra du programmeur. Il faudra veiller à préserver les registres (surtout DP et CC), protéger le pointeur de pile et geler les interruptions :

        ...
        PULU   A,B,DP,X,Y      Récupère la zone source
        PSHS   Y,X,DP,B,A      Ecrit dans la zone destination
        LEAS   7*2,S           Pointe en début de zone destination suivante
        ...

Effacement rapide d’une zone

Même procédé que le programme précédent. Ce type de programme est d’ailleurs utilisé par l’instruction CLS sous Basic :

        CLRA                 |
        CLRB                 |
        TFR   A,DP           | Met les registres
        TFR   D,X            | à 0
        TFR   D,Y            |
        TFR   D,U            |
        ...
        PSHS  U,Y,X,DP,B,A   Ecrit dans la zone destination
        LEAS  9*2,S          Pointe en début de zone destination suivante
        ...

Etiquetage minimal

Dans votre programme source, les étiquettes en amont des branchements peuvent être avantageusement remplacées par un SET (des étiquettes commençant par la lettre B suivie d’un chiffre, par exemple), directive qui permet d’utiliser plusieurs fois la même étiquette dans un programme. Cela vous évitera à devoir constamment chercher un nom et économisera l’espace mémoire pour l’assemblage:

        ...
        CLRB         Registre B à 256 (0 en 8 bits)
  B0    SET    *     BO contient maintenant l’adresse courante du programme
        CLRA         Registre A à 256 (0 en 8 bits)
  B1    SET    *     B1 contient maintenant l’adresse courante du programme
        DECA         A = A - 1
        BNE    B1    Si A <> 0, branche en boucle sur B1
        DECB         B = B - 1
        BNE    B0    Si B <> 0, branche en boucle sur B0
Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret