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

Caisse à outils
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 412
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#31 Message par F6FCO » dim. 13 mai 2018 10:54

Et comment que çà m'intéresse :-D
Même si ce n'est pas de nous çà mérite de figurer dans la caisse à outils. Merci JJE.

Bigonoff ne parle pas des branchements avec $ dans son cours, ou alors j'ai zappé.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

Caisse à outils
JJE
Amateur
Amateur
Messages : 114
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#32 Message par JJE » mar. 15 mai 2018 16:51

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 :


    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,
; if(A<AAthen goto Là    A et AA 8 bits 
    movf     AA
,W
    subwf    A
,w
    btfsc    STATUS
,C
    
goto      $+3
    btfss    STATUS
,Z
    
goto      
    endm

IfAInfOuEgalBgoto macro A
,AA,
; if(A<=AAthen goto Là    A et AA 8 bits 
    movf     AA
,W
    subwf    A
,w
    btfsc    STATUS
,C
    
goto     $+3
    btfss    STATUS
,Z
    
goto 
    btfsc    STATUS
,Z
    
goto 
    endm

IfAEgalBgoto macro A
AA
; if(A=AAthen goto Là    A et AA 8 bits 
    movf     AA
,W
    subwf    A
,w
    btfsc    STATUS
,Z
    
goto     
    endm

IfANonEgalBgoto macro A
AA
; if(A!=AAthen goto Là    A et AA 8 bits 
    movf     AA
,W
    subwf    A
,w
    btfss    STATUS
,Z
    
goto     
    endm    
    
IfAStrictSupBgoto macro A
,AA,
; if(A>AAthen goto Là    A et AA 8 bits 
    movf     AA
,W
    subwf    A
,w
    btfss    STATUS
,C
    
goto     $+3
    btfss    STATUS
,Z
    
goto 
    endm

IfASupOuEgalBgoto macro A
,AA,
; if(A>=AAthen goto Là    A et AA 8 bits 
    movf     AA
,W
    subwf    A
,w
    btfsc    STATUS
,C
    
goto 
    endm

;**********************************************************************
;    
test sur une variable et un littéral (deuxième paramètre)
;**********************************************************************

IfAStrictInfLitBgoto macro A,AA,
; if(A<0Xxxthen goto Là    A 8 bits 
    movlw     AA
    subwf    A
,w
    btfsc    STATUS
,C
    
goto     $+3
    btfss    STATUS
,Z
    
goto 
    endm

IfAInfOuEgalLitBgoto macro A
,AA,
; if(A<=0Xxxthen goto Là    A 8 bits 
    movlw     AA
    subwf    A
,w
    btfsc    STATUS
,C
    
goto     $+3
    btfss    STATUS
,Z
    
goto 
    btfsc    STATUS
,Z
    
goto 
    endm
    
IfAEgalLitBgoto macro A
,AA,
; if(A=0Xxxthen goto Là    A 8 bits 
    movlw     AA
    subwf    A
,w
    btfsc    STATUS
,Z
    
goto 
    endm
    
IfANonEgalLitBgoto macro A
AA
; if(A!=0Xxxthen goto Là    A 8 bits 
    movlw     AA
    subwf    A
,w
    btfss    STATUS
,Z
    
goto     
    endm    

IfASupOuEgalLitBgoto macro A
,AA,
; if(A>=0Xxxthen goto Là    A 8 bits 
    movlw     AA
    subwf    A
,w
    btfss    STATUS
,C
    
goto     $+3
    btfss    STATUS
,Z
    
goto 
    endm

IfAStrictSupLitBgoto macro A
,AA,
; if(A>0Xxxthen goto Là    A 8 bits 
    movlw    AA
    subwf    A
,w
    btfsc    STATUS
,C
    
goto 
    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
JJE

Caisse à outils
JJE
Amateur
Amateur
Messages : 114
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#33 Message par JJE » mer. 16 mai 2018 10:23

Je suis décidément trop étourdi.
Si quelqu'un a lu le post précédent avant que je rédige celui-ci, qu'il sache que j'avais laissé quelques défauts que je viens de corriger.
La version actuelle devrait être bonne :?
JJE

Caisse à outils
F6FCO
Avatar de l’utilisateur
Passioné
Passioné
Messages : 412
Âge : 64
Enregistré en : décembre 2017
Localisation : Furtif je suis.
Contact :

#34 Message par F6FCO » jeu. 17 mai 2018 15:28

Chouette, maintenant on va coder en JJE :-D
Merci pour ton travail.
Quand Chuck Norris dit « Hein ? », personne ne dit 2…

Caisse à outils
JJE
Amateur
Amateur
Messages : 114
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#35 Message par JJE » jeu. 17 mai 2018 18:49

Bonjour à tous,
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 :cry:

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
JJE


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités