Page 1 of 1

[ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 21:43
by Epharius
Bonjour tout le monde !

Je m'adresse à Matref, TheMachine42 et tous ceux qui seront en mesure de répondre à ma question, question qui demande pas mal de connaissances en programmation assembleur. Je compte sur vous, ce sera probablement une fonctionnalité de PHASM si j'arrive à débugger ça.
Commençons....

Le fait que ce soit pour Ti-83 Premium CE ne change absolument rien ! Le code est TOTALEMENT compatible avec n'importe quelle Ti z80 puisqu'elle n'utilise pas l'écran graphique, en supposant bien sûr d'avoir recompilé le code.


Vocabulaire : L'edit Buffer est un endroit de RAM ou la variable actuellement éditée est stockée. L'exemple le plus courant d'edit buffer est l'édition de programme basic, dans :f43: :f26:

Je suis sur PHASM, le shell pour ti-83 premium CE, depuis pas mal de temps et j'ai terminé les fonctionnalités de base.
Maintenant je veux m'attaquer à la suppression du never-ending scroll, qu'on a lorsqu'on choisit "goTo" lors d'une erreur dans un programma basic. Attention à faire la différence avec ce qu'avait matref ici. Je veux vraiment faire un instant goTo, pas voir le code défiler pendant 10 minutes.
Tout content de mon idée je me suis documenté pendant quelques heures, et j'ai trouvé ce que je cherchais : editCursor. Cet emplacement de RAM contient en fait l'adresse du token sous le curseur dans l'édition de variable ou pour être plus précis : Stores the address of where editing is taking place. As opposed to the visible cursor displayed on screen, this location stores the address of the token under the cursor.

C'est donc avec le fonctionnement des romCalls du buffer d'édition en tête que je me met à l'écriture de mon code. Je fais bien sûr quelques tests pour voir si tout marche et je me rend compte que changer editCursor c'est bien beau, mais ça ne change QUE le token (enfin, abus de langage, ce n'est pas un token mais passons) en dessous du curseur, ce qui nécessite de scroller un peu pour remettre les tokens à leur place. En gros faudrait rafraichir le contenu de l'edit buffer. Bon bien entendu, pas la peine de penser à grBufCpy, l'écran n'est pas contenu dedans. Je vous met mon code :

Code: Select all
ld hl,RawKeyHook
   ld de,$D052C6                 ; Adresse saferam
   ld bc,stop-begin+1
   ldir
   ld hl,$D052C6
   ld (RawKeyHookPtr),hl      ; Activation du Raw Key Hook
   set rawKeyHookActive, (iy+hookFlags2)
   ret


RawKeyHook:
   .org $D052C6
begin:
   .db 83h
   cp 250            ; if [<>] has been pressed
   ret nz
   bit editOpen, (iy+editFlags)
   ret z
   ld hl,editCursor
   inc (hl)
   inc (hl)
   inc (hl)
   inc (hl)
   inc (hl)
   ld a,0
   ret
stop:


Concrètement que fait ce code ? Déjà le début jusqu'à begin c'est juste pour activer le hook. J'utilise le rawKeyHook, le hook qui s'exécute à chaque fois qu'une touche a été pressée, en gros.
Le hook vérifie d'abord que c'est bien la touche <> qui a été pressée, ensuite il vérifie qu'on est bien dans l'edit buffer. Enfin, il incrémente 5 fois l'adresse du curseur, pour ensuite retourner à l'OS. Logiciellement ce hook marche, le curseur est bien 5 tokens après. Graphiquement c'est la guerre du Vietnam : on a des tokens qui se baladent à l'écran quand on re-bouge le curseur.

Bref, ma question est : comment fait-on pour rafraichir l'edit buffer ? la romCall _DispTail le fait bien elle, il doit y avoir un moyen...
Merci de m'avoir lu, si c'est le cas, jusqu'ici ! J'espère que vous pourrez m'aider ;)
N'hésitez pas à me demander plus d'infos si vous n'avez pas compris quelque chose, je vous répondrai le plus vite possible !

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 21:53
by Adriweb
Quel est le problème à utiliser _DispTail ?

(Edit: au passage, il y a ce PDF via TI, même s'il n'apportera probablement pas grand chose: https://web.archive.org/web/20040228033 ... ditbuf.pdf )

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 21:56
by Epharius
Très bonne question : _DispTail scroll jusqu'à la fin du programme, moi je veux aller instantanément à la fin, sans scroll. Sinon, le hook n'a plus d'intérêt, c'est comme ce que fait actuellement le GoTo dans les erreurs.

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 22:01
by Hayleia
Sinon, il n'y aurait pas moyen de déplacer ton curseur de manière progressive (sans le faire sauter) mais sans que le scroll ne soit visible à l'écran ? Je veux dire, quand tu le bouges ton curseur, ça prend effet à l'écran tout de suite ? Tu peux pas genre le faire scroller 1 "token" par 1 "token" jusqu'à la position voulue sans causer de scroll visible ?

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 22:05
by Adriweb
Il me semble que Doors CS fait ce genre de choses, mais évidemment KermM est contre le fait de le mettre open-source...

Bref, sinon, tu peux toujours regarder comment fonctionne le DispTail.

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 22:08
by Epharius
En fait ce que ça fait, c'est que le curseur, graphiquement, ne bouge pas. C'est juste le token en dessous du curseur qui change. Et encore, ce n'est pas le token mais le caractère qui change, puisqu'il est en dessous du curseur qui clignote et qui rafraichit l'emplacement.

Adriweb : oui j'y ait pensé mais je n'ai même pas pris la peine de lui demander :p
Sinon, je n'ai jamais fait de reverse engineering, je ne sais pas du tout comment faire... Le code de la romCall, on peut le trouver quelque part ?

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 22:20
by Adriweb
Tu peux toujours utiliser le désassembleur de DrDnar ou le module IDA ez80 de Brandon Wilson, les deux conviennent.
Ensuite faire du search/replace des addresses par leurs equates à partir du fichier d'include communautaire.

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 22:23
by Epharius
ok merci, ça me sera utile ;)

J'ai eu une idée entre temps... je vais essayer de mettre editBtm (adresse maximum du curseur) dans editCursor pour voir ce que ça fait. Je sais que ça ne marchera pas mais ça va me permettre de mieux comprendre le fonctionnement. D'ailleurs si quelqu'un sait la différence entre editTail et editBtm... x)

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 22:25
by Hayleia
Je ne sais pas la différence, je ne fais que des suppositions.
Peut être que tail, c'est la fin fin du programme alors que btm c'est le premier "token" de la dernière ligne ?

Re: [ASM] Rafraichissement de l'edit Buffer

Unread postPosted: 18 Oct 2015, 22:33
by Adriweb
Les pointeurs editTop/Cursor/Tail/Btm sont relatifs à l'edit buffer, pas au contenu (si c'était ton idée).