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
Caisse à outils
Caisse à outils
Bonjour à tous,
Je reprends en partie la bonne idée de ducran lapoigne (merci à lui), en vous proposant une série de macros gérant les situations du type :
Les instructions btfss et/ou btfsc ont tendance à me donner des boutons, de même que l'état de C après les instructions qui le touchent. Ces macros peuvent régler une partie de ces problèmes
Le programme ci-dessous montre l'usage de ces macros. Il est à lancer pas à pas sous le simulateur de MPLAB
Cordialement
Je reprends en partie la bonne idée de ducran lapoigne (merci à lui), en vous proposant une série de macros gérant les situations du type :
if ( a<b ) goto
if (a<.23)goto
Les instructions btfss et/ou btfsc ont tendance à me donner des boutons, de même que l'état de C après les instructions qui le touchent. Ces macros peuvent régler une partie de ces problèmes
Code : Tout sélectionner
;**********************************************************************
; Macros de test avec branchement *
; *
;**********************************************************************
; *
; NOM: MacrosTest *
; Date: 15/05/2018 *
; Version: 1.0 *
; Circuit: sans objet *
; Auteur: JJE *
; *
;**********************************************************************
; *
; Notes: *
; L'usage de ces macros remplace, dans bien des cas *
; l'utilisation des instructions btfsc ou btfsc *
; *
;**********************************************************************
ifndef STATUS
#DEFINE STATUS 3
endif
ifndef C
#DEFINE C 0
endif
ifndef Z
#DEFINE Z 2
endif
;**********************************************************************
; test sur deux variables
;**********************************************************************
IfAStrictInfBgoto macro A,AA,Là
; if(A<AA) then goto Là ; A et AA 8 bits
movf AA,W
subwf A,w
btfsc STATUS,C
goto $+3
btfss STATUS,Z
goto Là
endm
IfAInfOuEgalBgoto macro A,AA,Là
; if(A<=AA) then goto Là ; A et AA 8 bits
movf AA,W
subwf A,w
btfsc STATUS,C
goto $+3
btfss STATUS,Z
goto Là
btfsc STATUS,Z
goto Là
endm
IfAEgalBgoto macro A, AA, Là
; if(A=AA) then goto Là ; A et AA 8 bits
movf AA,W
subwf A,w
btfsc STATUS,Z
goto Là
endm
IfANonEgalBgoto macro A, AA, Là
; if(A!=AA) then goto Là ; A et AA 8 bits
movf AA,W
subwf A,w
btfss STATUS,Z
goto Là
endm
IfAStrictSupBgoto macro A,AA,Là
; if(A>AA) then goto Là ; A et AA 8 bits
movf AA,W
subwf A,w
btfss STATUS,C
goto $+3
btfss STATUS,Z
goto Là
endm
IfASupOuEgalBgoto macro A,AA,Là
; if(A>=AA) then goto Là ; A et AA 8 bits
movf AA,W
subwf A,w
btfsc STATUS,C
goto Là
endm
;**********************************************************************
; test sur une variable et un littéral (deuxième paramètre)
;**********************************************************************
IfAStrictInfLitBgoto macro A,AA,Là
; if(A<0Xxx) then goto Là ; A 8 bits
movlw AA
subwf A,w
btfsc STATUS,C
goto $+3
btfss STATUS,Z
goto Là
endm
IfAInfOuEgalLitBgoto macro A,AA,Là
; if(A<=0Xxx) then goto Là ; A 8 bits
movlw AA
subwf A,w
btfsc STATUS,C
goto $+3
btfss STATUS,Z
goto Là
btfsc STATUS,Z
goto Là
endm
IfAEgalLitBgoto macro A,AA,Là
; if(A=0Xxx) then goto Là ; A 8 bits
movlw AA
subwf A,w
btfsc STATUS,Z
goto Là
endm
IfANonEgalLitBgoto macro A, AA, Là
; if(A!=0Xxx) then goto Là ; A 8 bits
movlw AA
subwf A,w
btfss STATUS,Z
goto Là
endm
IfASupOuEgalLitBgoto macro A,AA,Là
; if(A>=0Xxx) then goto Là ; A 8 bits
movlw AA
subwf A,w
btfss STATUS,C
goto $+3
btfss STATUS,Z
goto Là
endm
IfAStrictSupLitBgoto macro A,AA,Là
; if(A>0Xxx) then goto Là ; A 8 bits
movlw AA
subwf A,w
btfsc STATUS,C
goto Là
endm
Le programme ci-dessous montre l'usage de ces macros. Il est à lancer pas à pas sous le simulateur de MPLAB
;**********************************************************************
; Test des Macros de test *
; *
;**********************************************************************
; *
; NOM: TestMacrosTest *
; Date: 15/05/2018 *
; Version: 1.0 *
; Circuit: sans objet *
; Auteur: JJE *
; *
;**********************************************************************
; *
; Fichier requis: MacrosTest.inc *
; *
;**********************************************************************
; *
; Notes:
; Ce petit programme permet de tester les macros du fichier inclus *
; sous le simulateur de MPLAB
; *
;**********************************************************************
;*********************************************************************
; 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 : 1
AA : 1
ENDC ; Fin de la zone
;*********************************************************************
; MACRO *
;*********************************************************************
include "MacrosTest.inc"
;**********************************************************************
; DEMARRAGE SUR RESET *
;**********************************************************************
org 0x000 ; Adresse de départ après reset
goto init
;**********************************************************************
init
movlw .100
movwf A
Test1
movlw .110
movwf AA
IfAStrictInfBgoto A, AA, Test1_1
call Erreur
Test1_1
movlw .100
movwf AA
IfAStrictInfBgoto A, AA, Test1_2
call Erreur
Test1_2
movlw .90
movwf AA
IfAStrictInfBgoto A, AA, Test2
call Erreur
Test2
movlw .110
movwf AA
IfAInfOuEgalBgoto A, AA, Test2_1
call Erreur
Test2_1
movlw .100
movwf AA
IfAInfOuEgalBgoto A, AA, Test2_2
call Erreur
Test2_2
movlw .90
movwf AA
IfAInfOuEgalBgoto A, AA, Test3
call Erreur
Test3
movlw .110
movwf AA
IfAEgalBgoto A, AA, Test3_1
call Erreur
Test3_1
movlw .100
movwf AA
IfAEgalBgoto A, AA, Test3_2
call Erreur
Test3_2
movlw .90
movwf AA
IfAEgalBgoto A, AA, Test4
call Erreur
Test4
movlw .110
movwf AA
IfANonEgalBgoto A, AA, Test4_1
call Erreur
Test4_1
movlw .100
movwf AA
IfANonEgalBgoto A, AA, Test4_2
call Erreur
Test4_2
movlw .90
movwf AA
IfANonEgalBgoto A, AA, Test5
call Erreur
Test5
movlw .110
movwf AA
IfAStrictSupBgoto A, AA, Test5_1
call Erreur
Test5_1
movlw .100
movwf AA
IfAStrictSupBgoto A, AA, Test5_2
call Erreur
Test5_2
movlw .90
movwf AA
IfAStrictSupBgoto A, AA, Test6
call Erreur
Test6
movlw .110
movwf AA
IfASupOuEgalBgoto A, AA, Test6_1
call Erreur
Test6_1
movlw .100
movwf AA
IfASupOuEgalBgoto A, AA, Test6_2
call Erreur
Test6_2
movlw .90
movwf AA
IfAStrictSupBgoto A, AA, Test8
call Erreur
Test8
IfAStrictInfLitBgoto A, .110, Test8_1
call Erreur
Test8_1
IfAStrictInfLitBgoto A, .100, Test8_2
call Erreur
Test8_2
IfAStrictInfLitBgoto A, .90, Test9
call Erreur
Test9
IfAInfOuEgalLitBgoto A, .110, Test9_1
call Erreur
Test9_1
IfAInfOuEgalLitBgoto A, .100, Test9_2
call Erreur
Test9_2
IfAInfOuEgalLitBgoto A, .90, Test10
call Erreur
Test10
IfAEgalLitBgoto A, .110, Test10_1
call Erreur
Test10_1
IfAEgalLitBgoto A, .100, Test10_2
call Erreur
Test10_2
IfAEgalLitBgoto A, .90, Test11
call Erreur
Test11
IfANonEgalLitBgoto A, .110, Test11_1
call Erreur
Test11_1
IfANonEgalLitBgoto A, .100, Test11_2
call Erreur
Test11_2
IfANonEgalLitBgoto A, .90, Test12
call Erreur
Test12
IfAStrictSupLitBgoto A, .110, Test12_1
call Erreur
Test12_1
IfAStrictSupLitBgoto A, .100, Test12_2
call Erreur
Test12_2
IfAStrictSupLitBgoto A, .90, Test13
call Erreur
Test13
IfASupOuEgalLitBgoto A, .110, Test13_1
call Erreur
Test13_1
IfASupOuEgalLitBgoto A, .100, Test13_2
call Erreur
Test13_2
IfAStrictSupLitBgoto A, .90, Fin
call Erreur
Fin
goto $
Erreur
return
END ; directive fin de programme
Cordialement
Caisse à outils
Caisse à outils
Caisse à outils
Bonjour à tous,
Pour ceux qui aiment les macros et les codes denses, en ajoutant au début du fichier .inc le code suivant :
Dommage que l'indentation ne soit pas gardée
qui s'invoque par quelque chose comme
Si A, Egal, B, jump, adresse
ou
Si A, EgalLit, .100, jump, adresse
plutôt plus joli que les 4 instructions remplcées.
Notez que le jump n'est là que pour le décor mais avec un peu plus de travail, on pourrait donner le choix entre jump et call
Remarque : l'assembleur sort en erreur que je n'ai pas résolue sur la directive error dans le premier test. Pourtant, je m'en sers souvent sans pb.
On peut remplacer le fichier de test par beaucoup plus court (mais beaucoup moins lisible ) :
Je n'ai trouvé aucune directive de manipulation de chaîne de caractères, si quelqu'un a une idée pour faire mieux que les
je suis preneur
J'ai l'équivalent des 6 macros précédentes travaillant sur des variables signées si quelqu'un est intéressé.
Cordialement
Pour ceux qui aiment les macros et les codes denses, en ajoutant au début du fichier .inc le code suivant :
jump EQU 0
StrictInf EQU 0
Inf EQU 1
Egal EQU 2
NonEgal EQU 3
Sup EQU 4
StrictSup EQU 5
StrictInfLit EQU 6
InfLit EQU 7
EgalLit EQU 8
NonEgalLit EQU 9
SupLit EQU 10
StrictSupLit EQU 11
Si macro A, Test, AA, VV, Là
local V
V set Test
if (V<StrictInf || V>StrictSup)
error "operande illegal"
else
if V==StrictInf
IfAStrictInfBgoto A, AA, Là
endif
if V==Inf
IfAInfOuEgalBgoto A, AA, Là
endif
if V==Egal
IfAEgalBgoto A, AA, Là
endif
if V==NonEgal
IfANonEgalBgoto A, AA, Là
endif
if V==Sup
IfASupOuEgalBgoto A, AA, Là
endif
if V==StrictSup
IfAStrictSupBgoto A, AA, Là
endif
if V==StrictInfLit
IfAStrictInfLitBgoto A, AA, Là
endif
if V==InfLit
IfAInfOuEgalLitBgoto A, AA, Là
endif
if V==EgalLit
IfAEgalLitBgoto A, AA, Là
endif
if V==NonEgalLit
IfANonEgalLitBgoto A, AA, Là
endif
if V==SupLit
IfASupOuEgalLitBgoto A, AA, Là
endif
if V==StrictSupLit
IfAStrictSupLitBgoto A, AA, Là
endif
endif
endm
Dommage que l'indentation ne soit pas gardée
qui s'invoque par quelque chose comme
Si A, Egal, B, jump, adresse
ou
Si A, EgalLit, .100, jump, adresse
plutôt plus joli que les 4 instructions remplcées.
Notez que le jump n'est là que pour le décor mais avec un peu plus de travail, on pourrait donner le choix entre jump et call
Remarque : l'assembleur sort en erreur que je n'ai pas résolue sur la directive error dans le premier test. Pourtant, je m'en sers souvent sans pb.
On peut remplacer le fichier de test par beaucoup plus court (mais beaucoup moins lisible ) :
org 0x000 ; Adresse de départ après reset
goto init
;**********************************************************************
Valeurs dt .110, .100, .90
init
movlw .100
movwf A
;**********************************************************************
;**********************************************************************
; tests non signés
; on appelle chacune des macros avec
; le premier paramètre égal à .100
; le deuxième successivement égal à
; .110
; .100
; .90
; si le test est satisfait, on enchaîne sur le suivant
; si le test n'est pas satisfait, on passe par le SSP Erreur
;**********************************************************************
;**********************************************************************
;**********************************************************************
; les deux premiers paramètres sont des variables pour i<StrictInfLit
; pour les valeurs suivantes, le dauxième paramètre est un littéral
;**********************************************************************
variable i = StrictInf
while i <= StrictSupLit
variable j = 0
while j<=2
if i < StrictInfLit
call Valeurs+j
movwf AA
Si A,i,AA,jump,$+2
else
if j == 0
Si A,i,.110,jump,$+2
endif
if j == 1
Si A,i,.100,jump,$+2
endif
if j == 2
Si A,i,.90,jump,$+2
endif
endif
call Erreur
j += 1
endw
i += 1
endw
Fin
goto $
Erreur
return
END ; directive fin de programme
Je n'ai trouvé aucune directive de manipulation de chaîne de caractères, si quelqu'un a une idée pour faire mieux que les
Code : Tout sélectionner
if j == 0
...
endif
je suis preneur
J'ai l'équivalent des 6 macros précédentes travaillant sur des variables signées si quelqu'un est intéressé.
Cordialement
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités