***************************************************************************

*******************************

FLIB 3.1

*******************************

par François LEIBER

http://leiber.free.fr

***************************************************************************


Ce texte contient une description détaillée de toutes les fonctions de Flib et de Flib2, regardez le Lisez-moi pour une présentation plus générale.



  1. Utilisation
  2. Infos
  3. Fonctions générales
  4. Fonctions graphiques
  5. Fonctions texte
  6. Fonctions high-scores
  7. Fonctions de la Status Line
  8. Fonctions touches
  9. Fonctions de variables



Utilisation :

Il suffit, dans un programme BASIC en général, de taper
flib("command1" [,"command2",...])

exemple :
flib("clrscr","msg:Hello, World !","slrcl")

Si vous utilisez des fonctions de flib2, alors :

exemple :
flib2("version","mkhs:10,500,fl,sc","hide:sc")

Les arguments numériques peuvent être de n'importe quel type, exactement comme en BASIC : nombres, mais aussi noms de variables, expressions mathématiques, bref tout ce qui renvoie un nombre. Mais attention, un argument numérique doit commencer soit par un chiffre, soit par un espace :

exemple, remarquez l'espace devant 'liste', 'int' et 'sin' :
flib2("drawline:0,1/2-1/5, liste[5], int(a+7*b), sin(atan(x^2))")

Un nombre ou un nom de variable seul sont traités rapidement et sans problèmes (je l'ai programmé à la main), alors que les expressions sont traitées de manière plus lente, et ne reconnaissent pas les variables locales. Si un argument comporte une erreur de syntaxe, Flib s'arrêtera et lancera une erreur comme le ferait une instruction BASIC standard.

Flib renvoie toujours une liste, vide à la rigueur, contenant les résultats de toutes les fonctions dans l'ordre où elles sont appelées. Cette liste est stockée dans la variable 'fl', qui peut être déclarée comme variable locale.

Si jamais vous ne comprenez pas une fonction, REPORTEZ-VOUS AUX PROGRAMMES D'EXEMPLE fournis avec Flib, qui sont là pour ça : 99% des questions peuvent être ainsi évitées, je vous en remercie. Je ne répondrai plus aux nombreuses questions qui trouvent leur réponse dans ces exemples, je n'ai vraiment plus le temps pour ça... De plus, Flib n'est qu'une librairie complètant les lacunes du BASIC TI, il vous faut déjà savoir programmer en BASIC avant de l'utiliser !



Infos :

Les fonctions de la deuxième librairie (flib2) sont précédées d'une étoile.

Tous les noms de fonctions sont en minuscule et le plus court possible afin de les rendre plus faciles et rapides à retenir et à écrire.

J'ai maintenant inclus toutes les protections possibles, je pense que Flib ne peut provoquer d'erreur, même si vous entrez des arguments erronés.



Fonctions générales :

"off"
Eteint la calculatrice.

"breakoff"
Désactive le break (touche ON, voir exemple 'flpass'). Attention, l'utilisation de la fonction getkey() réactive le break, mais aussi tout appel à un programme, une fonction ou à string(), c'est pourquoi je n'ai pas mis de fonction pour le réactiver. Enfin, vu que cette fonction désactive toutes les interruptions, elle accélère vos programmes.

"beep:freq[,duree]"
Joue la note à la fréquence freq pendant le temps duree, donné en centièmes de secondes. duree vaut 4 par défaut (note brève, du genre petit bruit quand on appuie sur une touche).
Remarquez au passage que je me suis cassé pour que les notes soient aussi justes sur HW1 que sur HW2.

"beep2:[tempo,]musique"
Joue la mélodie musique au tempon tempo (temps par minute), 120 par défaut. S'arrête si l'utilisateur appuie sur une touche.
musique doit respecter les conventions suivantes (regardez l'exemple 'sound') :

Do
Do#
Ré#
Mi
Fa
Fa# Sol Sol# La La# Si
A
B
C
D
E
F
G H I J K L

Pour changer d'octave, tapez 'O' suivi du numéro de l'octave, qui doit être compris entre 0 et 4 (2 par défaut).
Pour changer le type des notes, tapez :

1 2 3 4 5 6 7 8 9
Ronde
Blanche
Noire pointée
Noire
Croche pointée
Croche
Double croche Triple croche Triolet
4 temps
2 temps
1+1/2 temps
1 temps
1/2+1/4 temps
1/2 temps
1/4 temps 1/8 temps 1/3 temps

Enfin, pour une pause, tapez 'P', elle sera de la même longueur qu'une note qui aurait été jouée à la place.

"wait:valeur"
Attend un certain temps sans rien faire, valeur est donné en dixièmes de secondes. Cette fonction est étalonnée avec précision pour une HW2.

*"apd:valeur"
Fixe la valeur de l'apd (nombre de secondes avant que la 89 ne s'éteigne toute seule). Renvoie la valeur enregistrée précédemment.

*"error:nbre"
Crée une erreur n° nbre, voir le manuel de la 89 pour les numéros des différentes erreurs. L'avantage d'une erreur provoquée manuellement est que vous pouvez ainsi avertir l'utilisateur d'une erreur, tout en ne quittant pas le programme en cours.

*"reset"
Réinitialise la 89. Cette fonction n'est pas vraiment la plus utile, mais elle est sûrement la plus marrante !

(*)"version"
Renvoie la version de votre librairie Flib.

"+"
Augmente le contraste.

"-"
Diminue le contraste.

"getcont"
Renvoie le contraste courant de la calculatrice, soit un entier entre 0 (très clair) et 15 (très foncé).

"setcont:valeur"
Fixe la valeur du contraste courant. valeur doit être un nombre entre 0 et 15 compris.



Fonctions graphiques :

Dans toutes ces fonctions, l'argument mode peut être omis, il sera dans ce cas remplacé par 1.
Les coordonnées sont comptées à partir du coin supérieur gauche, de coordonnées (0,0) jusqu'au inférieur droit, de coordonnées (159,99) (ou (239,127) sur une 92+).


"gray"
Active les niveaux de gris, efface l'écran dans les deux plans, et active le plan 1. A la fin de l'appel de Flib, la calculatrice attend que vous appuyez sur une touche, puis désactive les niveaux de gris, restaure l'écran initial et renvoie la touche appuyée (voir exemples 'grayex' et 'anni').

"gray2"
Même chose que 'gray', sauf que la fonction n'attend pas l'appui d'une touche à la fin de l'appel. Si vous appelez cette fonction une deuxième fois, elle désactivera les niveaux de gris.

"plane:x"
Change le plan actif pour les niveaux de gris : toutes les fonctions graphiques que vous appelez après dans le même appel de Flib seront effectuées sur ce plan. x peut valoir 0 ou 1.
Un pixel de couleur * correspond aux plans * allumés :


"clrscr"
Efface tout l'écran.

"sprite:[x,][y,][mode,]pic"
Affiche une image pic aux coordonnées (x, y).
mode peut prendre les valeurs suivantes :

x et y valent 0 par défaut.

"savpic:x1,y1,x2,y2,pic"
Enregistre la partie de l'écran comprise entre les points (x1, y1) et (x2, y2) dans la variable pic.

"rclscr:pic"
Restaure l'image pic d'un écran enregistrée précédemment avec 'savpic'.

"savscr:pic"
Enregistre l'écran dans la variable pic.

"picsize:pic"
Renvoie dans une liste la taille horizontale et verticale de l'image pic.

"rect:x1,y1,x2,y2[,mode]"
Dessine un rectangle vide entre les points (x1, y1) et (x2, y2).
mode peut prendre les valeurs suivantes :

En fait, si vous recherchez un effet en particulier, essayez d'autres arguments, vous pouvez avoir des rectangles ronds inversés, des arrondis doubles, des rectangles avec les côtés en pointillés, etc.
De plus, les valeurs indiquées ci-dessus correspondent à des rectangles blancs par défaut, vous devez rajouter l'une des trois premières valeurs pour avoir des rectangles noirs ou inversés.

Ex : 97 ( = 64 + 32 + 1 ) pour un rectangle arrondi double noir.

"fillrect:x1,y1,x2,y2[,mode]"
Dessine un rectangle plein entre les points (x1, y1) et (x2, y2).
mode peut prendre les valeurs suivantes :


"filltri:x1,y1,x2,y2,x3,y3[,mode]"
Dessine un triangle plein entre les points (x1, y1), (x2, y2) et (x3, y3).
mode peut prendre les mêmes valeurs que la fonction 'line'.

"fillpoly:x1,y1,x2,y2,x3,y3,x4,y4[,mode]"
Dessine un quadrilatère plein entre les lignes (x1, y1)-(x2, y2) et (x3, y3)-(x4, y4).
La première ligne doit se situer plus près du bas de l'écran que la deuxième, sinon rien n'est dessiné.
mode peut prendre les mêmes valeurs que la fonction' line'.

"ellipse:x,y,r1,r2[,mode]"
Dessine une ellipse de centre (x, y), de rayon horizontal r1 et de rayon vertical r2.
mode peut prendre les même valeurs que 'fillrect'.


"line:x1,y1,x2,y2[,mode]"
Dessine une ligne entre les points (x1, y1) et (x2, y2).
mode peut prendre les valeurs suivantes :

En fait, les ombrages fonctionnent seulement avec les lignes ayant une pente supérieure à 45°.

"pix:x,y[,mode]"
Dessine un point de coordonnées (x, y).
mode peut prendre les même valeurs que 'fillrect'.


"pixtest:x,y"
Renvoie 1 si le pixel (x, y) est allumé, 0 s'il est éteint.

"mkpic:largeur,hauteur,var,données"
Enregistre dans la variable var une image de largeur et hauteur fixées, où l'image elle-même est directement fournie sous forme d'octets (une chaîne de caractères).
La structure des données est la suivante : chaque ligne est donnée par un nombre entier de caractères, chaque caractère contenant 8 pixels (si la largeur de l'image n'est pas un multiple de 8, les derniers bits du dernier octet de chaque ligne ne seront pas pris en compte).
Les lignes sont écrites les unes à la suite des autres.
Pour contourner les problèmes des caractères non utilisables en BASIC, remplacez le caractère n°0 par '00', le n°2 par '02' et le n°13 par '13'.

Pour comprendre, regardez les utilitaires BASIC 'mkpic' et 'mkpic2' qui créent des chaînes de caractères exploitables par 'mkpic' ; vous pouvez aussi regarder mon Othello BASIC (lire les docs respectives).
Si j'ai fait une telle fonction, très près de la machine, c'est à force de voir des programmeurs BASIC distribuer leurs programmes avec un million de petites images dans divers répertoires. Cette fonction permet donc de créer ces images de manière temporaire avec très peu de mémoire et de manière très pratique !

"map:[largeur,][x,][y,][horiz,][vert,][mode,][temps,]préfixe,données"
Affiche une série d'images en une seule passe les unes à la suite des autres, et par lignes successives (voir exemple 'map').
largeur est le nombre d'images qui seront dessinées horizontalement ; quand ce nombre est atteint, la fonction continuera sur la ligne suivante. Quand cet argument est omis, toutes les images sont tracées sur la même ligne.
Les images seront dessinées à partir du point (x, y) ; ce point est (0, 0) par défaut.
mode peut prendre les mêmes valeurs que pour 'sprite'.
horiz et vert indiquent quelle place doit être laissée à chaque image : si des images sont plus grandes que la place réservée, elles se chevaucheront. Quand horiz et vert sont omis, 'map' prend la taille des images comme arguments, mais dans ce cas il vaut mieux que les images aient toutes la même taille, sous peine d'avoir des décalages lors de l'affichage.
Toutes les images doivent avoir des noms composés de préfixe + 'un caractère' : données est la succession de ces caractères correspondant à toutes les images que vous voulez afficher. Vous pouvez donc afficher avec un seul appel à 'map' autant d'images différentes qu'il y a de caractères permis pour les noms de variables, soit une soixantaine.
temps est un argument astucieux : son emploi transforme cette fonction en CyclePic évolué. En effet, la fonctions va alors tourner en boucle tant qu'aucune touche n'est appuyée, puis s'arrêter et renvoyer le numéro de la touche appuyée. temps est le temps en centième de secondes que la fonction attend entre deux dessins d'images. Si vous donnez 0 et 0 pour horiz et vert, toutes les images vont être affichées les unes sur les autres.

Ex : flib("map:,x,y,0,,4,temps,pic,123456")
pic1, pic2,... forment une petite vidéo, et x, y et temps doivent être remplacés par des nombres.
En mettant le temps à 0, vous pouvez même faire des niveaux de gris (voir exemple 'grayex'), pratique pour afficher une image en niveaux de gris dans une interface en noir et blanc, ce que ne permet pas 'gray' (mais la qualité n'est pas aussi bonne quand même).



Fonctions texte :

"font:taille"
Change la taille de la police actuelle.
taille peut prendre les valeurs suivantes :


"drawstr:x,y,[mode,]string"
Affiche la chaîne de caractère string aux coordonnées (x, y).
Si x vaut 999, alors la chaîne sera centrée horizontalement sur l'écran (n'abusez pas de ce centrage automatique, vos programmes de 89 risqueraient de moins bien passer sur une 92+ à cause de la taille de l'écran).
mode peut prendre les valeurs suivantes :

Attention, si vous omettez l'argument mode, string ne doit pas commencer par un chiffre ou un espace, ou Flib croira que c'est mode. Une autre solution que je recommende consiste à mettre une virgule sans mettre d'argument.

"drawstrv:x,y,[mode,]string"
Affiche verticalement la chaîne de caractères string aux coordonnées (x, y).
mode peut prendre les mêmes valeurs que 'drawstr'.

"pretty:x,y,[mode,]expr"
Affiche en mode Pretty Print l'expression expr aux coordonnées (x, y).
mode peut prendre les mêmes valeurs que 'drawstr'.

"pinfo:expr"
Renvoie la largeur qu'aura l'expression affichée avec pretty, suivie de l'ordonnée de son haut et de son bas.
En clair, si vous l'affichez à (x,y), elle sera comprise entre (x, y+haut) et (x+largeur, y+bas).

"width:taille,str"
Renvoie la largeur en pixels que prend la chaîne de caractères str dans la police taille.

"msg:string"
Affiche la chaîne de caractères string en inversé sur un fond noir encadré et attend que l'utilisateur appuie sur une touche., puis restaure l'écran et renvoie la valeur de la touche appuyée.
Pour afficher le message sur plusieurs lignes, séparez-les par '|'. Chaque ligne sera tronquée à 25 caractères (38 sur une 92+) puis centrée sur l'écran, le nombre de lignes est limité à 8 (12 sur une 92+).

Attention, n'appelez pas cette fonction quand les niveaux de gris sont activés : les deux fonctions se servent de la même zone mémoire pour stocker l'écran de manière temporaire, donc Flib ne restaurera plus correctement l'écran à la fin de l'appel, comme elle devrait le faire avec 'gray'. Mais bon, vous pouvez le faire manuellement...

*"menu:[hauteur,][x,][y,]titre,éléments..."
Fait apparaître un menu rectangulaire avec autant d'éléments et de sous-éléments que vous voulez, avec le coin supérieur gauche au point (x, y). Les trois premiers arguments sont facultatifs, le menu aura la taille idéale et sera centré si vous les omettez. Si hauteur est insuffisant pour afficher tous les éléments, vous pourrez faire défiler le menu.
Chaque élément du menu est précédé d'une virgule, et chaque élément de sous-menu est précédé d'une '|'. Il ne peut y avoir qu'une profondeur de sous-menu.
La valeur renvoyée dans 'fl' correspond au numéro de l'élément sur lequel l'utilisateur a appuyé sur ENTER, ou 0 si il a appuyé sur ESC.

Essayez par exemple de taper ce qui suit sur votre calculatrice pour comprendre, ou reportez-vous à l'exemple 'menu'.
Ex : flib2("menu:20,titre,option1,option2|sous-option1|sous-option2")

*"numline:var"
Renvoie le nombre de lignes de la variable texte var.
En cas de problème - var n'existe pas ou n'est pas une variable texte - la fonction ne renvoie rien.

*"getline:n,var"
Renvoie la n-ième ligne de la variable texte var.
Dans un texte, la première ligne est numérotée 0 (valable aussi pour les deux fonctions suivantes).

En cas de problème, la fonction ne renvoie rien.

*"delline:n,var"
Supprime du texte var sa n-ième ligne.
Renvoie 1 en cas de succès, 0 sinon.

*"insertline:n,var,str"
Insère la ligne str entre la (n-1)-ième et la n-ième ligne du texte var.
Renvoie 1 en cas de succès, 0 sinon.



Fonctions high-scores :

Une table de high-scores est une variable contenant plusieurs scores, formés chacun d'un nombre, de 0 à 65535, et d'un nom, de 10 caractères maximum.
La variable se présente sous la forme d'une chaîne de caractères, mais vous ne verrez que 'highscores by flib', vous n'avez pas accès au reste des données. Vous pouvez trouver un exemple d'utilisation dans 'memory'.

*"mkhs:n,rec,nom,var"
Crée une variable var contenant une table de n records, initialisés à la valeur rec et au nom nom.
Si nom fait plus de 10 caractères, il sera tronqué.

*"puths:rec,nom,var"
Insère automatiquement dans la table de record var le record donné par le nombre rec et le nom nom.
Retourne la classement du nouveau record, ou 0 si rec est un record trop mauvais pour être classé.
Si nom fait plus de 10 caractères, il sera tronqué.

*"geths:n,var"
Renvoie dans 'fl' le n-ième record de la variable var, sous la forme d'un nombre suivi d'une chaîne de caractères pour le nom.



Fonctions de la Status Line :

"slclr"
Efface le contenu de la Status Line.

"slrcl"
Redessine la ligne au dessus de la Status Line.

"slmsg:string"
Affiche la chaîne de caractères string dans la Status Line.

"busy:mode"
Change l'indicateur de la Status Line.
mode peut prendre les valeurs suivantes :




Fonctions touches :

"keywait"
Attend que l'utilisateur appuie sur une touche et renvoie la valeur de la touche appuyée.
Attention, les touches suivantes ont des codes différents que ceux renvoyés par getkey() en basic, les autres sont les mêmes.

Normale
2nd
Shift
Diamant
Alpha
Haut
337
4433
8529
16721
33105
Gauche
338
4434
8530
16722
33106
Bas
340
4436
8532
16724
33108
Droit
344
4440
8536
16728
33112

Attention : pour une 92+, les touches Haut et Gauche sont inversées.

"keylow"
Permet de récupérer à bas niveau le code de touches appuyées : ce code ne détecte que les appuis sur les flèches et les quatre touches 2nd, Shift, Diamant et Alpha, idéal pour les jeux d'action (voir exemple 'keylow').
De plus, cette fonction ne vidange pas le tampon : en clair, elle est indépendante des getkey() et autres fonctions sur les touches que vous pouvez utiliser, elle renvoie juste l'état actuel du clavier. Enfin, il détecte quand plusieurs touches sont appuyées à la fois.
Il renvoie une chaîne de caractères dont les bits représentent successivement les états des touches 2nd, Shift, Diamant, Alpha (Lock pour les 92+), Gauche, Droite, Haut et Bas.

Par exemple, "10001010" signifie que les touches 2nd, Gauche et Haut sont appuyées, et que toutes les autres sont relâchées.

"initdelay:valeur"
Fixe la valeur (395èmes de seconde) au bout de laquelle la répétition des touches est activée, 0 désactive la répétition des touches.
Si vous mettez une valeur du genre 1, vous n'arriverez plus à diriger le curseur correctement car il avancera de plusieurs crans à chaque fois (marrant comme blague)...
La valeur par défaut est 336, mais de toute façon elle est restaurée à chaque fois que l'on éteint-rallume la 89.
Renvoie la valeur enregistrée précédemment.

"delay:valeur"
Fixe le temps (395èmes de seconde) entre deux répétitions de touches.
La valeur par défaut est 48, mais de toute façon elle est restaurée à chaque fois que l'on éteint-rallume la 89.
Renvoie la valeur enregistrée précédemment.



Fonctions de variables :

*"hide:var"
Cache la variable ou le dossier var (la rend invisible du TIOS).
Pour un dossier, la fonction commence commence par le replier, afin de cacher aussi les variables qu'il contient.

*"unhide:var"
Décache la variable ou le dossier var (voir 'hide').

*"size:var"
Renvoie la taille de la variable var.

*"state:var"
Renvoie l'état d'une variable ou d'un dossier sous forme d'un nombre de trois bits : le premier bit indique si var est archivé, le deuxième s'il est verrouillé et le dernier s'il est caché.
En clair, vous devez faire ceci si vous voulez récupérer les caractéristiques une par une :


*"folder:var"
Renvoie la liste de tous les répertoires où se trouve la variable var.

*"getfolder"
Renvoie la liste de tous les répertoires présents dans la 89.

*"getfile:[type,]folder"
Renvoie dans une liste le nom de toutes les variables présentes dans le répertoire folder.
De plus, vous pouvez ajouter un argument type, alors la fonction ne renverra que les variables de type type.
type peut prendre les valeurs suivantes :

Les expressions n'ont pas de valeur assignée, c'est pourquoi elles n'apparaissent pas ici.

*"getbyte:n[,nbre],var"
Renvoie la valeur du n-ième octet de la variable var.
Si l'argument nbre est présent, Flib renvoie sous la forme d'une chaîne de caractères nbre octets de la variable var en partant du numéro n.
n doit être compris entre 0 et 'size(var)-3'.
L'argument nbre est beaucoup plus puissant et pratique pour programmer un éditeur que de récupérer les octets un par un, cependant il renvoie très souvent une erreur (jamais de plantage, ne vous inquiétez pas), utilisez-le donc avec modération ! De plus, nbre est limité à 4997.

*"setbyte:n,val,var"
Remplace la valeur du n-ième octet de var par val.
n doit être compris entre 0 et 'size(var)-3', val entre 0 et 255.

*"memcpy:ndest,nsrc,num,dest,src"
Copie num octets à partir du nsrc-ième de la variable src dans la variable dest à partir de son ndest-ième octet.

Ex : "Flib by François Leiber"->a : "Flib2 &                        "->b : flib2("memcpy:9,1,23,b,a")

*"komp:var"
Si la variable var n'est pas compressée, alors cette fonction la compresse, c'est à dire la transforme en une autre variable de type KOMP, prenant moins de place en mémoire. Si var est déjà de type KOMP, décompresse automatiquement la variable.
La fonction renvoie un nombre, qui peut prendre les valeurs suivantes :


*"kinfo:var"
Renvoie, à la suite, le type (voir fonction 'getfile') et la taille d'origine de la variable compressée var. Renvoie juste 0 si var n'est pas de type KOMP.

*"group:[n,][var1,var2,...]var"
Lorsqu'il y a plus d'un nom de variable en argument, la fonction regroupe les variables var1, var2, ... dans la variable var, qui sera de type GRP. La somme de la taille des variables ne doit pas dépasser 65 Ko, par limitation du TIOS. Les noms de variables peuvent inclure un nom de répertoire.
Renvoie le nombre de variables enregistrées avec succès dans var.

Lorsqu'il n'y a qu'un nom de variable, la fonction comprend qu'il faut extraire les fichiers contenus dans cette variable de type GRP (ne fait rien si la variable est d'un autre type). Si en plus, il y a un argument numérique, extrait seulement le n-ième fichier de la variable.
Renvoie le nombre de variables extraites avec succès de var.

Cette fonction est pratique pour éviter d'avoir des programmes avec des milliers de fichiers (voir les exemples). En plus, la compression avec 'komp' est plus efficace quand vous regroupez plein de fichiers du même genre avant la compression, que de les compresser un par un puis de les regrouper.

*"ginfo:var"
Renvoie la liste des fichiers contenus dans la variable GRP var.

*"mkvar:taille,[type,][extension,]nom"
Crée une variable appelée var de taille octets, remplie de 0.
type est un nombre permettant de donner le type de la variable (voir 'getfile' pour connaître les différentes possibilités). Par défaut, 'mkvar' crée un texte (type vaut alors 224).
extension est une chaîne de 4 lettres maximum pour créer une variable de type personnel, extension est le type qui s'affichera dans Var-Link.
Si vous mettez à la fois les arguments type et extension, c'est cette dernière qui l'emportera.

Ex : flib2("mkvar:7,aaa","setbyte:2,32,aaa")
pour créer un texte vide appelé 'aaa'. Le deuxième octet fixé à 32 indique le début de la première ligne, indispensable pour que le TIOS ne s'emmêle pas les pédales.

Ex : flib2("mkvar:50,pers,aaa")
pour créer une variable de 50 octets qui apparaîtra de type 'pers' dans Var-Link.

*"type:var"
Renvoie l'extension de la variable de type personnel var.


Retour au sommet de la page