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 , 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 ==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
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 + (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
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
Cordialement
PS je m'absente quelques jours