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 ---
- 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 ---
Modérateur : mazertoc
Copie de variables
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 , 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.
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.
Bonne lecture en espérant ne pas déclencher trop de polémique
Cordialement
PS je m'absente quelques jours
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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Copie de variables
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+
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+
Copie de variables
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,
suivi d'une version des macros COPY complétée et commentée (entre les macros, ce n'est pas très cher)
Cordialement
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
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 46 invités