Logicielsmoto.com
http://www.logicielsmoto.com/phpBB/

gagner des cycles machines
http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=189
Page 7 sur 7

Auteur:  Samuel Devulder [ 01 Sep 2006, 09:24 ]
Sujet du message: 

Prehisto a écrit:
Petit indice: On opère bien avec l'accumulateur A et non l'accumulateur B, car une des instructions utilisées n'existe pas pour B.


Ah j'avais pas bien tout lu.. il n'y a pas bcp d'instruction ne s'executant que sur A et donc vu le contexte il faut forcement utiliser le DAA.. mais je vois pas comment car si A=#12 (decimal) en entree, apres le DAA on a A=#$12 (hexa) = #18 (decimal) et ca fait pas un truc proche du code ASCII du 'C' = $43..

sam (...il doit y avoir un truc)

Auteur:  jasz [ 01 Sep 2006, 10:11 ]
Sujet du message: 

Je pense qu'il utile DAA couplé avec un INC sous condition. Par contre, je ne sait pas si ADD est utilisé pour ajouter $#30. :roll:



Jasz qui cherche aussi. ;)

Auteur:  Samuel Devulder [ 01 Sep 2006, 10:36 ]
Sujet du message: 

jasz a écrit:
Je pense qu'il utile DAA couplé avec un INC sous condition. Par contre, je ne sait pas si ADD est utilisé pour ajouter $#30.


A mon avis le ADD apparait au debut car pour que DAA marche il faut que l'instruction precedente positionne H est inc je ne suis pas certain qu'il le fait.. Bon alors que donne
Code:
    ADDA #$30
    DAA   * A = $3x ou $4x suivant qu'au debut il est>10
    BITA  #$40
    BEQ   *+1
    INCA

Mais je ne vois pas de gain a priori: il y a un saut et le "BITA #$40" ne me plait pas.

sam.

Auteur:  Prehisto [ 01 Sep 2006, 10:56 ]
Sujet du message: 

Vous êtes sur la bonne voie avec le DAA et le ADDA. Mais il n'y a pas de branchement au final.

Auteur:  jasz [ 01 Sep 2006, 11:12 ]
Sujet du message: 

Prehisto a écrit:
Mais il n'y a pas de branchement au final.

Oui, parce que, soit j'ai bon pour des valeurs comprises entre 0 et 9 soit pour des valeurs comprises entre A et F. Mais pas les deux :(

Donc, il n'y a pas de CMP ni de branchement sous condition.

Excellent ton trip, ça nous fait courrir un peu. ;)

Auteur:  Prehisto [ 01 Sep 2006, 11:18 ]
Sujet du message: 

Indice: le programme commence bien par un ADDA et l'instruction DAA est utilisée deux fois.

Auteur:  Prehisto [ 01 Sep 2006, 11:35 ]
Sujet du message: 

Je vous donne la réponse? Parce que c'est vrai que celle-là est un peu trop casse-tête. Et c'est comme les mots croisés, on aime bien, mais on ne va pas non plus y passer la journée...

Auteur:  jasz [ 01 Sep 2006, 13:19 ]
Sujet du message: 

Ok, j'ai pas mieux :(


on devrait avoir un truc comme ça non?!

Code:
ADDA #$30
DAA
xxx
DAA


Mais je doute sur le #$30 du ADD et je pense à une opération logique AND, OR, EOR car je voie mal autre chose en deux octets. ;)

Auteur:  Prehisto [ 01 Sep 2006, 14:07 ]
Sujet du message: 

La réponse est:

Code:
       ADDA   #$90       90  91 92 93  94 95 96  97 98 99 9A 9B 9C 9D 9E 9F
       DAA                    90  91 92 93  94 95 96  97 98 99  00 01 02  03 04 05
       ADCA   #$40       D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 41 42 43  44 45 46
       DAA                    30  31 32 33  34 35 36  37 38 39  41 42 43  44 45 46

.. mais peut-être est-il possible de mieux faire?...

Auteur:  Samuel Devulder [ 01 Sep 2006, 14:39 ]
Sujet du message: 

Prehisto a écrit:
La réponse est:

Code:
       ADDA   #$90       90  91 92 93  94 95 96  97 98 99 9A 9B 9C 9D 9E 9F
       DAA                    90  91 92 93  94 95 96  97 98 99  00 01 02  03 04 05
       ADCA   #$40       D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 41 42 43  44 45 46
       DAA                    30  31 32 33  34 35 36  37 38 39  41 42 43  44 45 46

.. mais peut-être est-il possible de mieux faire?...


Cool !! Le ADCA fait le truc du +1 conditionnel de ma version. Donc si je comprends bien le 1er DAA possede la particularite de mettre C=1 pour les 6 dernieres valeurs ce qui evite le test et l'increment +1. C'est tout l'interret de l'addition de $90 au debut, avec un valeur moindre C serait toujours 0.. C'est super bien vu!

Et apres, vu qu'on est en BCD, on remarque qu'en decimal 90+40 = (1)30 et 01+40=41, cad que si on traite le 40 en $40 dans une addition BCD, on obtient le bon resulat. L'addition BCD est precisement ce que fabrique le 2eme DAA a partir de l'addition binaire du ADCA. Je vois mal comment faire plus court sans table.

Et si on voulait faire pareil mais pour extraire les deux denier digits decimaux d'un entier 8bits, on ferait comment: 45==>$45, 99==>$99, 100==>$00 (avec carry=1), 101==>$01 (carry=1), 199==>$99 (carry=1), 200==>$00 (carry=2 ?!? ya comme un bug). C'est peut-etre a rapprocher de l'algo de div par 8 de tomix car finalement c'est le reste code en BCD d'une division par 100, division dans laquelle les ROL sont remplaces par des addition avec carry BCD. Donc si on met des DAA, qu'on remplace les ROL par des ADC dans l'algo de tomix ca le fait, non ? quoi ? trop naif.. sans doute :)

sam.

Auteur:  jasz [ 02 Sep 2006, 08:20 ]
Sujet du message: 

Bien vu effectivement.

Il fallait aussi connaitre la particularité conditionnelle de ADCA. Sympa! :)

Auteur:  Tomix3 [ 02 Sep 2006, 12:03 ]
Sujet du message: 

L'astuce est tres sympa. Merci Prehisto.
Ca permet de se passer d'une table et ca coute tres peu de cycles en plus.

a+
Seg.

Auteur:  Samuel Devulder [ 03 Avr 2019, 14:32 ]
Sujet du message:  Re: gagner des cycles machines

Et hop, un petit déterrage sur ce sujet car en creusant des trucs pour CoCo et OS9 je suis tombé sur >>ce blog<< qui me semble contenir des infos utiles, donc j'en fait part. La plupart des codeurs habitués connaissent déjà ces trucs, mais si un débutant ou un codeur rouillé passe par là, il sera heureux de relire ce blog je pense. :bien:

Auteur:  Prehisto [ 03 Avr 2019, 16:46 ]
Sujet du message:  Re: gagner des cycles machines

Il est toujours bon de rappeler les principes d'optimisation ;)

Page 7 sur 7 Heures au format UTC + 1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/