Page 1 of 1

[Résolu] STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 06:10
by tyann2
Bonjour
Je cherche en vain depuis quelques jours à récupérer dans un programme
en assembleur le contenu d'une variable de chaîne.
par exemple : "LONG"-> str1
Voici ce que j'ai essayé de plus simple:

Code: Select all
; lecture d'une string var
#include "ultimate.inc"
   bcall(_clrlcdfull)
   ld hl,strname
   bcall(_mov9toop1)
   bcall(_findsym) ; ici je pense récupérer l'adresse du contenu str1 dans de (pas sûr)
   ld h,d
   ld l,e
   ld a,1
   ld (pencol),a
   ld (penrow),a
   bcall(_vputs)
   bcall(_getkey)
   ret
strname:
.db strngobj,tvarstrng,tstr1,0,0
.end


d'après des exemples vus dans un pdf de routines système pour 83+.
Mais vous l'aurez compris ça ne marche pas.
J'ai essayé de remplacer vputs par vputsn pour limiter le nombre de caractères sans résultat.
Merci d'avance.

Re: STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 07:50
by Epharius
Salut !
Il faut savoir que les deux premiers octets sont les octets de la taille de à string (LSB puis MSB) il faut donc ajouter Inc hl deux fois quelque part ;)

Ensuite je ne sais pas si c'est un problème mais je crois que les String sont stockées par tokens et non par caractères donc ça n'affichera correctement que A-Z 0-9. A toi de voir si t'as besoin des espace/virgule toussa. Pour t'aider _putTokString affiche en gros caractères le token contenu dans DE. Mais pour afficher en petits caractères comme VPuts je ne crois pas qu'il existe de Romcall.

Re: STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 12:47
by tyann2
Merci beaucoup, ça y est ça marche.
J'ai utilisé _vputsn, car _vputs m'ajoute un chiffre à la fin de la chaîne.
Comme vous vous en doutez sans doute, je débute en assembleur.
Dans l'exemple du fameux "hello world", on avait
Code: Select all
label:
.db "hello world",0

le tuto spécifie que le 0 marque la fin de la chaîne, apparemment les chaîne stockées dans
les variables str0 ... str9 ne sont pas codées pareils ?

Re: STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 16:45
by Epharius
Non, et c'est là où tu dois faire attention. Une chaine qui va être affichée avec _Puts ou Vputs doit TOUJOURS se terminer par ,0
Cependant, les chaînes Str[0-9] sont stockées sans ce 0 à la fin, et donc vont t'afficher plus que tu ne le voudrais. Et c'est là que les octets qui t'informent de la taille sont utiles : grâce à ça, tu peux mettre ta chaine de StrX jusqu'à OP1 (par exemple, tu peux aussi mettre dans la saferam, une zone de la mémoire pas ou peu utilisée) et ensuite faire une sorte de add OP1,size et y mettre un 0.
Plus précisément, ça va ressembler à ça (je n'ai pas vérifié si ça marchait par contre) :
Code: Select all
bcall(_ChkFindSym)
ld h,d ; on met DE dans HL
ld l,e
bcall(_ldHLind) ; ld hl,(hl)
ld b,h
ld c,l
ex de,hl
inc hl
inc hl
ld de,OP1
ldir
xor a ; ld a,0 (prend moins de place)
ld (de),a
ret


Bon, vérifie que ça marche mais c'est l'idée ;)
Si tu ne comprends pas quelque chose, dis moi. C'est un code assez compliqué à comprendre à certains endroits (j'ai essayé de faire la méthode la plus optimisée mais pas la plus simple)

Re: STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 18:49
by tyann2
Bonsoir
Je viens de faire un essai, nickel.
Je pense avoir compris :
On met le contenu pointé par hl dans hl (ldhlind) ça je connaissais pas.
Comme hl est un registre de 2 octets, on lit donc la longueur de strx
On met cette longueur dans bc, l'échange de, hl remet l'adresse de strx dans hl
On incrémente deux fois hl pour arriver au premier caractère
On met l'adresse op1 dans de et on copie bc octets avec ldir.
de et hl se sont incrémentés pendant la copie (ça j'y aurai pas pensé)
donc de pointe juste après le dernier caractère et on y met donc zéro pour
marquer la fin de la chaîne.
Ensuite j'ai mis op1 dans hl et appelé vputs.
Merci encore.
Pour faire ce que j'ai en tête, un petit softmenu,
j'utilise des titres de longueur fixe de 4 caractères.
J'ai pensé à faire quelque chose comme ça.
Code: Select all
label:
.db "1234",0,"1234",0, etc...

puis à copier les 4 premiers caractères de la chaîne à l'adresse label
puis les 4 suivants à label+5 etc... comme ça j'ai mon zéro automatiquement.
Comme j'ai déjà réalisé un softmenu sous cette forme avec les titres directement dans le listing.
Qu'en pensez-vous ?

Re: STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 20:26
by Epharius
Tu as tout très bien compris, c'est exactement ça ;)

Oui, ça devrait marcher. Seul inconvénient si tu veux regarder ce qu'il y a dans cette chaîne via Ti-Basic ou sur l'écran de calcul, ça va t'afficher un caractère bizarre (genre ?) mais au pire, c'est pas trop grave à mon avis.

Aussi, en terme d'optimisation, tu n'as pas vraiment besoin de faire ld hl,label+5 puisque _vputs va retourner HL=adresse après le 0. Un exemple :
Code: Select all
ld hl,Lbl
call _vputs ; après _Vputs on a (HL)='C' car HL a été incrémenté durant l'affichage
call _vputs ; Affiche bien "C'est moi !"
ret
Lbl:
.db "COUCOU",0,"C'est moi !",0

Re: STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 22:04
by tyann2
Merci Epharius, super sympa.
Au plaisir.

Re: [Résolu] STRING en assembleur sur Ti 83+

Unread postPosted: 15 Mar 2016, 23:55
by Epharius
De rien, ça fait plaisir de voir des collègues assembleux :p

Si tu as d'autres questions, n'hésite pas