1

Comme je n'ai toujours pas réussi à afficher quelque chose dans la barre de calcul (mais ce n'est pas grave), j'ai trouvé une solution alternative : exécuter directement les programmes. Comme puis-je faire cela ?

Merci d'avance.

2

PreOs::Exec
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

Je doit déclarer quelque chose ?

4

Exécuter un programme à partir d'un autre est une des choses les plus difficiles à faire sur une TI-68k tournant AMS, à cause des protections d'exécution à la con que TI a ajoutées au fil des modèles. Exécuter un programme est beaucoup plus difficile que:
* faire retourner une valeur au programme (cf. l'autre topic), en l'ayant au préalable poussée sur l'Expression Stack en utilisant des fonctions d'estack.h;
* copier ce que tu veux en tant que texte dans la Home Screen Line. Il existe un hack qui permet de trouver le HANDLE de cette ligne, il est dans tthdex, mais il faudrait que je vérifie s'il passe sans modifications sur AMS 2.08+, ce qui est loin d'être certain...

Utiliser HW2/3Patch supprime une partie significative de ce qui fait qu'il est difficile d'exécuter un programme à partir d'un autre.


Sasume propose une solution qui fonctionne bien, mais nécessite d'utiliser un "kernel" (PreOS).
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

5

En effet exécuter un programme depuis un autre est quelque chose de très complexe en nostub. Le kernel simplifie énormément ce genre de problème l'incovébient est bien sur que l'utilisateur devra avoir PreOS installé.

La syntaxe de Sasume est de type Assembleur.
La syntaxe C sera: kernel_exec("program"); , mais il te faudra installer le fichier include "kernel.h" fourni avec PreOS qui n'est malheureusement pas intégré dans TIGCC.

avatar

6

Lionel Debroux (./4) :
Exécuter un programme à partir d'un autre est une des choses les plus difficiles à faire sur une TI-68k tournant AMS, à cause des protections d'exécution à la con que TI a ajoutées au fil des modèles. Exécuter un programme est beaucoup plus difficile que:(...)
La situation pourrait être inversée si Kevin intégrait une fonction toute bête à l'API de TIGCC, par exemple "int execute(HANDLE programhdl)".

La question de Yamaw est revenue et revient tellement souvent...
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

7

Dans ce cas-ci, est-ce qu'exécuter un programme depuis un autre est le plus malin ?

J'ai retrouvé la méthode:
extern HANDLE getHSLH(void);
asm("
.text
.globl getHSLH
getHSLH:
move.l 0xC8.w,%a1
move.l 1080(%a1),%a0 | HomeExecute
move.l 708(%a1),%d0 | TE_select
SearchLoop:
addq.l #2,%a0
cmp.l (%a0),%d0
bne.s SearchLoop
move.w -4(%a0),%a0 | pointer to the home text edit structure
move.w 34(%a0),%d0 | have the handle
rts
");

Il reste juste à regarder ce que ça donne sur AMS 2.08+, des fois que TI ait mis la structure qui nous intéresse au-delà de 0x8000...
[EDIT: sur AMS 2.07 et 3.10, je trouve que la structure est à 0x6nnn, donc je suppose que c'est bon.
EDIT2: pas bien, quand on désinline une routine, d'oublier "rts" à la fin de la routine grin]


Cette méthode renvoie un HANDLE. Il suffit d'utiliser HeapDeref dessus, et tu peux écrire une chaîne de caractères à cet endroit.
Naturellement, il ne faut pas écrire une chaîne plus grande que la taille de ce handle. La longueur d'une chaîne s'obtient avec strlen, la taille d'un handle avec HeapSize.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

8

Yamaw> Je te conseille de te tourner vers la solution de Lionel pour écrire dans la barre de calcul. Ça me paraît plus simple que d'avoir recours à des techniques complexes pour pouvoir exécuter un programme.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

Thibaut (./6) :
La situation pourrait être inversée si Kevin intégrait une fonction toute bête à l'API de TIGCC, par exemple "int execute(HANDLE programhdl)".

Le problème, c'est qu'il y aurait soit beaucoup de contraintes sur le programme utilisant cette fonction (que les utilisateurs d'une telle fonction ne comprendront pas forcément), soit des contraintes sur l'utilisation (par exemple HW3Patch nécessaire sur Titanium).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

10

Merci à tout le monde !

Mais j'ai (encore) un problème :

J'ai copié la méthode de Lionel à la fin de mon programme pour essayer.
Je compile.
J'exécute mon programme et j'appuie sur ESC (ce qui le quitte).
Tout se passe comme d'habitude mais une fois revenu sur l'écran home (mais je suppose que mon programme est toujours en train de fonctionner), la calculatrice (l'émulateur) reste "buzy" comme si elle était coincée dans une boucle.

11

Ça ne sert à rien d'utiliser de l'assembleur inline pour ça, voilà la même chose en C pur (par Greg Dietsche):
//thanks to Samuel Stearely for explaining how his tsr hook, complete,
//gets the pointer to the home screen text edit structure in an ams
//independent manner. I (Greg) have taken his code and ported it to C.

TEXT_EDIT *TE_findHomeScreen(void)
{
	register void *a=HomeExecute;

	while(*(unsigned long*)a!=(unsigned long)TE_select)
		a+=2;

	return (TEXT_EDIT*)(unsigned long)(*(unsigned short*)(a-4));
}

En plus rapide et plus court (extension de signe de l'adresse comme le fait le CPU lui-même) et sans fautes d'orthographe, ça donne:
// Thanks to Samuel Stearley for explaining how his TSR hook, Complete,
// gets the pointer to the home screen text edit structure in an
// AMS-independent manner. I (Greg) have taken his code and ported it to C.

TEXT_EDIT *TE_findHomeScreen(void)
{
	void *a=HomeExecute;

	while(*(unsigned long*)a!=(unsigned long)TE_select)
		a+=2;

	return (TEXT_EDIT*)(long)(*(short*)(a-4));
}

(J'ai aussi supprimé le mot-clé register qui est ignoré par GCC.) Pour avoir le handle, tu utilises TE_findHomeScreen()->Text.Handle.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

./9: une telle fonction serait nettement simplifiée si HW2/3Patch était obligatoire. Ca fait un certain temps que je suis convaincu que s'en passer est une contrainte énorme sur le lanceur, et j'en suis d'autant plus convaincu depuis que ça m'a pris ~1h30 de faire un lanceur simplifié (page 2 du topic Dune 2, section Projets).

./10: une cause fréquente de BUSY à la sortie est une corruption mémoire.

Au cas où tu n'aurais pas bien vu, Kevin, je n'ai pas écrit de l'ASM inline avec opérandes C wink
Même si c'est ça qu'il faudrait faire pour une efficacité maximale en taille et vitesse (en éliminant éventuellement au passage le chargement de __jmp_tbl dans a1 si OPTIMIZE_ROM_CALLS est actif). J'ai déjà vu GCC faire suffisamment de pessimizations sur 68k (même quand on a écrit le code correctement, par exemple pour qu'il alloue ses registres correctement, il fait des sauvegardes, changements et restaurations) pour ne plus lui faire confiance...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

13

Comment exécuter un programme à partir d'un autre


Dans ton programme tu codes un OS, et tu appelles sa fonction "start" qui lance un processus.
Tout ce qui passe pas par le port 80, c'est de la triche.

14

./11 : Comment je fait pour choisir le fichier à exécuter ?

15

Que veux-tu dire par là ?
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

16

ben il voit nulle part marqué "char *filename" (et il a raison)

il faut obtenir le handle avec SymFind je suppose...

17

Kevin Kofler (./11) :
Pour avoir le handle, tu utilises TE_findHomeScreen()->Text.Handle.


Ben oui mais ça veut dire quoi ? triso

18

./16: ben, tu parles de quoi ?? Il n'y a pas "char *filename" dans ./11 ni ailleurs dans ce topic.

./17:
1) tu copies-colles la deuxième version de TE_findHomeScreen() qui se trouve dans ./11;
2) tu copies-colles TE_findHomeScreen()->Text.Handle et tu stockes ça dans une variable de type HANDLE (cf. ./7);
3) tu utilises HeapDeref pour avoir un pointeur à partir du handle (cf. ./7);
4) tu peux utiliser strcpy, strlen, HeapSize, HeapRealloc, etc. pour stocker quelque chose dans la ligne d'édition de l'écran HOME.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

19

Oulala ça devient compliqué là !

Voilà ou je bloque dans le message 17 :

1) Ok, ça j'ai fait !
2) a) Je doit mettre ça dans le fichier c ou dans la variable HANDLE
....b) C'est quoi une variable de type HANDLE ?
....c) Je doit mettre HANDLE a="TE_findHomeScreen()->Text.Handle" ??? triso
3) a) C'est quoi HeapDeref ?
....b) Oulala les pointeur, j'ai vraiment du mal ! triso
4) Ah ! Et le ./11, il sert à quoi alors ??


Vous avez compris : Tout (ou presque) ... gni


Vous cassez pas trop la tête pour un imbécile d'ignorant (Eheh).

20

2a) Dans une variable de type HANDLE déclarée dans ton fichier C. Voir 2c)
2b) Voir documentation de TIGCC wink
2c) C'est presque ça: HANDLE a=TE_findHomeScreen()->Text.Handle; (sans les guillemets, avec un point-virgule à la fin.

3a) Voir documentation de TIGCC wink
3b) Tu devrais lire des cours sur le C wink

4) c'est la suite du reste, il faut avoir fait le reste auparavant.
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.

21

Lionel Debroux (./20) :
4) c'est la suite du reste, il faut avoir fait le reste auparavant.



Hein ??

22

C'est une mauvaise idée de modifier directement le HANDLE de la ligne d'entrée, parce que l'affichage ne sera pas mis à jour. Ça marche peut-être mieux avec les routines de textedit.h sur le TEXT_EDIT *. Sinon, ce que fait la version actuelle de AutoClBr, c'est d'utiliser le TEXT_EDIT * en lecture seule et d'envoyer tout simplement des évènements à l'écran HOME avec EV_sendEvent pour modifier la ligne d'entrée!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

23

void EV_sendEvent (short TaskID, EVENT *event); (doc TIGCC)

J'aime pas l'astérisque...

24

Mais dites donc, une fonction genre DispCalcBare("blabla"); ???


embarrassed