ca ne marche nickel QUE si le résultat tient dans un word (ce qui ne sera pas le cas si tu veux diviser un nombre 32 bits quelconque par 100)
mais si t'as pas du tout besoin de vitesse, tu peux utiliser _du32u32 (ou un truc comme ca)
|========================================================================= |Func_IntToStr |------------------------------------------------------------------------- |Convertie un entier en chaîne de caractères |------------------------------------------------------------------------- |input: | dc.l %d0 = Entier. | dc.l %a0 = Chaîne de caractères de destination. | |output: | dc.l %a3 = Chaîne de caractères. | |destroy: %a3, %d3 |========================================================================= _Func_IntToStr_zero: move.b #'0',-(%a3) rts Func_IntToStr: lea.l 12(%a0),%a3 clr.b -(%a3) moveq.l #0,%d7 |Signe négatif move.l %d0,%d1 jbeq _Func_IntToStr_zero jbge _Func_IntToStr_next moveq.l #-1,%d7 neg.l %d1 _Func_IntToStr_next: move.l %d1,%d3 _Func_IntToStr_loop: moveq.l #10,%d0 ROM_CALL _mu32u32 addi.b #'0',%d1 move.b %d1,-(%a3) move.l %d3,%d1 moveq.l #10,%d0 ROM_CALL _du32u32 move.l %d1,%d3 jbne _Func_IntToStr_loop _Func_IntToStr_end_loop: tst.w %d7 jbeq _Func_IntToStr_exit move.b #'-',-(%a3) _Func_IntToStr_exit: rts
), qui sera utilisé pour stocker le résultatAfficher_Chiffre lea buffer(pc),a0 move.b #0,(a0)+ move.l #1000,d1 moveq #1,d3 divu.l d1,d0 clr.l d2 swap d0 move.w d0,d2 clr.w d0 swap d0 \loop: divu.w d1,d0 move.b d0,(a0)+ clr.w d0 swap d0 divu.w #10,d1 tst.w d1 bne \loop move.w d2,d0 moveq #100,d1 dbra d3,\loop lea buffer(pc),a0 moveq #6,d1 \loop1: move.b #$ff,(a0)+ tst.b (a0) dbne d1,\loop1 rts
Sasume :
movea.l %a0,%a3 ; lea.l 12(%a3),%a3 => lea.l 12(%a0),%a3
Et il n'y a pas une erreur quand le nombre est nul (il faut mettre a3 au lieu de a0) ?
Et on peut optimiser le test du signe (avec sCC) à mon avis.
Par contre, il faut que la chaine de destination contienne des espaces, et les données seront alignées à droite ; et ta routine détruit aussi d0,d1,d7.
nan, y a une fonction pour la division (_dmachin) et une autre pour le modulo (_mmachin), faut faire 2 appels...
et :
- c'est tout sauf fast pour les gros nombres, ca fait 2 appels des fonctions lentes de TI a chaque chiffre, donc a moins que fastitoa soit franchement lent, c vite vu... - a0 est tout sauf la chaine de destination, c'est plutot un buffer temporaire de 12 caracteres (mais je ne vois marqué ca nulle part dans la spec ), qui sera utilisé pour stocker le résultat
"geogeo :
Normal, il faut spécifier soit même dans %a0 la destination donc soit même un buffer temporaire.
(enfin je me doute bien que c'est pas [trop] genant si la routine est juste pour toi dans un de tes projets, mais le fait d'avoir voulu faire un joli header en ASCII art avec une description et tout et tout peut faire croire que la doc permet d'utiliser la fonction sans lire le code, alors que c'est pas du tout le cas ; c'est un peu le meme probleme que si tu détruisais d4 et que tu ne le rajoutais pas dans la liste des registres détruits)
(par exemple utiliser moveq a la place de move.l, ou utiliser les adresses pc-relatives au maximum et n'utiliser les adresses absolues qu'en cas de stricte nécessité)