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

appel aux specialistes ASM decalage 96 bits
satinas
Passioné
Passioné
Messages : 409
Enregistré en : novembre 2015

#11 Message par satinas » dim. 26 mai 2019 12:48

J'avais zappé le ABSOLUTE pour que le C reste éloigné du bas niveau.
en tenant compte de la dernière remarque de JJE, et en nettoyant encore un peu plus

avec des variables n'importe où :

Code : Tout sélectionner

     
      _asm
      movlw   90
      movlb   _Depart             // sélectionner bank
      bcf     STATUS,0,0          // clear bit c (bcf STATUS,C,ACCESS)
bcl:
      rlcf    _Depart+0,1,1       // rotate left through carry de _Depart[0] (rlcf _Depart,F,BANKED)
      rlcf    _Depart+1,1,1
      rlcf    _Depart+2,1,1
      rlcf    _Depart+3,1,1

      rlcf    _Depart+4,1,1       // rotate left through carry de _Depart[1]
      rlcf    _Depart+5,1,1
      rlcf    _Depart+6,1,1
      rlcf    _Depart+7,1,1

      rlcf    _Depart+8,1,1       // rotate left through carry de _Depart[2]
      rlcf    _Depart+9,1,1
      rlcf    _Depart+10,1,1
      rlcf    _Depart+11,1,1
      decfsz  WREG,1,0            // 1 pour F, 0 pour ACCES (par défaut c'est BANKED)
      goto bcl
finbcl:
      _endasm


Avec des variables ABSOLUTE en access ram < 0x60, on enlève le movlb et on adresse les variables en mode access

Code : Tout sélectionner

     
      _asm
      movlw   90
      bcf     STATUS,0,0          // clear bit c (bcf STATUS,C,ACCESS)
bcl:
      rlcf    _Depart+0,1,0       // rotate left through carry de _Depart[0] (rlcf _Depart,F,ACCESS)
      rlcf    _Depart+1,1,0
      rlcf    _Depart+2,1,0
      rlcf    _Depart+3,1,0

      rlcf    _Depart+4,1,0       // rotate left through carry de _Depart[1]
      rlcf    _Depart+5,1,0
      rlcf    _Depart+6,1,0
      rlcf    _Depart+7,1,0

      rlcf    _Depart+8,1,0       // rotate left through carry de _Depart[2]
      rlcf    _Depart+9,1,0
      rlcf    _Depart+10,1,0
      rlcf    _Depart+11,1,0
      decfsz  WREG,1,0            // 1 pour F, 0 pour ACCES (car par défaut c'est BANKED)
      goto bcl
finbcl:
      _endasm


Je peux pas tester le mode ABSOLUTE, je connais pas la syntaxe en C18 :)

appel aux specialistes ASM decalage 96 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1306
Enregistré en : juillet 2016
Localisation : Terre

#12 Message par Temps-x » dim. 26 mai 2019 12:51

Bonjour paulfjujo, JJE, satinas, et tout le forum,

Après 8 décrémentations et en partant de zéro, il faut copier la première variable sur la deuxième, puis troisième, .....ect

De plus je dirais qu'il faut naviguer dans la mémoire(sdram) du pic, paulfjujo le décalage tu le fais sur toute une ligne si j'ai bien compris ?

==> A+
Modifié en dernier par Temps-x le dim. 26 mai 2019 21:44, modifié 2 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

appel aux specialistes ASM decalage 96 bits
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1401
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#13 Message par paulfjujo » dim. 26 mai 2019 13:27

Temps-x a écrit :paulfjujo le décalage tu le fais sur toute une ligne si j'ai bien compris.



OUI,


exemple mon buffer d'affichage contenant ceci
et L10 ,L11,L12 , le Bigmot contenant la 1ere ligne du buffer

Capture._Aff_buffer.jpg


sinon, je vais m'orienter pour travailler uniquement avec 8 pointeurs debut ( 1 pointeur par colonne , 8 rangee de pixel / par colonne.)
les pointers parcourant la position 1 à 96
la 1ere passe
...................1
..................2.
.................3..
...etc ...
96.................
...etc ...
ensuite
95........etc.........2.1.96
94........etc.........2.1.95
93........etc.......3.2.1.94
ecart constant de 95 entre les pointeurs debut et detection fin de ligne
.. en boucle ..

Test de la derniere proposition by Satinas

:bravo: YES, it works ! :+1:

résultats

Code : Tout sélectionner


Avant decalage
00000000
-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000001
Apres  95   decalages à gauche
10000000
-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000
 
=================================
Avant decalage
00000000
-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000001
Apres  64   decalages à gauche
00000000
-00000000-00000000-00000001-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000
  
=====================
Avant decalage
00000000
-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000001
Apres  90   decalages à gauche
00000100
-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000
==========================
Avant decalage
00000000
-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000001
Apres  18   decalages à gauche
00000000
-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000100-00000000-00000000



Code : Tout sélectionner


     cnt
=90;
      _asm {
      movf   _cnt,0                 // recupere nombre de decalage à faire
      bcf     STATUS,0,0          // clear bit c (bcf STATUS,C,ACCESS)
bcl:
      rlcf    _Depart+0,1,0       // rotate left through carry de _Depart[0] (rlcf _Depart,F,ACCESS)
      rlcf    _Depart+1,1,0
      rlcf    _Depart
+2,1,0
      rlcf    _Depart
+3,1,0

      rlcf    _Depart
+4,1,0       // rotate left through carry de _Depart[1]
      rlcf    _Depart+5,1,0
      rlcf    _Depart
+6,1,0
      rlcf    _Depart
+7,1,0

      rlcf    _Depart
+8,1,0       // rotate left through carry de _Depart[2]
      rlcf    _Depart+9,1,0
      rlcf    _Depart
+10,1,0
      rlcf    _Depart
+11,1,0
      decfsz  WREG
,1,0            // 1 pour F, 0 pour ACCES (car par défaut c'est BANKED)
      goto bcl
      
}
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aides toi, le ciel ou Fantastpic t'aideras

appel aux specialistes ASM decalage 96 bits
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1401
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#14 Message par paulfjujo » dim. 26 mai 2019 15:59

mais ...avec ce test

Code : Tout sélectionner


       L10
=0x22;
       L11=0;
       L12=0;

        UART1_Write_CText("\r\nAvant decalage et Carry= ");  UART1_Write(Carry+48);
        UART1_Write_CText("\r\n");
        Binarise_32bits(L12,CRam1,1);
        UART1_Write_Text(CRam1); UART1_Write('-');
        // CRLF1();
        Binarise_32bits(L11,CRam1,1);
        UART1_Write_Text(CRam1);  UART1_Write('-');
        // CRLF1();
        Binarise_32bits(L10,CRam1,1);
        UART1_Write_Text(CRam1);
        CRLF1();
    
        Depart
=Departs[0];
        Carry=1;

         
      _asm 
{
      bsf STATUS,0,0
      btfss _Carry
,1,0         // char Carry at absolute 0x0038
      bcf STATUS,0,0
      nop

      rlcf    _Depart
+0,1,0       // rotate left through carry de _Depart[0] (rlcf _Depart,F,ACCESS)
      rlcf    _Depart+1,1,0
      rlcf    _Depart
+2,1,0
      rlcf    _Depart
+3,1,0

      rlcf    _Depart
+4,1,0       // rotate left through carry de _Depart[1]
      rlcf    _Depart+5,1,0
      rlcf    _Depart
+6,1,0
      rlcf    _Depart
+7,1,0

      rlcf    _Depart
+8,1,0       // rotate left through carry de _Depart[2]
      rlcf    _Depart+9,1,0
      rlcf    _Depart
+10,1,0
      rlcf    _Depart
+11,1,0

      
}
      
           UART1_Write_CText
("\r\nApres 1 seul  decalage à gauche \r\n");
        
        Binarise_32bits
(L12,CRam1,1);
        UART1_Write_Text(CRam1); UART1_Write('-');
       // CRLF1();
       Binarise_32bits(L11,CRam1,1);
       UART1_Write_Text(CRam1);  UART1_Write('-');
       // CRLF1();
       Binarise_32bits(L10,CRam1,1);
       UART1_Write_Text(CRam1);
       CRLF1();


Avant decalage et Carry= 1
00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00100010

Apres 1 seul decalage à gauche
00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-00000000-01000100

on a bien 0x44 , sans Carry ( avec bcf STATUS,0,0)

mais en mettant en direct bsf STATUS,0,0
le carry n'est pas entré
:!!: je m'attendais à trouver 0x45 en forçant ce Carry
Aides toi, le ciel ou Fantastpic t'aideras

appel aux specialistes ASM decalage 96 bits
satinas
Passioné
Passioné
Messages : 409
Enregistré en : novembre 2015

#15 Message par satinas » dim. 26 mai 2019 16:23

J'avais supprimé _cnt, elle n'est plus nécessaire.
C'est le registre W l'indice de boucle.
Sur les 18F, le registre W est utilisable dans toutes les instructions sous le nom WREG

Code : Tout sélectionner

        _asm
        movlw   90
:bcl
        blabla
   
        decfsz  WREG,1,0
        bra     bcl
finbcl:
        nop
        _endasm

le bra c'est pareil que goto
et ajoute un nop derrière finbcl, on sait jamais, terminer sur un label ...
Modifié en dernier par satinas le dim. 26 mai 2019 16:43, modifié 1 fois.

appel aux specialistes ASM decalage 96 bits
JJE
Passioné
Passioné
Messages : 357
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#16 Message par JJE » dim. 26 mai 2019 16:43

Bonjour paulfjujo, tu écris :

Code : Tout sélectionner

       Carry=1;
      _asm {
      bsf STATUS,0,0
      btfss _Carry
,1,0         // char Carry at absolute 0x0038
      bcf STATUS,0,0
      nop


Avec le compilateur que tu utilises, quelle est la signification de _Carry ?
Cordialement

JJE

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

appel aux specialistes ASM decalage 96 bits
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 1306
Enregistré en : juillet 2016
Localisation : Terre

#17 Message par Temps-x » dim. 26 mai 2019 21:18

Re

:roll: Avec moitié C et moitié ASM, je n'y comprends plus grand chose,

satinas a écrit :Source du message le bra c'est pareil que goto


Le bra , c'est pareil que le goto, c'est vrai, mais un goto va te prendre plus de place qu'un bra en occupation programme.

L’instruction goto contient les 11 bits de l’emplacement de destination. les 2 bits restants sont chargés depuis le registre PCLATH.
On ne peut sauter qu’à l’intérieur d’une même PAGE de 211, soit 2048 mots.

Goto
==> 2 mots
==> 2 cycles

L’instruction bra la distance du saut est codée sur 11 bits, et non sur 8. de ce fait, on peut sauter de –1024 à +1023 mots à partir
de l’instruction qui suit le bra

bra
==> 1 mot
==> 2 cycles si on saute, 1 cycle si on ne saute pas.

:bravo: pour ton code satinas, et merci d'être toujours là pour nous secourir.

A+
Modifié en dernier par Temps-x le dim. 26 mai 2019 21:42, modifié 2 fois.
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

appel aux specialistes ASM decalage 96 bits
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1401
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#18 Message par paulfjujo » dim. 26 mai 2019 21:41

JJE a écrit :Avec le compilateur que tu utilises, quelle est la signification de _Carry ?


// un byte dans un emplacement memoire defini
char Carry absolute 0x0038 ;
_Carry pour l'utilser dans l'ASM du MikroC
Aides toi, le ciel ou Fantastpic t'aideras

appel aux specialistes ASM decalage 96 bits
satinas
Passioné
Passioné
Messages : 409
Enregistré en : novembre 2015

#19 Message par satinas » lun. 27 mai 2019 07:50

Bonjour

C'était un travail d'équipe avec JJE :)

bra
==> 1 mot
==> 2 cycles si on saute, 1 cycle si on ne saute pas.


Un petit détail
Je sais pas pourquoi dans tous les datasheets de 18F, dans le résumé des instructions, ils indiquent que l'instruction BRA fait 1 ou 2 cycles. C'est un branch unconditionally, donc forcément elle dure 2 cycles, comme le goto.
Je viens de vérifier sur le simulateur de MPLAB que même si on fait un bra vers l'instruction qui suit le bra, cela dure aussi 2 cycles.

Le 1 ou 2 cycles, c'est pour les autres, qui sont des branch conditionally :
bc, bz, bn, bov, bnc, bnz, bnn, bnov
Si la condition n'est pas vérifié ("carry set" pour bc par exemple), elles passent en 1 cycle à l'instruction qui suit, sinon elles font un saut de 2 cycles.

appel aux specialistes ASM decalage 96 bits
JJE
Passioné
Passioné
Messages : 357
Âge : 78
Enregistré en : novembre 2017
Localisation : Picardie

#20 Message par JJE » lun. 27 mai 2019 10:10

Bonjour à tous, suite et complément de mon post #16
Donc, avec la réponse #18 de paulfjujo, en MikroC
une variable déclarée
<type> Nom at absolute xxx
peut être adressée en asm par _Nom, charge, bien sûr au programmeur à interpréter les actets qui suivent convenablement, en fonction du type. Il semble qu'en C8, il n'y a pas besoin du "_"

paulfjujo a écrit :Source du message         Depart=Departs[0];
        Carry=1;

         
      _asm {
      bsf STATUS,0,0
      btfss _Carry,1,0         // char Carry at absolute 0x0038
      bcf STATUS,0,0
      nop

rlcf _Depart+0,1,0 // rotate left through carry de _Depart[0] (rlcf _Depart,F,ACCESS)


Depart=Departs[0];

         ??? peut-être un reste du contexte, a priori inutile ici
Carry=1;

donc Carry, synonyme de _Carry, == b'00000001'
      bsf STATUS,0,0

donc STATUS, C == 0 (il serait d'ailleurs plus lisible d'écrire bsf STATUS, C, F, du moins avec mes habituides)
 btfss _Carry,1,0

le bit 1 de _Carry vaut 0, c'est le bit 0 qui vaut 1 :-) , donc, on ne saute PAS et on effectue l'instruction suivante
bcf STATUS,0,0

qui met le bit C de STATUS à 0
rlcf _Depart+0,1,0

fait entrer STATUS, C, donc 0, tout va bien
:!!: je m'attendais à trouver 0x45 en forçant ce Carry

oui, c'est ce qui se serait passé si tu ne l'avais pas effacé juste après l'avoir mis à 1 :-)
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é