Logicielsmoto.com

Nous sommes le 20 Sep 2019, 12:52

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 104 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7  Suivante
Auteur Message
 Sujet du message:
MessagePosté: 29 Aoû 2006, 22:39 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
@Sam
Code:
00100 ****** Division 16 bits ******
00110 ***** D:Divide  X:Divise *****
00120 DIVIS16 PSHS    D,X
00130              LDD     #$0000
00140              LDX     #16
00150 DIVI161 ROL     1,S
00160              ROL     ,S
00170              ROLB
00180              ROLA
00190              SUBD    2,S
00200              BCC     DIVI162
00210              ADDD    2,S
00220 DIVI162 LEAX    -1,X
00230              BNE     DIVI161
00240              ROL     1,S
00250              ROL     ,S
00260              COM     1,S
00270              COM     ,S
00280              PULS    X
00290              LEAS    2,S
00300              RTS
00310 ****** Res:X     Rest:D ******

Ce coup ci, j'ai laisse les numeros de ligne Assdesass. Marre de les virer... :)

Tu veux pas mes routines de multiplication 8 bits et 16 bits aussi?

a+
Seg.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 29 Aoû 2006, 23:30 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
Samuel Devulder a écrit:
Tomix3 a écrit:
J'ai aussi une routine de division 16 bits dans mes vieilles disquettes...


j'suis preneur!


En attendant, je viens de generaliser ton code 8 bits. Ca a l'air assez direct. L'astuce est d'utiliser un paire de exg pour faire comme si les ror existaient pour les registres d'addresse:
Code:
* divise D par X.
* resultat dans D, reste de la division dans y
divi16 pshs x      * utiliser stx ,--s ?
       ldx  #16
       leay -16,x  * astuce: prends moins de place que ldy #0... mais est-ce ok en nb de cycles ?
l1     rolb
       rola
       exg  d,y
       rolb
       rola
       subd ,s
       bcc  l2
       addd ,s
l2     exg  d,y
       leax -1,x
       bne  l1
       rolb
       rola
       comb
       coma
       puls x,pc


M'enfin je me demande si on peut pas grapiller 1 ou 2 cycles. Ca serait cool un assembleur (ou un emulateur! ;) ) qui affiche a cote des opcodes le nb de cycles de chaque instruction. Ca permettrait de comparer 2 implementations.

A noter l'astuce avec le leay -16,x qui prends juste 2 octets au lieu des 3 pour ldy #0.

Au debut j'avais une version avec le resultat dans X et le compteur dans Y sur 15 valeurs permettant un "ldx #0; leay 15,x" qui me semblait bien, et au lieu du "leay -1,y; bne XXX" j'avais ecrit "leay -1,y, bpl XXX" en utilisant le fait (jusqu'il y a peu inconnu de moi, merci prehisto :bien:) que lea positionne le bit N. C'etait pas mal, ca doit marcher sur un vrai 6809e, mais sous dcmoto ca passe pas.. le LEA garde le bit N tel quel et la boucle ne termine pas. C'est dommage car le bit C lui doit rester tel quel pour que l'algo marche. Donc le LEA qui positionne uniquement Z et N c'est le bon plan.

sam (il n'y a pas a dire l'asm 6809e c'est rigolo)


Dernière édition par Samuel Devulder le 29 Aoû 2006, 23:41, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 29 Aoû 2006, 23:39 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
Tomix3 a écrit:
Code:
...
00220 DIVI162 LEAX    -1,X
...
00240              ROL     1,S
00250              ROL     ,S



Ah zut on s'est croise :) Ma solution est differente: j'utilise un reg plutot que la pile .. Grr j'arrive pas a compter les cycles avec les modes indexe.. dans la doc de l'assembleur TO8/TO9/TO9+ de FIL que j'ai, il n'ont pas inclu les tableaux pour compter les cycles des modes indexes (page 174). C'est bien la peine d'avoir avec moi les docs papier tiens!
Du coup je sais pas si c'est plus rapide au final car "exg" est une instruction lourde (8 cycles!!!).

Quand je vois tes label "DIVI162"... ca me fait penser que les ASM thomson ont le mauvais gout de ne pas avoir de notion de label "locale" (les labels commencant par un "." sous gcc par ex) qu'on peut redefinir. L'assembleur pointerait sur la label de meme nom le plus proche de l'addresse courante. Ca simplifierait vraiment l'ecriture asm.. parce que passe les "toto" "titi" "tutu" et "tata" je suis a court de labels! ;)

sam (bonne nuit, il se fait tard, faut que j'rentre)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 29 Aoû 2006, 23:50 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
Tomix3 a écrit:
Tu veux pas mes routines de multiplication 8 bits et 16 bits aussi?


Ouais.. Mais je pense qu'il faudrait vraiment faire un autre sujet sur le forum programmation car on va finir par saturer celui-ci qui je crois s'interresse plus au niveau "instructions isolees". Je ne sais pas ce qu'en pense l'initiateur du sujet.

Sinon pour le 8 bits... ben mul.. Il est quasi gratos sur 6809e (11cycles) et les shift+add seront plus lent (5/6 cycles par saut, en 2sauts on est moins bon que le mul)

Pour le 16 bits, ben on fait 4 muls.. eventuellement 3 si on utilise l'astuce qui evite de calculer les produits croises centraux du developpement (multiplication karatusba http://mathworld.wolfram.com/KaratsubaMultiplication.html).

Sinon quelqu'un a t'il reussi a exploiter le fait que bitC est positionne a la suite d'un mul si le bit B7 (de A je suppose) est positionne ?

sam.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 29 Aoû 2006, 23:58 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
@Sam
A propos du calcul de cycle, j'avais prevu le coup dans le debugueur de Tomix. Le desassembleur affiche le nombre de cycles (et les cycles alternatifs pour certaines instructions).
Faudrait que je monte une petite commande DOS qui depouille un fichier binaire thomson, a partir du debugueur de Tomix.

a+
Seg.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 02:39 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
Samuel Devulder a écrit:
Quand je vois tes label "DIVI162"... ca me fait penser que les ASM thomson ont le mauvais gout de ne pas avoir de notion de label "locale" (les labels commencant par un "." sous gcc par ex) qu'on peut redefinir. L'assembleur pointerait sur la label de meme nom le plus proche de l'addresse courante. Ca simplifierait vraiment l'ecriture asm.. parce que passe les "toto" "titi" "tutu" et "tata" je suis a court de labels! ;)


Il y a toujours moyen de contourner le problème pour les branchements ascendants, en utilisant la directive SET. Pour ma part, j'utilise les labels B complétés avec un chiffre:

Code:
              LDA     #45
B0          SET      *
              DECA
              BNE     B0
B0          SET      *
              DECA
              BNE     B0
B0          SET      *
              DECA
              BNE     B0


... ce qui me permet d'utiliser plusieurs fois le même label.

Pour le reste, évidemment...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 04:48 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
Si je puis me permettre, Tomix, ton:

Tomix3 a écrit:
Code:
00130              LDD     #$0000


... peut déjà être optimisé avantageusement par:

Tomix3 a écrit:
Code:
          CLRA
          CLRB


J'ai aussi évité la redondance du ROL 1,S/ROL ,S en la compensant par un BRA et un LDX #17 au lieu d'un LDX #16. Et réaménagé la sortie de routine, ce qui inverse les registres du reste et du quotient mais qui me permet de faire un COMA/COMB au lieu d'un COM ,S/COM 1,S :

Code:
*** X=diviseur - D=dividende ***
DIV         PSHS      D,X
               CLRA
               CLRB
               LDX        #17
               BRA       DIV1
DIV0       ROLB
               ROLA
               SUBD     2,S
               BCC        DIV1
               ADDD    2,S
DIV1       ROL       1,S
               ROL      ,S
               LEAX     -1,X
               BNE       DIV0
               STD       2,S
               PULS     D,X
               COMA
               COMB
               RTS
*** D=quotient - X=reste ***

Gain: 5 octets.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 06:35 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
Tomix3 a écrit:

Code:
****** Division 8 bits ******
****** A:Divid B:Divis ******
DIVIS8  PSHS    B,X
            CLRB
            LDX     #8
DIVI81  ROLA
            ROLB
            SUBB    ,S
            BCC     DIVI82
            ADDB    ,S
DIVI82  LEAX    -1,X
            BNE     DIVI81
            ROLA
            COMA
            LEAS    1,S
            PULS    X,PC
****** Res:A    Rest:B ******

.


J'empile A, ce qui me le libère pour le décompteur et vire donc le X :

Code:
****** Division 8 bits ******
****** A:Divid B:Divis ******
DIVIS8  PSHS    A,B
            LDD       #$0800
DIVI81  ROL      ,S
            ROLB
            SUBB    1,S
            BCC      DIVI82
            ADDB    1,S
DIVI82  DECA
            BNE       DIVI81
            LDA      ,S++
            ROLA
            COMA
            RTS
****** Res:A    Rest:B ******


Gain: 2 octets.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 08:44 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
@Prehisto
Attention au CLRA et CLRB. Ca coute 2 octets et 4 cycles en tout; le LDD #0 coute 3 octets mais 3 cycles en tout.
Le LDD est plus avantageux.

a+
Seg.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 08:51 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
@Prehisto
Ta division 8 bits reformulee m'a l'air bien sympa, aussi bien en taille qu'en nombre de cycles :)

a+
Seg.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 08:52 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1054
Localisation: France (24)
Tomix3 a écrit:
@Prehisto
Attention au CLRA et CLRB. Ca coute 2 octets et 4 cycles en tout; le LDD #0 coute 3 octets mais 3 cycles en tout.
Le LDD est plus avantageux.

a+
Seg.


C'est sûr que tes routines sont les plus rapides. Mais dans ce cas, pourquoi mettre des routines sur lesquelles il n'y a plus rien à faire?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 09:18 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
@Prehisto
Rien a faire, c'est vite dit! Si je croyais ca, je n'aurai pas poste ces routines.
L'idee pour moi c'est d'avoir le meilleur compromis entre taille et nombre de cycles consommes et ton intervention interessante montre que ma demarche n'est pas inutile.

Je reviens sur ton optimisation sinon:
Le rol ,s va couter 4 cycles de plus que le le rola. Sur la boucle ca fait 4*8, soit 24 cycles.
Tu elimines le leax qui coute 4 cycles pour un deca qui en coute 2, soit un gain de 2 cycles, cad 16 cycles (8*2) sur la boucle. Le differenciel est donc de 8 cycles a ce stade.
Tu supprimes le LEAS et le PULS qui coutent 13 cycles et tu rajoutes un LDA ,S++ et un RTS qui coutent 7 et 5 cycles. Gain: 1 cycle.
Pour l'entete, le PSHS/CLRB/LDX coutaient 13 cycles. Et ton entete coute 10 cycles. Soit 3 cycles de gagne.
Il y a donc 4 cycles de gagnes en entete et en queue de routine.
Si je me suis pas plante, la version que tu proposes prend un chouilla plus de cycle (4 cycles de plus).
Argh, c'est dommage :(

a+
Seg.


Dernière édition par Tomix3 le 30 Aoû 2006, 09:26, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 09:23 
Hors ligne

Inscription: 27 Avr 2006, 09:04
Messages: 101
Ops...
8*4=32 of course... Donc, 16 cycles d'ecart sur la boucle... Au final, le gain est donc de -12 cycles. Argh++ :(

a+
Seg.

Edit: tiens, je viens de m'apercevoir qu'il y a un bouton "Editer" pour modifier son post... :)

Edit2: J'ai cree un nouveau sujet pour la suite, plutot que de polluer celui la...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 10:24 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
Tomix3 a écrit:
...
Le rol ,s va couter 4 cycles de plus que le le rola. Sur la boucle ca fait 4*8, soit 24 cycles. ...


Donc en fait c'est le rol en memoire qui bouffe du temps a cause du nb de cycles pour decoder puis acceder au ",s" le tout multiplie par le nb de tours. Ceci me laisse a penser que la version de la division 16bits que j'ai postee doit pas mal depoter: il n'y a pas de rol rien en memoire on fait juste deux exg.. ca doit le faire non ?

encore que non.. exg c'est quand meme couteux.. bizzare pour une instru qui est bien pratique car elle permet pour ainsi dire d'etendre l'accumulateur aux registres x,y,u.. Si le exg coutait 2 cycles ca voudrait dire qu'on pourrait faire des and / eor sur X ou Y pour seulements 4 cycles de plus! Bon en realite ca coute 16cycles ce qui n'est plus tout a fait negligeable.. ca depend, il faut chiffrer et la j'suis en panne de table de cycles pour les modes d'addressages :-(

sam (<==il a un petit cycle qui tourne dans la tete ? non c'est un ptit velo qui tourne dans sa tete !)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 30 Aoû 2006, 10:34 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1111
Localisation: Brest
Prehisto a écrit:
Il y a toujours moyen de contourner le problème pour les branchements ascendants, en utilisant la directive SET.


C'est pas con! :bien: Il faudrait une astuce pour descendre... parce que bon avec des "BEQ *+6" on a vite fait de se planter :) Il n'y a pas l'equivalent d'un UNSET ? parce que je viens de voir que SET peut etre positionne apres son utilisation et que ca a l'air d'etre la definition qui suit qui est utilisee dans ce cas:
Code:
    ...
B0  UNSET     * du coup le B0 qui suit n'est pas defini
    BEQ   B0  * et on sautera au prochain defini
    ...
B0  SET   *
    ...


sam.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 104 messages ]  Aller à la page Précédente  1, 2, 3, 4, 5, 6, 7  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

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


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com