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
appel aux specialistes ASM decalage 96 bits
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ù :
Avec des variables ABSOLUTE en access ram < 0x60, on enlève le movlb et on adresse les variables en mode access
Je peux pas tester le mode ABSOLUTE, je connais pas la syntaxe en C18 :)
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
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+
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.
appel aux specialistes ASM decalage 96 bits
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
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
YES, it works !
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.
appel aux specialistes ASM decalage 96 bits
- paulfjujo
Expert- Messages : 2598
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
mais ...avec ce test
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
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
appel aux specialistes ASM decalage 96 bits
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
le bra c'est pareil que goto
et ajoute un nop derrière finbcl, on sait jamais, terminer sur un label ...
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
Bonjour paulfjujo, tu écris :
Avec le compilateur que tu utilises, quelle est la signification de _Carry ?
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 ?
appel aux specialistes ASM decalage 96 bits
Re
Avec moitié C et moitié ASM, je n'y comprends plus grand chose,
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.
pour ton code satinas, et merci d'être toujours là pour nous secourir.
A+
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.
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.
appel aux specialistes ASM decalage 96 bits
appel aux specialistes ASM decalage 96 bits
Bonjour
C'était un travail d'équipe avec JJE :)
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.
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
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 "_"
??? peut-être un reste du contexte, a priori inutile ici
donc Carry, synonyme de _Carry, == b'00000001'
donc STATUS, C == 0 (il serait d'ailleurs plus lisible d'écrire bsf STATUS, C, F, du moins avec mes habituides)
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
qui met le bit C de STATUS à 0
fait entrer STATUS, C, donc 0, tout va bien
oui, c'est ce qui se serait passé si tu ne l'avais pas effacé juste après l'avoir mis à 1
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
Retourner vers « Langage ASM »
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 123 invités