1


ReOuverture du Topic
ATTENTION : Nombreuses Modifications

Relire Tout
La surprise est de Taille




Le nom de la LIB n'est pas définitif mais c'est plaisant

'MyLib' Librairie graphique pour le basic Alternative à VERTEL

Prog Externe : C'est pour de Suite

Il y aura des progs externes dans des Listes tout simplement. M'enfin pas tout à fait : c'est des presque listes avec mon extension Perso 'MyLB'

Les codes Dans Les Listes sont tokénéisés contrairement au code Normal
Il vaudrait mieux en abuser.

Le code est dans une liste. Vous passez après le séparateur d'appelle de fonctions une Liste ou le nom d'une Liste par Indirection interne.
MyLib vérifie que le nom rencontrer est une Liste. Si c'est le cas ce code est lancé sans préavis directement dans la Liste et non dans la Pile interne.

C'est simple et efficacer

Voici ce qu'il faut noter commme différences Majeures par rapport aux Autres Librairies du BASIC :


Sauf mention, les fonctions sont déjà implémentées

La taille n'est pas un Soucis : prévoyons 20 Ko voir 25Ko (nous en sommes à 17 Ko)




-Pile Interne pour passage d'arguments entre les fonctions interne/Prog de 'MyLib'

- Création de sous programmes Définition du corps avec "prog" , "endp" et execution avec "runp"

MyLib("Prog", Num , % , code_du_programme, % , "endp",", Num , % , ... % ... , % , "runp", ", Num , % , ... % , ...)

-Delimiteur de Blocs

Cela consiste à mettre entre { } une portion de code. J'ai étendu la possibilité de mettre des LISTE/MATRIX dans une liste par la syntaxe suivante :
MyLib("srce", code_du_programme, % , "ends")->ListName
tout le code est copié dans une Liste.


- Prise en charge de Boucles avec 'Jump' pour avancer ou reculer dans les appels de fonctions , et bien sur 'Label' et 'Goto'.
-Compteur interne Pour aller de paire avec les boucles ; Opérateurs supportés: + , - , * , / , %(modulo) , random(cpt) , f(i,j,k)= (Cpt[//i] * Cpt[j] + Cpt[k])
- Fonction Test (très performante avec And et Or)
- Fonction When(Test,TrueValue,FalseValue)

- Indirections internes (dans les Variables TiOs - Pile Interne - Structure Interne)
- Création des variable NUM, STR , LIST , MATRIX, PICT
- manipulation de Listes( Augment, left , right , midl , dim) et Matrix (Augment , SubMat , dim)


-Niveaux de Gris
-Affichage et création d'image TI Basic
-Affichage des Map de Sprites en Fichiers externes (en Cours)
-Création d'une Souris transparente dans toutes les fonctions avec évènement (OnClickLeft, OnClickRight , MouseOn , MouseOut) et définition de zone rectangulaire actives (en projet)

-Affichage de Texte avec clipping local comme dans le TI MATRIX Editor

-CATALOG(comme complete) à partir de plusieurs LISTES(left right pour changer de Liste) qui retourne une LISTE ={le numéro du choix, Le numéro de la Liste, la chaine choisie(en Cours)
-Donner accès au un InputStr avec utilisation du CATALOG (en projet)

2

Gestion des arguments

- ENTIERS et les CHAÎNES.
les structures du BASIC ( MATRIX et LISTES ) sont supportées. Ce qui fait que la fonction s'executera en parcourant individuellement chaque élément.

pour faire court on dira EXPR simple pour désigner seulement ENTIERS ou CHAÎNES

et EXPR Complexes pour MATRIX et LISTES et EXPR pour désigner le tout.


La Syntaxe
[cite]

Le retour à la ligne c'est juste pour la lisibilité du code

Syntaxe de Base

C'est celle déjà implémentée et fonctionelle

MyLib(
"fonc1" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
"fonc2" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
...)

Syntaxe avec délimiteurs de Blocs

C'est fait..

MyLib(
"fonc1" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
{ "fonc2" [,EXPR1] [,EXPR2] ...[,EXPRN] , % , "fonc3" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
"fonc4" [,EXPR1] [,EXPR2] ...[,EXPRN] }
, % ,
"fonc5" [,EXPR1] [,EXPR2] ...[,EXPRN] , % ,
... )

où % remplace le symbole infini.


La seconde syntaxe vous procurera une grande aisance lors de l'utilisation des structure de contrôle 'Jump' , 'Goto' et 'Labl'
En effet il suffit d'avoir la chose suivante pour sauter un Block en entier:

MyLib(
"jump", VALEUR_TEST , OffSet , % ,
{
"pict", "#desktop","#x0" ,"#y0" ,1 , % ,
"text" , "#comment" ,"#x1" ,"#y1", 0, 1, % ,
"text" ,"#title" , "#x2" , "#y2", 0, 1
}
, % ,
"text" ,"MyLib Version 1.1 ", 0,0,1)

pour VALEUR_TEST=1 et OffSet =1
le Bloc entre accollade sera sauter car il correspond au saut d'un seul argument de fonction.

par souci de conformité avec l'implémentation actuelle je mettrai la fonction "Bloc",{Liste_contenant_du_code} , % , .....

[cite]

Interpretation des Arguments


List désigne une Liste
Elt désigne un NUM|STR
-> désigne le symbole de STO

Appel Standard

MyLib("fonction" , {List1,List2} , { Elt1, Elt2} , Elt0)

- les paramètres non LIST|MATRICE reste inchangés
- à tout élément de List1 correspond Elt1
- à tout élément de List2 correspond Elt2

Le principe c'est que le dernier élément d'un argument est répété pour les autres arguments.

Attention dans le cas des MATRIX le Dernier argument est une Liste.


Forcer le déplacement d'une Liste et le Mettre en Mode Auto-Reapeat

MyLib("fonction" , {List1,List2} ,"->" , { Elt1, Elt2} , Elt0)

"->" n'a aucun effet sur les MATRIX (faut pas tenter le DIABLE et en plus je ne vois pas à quoi ça pourrait servir)

"->" force l'avancement des élément de la Liste , { Elt1, Elt2} ; et se repositionne au début de la liste autant de fois qu'il faut pour parcourir de tous éléments de la MATRIX {List1,List2}

A la place de la MATRIX {List1,List2} il y aurait pu avoir une LISTE { Elta, Eltb, Eltc, Eltd, Elte, Eltf } .

la Liste { Elt1, Elt2} aurait alors été parcourue 3 fois.



Arguments Optionnels

Lorsque les arguments d'une fonction sont omis, les valeur par défaut sont :
- zéro pour les NUMERIQUE
- chaîne vide pour les STRING



Les arguments par valeur

vous pouvez passer directement une EXPR.
Mais il est préférable d'utiliser une indirection vers une variable TiOS.
Une raison simple à cela : vous surcharger la Pile d'expressin de la TI.

Les arguments par valeurs ne sont utilisé que pour passer des variables Globales Statiques et surtout des EXPR simples.

De plus Stockez toujours vos variables globales dans des Variable TI BASIC d'abord.
ça facilite la Maintenance du Prog.

Entre ces 2 formes :

1->lbl1:MyLib("Goto", lbl1, ............. , "Labl",lbl1, ..........., "Goto", lbl1, ................,"Goto", lbl1 )

MyLib("Goto", 1, ............. , "Labl",1, ..........., "Goto", 1, ................,"Goto", 1 )

la modification du numéro du "Labl" est plus simple dans le 1er code et fastudieux dans le 2nd




Les arguments par indirection

Pourquoi les indirections ? je dirai 3 raisons évidentes :

1- ne pas surcharger la PILE(ESTACK) de la TI.
[cite]
En effet tout le code de MyLib y sera copié pendant l'execution du prog.
Alors priviliégiez sytématiquement :
- les codes de programme dans les Listes
- l'usage des indirections internes

L'exécution du code n'en sera que plus rapide.

[cite]

2- Empêcher le TiOS d'évaluer des variables dont la valeur n'est pas encore définie au moment ou le TiOS copie le Code de 'MyLib' dans l'ESTACK.

3- Les variables (qui par définition ne sont pas constante) modifié par le code et réutilisées par la suite



-"#" désigne le dernier argument posé sur la pile_interne
- "#0" à "#9" un Tableau de STRUCTURES internes du C alloué dynamiquement
- pour le basic : "#nomvariable" ("#nomvar" équivaut à nomvar : le contenu de la variable n'est pas dans la pile (seulement la chaine) ; le TiOS n'analyse que la Chaine (pas la Variable) alors que MyLib regardera dans la Variable)

L'utilité des STRUCTURES internes est avérée dans les boucles. Histoire de ne pas parcourir de nouveau la l'ESTACK. ça sert à faire afficher du texte beaucoup plus vite
qu'avec des Listes ou Matrix par expemple.

Les Indirections dans la pile interne "#" .

Cela donne de la souplesse au language et permet d'effectuer le passage d'arguments à un autre programme ou entre les fonctions de la 'MyLiB'. En fait cela permet de rediriger l'argument de la fonction dans la pile interne de MyLib en remontant une EXPR après l'autre.

Vous ne pouvez pas en mettre à l'intérieur des Liste ou des MATRIX , car elle remplacera la LISTE ou La MATRIX par l'argument de la pile.


Les Indirections retardées cachées dans les Listes

On parle d'indirection retardée lorsque celle-ci n'est pas visible lors du passage d'arguments à une fonction.
Ces indirections ne peuvent porter que sur des variables de type NUM|STR .
Vous écrivez {"#a" , "#b" } au lieu de { a, b }




Limitations Actuelles : Presque Rien

- 5 structures internes Global à la LIB
- Nombre de programmes
- Définition de la Profondeur de La pile des appels de programme.
- Récursivité : c'est possible selon la profondeur que vous définissez.

- Pas d'imbrication de définiton de programme.
- Le "prog",0 est celui qui est actif quand on lance la MyLib

- Nombre de labels défini par un paramètre du programme appelant
- Nombre de compteurs internes défini par un paramètre du programme appelant



- Taille Maxi des chaînes 255 caractères(ça passera à 1000 si je décide de réintégrer les fonctions de manipulation de chaine déjà écrite : left, right,len,mid,scat[addition de chaîne] ).

- Les chaînes sont allouées dynamiquement à leur taille réelle dans les structures internes.

Plus Conversion des EXPR Basic en Fichiers Externes
Seulement un chargement en STRUCTURE interne.
J'arrive pas encore à trouver une application à ces STRUCTURES internes mais ça va venir.(Bien sure ç ser déjà pour le CATALOG like Complete)

En effet elle sont pour le moment imcompatible avec mes pointeurs sur l'estack;
Va falloir que j'associe une petite structure pour pointer dedans comme je l'aurais fait avec les Listes ou Matrix.

3

Des Info Croustillantes sur l'implémentation de MyLib

Faut pas rêver ça sera pas en Open Source, du moins pas de Suite.
C'est presqu'un Mois de boulot : 5H tous les soirs.
ça ma obligé à lire l'englais.
ça ma vraiement permis de savoir comment fonctionne L'ESTACK de La TI.
Et surtout le but était d'apprendre le C en faisant cette Librairie.
______________________________________________________________________________

Table des fonctions de MyLib
//Functions Table char *tbl_func[]={  (char *)"seti", // OK     VarNum, NUM, PUSH                         Définit la valeur du compteur  (char *)"movi", // OK     VarNum, VarNum, PUSH               Copie la valeur du compteur  (char *)"addi", // OK     VarNum, NUM, PUSH                         Ajoute NUM au Compteur  (char *)"mult", // OK     VarNum, NUM, PUSH                           (char *)"divd", // OK     VarNum, NUM, PUSH  (char *)"modo", // OK     VarNum, NUM, PUSH  (char *)"rand", // OK     VarNum, NUM, PUSH  (char *)"valu", // OK     VarNum                                                  Retourne la valeur du copmteur  (char *)"into", // OK     VarNum, MIN, MAX, MODE{0,1}  (char *)"fonc", // OK     VarNum, VarNum, VarNum  (char *)"test", // OK     EXPR1, EXPR2,{0 ==, 1 != , 2 < , 3 >},{0 And , 1 Or , 2 Index}  (char *)"etyp", // OK     EXPR                                                       Retourne le Type {0 NUM, 1 STR, 2 LIST, 3 MAT}  (char *)"diml", // OK     EXPR                                                       Retourne la dimension d'une LISTE/MATRIX  (char *)"subl", // OK     EXPR, First, Len                         Retourne l'élément d'une LISTE/MATRIX  (char *)"augl", // OK     EXPR, EXPR                                        Retourne l'élément d'une LISTE/MATRIX  (char *)"jump", // OK     BOOLEAN, OffSet                              Saute OffSet instructions (offset peut être négatif)  (char *)"when", // OK     BOOLEAN, EXPR1, EXPR2               Si BOOLEAN==0 retourne EXPR2, sinon EXPR1  (char *)"dupn", // OK     EXPR, Count                                        Duplique n fois EXPR dans la pile interne  (char *)"labl", // OK     NUM{0 à NBR_GOTO}                         Définit un Label  (char *)"goto", // OK     NUM{0 à NBR_GOTO}                         Provoque un Branchement au Label équivalent  (char *)"prog", // OK     NUM{0 à NBR_PROG}                         Définit le début d'un Prog  (char *)"endp", // OK     NUM{0 à NBR_PROG}                         Définit la fin d'un prog  (char *)"runp", // OK     NUM{0 à NBR_PROG}                         Execute le Prog  (char *)"exit", // OK     NUM{0 à NBR_PROG}                         Quitte le prog  (char *)"name", // OK     Pas d'arguments :                     Basucle entre les Mode chaine/numéro pour appeler les fonctions  (char *)"ikey", // OK     NUM{0 à 395} default=336     Règle la vitesse du PAD  (char *)"rkey", // OK     NUM{0 à 395} default=48          Règle la vitesse du PAD  (char *)"gray", // OK     NUM{0 OFF,1 LIGHT,2 DARK}     Active les niveau de gris  (char *)"stri", // OK     NUM_POS                                                  converti un entier en chaîne  (char *)"apdt", // OK     NUM_POS                                                  Règle le temps de mis sous tension de la TI  (char *)"wait", // OK     NUM_POS                                                  Attend une durée de temps sans rien faire  (char *)"dbug", // OK     NUM_POS                                                  Mode déboguage dans la ligne d'Etat  (char *)"time", // OK     NUM_POS                                                  Règle le compteur pour le Chronomètre  (char *)"srce", // OK     VarName                                                  Indique le Début d'une source Externe de Code qui sera sauver dans une Liste   (char *)"ends", // OK     Pas d'arguments !                         Marque la Fin d'une source de Code Externe  (char *)"answ", // OK     Pas d'arguments !                     (dés)active la suppression des arguments utilisé par les fonctions  (char *)"brek", // OK     Pas d'arguments !                     C'est pour sortir de la Lib en Cas de BUG  (char *)"offp", // OK     Pas d'arguments !                     Etteind la TI  (char *)"quit", // OK     Pas d'arguments !                     Quit la Lib   (char *)"virt", // OK     Pas d'arguments !                     (dés)active l'écran virtuelle  (char *)"clrv", // OK     Pas d'arguments !                     libère la mémoire de l'écran virtuelle à chaque appel  (char *)"clrs", // OK     Pas d'arguments !                     Efface l'écran  (char *)"list", // OK     Pas d'arguments !                     (dés)active la récupération des réponses dans une Liste  (char *)"wkey", // OK     {0,1}                                                       Attends l'appui d'une touche  (char *)"gkey", // OK     Pas d'arguments !                     Comme Getkey du Basic  (char *)"tkey", // OK     NUMrow,NUMcol                         Lecture de touches multiples  (char *)"wrcl", // OK     VarStruct{0 à 9}                         Rappel la Structure dans la Pile  (char *)"wdel", // OK     VarStruct{0 à 9}                         Libère la mémoire oqp par la structure  (char *)"wsav", // OK     VarStruct{0 à 9}, EXPR          Sauve EXPR dans la Structure  (char *)"stop", // OK     VarNme, x0, y0, x1, y1          Sauve un image dans la VAT  (char *)"stor", // OK     Varname, EXPR                                   Sauve une EXPR dans la VAT  (char *)"make", // OK     Varname, Size                                   Crée une Entrée dans la VAT  (char *)"writ", // OK     ListScre, Dest, Start, Len          Copy Len Bytes de  Scre dans  Dest à partir de Start  (char *)"read", // OK     ListDest, Srce, Start, Len          Lit Len Bytes de  Scre à partir de Start dans  Dest  (char *)"kill", // OK     Varname                                                  Supprime la variable  (char *)"size", // OK     Varname                                                  Taille de la variable  (char *)"type", // OK     Varname                                                  Type de la variable  (char *)"help", // OK     STR                                                            Affiche un msg dans le Status Line  (char *)"info", // OK     Title, STR, BT_1, BT_2          Affiche un msg dans une Boite de Dialogue  (char *)"text", // OK     STR, X, Y, Font, Mode{0 à 4}  (char *)"pict", // OK     PictName, X, Y, Mode{0 à 6}  (char *)"wdth", // OK     STR, Font{0,1,2}                         Calcule La longueur de la Chaine  (char *)"clip", // OK     X0, Y0, X1, Y1                              Définit la zone d'affichage graphique  (char *)"line", // OK     X0, Y0, X1, Y1, Mode{0 à 7}  (char *)"crcl", // OK     X0, Y0, R1, R2, Mode{},Type{0=vide, 1=Plein}  (char *)"rect", // OK     X0, Y0, X1, X2, Mode{},Type{0=vide, 1=Plein}  (char *)"ofst", // OK     OffsetX, OffsetY  (char *)"sequ", // OK     Init, Step, Count                         Génère un liste  (char *)"dpix", // OK     X0, Y0, Mode{0,1,2}                    Dessine un pixel  (char *)"gpix", // OK     X0, Y0                                                  Retourne l'état d'un pixel  (char *)"2lst", // OK  MUTLI_EXPR                                        Créer une liste à partir de la pile interne  (char *)"2arg", // OK  MUTLI_EXPR                                        Supprime les accolages de liste  (char *)"push", // OK  MUTLI_EXPR                                        Ajoute des EXPR dans la pile interne  (char *)"purg"};// OK     Pas d'Arguments                          Vide la pile interne //Error Message char *tbl_err[]={  (char *)":Bad Function Name or Index !",  (char *)":Bad Argument Type !",  (char *)":Not Enough Memory !",  (char *)":Nothing on ESTACK !",  (char *)":Too Many Arguments !",  (char *)":Invalid PIC Name!",  (char *)":Separator in LIST or MAT !",  (char *)":Undefined Structure !",  (char *)":Unable to Free Timer !",  (char *)":Index Out of Range !",  (char *)":Missing Start or End of Block !",  (char *)":Imbricated Prog Block !",  (char *)":Too Much String !",  (char *)":Too Much Integer !",  (char *)":Too Much Prog Called at Once ",  (char *)":Break !",  (char *)":Quit  !",  (char *)":Invalid TiOS VarName !",  (char *)":Can't Delete Var !"};

_______________________________________________________________________________
Vu que je ne gère que les ENTIERS, les CHAINES , LISTE et MATRIX
Nouvelle fonctions de l'ESTACK


- my_nei Remplace next_expression index
- my_pei Nouveau previous_expression index
- my_SkipNextArg Remplace SkipArg
- my_SkipPrevArg Nouveau SkipPrevArg
- my_NextArgCnt Remplace RemainingArgCnt



conversion d'entier en châine

Supporte jusqu'à 12 chiffres significatifs par défaut, avec possibilité d'aligner à gauche ou à droite les nombres.

Très rapide la conversion , j'en suis assez fier. ça m'a pris du temps de fignoler un truc juste.

En Fait le buffer de conversion est à 12 par défaut. mais on peut l'agrandir ou le réduire :
- Le réduire rend plus rapide la conversion
- L'agrandir ralenti la conversion


Gestion des Variables


Ecriture des 3 fonctions Standards à partir de VAT.H

- MakeFile
- ReadFile
- WriteFile

et ces deux là qui bien sure utilisent celles du Dessus

-SavePic Sauve une Image : C'est 'BitmapGet' qui écrit directement dans la VAT
-SaveExpr Sauve une EXPR dans un des format TI ENTIER, CHAINE, LISTE, MATRIX



Gestion de L'ESTACK


Comme on peut s'en douter (ça c'est du détail ):

- référencement dans une structure des argumments de la fonction courante.
- Exécution de la Fonction en boucle selon la Structures des paramètre
- Certaines Fonctions retournent des Valeurs après le code du Prog dans L'ESTACK
- On peut récupérer successivement ces Valeurs à l'aide de l'indirection "#"
- Les valeurs récupérées par "#" sont supprimées automatiquement sauf si on configure 'MyLib' différemment

4

Les Appels de Programme

ça n'a pas été facile à gerer. Il m'a fallu 3 tables pour simuler les allez et retour dans les programmes.

- le nombre de programme maxi est 30.
- la profondeur maxi de la Pile de Prog est 30.

L'appel d'un programme se fait en pasant en paramètre :
- Le nombre de Saut(Goto) de la Table des Jumps
- Le nombre de variables dans la Table des Compteur entiers

Ces tables seront supprimées automatiquement en fin de programme Sauf si elle sont précisée Static.


5


La Tokenéisation des Programmes dans des LISTES


Lorsqu'on utilise Les programmes dans les Listes , les noms des fonctions sont remplacés par des Tokens.

Non seulement ça réduit considérablement la taille du Code , mais ça évite aussi la recherche dans la Table des Fonctions(Acces directe).

Pour l'appel de N fonctions on passe de 5*N bytes à N bytes de taille de code OQP par les noms des fonctions.

J'ai la Flemme de faire la détokéneisation des fonctions ; ça sera pour plus tard.


6

Organisation en Projet

Cette architecture s'est imposé d'elle même lorsque j'ai voulu créer des Programmes Externes.
Si l'on n'utilise pas de programmes externes , l'utilisation de la LiB ne change pas vraiment. Les valeurs par défaut seront utilisées.


MyLiB est désormais organisée en Projet

Pour créer Un projet , il faut préciser 4 paramètres:

1- Le nombre de programmes contenus dans le projet
2- La profondeur de la pile d'appel des Programmes

Et comme un projet suppose un programme principale (initilale) il faut aussi :

3- Le nombre de Goto du Programme principale
4- Le nombre de Variables Numérique du Programme principale

Heureusement , il y aura des valeurs par défauts pour tout ça.




Création de programmes dans un projet


Pour chaque programme qu'on créer il faut déclarer :

- Le nombre de Goto du Programme
- Le nombre de Variables Numérique


_______________________________________________________________________________

Cette architecture fait que chaque Fichier Externe '*.MyLB' est complètement indépendant , car celui gère un ensemble de ressources qui lui sont propres.

j'ai écris tout le Code Hier , Il y a un Bug avec l'allocation dynamique que je doit regler et c'est bon.

Je crois que je vais faire une Beta avant d'inclure La gestion des Sprites.



7

""

8

""

9

""

10

""

11

""

12

Je veux bien tester si tu veux smile

13

""

14

Ok smile

15


En Passant on peut Stocker dans une LISTE d'autres Listes.

Exemple : MyLib("push", 2 , 5 , {45 ,18 ,6 ,5}, % ,"2lst") -> a

a contient la LISTE : { 2 , 5 , {45 ,18 ,6 ,5} }
Et voilà le travail. Casser la Limitation sur les Listes.


Mais ça il faut pas le faire pour l'instant.
Faut que je vérifie que c'est compatible avec le Système actuel.



Nico_ : j'essaie de finir la création de Fichier PIC, LIST, MAT , STR , NUM et PERSO
pour ce week-end et je t'envoi la betâ tant attendu.

Vivement que Mon pôte JacKrak remette en service son PC qu'il a cramer.
Parceque là je suis à bout , je vais lui filer à faire la Gestion des Prog Externe pendant que moi je fignole la Gestion des Sprites , et peut-être la (dé)Tokeineisation des fonctions pour les Programmes Externes

16

!close
--- Close : sujet clos !

demande de l'auteur ^^
avatar
Webmaster et développeur du site. Pour tout probleme ou question envoyez un mini message ou mail.

Suivez l'actualité de tous vos site préférés sur yAronews : http://ns.yaronet.com =)

17

Reouverture du Topic

De nombreux Changement

Tout relire

18

A première vue, je dirais que Vertel est trés simple à utiliser grin
avatar
Membre fondateur de la Ligue Anti-MacIntoc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Un expert est quelqu'un qui en sait de plus en plus sur de moins en moins
de choses, jusqu'à ce qu'il connaisse absolument tout à propos de rien.

19

Disons jusqu'à maintenant : je viens de décider que les programmes externes seront tout simplement dans des Listes. J'ai réexpliqué ça simplement.

La Librairie peut lancer une portion de code situé dans une Liste.

Imagine un Peu les applications.
Des plug-in partagés par plusieurs prog (bibliothèque standard quoi )
Ecriture de programme par d'autres programmes

20

21

Bon Faut que je finisse aujourd'hui de coder La création de variable TiOS et Perso.

Comme ça on pourra en fin voir ce que fait cette LIB.

Les Niveaux de Gris ça déchire. Mais y en a que 2 avec TIGCC.
Je devrais penser au niveaux de Gris de K.K.

Et Surement que de l'Extra-Graph ne ferai pas de Mal à l'affichage des Sprite au Lieu des Routines de TIGCC. Mais j'ai un peu peur pour La Taille de La LIB


22

Pour extgraph, c pas vraiment la peine, le gain que tu gagnes grace à elle est négligeable devant tous le reste.
avatar
Membre fondateur de la Ligue Anti-MacIntoc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Un expert est quelqu'un qui en sait de plus en plus sur de moins en moins
de choses, jusqu'à ce qu'il connaisse absolument tout à propos de rien.

23

Sauf s'il fait un moyen rapide d'afficher toute une frame...

24

Nan, mais même l'interprétation des fnctions et tous ça... Vertyos à déjas fait le teste pour Vertel.
avatar
Membre fondateur de la Ligue Anti-MacIntoc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Un expert est quelqu'un qui en sait de plus en plus sur de moins en moins
de choses, jusqu'à ce qu'il connaisse absolument tout à propos de rien.

25

Ouf ! Je viens juste de finir de coder :
- La création de programme dans les listes
- La création d'Image TI-Basic et de Variable(LIST,MAT,NUM,STR,PERSO)


J'ai pas encore testé mais c'était pas de la tarte de tout regrouper en :
-MakeFile
-WriteFile
-ReadFile

ça m'a pris toute l'après midi : de jongle entre le HeapDeref et HtoESI et les Sym*

J'espère que ça marchera du premier coup paeceque j'ai énormément modélisé avant de coder.
___________________________________________________________________________________________

Au Dodo ; Demain c'est les Sprites.
Quelle galère.

Ce que Je veux faire c'est :
-Charger les Tableaux de Map des différents Plan dans mes structure internes
-Ensuite Afficher en une seule passe le MAP

Mais d'abord faut que je convertisse les images Ti-Basic en Sprite, ou que je fasse un Editeur de Sprite.
ça sera le 1er Programme de 'MyLib'.

J'ai rien trouvé qui fasse déjà ça. Sinon y a-t-il quelqu'un qui aurait fait un Editeur de Sprite on Calc.
Il m'avait semblé en avoir vu dans le temps.


26

J'ai pensé à tokéneiser les nom des fonctions :
Mais forcément ça voudra dire que je tripote un peu les Listes pour remplacer les nom des fonctions par des Token de Char.

J'avais déjà prévu 2 modes d'appel des fonctions :
-nom sous forme de chaine
-numéro de la fonction dans la Table des fonction pour courcicuiter la recherche dans la Table des Fonctions.

Là y a 70 fonctions et j'ai pas encore fait Les sprites ni intégré le code du CATALOG et du InputStr de mon pote JacKrac.

Déjà les numéro ça évite la recherche Mais faut faire un GetIntArg
Avec les Token Char de 0 à 80 plus besoin de GetIntArg. Un petit (short)*ArgPtr suffit.

Je vais faire un 3ème Mode pour les Token, C'est pour le Cas ou j'écrirai un Utilitaire MyLib pour Traffiquer le Code des Liste.
Pas besoin de surcharger La Lib avec ces Utilitaires de changement de Format.

Quoi qu'il en soit dans les Boucles on Voit que 'MyLib' est Légèrement plus Rapide que Ti-Basic + Vertel En Ce qui concerne l'affichage d'image Basic.

Mais avec Les Sprite , ça va être autre chose.



27

Quand tu dis Basic+Vertel, tu veux dire :
for ...
vertel(...)
endfor ??
avatar
Membre fondateur de la Ligue Anti-MacIntoc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Un expert est quelqu'un qui en sait de plus en plus sur de moins en moins
de choses, jusqu'à ce qu'il connaisse absolument tout à propos de rien.

28

Oui c'est cela même. J'ai fait un Test d'affichage de 25 images 16*16 format un MAP qui se déplace( Step 16) d'un bout de l'écran à l'autre et qui se répète 5 fois. Le bench avec Vertel donne :
144 -> MyLib
190 -> Vertel + For du Basic

Je prévoit de modifier légèrement mes fonctions goto et Jump pour leur donner un paramètre TestValue. Dans certains cas simple ça pourrait éviter de faire appel à la fonction Test .

Mais j'ai pas essayer Vertel + Goto . Je vais testé ça pour comparer.

Ouf ça y est je suis arrivé à débogguer mes fonctions de création de VARIABLES.
Il y a maintenant Stopic et Store(STR,NUM,LIST,MAT).
C'est très plaisant : on dirait du C

MyLib( "Stor" , {"a","b","c","d","e"} , {1,2,3,4} )
ou
{1,2,3,4} ->liste :MyLib( "Stor" , {"a","b","c","d","e"} , "#liste" )

copie la Liste {1,2,3,4} dans chacune des variables a,b,c,d,e.

Il y a aussi moyen de faire : copier élément par élément avec un truc du genre
MyLib("Stor" , {"a","b","c","d"} , { 1, 2, 3 , 4} , 1)

ça donne
a=1
b=2
c=3
d=4

Rien de tel pour charger des paramètres de configuration dans des variables au début du programme.



j'ai même envie de ne pas vérivier le Type pour en faire un CopyVar.
Mais je vais surement créer une autre fonction 'copy' pour faire ça.





Mais je ne supporte pas encore les Variables Locales. C'est terrible ce truc.
Faut déjà faire une boucle et chercher les nom des répertoires locaux jusqu'à la 1ere erreur pour savoir le Répertoire Temporaire actif.

Après faut lire le bits Local de la Variable et le sauvegarder.
Si par la Suite on supprime la var, faut indiquer de nouveau dans quel repertoie temporaire on veut la créer.



Je vais essayer de fonctions internes d'addition,multiplication,division,modulo,random d'entier de type short(-32768 to 32767).
Histoire de comparer avec mon tableau d'entiers C que j'utilise pour les compteur interne.
Si ça donne un truc proche question vitesse; j'abandonne le Tableau C .

29

andoh_wilfried
: 190 -> Vertel + For du Basic

C'est archi-lent ça, faut tester avec des listes sinon le bench ne signifie pas grand chose neutral
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

30

andoh_wilfried
: 190 -> Vertel + For du Basic

C'est archi-lent ça, faut tester avec des listes sinon le bench ne signifie pas grand chose neutral


tout est fait avec des Indirections Internes . Que ce soit dans MyLib ou Vertel.

C'est un MAP 5*5 de Picture 16*16

j'affiche le MAP avec le code suivant :

"pict", "#piclist" , "#Listx","->","#Listy"

Listy ne change pas.
Mais pour déplacer le MAP horizontalement, faut :
Pour Vertel
recalculer Listx.
j'utilise "sequ" de Vertel car les Test avec 'seq(' et 'mid(' du basic sont plus lent.

Pour MyLib

Il y a juste à faire
"addi",1,16,%,"ofst",OffSetX="#" ,OffSetY=0
pour décaler les coordonnées des fonctions Graphiques de 16 pour les X à chaque boucle et 0 pour les Y

________________________________________________________________________

Je viens j'ajouter la table des fonctions et des erreurs //Functions Table char *tbl_func[]={  (char *)"seti", // OK     VarNum, NUM, PUSH                         Définit la valeur du compteur  (char *)"movi", // OK     VarNum, VarNum, PUSH               Copie la valeur du compteur  (char *)"addi", // OK     VarNum, NUM, PUSH                         Ajoute NUM au Compteur  (char *)"mult", // OK     VarNum, NUM, PUSH                           (char *)"divd", // OK     VarNum, NUM, PUSH  (char *)"modo", // OK     VarNum, NUM, PUSH  (char *)"rand", // OK     VarNum, NUM, PUSH  (char *)"valu", // OK     VarNum                                                  Retourne la valeur du copmteur  (char *)"into", // OK     VarNum, MIN, MAX, MODE{0,1}  (char *)"fonc", // OK     VarNum, VarNum, VarNum  (char *)"test", // OK     EXPR1, EXPR2,{0 ==, 1 != , 2 < , 3 >},{0 And , 1 Or , 2 Index}  (char *)"etyp", // OK     EXPR                                                       Retourne le Type {0 NUM, 1 STR, 2 LIST, 3 MAT}  (char *)"diml", // OK     EXPR                                                       Retourne la dimension d'une LISTE/MATRIX  (char *)"subl", // OK     EXPR, First, Len                         Retourne l'élément d'une LISTE/MATRIX  (char *)"augl", // OK     EXPR, EXPR                                        Retourne l'élément d'une LISTE/MATRIX  (char *)"jump", // OK     BOOLEAN, OffSet                              Saute OffSet instructions (offset peut être négatif)  (char *)"when", // OK     BOOLEAN, EXPR1, EXPR2               Si BOOLEAN==0 retourne EXPR2, sinon EXPR1  (char *)"dupn", // OK     EXPR, Count                                        Duplique n fois EXPR dans la pile interne  (char *)"labl", // OK     NUM{0 à NBR_GOTO}                         Définit un Label  (char *)"goto", // OK     NUM{0 à NBR_GOTO}                         Provoque un Branchement au Label équivalent  (char *)"prog", // OK     NUM{0 à NBR_PROG}                         Définit le début d'un Prog  (char *)"endp", // OK     NUM{0 à NBR_PROG}                         Définit la fin d'un prog  (char *)"runp", // OK     NUM{0 à NBR_PROG}                         Execute le Prog  (char *)"exit", // OK     NUM{0 à NBR_PROG}                         Quitte le prog  (char *)"name", // OK     Pas d'arguments :                     Basucle entre les Mode chaine/numéro pour appeler les fonctions  (char *)"ikey", // OK     NUM{0 à 395} default=336     Règle la vitesse du PAD  (char *)"rkey", // OK     NUM{0 à 395} default=48          Règle la vitesse du PAD  (char *)"gray", // OK     NUM{0 OFF,1 LIGHT,2 DARK}     Active les niveau de gris  (char *)"stri", // OK     NUM_POS                                                  converti un entier en chaîne  (char *)"apdt", // OK     NUM_POS                                                  Règle le temps de mis sous tension de la TI  (char *)"wait", // OK     NUM_POS                                                  Attend une durée de temps sans rien faire  (char *)"dbug", // OK     NUM_POS                                                  Mode déboguage dans la ligne d'Etat  (char *)"time", // OK     NUM_POS                                                  Règle le compteur pour le Chronomètre  (char *)"srce", // OK     VarName                                                  Indique le Début d'une source Externe de Code qui sera sauver dans une Liste   (char *)"ends", // OK     Pas d'arguments !                         Marque la Fin d'une source de Code Externe  (char *)"answ", // OK     Pas d'arguments !                     (dés)active la suppression des arguments utilisé par les fonctions  (char *)"brek", // OK     Pas d'arguments !                     C'est pour sortir de la Lib en Cas de BUG  (char *)"offp", // OK     Pas d'arguments !                     Etteind la TI  (char *)"quit", // OK     Pas d'arguments !                     Quit la Lib   (char *)"virt", // OK     Pas d'arguments !                     (dés)active l'écran virtuelle  (char *)"clrv", // OK     Pas d'arguments !                     libère la mémoire de l'écran virtuelle à chaque appel  (char *)"clrs", // OK     Pas d'arguments !                     Efface l'écran  (char *)"list", // OK     Pas d'arguments !                     (dés)active la récupération des réponses dans une Liste  (char *)"wkey", // OK     {0,1}                                                       Attends l'appui d'une touche  (char *)"gkey", // OK     Pas d'arguments !                     Comme Getkey du Basic  (char *)"tkey", // OK     NUMrow,NUMcol                         Lecture de touches multiples  (char *)"wrcl", // OK     VarStruct{0 à 9}                         Rappel la Structure dans la Pile  (char *)"wdel", // OK     VarStruct{0 à 9}                         Libère la mémoire oqp par la structure  (char *)"wsav", // OK     VarStruct{0 à 9}, EXPR          Sauve EXPR dans la Structure  (char *)"stop", // OK     VarNme, x0, y0, x1, y1          Sauve un image dans la VAT  (char *)"stor", // OK     Varname, EXPR                                   Sauve une EXPR dans la VAT  (char *)"make", // OK     Varname, Size                                   Crée une Entrée dans la VAT  (char *)"writ", // OK     ListScre, Dest, Start, Len          Copy Len Bytes de  Scre dans  Dest à partir de Start  (char *)"read", // OK     ListDest, Srce, Start, Len          Lit Len Bytes de  Scre à partir de Start dans  Dest  (char *)"kill", // OK     Varname                                                  Supprime la variable  (char *)"size", // OK     Varname                                                  Taille de la variable  (char *)"type", // OK     Varname                                                  Type de la variable  (char *)"help", // OK     STR                                                            Affiche un msg dans le Status Line  (char *)"info", // OK     Title, STR, BT_1, BT_2          Affiche un msg dans une Boite de Dialogue  (char *)"text", // OK     STR, X, Y, Font, Mode{0 à 4}  (char *)"pict", // OK     PictName, X, Y, Mode{0 à 6}  (char *)"wdth", // OK     STR, Font{0,1,2}                         Calcule La longueur de la Chaine  (char *)"clip", // OK     X0, Y0, X1, Y1                              Définit la zone d'affichage graphique  (char *)"line", // OK     X0, Y0, X1, Y1, Mode{0 à 7}  (char *)"crcl", // OK     X0, Y0, R1, R2, Mode{},Type{0=vide, 1=Plein}  (char *)"rect", // OK     X0, Y0, X1, X2, Mode{},Type{0=vide, 1=Plein}  (char *)"ofst", // OK     OffsetX, OffsetY  (char *)"sequ", // OK     Init, Step, Count                         Génère un liste  (char *)"dpix", // OK     X0, Y0, Mode{0,1,2}                    Dessine un pixel  (char *)"gpix", // OK     X0, Y0                                                  Retourne l'état d'un pixel  (char *)"2lst", // OK  MUTLI_EXPR                                        Créer une liste à partir de la pile interne  (char *)"2arg", // OK  MUTLI_EXPR                                        Supprime les accolages de liste  (char *)"push", // OK  MUTLI_EXPR                                        Ajoute des EXPR dans la pile interne  (char *)"purg"};// OK     Pas d'Arguments                          Vide la pile interne //Error Message char *tbl_err[]={  (char *)":Bad Function Name or Index !",  (char *)":Bad Argument Type !",  (char *)":Not Enough Memory !",  (char *)":Nothing on ESTACK !",  (char *)":Too Many Arguments !",  (char *)":Invalid PIC Name!",  (char *)":Separator in LIST or MAT !",  (char *)":Undefined Structure !",  (char *)":Unable to Free Timer !",  (char *)":Index Out of Range !",  (char *)":Missing Start or End of Block !",  (char *)":Imbricated Prog Block !",  (char *)":Too Much String !",  (char *)":Too Much Integer !",  (char *)":Too Much Prog Called at Once ",  (char *)":Break !",  (char *)":Quit  !",  (char *)":Invalid TiOS VarName !",  (char *)":Can't Delete Var !"};
___________________________________________________________________________