Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Copie de variables
JJE
Amateur
Amateur
Messages : 160
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#1 Message par JJE » dim. 27 mai 2018 17:56

Bonjour à tous,
J'ai hésité à classer ce post dans les tutos ou dans la boîte à outils, pensant qu'il irait bien dans chaque boîte.
L'idée toute bête est qu'il est fréquent d'avoir à copier la valeur d'une variable dans une autre et que, comme ça se fait dans le meilleur des cas en 2 instructions, je doute que nous soyons nombreux à s'être penché sur ce problème qui n'a en fait d'importance que lorsque le programme manipule de nombreuses données nécessitant l'usage de plusieurs banque.
J'ai donc écrit un papier sur le sujet qui va jusqu'au passage de paramètre à des sous-programme il est ici
Copie de variables avec MPASM.pdf
, que Jérémy me pardonne, comme je voulais une bonne mise en page, j'ai préféré utiliser mon traitement de texte habituel qui sait faire du PDF comme format non propriétaire.
Un fichier à inclure dont le source est ci-dessous contient toutes les macros décrites dans le fichier ci-dessus. L'absence de commentaires est volontaire car, avec des macros on arrive très vite à des fichers .lst illisibles et pleins de répétitions.

Code : Tout sélectionner

;**********************************************************************
;
                Macros de Copie de variables                          *  
;                                                                     *
;**********************************************************************
;
                                                                     *
;
    NOM:      MacrosCopy                                              *
;
    Date:     27/05/2018                                             *
;
    Version:  1.0                                                    *
;
    Circuit:  sans objet                                             *
;
    Auteur:   JJE                                                     *
;
                                                                     *
;**********************************************************************
;
                                                                     *
;
    Notes:                                                           *
;
                                                                      *
;
                                                                     *
;**********************************************************************

    ifndef    STATUS
        
#DEFINE STATUS    3
    endif
    
BANKCHANGE    macro    Source
, But
    local V
, VV, VVV
V set low
(Source) & 0x80
VV set low
(But)& 0x80
    if V  
==&& VV ==0x80
        bsf    STATUS
, 5
    endif
    if V  
==0x80 && VV ==0
        bcf    STATUS
, 5
    endif
V set high
(Source) & 0x01
VV set high
(But)& 0x01
    if V  
==&& VV ==0x01
        bsf    STATUS
, 6
    endif
    if V  
==0x01 && VV ==0
        bcf    STATUS
, 6
    endif
    endm
    
    
COPY8    macro    Source
, But

    errorlevel 
-302
    movf    Source
,W    
    errorlevel 
+302
    BANKCHANGE    Source
, But
    errorlevel 
-302
    movwf    But
    errorlevel 
+302
    BANKCHANGE    But
, Source
    endm

COPY8A        macro        Source
, But
    BANKSEL    Source
    COPY8    Source
, But
    endm
    
COPY8B        macro        Source
, But
    swapf    STATUS
,W
    BANKSEL    Source
    movwf    SauveStatus
    COPY8    Source
, But
    swapf    SauveStatus
,W
    movwf    STATUS
    endm
    
COPY16    macro    Source
, But
    COPY8    Source
, But
    COPY8    Source
+1, But+1
    endm
    
COPYN    macro    Cmpt
, Source, But
    local V
, Index, W1, W2
V set Cmpt
Index    set    0
    while V 
!= 0
W1     set    Source
+Index
W2    set    But
+Index
        COPY8    W1
, W2
V    set    V
-1
Index    set    Index
+1        
    endw
    endm
    
COPY_2    macro A1
,A2,But
        COPY8    A1
,But
        COPY8    A2
,But+1
        endm

COPY_2A    macro Type1
, A1,Type2, A2,But
        local  offset
offset set  0        
        COPYN    Type1
,A1,But
offset set offset
+Type1
        COPYN    Type2
,A2,But+offset
        endm
        
COPY_3    macro A1
,A2,A3,But
        COPY8    A1
,But
        COPY8    A2
,But+1
        COPY8    A3
,But+2
        endm

COPY_3A    macro Type1
, A1,Type2, A2, Type3, A3, But
        local  offset
offset set  0        
        COPYN    Type1
,A1,But
offset set offset
+Type1
        COPYN    Type2
,A2,But+offset
offset set offset
+Type2
        COPYN    Type3
,A3,But+offset
        endm
        
COPY8_Ind        macro     A
        movf        A
,W
        movwf        INDF
        INCF        FSR
,F
        endm
        
COPY8_Ind_1        macro     A1
,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY8_Ind    A1
        endm
        
COPY8_Ind_2        macro     A1
,A2,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY8_Ind    A1
        COPY8_Ind    A2
        endm
        
COPY8_Ind_3        macro     A1
,A2,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY8_Ind    A1
        COPY8_Ind    A2
        COPY8_Ind    A3
        endm
        
COPY16_Ind        macro     A
        movf        A
,W
        movwf        INDF
        INCF        FSR
,F
        movf        A
+1,W
        movwf        INDF
        INCF        FSR
,F
        endm
        
COPY16_Ind_2        macro     A1
,A2,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY16_Ind    A1
        COPY16_Ind    A2
        endm
        
Appelle_SSP_3 macro Type1
, A1, Type2, A2, Type3, A3, Data_SSP, SSP
    COPY_3A     Type1
&0x7F, A1, Type2&0x7F, A2, Type3&0x7F, A3, Data_SSP
    BANKSEL    Data_SSP
    pagesel    SSP
    errorlevel    
-306
    call    SSP
    errorlevel    
+306
    pagesel    
$
    local V, offset
offset set 0
V    set    Type1
    if    V 
& 0x80
        COPYN    V 
& 0x7F, Data_SSP, A1    
    endif
offset set offset 
+ (& 0x7F)
V    set    Type2
    if    V 
& 0x80
        COPYN    V 
& 0x7F, Data_SSP+offset, A2    
    endif
offset set offset 
+ (& 0x7F)
V    set    Type3
    if    V 
& 0x80
        COPYN    V 
& 0x7F, Data_SSP+offset, A3    
    endif
    endm



Ci dessous un petit programme de test très partiel à éxecuter sous le simulateur de MPLAB en pas à pas. Des commentaires indiquent les opérations à effectuer.

Code : Tout sélectionner

;**********************************************************************
;
                       Tests MacrosCopy                          *  
;                                                                     *
;**********************************************************************
;
                                                                     *
;
    NOM:      Tests MacrosCopy                                        *
;
    Date:     27/05/2018                                             *
;
    Version:  1.0                                                    *
;
    Circuit:  sans objet                                             *
;
    Auteur:   JJE                                                     *
;
                                                                     *
;**********************************************************************
;
                                                                     *
;
    Notes: 
;    Ce petit programme permet de tester les macros du fichier inclus  *
;
    sous le simulateur de MPLAB
;    Il teste les mocros COPY...
;
     Des directives de mise en oeuvre sont données en commentaire
;                                                                     *
;**********************************************************************

    #DEFINE    PCLATH    0x0A
    #DEFINE    STATUS    .3
        
;*********************************************************************
;
                   DECLARATIONS DE VARIABLES                        *
;*********************************************************************


    CBLOCK 0x020                   ; Début de la zone des variables  
    
; sauvegardes pour l'IT
    w_temp : 1                    ; W
    status_temp : 1                ; STATUS

; variables utiles 
    A    : 2
    AA : 2
    But    : 5
    
    ENDC                        ; Fin de la zone
     
    CBLOCK    0xD0
    VZ : 8
    ZZ    : 8
    Truc : 1
    ENDC                        ; Fin de la zone 
    
    CBLOCK 0xE0
    Data_add_8bits_signés : 0
    Op1    : 1
    Op2    : 1
    Result    : 1
    ENDC
    
    CBLOCK    0x140
    WZ : 8
    AAA:1
    ENDC
    
    CBLOCK    0x195
    DataSSP : 5
    ENDC
    
    CBLOCK 0X40
    SauveStatus    : 1
    ENDC
    CBLOCK SauveStatus +0x80
    SauveStatusP1    : 1
    ENDC
    CBLOCK SauveStatus +0x100
    SauveStatusP2    : 1
    ENDC
    CBLOCK SauveStatus +0x180
    SauveStatusP3    : 1
    ENDC
    

;*********************************************************************
;                             MACRO                                  *
;*********************************************************************

    include    "MacrosCopy.inc"
    
;**********************************************************************
;                      DEMARRAGE SUR RESET                            *
;**********************************************************************

    org     0x000                 ; Adresse de départ après reset
      goto    init                 
      
;**********************************************************************


init
    ; ouvrir une fenêtre Watch
    ; y ajouter les variables A, ZZ et STATUS
    movlw    .100
    movwf    A
    ; ici, A vaut 0x64 (.100)
    ;        ZZ 0
    ; STATUS<6,5> b'
00'
    COPY8    A, ZZ
    ;  ici, A inchangé
    ;        ZZ = .x64
    ; STATUS<6,5> b'
00' on n'a pas changé de banque active 
    
; et pourtant ZZ est en banque 1
    
    
; les curieux pourant lire le listing d'asemblage pour constater 
    ; qu'
il n'a pas été touché à un autre bit de STATUS que le bit 5
    ; les encore plus curieux pouront lire le fichier .lst pour voir 
    ; le travail du macro-processeur
    
    ; pour vous convaincre de la bizarrerie de MPASM, lisez le résultat
    ; du macro-assembleur pour l'
instruction suivante, on ne sera pas surpris
    
; que son appel ne donne pas le résultat attendu,
    ; Il est généré un BANKCHANGE ZZ, ZZ au lien d'un BANKCHANGE But, ZZ
   
    COPY8    But, ZZ.
   
    ; Il semble que le macro-processeur remplace le paramètre formel Source
    ; par le paramètre effectif But puis le paramètre formel But par le paramètre 
    ; effectif ZZ sans tenir compte de la substitution précédente. 
    
    ; je vous laisse le soin de compléter avec les tests que vous souhaitez
    
    goto    $
    
    org    0x0800
    
    END             ; directive fin de programme



Bonne lecture en espérant ne pas déclencher trop de polémique :sifflotte:

Cordialement
PS je m'absente quelques jours
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e

Copie de variables
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1007
Enregistré en : juillet 2016
Localisation : Terre

#2 Message par Temps-x » lun. 28 mai 2018 01:53

Bonsoir JJE, et tout le forum,

Le problème d'une copie d'une variable c'est de savoir dans quelle banque elle se trouve, mais comme vous le savait une
directive existe pour changer de bank, la directive se nome BANKSEL

Exemple :

BANKSEL : non du registre ou variable (et vous, vous retrouvez dans la bank approprié)

Vous allez me dire on connais cette directive, oui mais là ou ça devient intéressant, c'est quand elle est mi dans une macro.

Je vous laisse deviner la suite.

==> A+
Quand la souris nargue le chat, c'est que son trou n'est pas loin.

Copie de variables
JJE
Amateur
Amateur
Messages : 160
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#3 Message par JJE » lun. 28 mai 2018 18:50

Bonsoir à tous,

Comme illustration de la conclusion de mon papier, ci-dessous un petit programme qui reprend le programme de tests de routines arithmétiques 8 bits signés
La macro Appelle_add_8bits_signé devrait être fournie avec le sous-programme add_8bits_signé ainsi que la définition de la zone de variables de ce sous-programme.
Je n'ai traité que ce sous programme laissant au lecteur le soin de compléter, mes excuses pour cette flemme,

Code : Tout sélectionner

;**********************************************************************
;
   Test de routines arithmétique 8 bits signés                          *  
;                                                                     *
;**********************************************************************
;
                                                                     *
;
    NOM:      Test8bitsSignés                                        *
;
    Date:     28/05/2018                                             *
;
    Version:  2.0                                                    *
;
    Circuit:  sans objet                                             *
;
    Auteur:   JJE                                                     *
;
                                                                     *
;**********************************************************************
;
                                                                     *
;
    Fichier requis: MacrosCopy.inc                                   *
;
                                                                     *
;**********************************************************************
;
                                                                     *
;
    Notes: 
;    Ce petit programme permet de tester les routines 8bits signés     *
;
    sous le simulateur de MPLAB
;     lancez en pas à pas et 
;    suivez les indications données dans les remarques
;
;
     Dans Configure/Select Device, choisir un Pic Mid-Range 
;    à 4 pages de mémoire
;                                                                     *
;**********************************************************************



STATUS    EQU    .3
RP0        EQU    .5
RP1        EQU    .6
C        EQU    0
Z        EQU    2



;*********************************************************************
;
                   DECLARATIONS DE VARIABLES                        *
;*********************************************************************

;
 sauvegardes pour l'IT, sans objet dans ce programme
; placées ici pour éviter les problèmes de banque
    CBLOCK 0x07F                     
    w_temp : 1                    ; W
    status_temp : 1                ; STATUS
    ENDC                        ; Fin de la zone    
; quelques variables pour les test 

; en banque 0
    CBLOCK    0x20
    V01    :    1
    V02    :     1
    V03    :    1
    ENDC                        ; Fin de la zone    

; en banque 1
    CBLOCK    0xA0
    V11    :    1
    V12    :     1
    V13    :    1
    ENDC                        ; Fin de la zone    
    
; en banque 2
    CBLOCK    0x120
    V21    :    1
    V22    :     1
    V23    :    1
    ENDC                        ; Fin de la zone    
    
; en banque 3
    CBLOCK    0x190
    V31    :    1
    V32    :     1
    V33    :    1
    ENDC                        ; Fin de la zone    
    
; variables utiles aux sous-progtammes d'
aritmétique 8bits signé    
; ces 3 variables doivent être dans la même banque    
; placées ici en fond de banque 3
; l'utilisateur pourra les déplacer à sa guise

    CBLOCK    0x1ED
    Data_8bs : 0, op1    : 1        
    op2    : 1
    result    : 1
    ENDC                        ; Fin de la zone    
    

;*********************************************************************
;                             MACRO                                  *
;*********************************************************************

    include MacrosCopy.inc
    
; équivalent de P3=P1+P2 d'
un langage évolué
; en évitant au programmeur de mettre les mains dans le cambouis
; P1, P2, P3 doivent être dans la banque active
Appelle_add_8bits_signé    macro    P1
, P2, P3    
    Appelle_SSP_3 1
,P1, 1, P2, 1+0x80, P3, Data_8bs, add_8bits_signé
    endm
;**********************************************************************
;
                      DEMARRAGE SUR RESET                            *
;**********************************************************************

    org     0x000                 ; Adresse de départ après reset
      goto    init                
; 
      
;**********************************************************************
;
                     ROUTINE INTERRUPTION                            *
;**********************************************************************

            ;sauvegarder registres    
            
;---------------------
    ORG     0x004                ; adresse d'interruption
    errorlevel    -302
    movwf    w_temp              ; 1 sauver registre W
    swapf    STATUS,w            ; 2 swap status avec résultat dans w
    movwf    status_temp            ; 3 sauver status swappé
    
restorereg
    swapf    status_temp,w        ; 2 swap ancien status, résultat dans w
    movwf   STATUS                ; 3 restaurer status
    swapf   w_temp,f            ; 4 Inversion L et H de l'
ancien W
                                   
; sans modifier Z
    swapf   w_temp
,w              ; 5 Réinversion de L et H dans W
    errorlevel    
+302
                                
; W restauré sans modifier status
    retfie                      
; 7 return from interrupt
    
init
    
; ici ouvrir une fenêtre Watch et y ajouter les variables
    
; STATUS
    
; WREG 
    
; V01, V02, V03
    
; V21, V22, V23
    
; op1 op2, result
    
; et surveillez ce qui se passe
    
; ici, on est en banque 0
      movlw    .99    
      movwf    V01
      movlw    .1        
      movwf    V02
      
; passer en banque 2
      BANKCHANGE    V02
, V21
    errorlevel    
-302
      movlw    .20    
      movwf    V21
      movlw    .10        
      movwf    V22
    errorlevel    
+302
      
; repasser en banque 0
      BANKCHANGE    V22
, V01
      Appelle_add_8bits_signé    V01
, V02, V03
      
; repasser en banque 2
      BANKCHANGE    V01
, V21
      Appelle_add_8bits_signé    V21
, V22, V23
      
      
; Compléter le source avec d'autres tests
      
      goto    init
      
Erreur
    ; ici, en général, on ne sait pas trop quoi faire
    goto    $
;**********************************************************************
;                            Sous-programmes                           *
;**********************************************************************

sub_8bits_signé
; réalise la soustraction de deux entiers 8 bits signés
; entrée :
;     op1 opérande 1 
;     op2 opérande 2
; sortie :
;     op1 inchangé
;    op2 remplacé par son opposé
;     result contient op1 - op2
;     STATUS,C armé si débordement
;     STATUS,Z armé si résultat nul
; remarque :
;    utilise un niveau de pile
;     la banque mémoire contenant op1, op2 et result 
;     doit être sélectionnée
;     chaîne sur add_8bits_signé pour gagner un octet de code

    errorlevel    -302
    call    opposé_8bits_signé
    btfsc    STATUS,C
    goto    sub_8bits_signé_1
    call    add_8bits_signé
    return
sub_8bits_signé_1
    ; ici on calcule op1-(-128) ce qui n'
est possible que si
    
; op1<0
    btfsc    op1
,7
    goto    sub_8bits_signé_2
    bsf        STATUS
,C
    return
sub_8bits_signé_2    
    movf    op1
,w
    addwf    op2
,w
    movwf    result
    return
    
;**********************************************************************

add_8bits_signé
; réalise l'addition de deux entiers 8 bits signés
; entrée :
;     op1 opérande 1 
;     op2 opérande 2
; sortie :
;     op1, op2 inchangés
;     result contient op1 + op2
;     STATUS,C armé si débordement
;     STATUS,Z armé si résultat nul
; remarque :
;     la banque mémoire contenant op1, op2 et result 
;     doit être sélectionnée
    movf    op1,w
    xorwf    op2,w        ; ou exlusif avec op2
    movwf    result        ; pour manipuler le bit 7 du résultat
    btfsc    result,7    ; on ne s'
intéresse qu'au bit de signe
    goto    add_8bits_signé_1
    ; ici, op1 et op2 sont de même signe
    call    add_8bits_non_signé
    ; W contient result
    xorwf    op1,w    ; ou exlusif avec result
    andlw    0x80
    btfss    STATUS, Z
    ; le bit de signe du résultat diffère de celui des opérandes
    ; il y a débordement
    bsf        STATUS, C    ; on indique le débordement
    movf    result,f    ; pour armer STATUS,Z en fonction de result
    return                ; le résultat n'
est pas nul
    
add_8bits_signé_1
    
; ici op1 et op2 sont de signe différent
    
; il ne peut pas y avoir de débordement,
    ; on les ajoute comme des insignés
    call    add_8bits_non_signé
    
; et on marque le non débordement
    bcf        STATUS
, C
    return
    
add_8bits_non_signé
; réalise l'addition de deux entiers 8 bits non signés
; entrée :
;     op1 opérande 1 
;     op2 opérande 2
; sortie :
;     op1, op2 inchangés
;     result contient op1 + op2
;    WREG contient result
;     STATUS,Z armé si résultat nul
;    STATUS,C armé si débordement
; remarque :
;     la banque mémoire contenant op1, op2 et result 
;     doit être sélectionnée
    movf    op1,w
    addwf    op2,w
    movwf    result
    return

;**********************************************************************

opposé_8bits_signé
; calcule l'
opposé d'un entier 8 bits signés
; entrée :
    ; op2 l'
octet à traiter    
; sortie : 
;     op2 contient -op2
;     STATUS, C est armé si dépassement de capacité
;     se produit si la valeur de l'octet traité en entrée est -128 (0x80)
;     on se débarasse de ce cas gènant 
; remarque :
;     la banque mémoire contenant op2 doit être sélectionnée
    movf    op2, w
    xorlw    0x80
    bsf        STATUS,C
    btfsc    STATUS,Z
    ; C a été armé en précaution
    return
    bcf        STATUS,C    ; ici, on n'
aura pas de débordement
                        
; et aucune des instructions suivantes ne touche à C
    comf    op2
, f
    incf    op2
, f
    return
    errorlevel    
+302
    
    END             
; directive fin de programme



suivi d'une version des macros COPY complétée et commentée (entre les macros, ce n'est pas très cher)

Code : Tout sélectionner

;**********************************************************************
;
                Macros de Copie de variables                          *  
;                                                                     *
;**********************************************************************
;
                                                                     *
;
    NOM:      MacrosCopy.inc                                              *
;
    Date:     27/05/2018                                             *
;
    Version:  1.1
;    Circuit:  sans objet                                             *
;
    Auteur:   JJE                                                     *
;
 
;    Date:     28/05/2018                                             *
;
    Version:  1.1
;     Correction dans Appelle_SSP_3
;        manquait le sélection de la banque initiale en sortie 
;     Ajout des commentaires décrivant ces macros
;     Ajout de la macro MEMESBANQUES et de son usage dans Appelle_SSP_3
;      cette erreur pouvant être vue par l'assembleur, 
;     il était dommage de s'
en passer
;                                                                    *
;**********************************************************************
;
                                                                     *
;
    Notes:                                                           *
;
                                                                      *
;
                                                                     *
;**********************************************************************

    ifndef    STATUS
        
#DEFINE STATUS    3
    endif

; La banque active étant supposée contenir la variable Source,
;
 cette macro active la banque contenant la variable But 
; en le minimum d'instructions
BANKCHANGE    macro    Source, But
    local V, VV
V set low(Source) & 0x80
VV set low(But)& 0x80
    if V  ==0 && VV ==0x80
        bsf    STATUS, 5
    endif
    if V  ==0x80 && VV ==0
        bcf    STATUS, 5
    endif
V set high(Source) & 0x01
VV set high(But)& 0x01
    if V  ==0 && VV ==0x01
        bsf    STATUS, 6
    endif
    if V  ==0x01 && VV ==0
        bcf    STATUS, 6
    endif
    endm

; vérifie que les variables passées en paramètre sont dans la même banque
; déclenche une erreur sinon
; ne génère aucun code
MEMESBANQUES    macro P, Q    
    local V, VV
V set low(P) & 0x80
VV set low(Q)& 0x80
    if    V != VV
        error    "variables dans des banques différentes"
    endif
V set high(P) & 0x01
VV set high(Q)& 0x01
    if    V != VV
        error    "variables dans des banques différentes"
    endif
    endm
; La banque active étant supposée contenir la variable Source,
; cette macro recopie la valeur de source (1 octet)dans la variable But
; dans quelque banque que soit But
; et réactive la banque qui l'
était en entrée
COPY8    macro    Source
, But
    errorlevel 
-302
    movf    Source
,W    
    BANKCHANGE    Source
, But
    movwf    But
    BANKCHANGE    But
, Source
    errorlevel 
+302
    endm


; cette macro recopie la valeur de Source (1 octet) dans quelque banque qu'elle soit
; dans la variable But dans quelque banque que soit But
; La banque active en sortie est la banque contenant But
COPY8A        macro        Source, But
    BANKSEL    Source
    COPY8    Source, But
    endm
; comme CoPYA mais réactive en sortie la banque qui l'
était en entrée
; La banque qui contient Source doit contenir une variable de 1 octet nommée SauveStatus
COPY8B        macro        Source
, But
    swapf    STATUS
,W
    BANKSEL    Source
    movwf    SauveStatus
    COPY8    Source
, But
    swapf    SauveStatus
,W
    movwf    STATUS
    endm

; exactement comme COPY8 mais pour des variables de 2 octets    
COPY16    macro    Source
, But
    COPY8    Source
, But
    COPY8    Source
+1, But+1
    endm
    
; exactement comme COPY8 mais pour des variables de Cmpt octets    
COPYN    macro    Cmpt
, Source, But
    local V
, Index, W1, W2
V set Cmpt
Index    set    0
    while V 
!= 0
W1     set    Source
+Index
W2    set    But
+Index
        COPY8    W1
, W2
V    set    V
-1
Index    set    Index
+1        
    endw
    endm
    
; La banque active étant supposée contenir les variables A1 et A2,
;
 cette macro recopie les valeurs de A1 (1 octet) puis A2 dans la variable But (2 octets)
;
 dans quelque banque que soit But
; et réactive la banque qui l'était en entrée
COPY_2    macro A1,A2,But
        COPY8    A1,But
        COPY8    A2,But+1
        endm

; comme COPY_2 mais pour des variables de taille quelconque
; TypeI donne la taille de la variable Ai
; But est l'
adresse d'une zone mémoire d'une taille au moins égale à la somme des tailles
COPY_2A    macro Type1
, A1,Type2, A2,But
        local  offset
offset set  0        
        COPYN    Type1
,A1,But
offset set offset
+Type1
        COPYN    Type2
,A2,But+offset
        endm
        
; comme COPY_2 mais pour 3 variables de 1 octet supposées être dans la banque active
COPY_3    macro A1
,A2,A3,But
        COPY8    A1
,But
        COPY8    A2
,But+1
        COPY8    A3
,But+2
        endm

; comme COPY_2A mais pour 3 variables
COPY_3A    macro Type1
, A1,Type2, A2, Type3, A3, But
        local  offset
offset set  0        
        COPYN    Type1
,A1,But
offset set offset
+Type1
        COPYN    Type2
,A2,But+offset
offset set offset
+Type2
        COPYN    Type3
,A3,But+offset
        endm
        
; La variable A (1 octet) étant dans la banque active, recopie sa valeur
; à l'adresse pointée par FSR puis incrémente FSR
COPY8_Ind        macro     A
        movf        A,W
        movwf        INDF
        INCF        FSR,F
        endm
        
; comme COPY8_Ind mais commence par initialiser FSR sur la variable But
; STATUS, IRP est initialisé en fonction de But
COPY8_Ind_1        macro     A1,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY8_Ind    A1
        endm
; Comme COPY8_Ind_1 mais pour deux variables (1 octet) supposées dans la banque active        
COPY8_Ind_2        macro     A1,A2,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY8_Ind    A1
        COPY8_Ind    A2
        endm
        
; Comme COPY8_Ind_1 mais pour trois variables (1 octet) supposées dans la banque active        
COPY8_Ind_3        macro     A1,A2,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY8_Ind    A1
        COPY8_Ind    A2
        COPY8_Ind    A3
        endm
        
; Comme COPY8_Ind_1 mais pour une variables de 2 octets supposée dans la banque active        
COPY16_Ind        macro     A
        movf        A,W
        movwf        INDF
        INCF        FSR,F
        movf        A+1,W
        movwf        INDF
        INCF        FSR,F
        endm
        
; Comme COPY16_Ind_1 mais pour deux variables de 2 octets supposées dans la banque active        
COPY16_Ind_2        macro     A1,A2,But
        bankisel     But
        movlw        But
        movwf        FSR
        COPY16_Ind    A1
        COPY16_Ind    A2
        endm
        
; appel d'
un sous-programme à 3 paramètres
; SSP est le nom du sous-programme à appeler
; Data_SSP est l'adresse de l'espace mémoire de travail de SSP
; Les valeurs des paramètres Ai y seront recopiées successivement dans l'ordre
; les bits 0 à 6 des paramètres Typei donnent la taille du paramètre Ai correspondant
; le bit 7 des paramètres Typei indique qu'
il faut retourner la valeur en sortie de
; l'espave mémoire correspondant à Ai 
; les trois variables Ai doivent être dans la même banque qui doit être active en entrée
; elle est réactivée en sortie
Appelle_SSP_3 macro Type1, A1, Type2, A2, Type3, A3, Data_SSP, SSP
    MEMESBANQUES A1, A2
    MEMESBANQUES A2, A3
    COPY_3A     Type1&0x7F, A1, Type2&0x7F, A2, Type3&0x7F, A3, Data_SSP
    BANKCHANGE    A1, Data_SSP
    pagesel    SSP
    errorlevel    -306
    call    SSP
    errorlevel    +306
    pagesel    $
    local V, offset
offset set 0
V    set    Type1
    if    V & 0x80
        COPYN    V & 0x7F, Data_SSP, A1    
    endif
offset set offset + (V & 0x7F)
V    set    Type2
    if    V & 0x80
        COPYN    V & 0x7F, Data_SSP+offset, A2    
    endif
offset set offset + (V & 0x7F)
V    set    Type3
    if    V & 0x80
        COPYN    V & 0x7F, Data_SSP+offset, A3    
    endif
    BANKCHANGE    Data_SSP, A1
    endm


Cordialement
Cordialement

JJE

C'est pas parcequ'on n'a rien à dire qu'il faut fermer sa G....e


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité