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

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

FLIB v2.2

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

par François LEIBER

http://leiber.free.fr

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



  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")

La liste renvoyée par flib est stockée dans la variable 'fl'.
A partir de la version 1.8, fl peut être déclarée comme variable locale, et ce quel que soit le nombre de sous-programmes où elle est utilisée à la fois.

Flib renvoie toujours une liste, vide si les fonctions ne renvoient rien ou s'il y a eu une erreur, sinon cette liste contient les résutats de toutes les fonctions, dans le bon ordre à partir de la version 1.4b.

Pour éviter que l'on me repose la même question 500 fois :
Non, vous ne pouvez pas écrire :
100->a: flib("apd:a")
Vous devez faire :
100->a: flib("apd:"&string(a)) !
Ceci est bien sûr valable pour toutes les fonctions utilisant des arguments numériques.



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"
Eteins la calculatrice.

"breakoff"
Désactive le break (touche ON). 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.

"wait:valeur"
Attend un certain temps sans rien faire, valeur est donné en dixièmes de secondes. Cette fonction n'est pas très précise, les timers se déclenchant en fait tous les 52 ms, et non pas tous les 50ms.

*"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écedemment.

*"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 et 15.

"setcont:valeur"
Fixe la valeur du contraste courant. valeur doit être un nombre entre 0 (très clair) et 15 (très foncé).



Fonctions graphiques :

Dans toutes ces fonctions, l'argument 'mode' peut être omis, il sera dans ce cas remplacé par 1.

"gray"
Permet d'utiliser ensuite des niveaux de gris : 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 et restaure l'écran initial.

"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écedemment 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 valeurs suivantes :


"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 valeurs suivantes :


"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'.
Commentaire : Si j'ai mis cette fonction à la fin, c'est que je suis sûr qu'il va y avoir plein de monde qui ne va pas comprendre comment s'en servir vu que j'ai très mal expliqué. C'est pourquoi j'ai fait un petit programme BASIC ('mkpic()') qui transforme une partie de l'écran graphique en chaîne de caractères exploitable par cette fonction ; vous pouvez aussi regarder mon Othello BASIC pour mieux comprendre (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],préfixe,données"
Affiche une série d'images en une seule passe les unes à la suite des autres, et par lignes successives.
largeur est le nombre d'images qui seront dessinées horizontalement ; quand ce nombre est atteint, la fonction continuera sur la ligne suivante.
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 cinquantaine (lettres normales et grecques + chiffres).



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.
mode peut prendre les valeurs suivantes :

Attention, si vous omettez l'argument mode, string ne doit pas commencer par un chiffre, ou flib croira que c'est mode. Une autre solution 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'.

"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. Cette fonction renvoie la valeur de la touche appuyée. La chaîne sera tronquée à 25 caractères (38 sur une 92+).

*"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 aux exemples fournis (plus particulièrement le programme 'kbdprgm8').

Ex : flib("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.
En cas de problème - var n'existe pas, ou n'est pas une variable texte, ou ne contient pas assez de lignes - , la fonction ne renvoie rien.



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.

*"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.
De plus, il ne vidange pas le tampon : en clair, il est indépendant des getkey() et autres fonctions sur les touches que vous pouvez utiliser, il 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écedemment.

"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écedemment.



Fonctions de variables :

*"hide:var"
Cache la variable var (la rend invisible du TIOS).
Si var est un dossier, cette fonction ne cachera que le dossier, pas les autres variables qu'il contient.

*"unhide:var"
Décache la variable var.
Si var est un dossier, cette fonction ne va décacher que le dossier, pas les autres variables qu'il contient.

*"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 dans une liste tous les répertoires présent 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.
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 si je ne me trompe pas, il ne sert à rien de rentrer un argument plus grand.
n doit être compris entre 0 et 'size(var)-3'.

*"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.
Pour ceux qui aiment les manoeuvres risquées, sachez que le 'size(var)-2'-ième octet représente le type de le variable, vous pouvez donc théoriquement le modifier (les codes des différents types sont donnés dans la fonction 'getfile'), mais vous risquer fortement d'avoir des plantages (je ne sais même pas si c'est possible) !

*"komp:var"
Compresse la variable var, c'est à dire transforme la variable en une autre variable de type KOMP, prenant moins de place en mémoire.
La fonction renvoie un nombre, qui peut prendre les valeurs suivantes :

Quelques remarques indispensables concernant cette fontion :
- Tout d'abord, elle est assez lente (la décompression est plus correcte), environ 0,5 Ko / s.
- Ensuite, elle n'est pas vraiment ternminée : si vous la lancez deux fois de suite sur la même variable, il est possible d'obtenir un taux de compression supérieur à celui d'un seul passage, cela devrait se faire tout seul. Mais bon, j'ai commencé par faire quelque chose de plus simple, mais qui marche bien.
- Enfin, il ne faut pas en attendre des taux de compression astronomiques : apparemment, j'utilise une technique similaire à celle utilisée dans ziplib, vu que j'obtiens des taux de compression très proches.


*"dekomp:var"
Décompresse la variable var.
La fonction renvoie un valeur qui peut valoir :


*"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.

Retour au sommet de la page