Sponsors

FacebookTwitterGoogle Bookmarks

Ici, on commence par demander un mot de passe. Si ce mot est AMIGA, alors on affiche «Mot de passe correct», sinon, si ce mot est ATARI, on hurle au traître (hé, hé, hé), sinon enfin, on se contente d’afficher «Mot de passe incorrect». Ce qui se passe en fait, c’est que l’on compare la chaîne de caractères contenue dans la variable a$ , avec la chaîne AMIGA. Si les deux chaînes sont égales (c’est-à-dire identiques), alors la condition est remplie. Si elles sont différentes, on compare a$ avec ATARI. Si alors le résultat de cette comparaison est vraie, la condition est remplie, sinon (c’est-à-dire si a$ ne valait ni AMIGA ni ATARI), c’est le mauvais mot de passe. En plus de pouvoir comparer l’égalité (plutôt, l’identicité de deux chaînes), on peut également comparer leur supériorité et leur infériorité. Comment celà est-il possible ? Je vous rappelle qu’une variable alphanumérique est composée de plusieurs caractères qui se suivent. Ces caractères correspondent tous à un code ASCII, c’est-à-dire une valeur comprise entre 0 et 255. Ainsi, le A majuscule vaut 65, le B 66, tandis que le a minuscule vaut 97, b 98, etc. Le Basic ne traite en fait rien d’autre que ces codes ASCII ; pour lui, A ne signigie rien du tout, seul 65 a un sens. L’instruction IF va comparer un à un tous les codes ASCII des deux chaînes (dans notre exemple, a$ et «AMIGA»), jusqu’à ce qu’il rencontre une différence entre les deux. Cette différence peut être due à une lettre dans la chaîne, mais aussi à des longueurs de chaînes différentes. Voici quelques exemples qui, je l’espère, vous aideront à comprendre un peu mieux tout cela : «AMIGA» «ATARI» «amiga» > «ATARI» «AMIGA» = «AMIGA» «AMIGA» «amiga»

Click image to download PDF

AMIGA NEWS TECH numero 03 (07-08-1989)

Document sans nom INITIATION A LAMIGA-BASIC
Déjà le troisième volet de notre excursion au pays d’Amiga- Basic, dans lequel nous continuons, sur notre lancée et sans plus attendre, notre exploration des variables. Au menu d’aujourd’hui, les variables alphanumériques.
Avant tout, qu’est-ce qu’une variable alphanumérique ? Excellente question ma foi, à laquelle je vais m’empresser de répondre, avec toute la rigueur qui me caractérise. A la différence d’une variable de type numérique, une variable alphanumérique peut contenir n’importe quelle valeur codée, sous forme de suite de caractères ASCII. Ceci était la définition globale, voici maintenant un exemple légèrement plus démonstratif. A$ = «Bonjour» b$ = «1234»
a$ et b$ sont deux variables de type alphanumérique. Votre esprit perspicace n’aura sans doute pas manqué de remarquer le suffixe “$ ”, qui suit immédiatement leur nom ; c’est un moyen simple aussi bien pour Amiga-Basic que pour nous- même de savoir qu’effectivement, a et b sont alphanumériques, et non simplement numériques. Vous aurez également remarqué que le texte assigné à ces variables est inscrit entre guillemets. Les guillemets sont, en Basic, un signe séparateur de texte et ne font pas partie du texte lui- même. En d’autres termes, notre variable a$ contient la chaîne Bonjour, guillemets exclus, et non la chaîne
«Bonjour», guillemets inclus.
Notez au passage qu’il est tout-à-fait possible que coexistent dans un programme, deux variables de même nom, mais de type différent. Ainsi, dans les lignes suivantes : a = 12
a$ = «Only AMIGA makes it possible» les deux variables a et a$ sont entièrement distinctes.
ÉDITION DE VARIABLES ALPHANUMERIQUES
Devinez qui vient diner ce soir ? Allez, je vous le donne en mille : c’est encore l’instruction PRINT
qui va nous servir à éditer à l’écran, le contenu d’une variable alphanumérique. A$ = «Oups ! Je suis en retard»
PRINT a$
Et le texte «Oups ! Je suis en retard» s’affichera à l’écran (encore une fois, sans les guillemets. Je ne les mets moi- même dans ce texte, que par souci de respecter certaines règles élémentaires de grammaire).
C’est tellement simple qu’il n’y a rien de plus à dire sur le sujet. Passons donc à une notion à priori plus bizarre...
CALCUL SUR LES VARIABLES ALPHANUMERIQUES
Pardon ? Quid ? Larousse ? Il est possible de calculer des textes ? Mais comment, j’aimerais que l’on m’explique ce phénomène...
En fait, il n’existe qu’une seule opération possible sur les variables alphanumériques : l’addition. Prenons un exemple tout bête (merci pour moi) :
a$ = «Commodore» b$ = «Revue» c$ a$ + b$
PRINT c$
et alors là, ô miracle, le nom désormais célèbre «Commodore Revue» s’affiche à l’écran. Que s’est- il donc passé au sein de l’interpréteur Basic ? Eh bien tenez-vous bien (tenez vous mieux, on voit tout, là...), Amiga-Basic a pris le contenu de la variable a$ , auquel il a ajouté celui de la variable b$ , pour enfin affecter ce résultat à la variable c$ . En fait d’ajouter, il a tout simplement placé b$ A LA SUITE de a$ .
PETIT PIEGE A EVITER
Les débutants en programmation en Basic et après tout, c’est à eux que s’adresse cette rubrique font souvent l’erreur, bien compréhensible après tout, qui consiste à considérer un nombre contenu dans une variable alphanumérique, avec son équivalent numérique. Ainsi, il n’est pas rare
de rencontrer les quelques lignes suivantes : a$ =«12»
b = 12 PRINT b + a$
Lors de l’exécution de ce programme, un message d’erreur s’affiche. Il ne faut en effet pas confondre la suite de caractères «12», qui est donc composée des caractères ASCII «1» et «2» et le nombre 12. En règle générale, une variable alphanumérique ne peut pas être utilisée directement dans des calculs mêlant une ou plusieurs variables numériques.
Voilà à peu près tout ce que nous avons besoin de savoir pour le moment, sur les variables alphanumériques. Au fur et à mesure de nos périgina- tions basicardes, nous rencontrerons diverses instructions et ou fonctions, destinées à les gérer de manière aussi complète que possible. Pour l’heure, nous allons effectuer un grand pas en avant et découvrir les tests.
LES TESTS
C’est en effet bien beau de pouvoir jongler ainsi avec toutes sortes de variables, encore faudrait-il pouvoir prendre connaissance de leur valeur. En effet, nous n’avons jusqu’ici rencontré des variables dont nous avions nous-même réalisé l’affectation. De fait, connaître leur valeur était d’une part évident (et pour cause !) Et d’autre part, sans grand intérêt.
Mais il arrive parfois, bien plus souvent que l’on ne le pense, qu’une variable puisse avoir une valeur totalement inconnue à priori. Par exemple, si elle est le résultat d’un calcul, ou bien s’il s’agit d’une valeur entrée par l’utilisateur.
Nous disposons, en Basic, du groupe d’instructions IF... THEN... ELSE (ou ELSE IF)... END IF, qui permet de tester les variables (et bien d’autres choses encore) et de réagir en fonction du résultat de ce test. Considérez donc le programme suivant :
INPUT «Entrez un nombre entre 1 et 100 » ;a IF a 1 THEN
PRINT «Plus grand, voyons !!»
END END IF
IF a>100 THEN PRINT «Plus petit !!»
ELSE
PRINT «Merci beaucoup.»
END IF END
Que fait ce programme ? Il demande un nombre compris entre 1 et 100. Mais rien, à part cette invite bien sûr, n’oblige l’utilisateur à effectivement donner un nombre compris dans cette fourchette. Il peut très bien, par erreur ou par malice, entrer 15,1002 ou n’importe quel autre nombre.
L’intérêt du test est que l’on peut vérifier la conformité du nombre.
La ligne IF a THEN sert à vérifier si a est inférieur à 1 (les matheux auront reconnu le signe inférieur ). Si (IF) c’est le cas, alors (THEN) on affiche (PRINT) le message «Plus grand, voyons ! !» et on termine le programme (END). Dans le cas contraire, ces deux instructions sont tout bonnement ignorées et l’on saute jusqu’au prochain END IF (littéralement, «fin de si», soit fin de test).
On procède alors à un second test, visant à vérifier si a est supérieur à 100. Là encore, si c’est le cas, on affiche le message «Plus petit !!» et on termine le programme. Sinon (ELSE), c’est que l’utilisateur s’est plié à notre volonté, et que le nombre est effectivement compris entre 1 et 100. Dans ce cas là, on affiche le message «Merci beaucoup», on termine le test (END IF), puis le programme lui-même.
La règle à retenir pour les tests est donc la suivante : la condition suivant le IF est évaluée ; si elle est vraie, alors les instructions placées entre le IF et le END IF (ou le ELSE) sont exécutées. Si en revanche elle est fausse, on saute les instructions suivant le IF jusqu’à ce que l’on rencontre un ELSE (sinon), ou une fin de test (END IF).
Bien entendu, il existe plusieurs tests possibles :
Opérateur
Signification

= ou = = ou = >
>
Egalité
Infériorité stricte Supériorité stricte Infériorité ou égalité Supériorité ou égalité Non égalité (différence)
De même, il est possible de combiner plusieurs tests dans une seule instruction IF, grâce à ce que l’on appelle les opérateurs logiques, qui sont au nombre de quatre :
Opérateur
Signification
AND
Les deux conditions doi
vent être vraies
OR
L’une ou l’autre condition
doit être vraie
XOR
Seulement une condition
doit être vraie
NOT
La condition doit être
fausse
Simplifions donc notre programme-exemple de tantôt :
INPUT «Donnez un nombre entre 1 et 100 » ;a
F
F
LU
F
IMIGRI
?
T la. C
de rencontrer les quelques lignes suivantes : a$ = «12»
b = 12 PRINT b + a$
Lors de l’exécution de ce programme, un message d’erreur s’affiche. Il ne faut en effet pas confondre la suite de caractères «12», qui est donc composée des caractères ASCII «1» et «2» et le nombre 12. En règle générale, une variable alphanumérique ne peut pas être utilisée directement dans des calculs mêlant une ou plusieurs variables numériques.
Voilà à peu près tout ce que nous avons besoin de savoir pour le moment, sur les variables alphanumériques. Au fur et à mesure de nos périgina- tions basicardes, nous rencontrerons diverses instructions et ou fonctions, destinées à les gérer de manière aussi complète que possible. Pour l’heure, nous allons effectuer un grand pas en avant et découvrir les tests.
LES TESTS
C’est en effet bien beau de pouvoir jongler ainsi avec toutes sortes de variables, encore faudrait-il pouvoir prendre connaissance de leur valeur. En effet, nous n’avons jusqu’ici rencontré des variables dont nous avions nous-même réalisé l’affectation. De fait, connaître leur valeur était d’une part évident (et pour cause !) Et d’autre part, sans grand intérêt.
Mais il arrive parfois, bien plus souvent que l’on ne le pense, qu’une variable puisse avoir une valeur totalement inconnue à priori. Par exemple, si elle est le résultat d’un calcul, ou bien s’il s’agit d’une valeur entrée par l’utilisateur.
Nous disposons, en Basic, du groupe d’instructions IF... THEN... ELSE (ou ELSE IF)... END IF, qui permet de tester les variables (et bien d’autres choses encore) et de réagir en fonction du résultat de ce test. Considérez donc le programme suivant :
INPUT «Entrez un nombre entre 1 et 100 » ;a IF a 1 THEN
PRINT «Plus grand, voyons !!»
END END IF
IF a> 100 THEN
PRINT «Plus petit !!»
ELSE ¦
PRINT «Merci beaucoup.»
END IF END
Que fait ce programme ? Il demande un nombre compris entre 1 et 100. Mais rien, à part cette invite bien sûr, n’oblige l’utilisateur à effectivement donner un nombre compris dans cette fourchette. Il peut très bien, par erreur ou par malice, entrer 15,1002 ou n’importe quel autre nombre.
L’intérêt du test est que l’on peut vérifier la conformité du nombre.
La ligne IF a THEN sert à vérifier si a est inférieur à 1 (les matheux auront reconnu le signe inférieur ). Si (IF) c’est le cas, alors (THEN) on affiche (PRINT) le message «Plus grand, voyons ! !» et on termine le programme (END). Dans le cas contraire, ces deux instructions sont tout bonnement ignorées et l’on saute jusqu’au prochain END IF (littéralement, «fin de si», soit fin de test).
On procède alors à un second test, visant à vérifier si a est supérieur à 100. Là encore, si c’est le cas, on affiche le message «Plus petit !!» et on termine le programme. Sinon (ELSE), c’est que l’utilisateur s’est plié à notre volonté, et que le nombre est effectivement compris entre 1 et 100. Dans ce cas là, on affiche le message «Merci beaucoup», on termine le test (END IF), puis le programme lui-même.
La règle à retenir pour les tests est donc la suivante : la condition suivant le IF est évaluée ; si elle est vraie, alors les instructions placées entre le IF et le END IF (ou le ELSE) sont exécutées. Si en revanche elle est fausse, on saute les instructions suivant le IF jusqu’à ce que l’on rencontre un ELSE (sinon), ou une fin de test (END IF).
Bien entendu, il existe plusieurs tests possibles :
Opérateur
Signification

= ou = = ou = >
>
Egalité
Infériorité stricte Supériorité stricte Infériorité ou égalité Supériorité ou égalité Non égalité (différence)
De même, il est possible de combiner plusieurs tests dans une seule instruction IF, grâce à ce que l’on appelle les opérateurs logiques, qui sont au nombre de quatre :
Opérateur
Signification
AND
OR
XOR
NOT
Les deux conditions doivent être vraies L’une ou l’autre condition doit être vraie Seulement une condition doit être vraie La condition doit être fausse
Simplifions donc notre programme-exemple de tantôt :
INPUT «Donnez un nombre entre 1 et 100 » ;a
IF a>0 AND a 101 THEN PRINT «Merci beaucoup.»
ELSE
PRINT «J’ai dit : entre 1 et 100 !»
END IF END
Ce qui équivaut à :
INPUT «Donnez un nombre entre 1 et 100» ;a IF a 1 OR a> 100 THEN PRINT «J’ai dit : entre 1 et 100 !» ELSE
PRINT «Merci beaucoup.»
END IF END
ET POUR QUELQUES DOLLARS DE PLUS...
Vous l’aurez compris, il est également possible de tester des variables alphanumériques avec l’instruction IF. Je vais d’abord vous donner un exemple, les explications suivront.
INPUT «Entrez le mot de passe» ;a$
IF a$ = «AMIGA» THEN PRINT «Mot de passe correct.»
ELSE IF a$ = «ATARI» THEN PRINT «Arghh ! Un traître !»
ELSE
PRINT «Mot de passe incorrect.»
END IF
Ici, on commence par demander un mot de passe. Si ce mot est AMIGA, alors on affiche «Mot de passe correct», sinon, si ce mot est ATARI, on hurle au traître (hé, hé, hé), sinon enfin, on se contente d’afficher «Mot de passe incorrect».
Ce qui se passe en fait, c’est que l’on compare la chaîne de caractères contenue dans la variable a$ , avec la chaîne AMIGA. Si les deux chaînes sont égales (c’est-à-dire identiques), alors la condition est remplie. Si elles sont différentes, on compare a$ avec ATARI. Si alors le résultat de cette comparaison est vraie, la condition est remplie, sinon (c’est-à-dire si a$ ne valait ni AMIGA ni ATARI), c’est le mauvais mot de passe.
En plus de pouvoir comparer l’égalité (plutôt, l’identicité de deux chaînes), on peut également comparer leur supériorité et leur infériorité. Comment celà est-il possible ?
Je vous rappelle qu’une variable alphanumérique est composée de plusieurs caractères qui se suivent. Ces caractères correspondent tous à un code ASCII, c’est-à-dire une valeur comprise entre 0 et 255. Ainsi, le A majuscule vaut 65, le B 66, tandis que le a minuscule vaut 97, b 98, etc. Le Basic ne traite en fait rien d’autre que ces codes ASCII ; pour lui, A ne signigie rien du tout, seul 65 a un sens. L’instruction IF va comparer un à un tous les codes ASCII des deux chaînes (dans notre exemple, a$ et «AMIGA»), jusqu’à ce qu’il rencontre une différence entre les deux. Cette différence peut être due à une lettre dans la chaîne, mais aussi à des longueurs de chaînes différentes. Voici quelques exemples qui, je l’espère, vous aideront à comprendre un peu mieux tout cela : «AMIGA» «ATARI»
«amiga» > «ATARI»
«AMIGA» = «AMIGA»
«AMIGA» «amiga»
C’EST FINI POUR AUJOURD’HUI
Voilà pour ce qui concerne les variables alphanumériques et les tests. Le mois prochain, nous entamerons un gros chapitre du Basic : les branchements et les boucles. Ce qui, d’ailleurs, clôturera notre approche de la programmation en Basic en général et nous ouvrira toutes grandes, les portes de l’Amiga-Basic en particulier, avec ses spécificités dûes à l’Amiga. A bientôt donc pour de nouvelles aventures, à moins que vous ne préfériez me poser vos questions sur le serveur de Commodore Revue, j’ai nommé le 36-15 COMREV, dans ma BAL DESCOINS.
Michel Descoins
LE GUIDE DE L'AMIGA
Logiciels d'application et périphériques
Édité par
COMMODORE REVUE
256 PAGES D'informations sur L'amiga 48 Francs
Mon Dieu, que le temps passe ! Déjà le 11e volet de notre initiation à l’assembleur sur Amiga... Le mois prochain sera notre premier anniversaire... J’en frémis d’émotion, tiens.
Pour commencer, un peu de pub aussi gratuite que bien placée : depuis l’existence du serveur 3615 COMREV, une BAL (boîte aux lettres pour les non-initiés), du nom délicat de MAX est disponible pour ceux qui auraient un problème avec cette rubrique, ou l’assembleur en général et qui désireraient quelques éclaircissements. Je ne promets pas de réponse sous 24 heures, vu que je n’ai que rarement l’occasion d’utiliser un Minitel, mais je me débrouille pour venir au moins deux fois par semaine. Fin de l’entracte publicitaire, revenons à nos moutons.
Pour autant que je me rappelle, nous avons vu jusqu’ici comment mettre en place et gérer les écrans, les fenêtres et les menus. Ce qui n’est déjà pas mal du tout et devrait permettre la réalisation de petits programmes, aussi sympathiques que conviviaux. Il nous reste pourtant encore quelques petites choses à voir pour compléter notre étude de l’environnement Intuition, je pense plus particulièrement aux requesters.
REQUEST
Vous connaissez tous les requesters : sur d’autres machines, que je ne nommerai pas pour ne pas leur faire de tort, on les nomme Dialog Box, soit dans la langue de Molière : “boîte de dialogue”. Il s’agit de fenêtres particulières, dans lesquelles le programme attend une entrée de la part de l’utilisateur, entrée qui peut aussi bien être textuelle que proportionnelle. Le programme “Préférences” par exemple, n’est qu’un immense requester à lui tout seul.
Comment pouvons-nous programmer nous- même de tels requesters ? Encore une fois, Intuition est la réponse à notre problème, puisqu’elle nous offre la fonction AutoRequest (offset 348), qui permet l’affichage et la gestion automatique des requesters. Il existe d’autres fonctions telles InitRequester, Request ou encore EndRequest dont on pourrait également se servir, mais pour une fois en informatique, c’est un exploit ! - pourquoi faire compliqué quand on peut faire simple ?
Cette fonction, AutoRequest, attend en paramètre dans aO, le pointeur sur la structure Win- dow de la fenêtre de notre requester (celui que nous avions sauvegardé juste après l’ouverture de la fenêtre dans WinHandle), dans a1, un pointeur sur la structure IntuiText du message qui doit figurer dans le requester, dans a2 et a3 les deux pointeurs sur les structures IntuiText des deux boutons possibles, dans dO et d1 les flags IDCMP de ces deux boutons, et pour terminer, dans d2 et d3 les largeur et hauteur totales du requester.
La structure IntuiText, nous l’avons déjà rencontrée le mois dernier lors de l’étude d’une structure Menu. La voici tout de même encore détaillée, par mesure de sécurité :
Sructure IntuiText
Offset
Signification
0
Détail Pen
1
Block Pen (non pris en compte)
2
WriteMode
4
Position X
6
Position Y
10
Fonte à utiliser
14
Pointeur sur le texte
18
Pointeur sur le prochain texte
Les Détail et Block Pen, vous les connaissez, on les a déjà rencontrés assez souvent ; notez simplement que dans le cas d’un IntuiText, le Block n’est pas pris en compte. WriteMode ne peut, à ma connaissance, prendre qu’une seule valeur intéressante (en dehors de la valeur nulle, bien sûr) : 4, qui indique que le texte devra être écrit en vidéo inverse. Suit donc un octet de remplissage, afin de garantir la parité de ce qui suit. Position X et Position Y portent bien leur nom, sont exprimées en pixels et par rapport au coin supérieur gauche de la boîte contenant le texte. Le pointeur sur la fonte à utiliser est du même type que ceux rencontrés dans les structures New- Screen et NewWindow et doit donc être nul, si l’on désire la fonte standard. Finalement, l’on trouve un pointeur sur la chaîne à afficher (au format C, c’est-à-dire terminée par un octet nul), ainsi qu’un pointeur sur le prochain texte (doit être nul si c’est le dernier).
Celà suffit amplement pour demander à Intuition de bâtir notre requester. Ce que nous allons bien entendu nous empresser de faire :
; Mise en place d’un requester ; cette routine suppose qu’une fenêtre ; ait déjà été ouverte, le pointeur ; sur sa structure Window étant sauvegardé ; à l’adresse WinHandle
AutoRequest
equ
- 348
Request:
move.l
WinHandle,aO
; pointeur sur la fenêtre
lea
ReqMessage,a1
; Message du requester
lea
ReqBoutonl,a2
; Bouton de gauche
lea
ReqBouton2,a2 5
; Bouton de droite
sub.l
dO,dO
; IDCMP bouton gauche
sub.l
d1,d1
; IDCMP bouton droite
move.l
+ 180,d2
; Hauteur du requester
move.l
+ 80,d3
; Largeur
move.l
lntuiBase,a6
jmp
AutoRequest(a6)
; Et hop !...
ReqMessage :
dc. b
1,0,0,0
; Détail, Block, WriteMode
& filler
dc. w
10,8
; Position X & Y
dc. l
0
; Fonte standard
dc. l
ReqMessageText
; Texte à afficher
dc. l
0
; C’est tout pour
aujourd’hui
ReqBoutonl :
dc. b
2,0,0,0
dc. w
8,8
dc. l
0,ReqBoutonIText,0
ReqBouton2 :
dc. b
2,0,0,0
dc. w
8,8
dc. l
0,ReqBouton2Text,0
ReqMessageText:dc.b
‘Voici un requester",0
even
ReqBoutonIText
dc. b
'Bouton1“,0
even
ReqBouton2Text
dc. b
‘Bouton2“,0
even
Et que se passera-t-il donc lorsque Madame Intuition nous rendra la main ? Eh bien tout simplement, le registre dO contiendra le numéro du bouton qui a été choisi (0 pour le droit et 1 pour le gauche). C’est tout.
PEUT MIEUX FAIRE
Certes, c’était bien beau, mais je parlais tout- à-l’heure de Préférences et, si ma mémoire est bonne, on y trouve beaucoup plus qu’un message et deux boutons : entrées de textes, réglage des couleurs par déplacement de potentiomètres, etc... il serait intéressant que nous puissions, nous aussi, utiliser de tels gadgets... Pas de panique, réponds-je, on y arrive.
Nous avons déjà vu la notion de gadgets lors des descriptions des structures NewScreen et NewWindow. Mais il ne s’agissait jusqu’à présent que de gadgets propres au sytème, comme la barre de déplacement d’une fenêtre, les boutons de fermeture ou d’empilement. Il nous est heureusement tout-à-fait possible, moyennant quelques petits efforts il est vrai, de créer nos propres gadgets. Intuition, qui décidément n’est pas avare pour deux sous, offre à ce sujet toute une foule de possiblités.
Il convient toutefois de distinguer quatre types de gadgets :
les BOOLEENS, qui ne peuvent prendre que deux valeurs (OUI et NON, plus généralement ALLUME et ETEINT) ;
les CHAINES, qui servent à entrer... des chaînes de caractères, oui ;
les NUMERIQUES, qui servent à entrer... ben... heu... des nombres ;
et finalement les PROPORTIONNELS, c’est- à-dire ceux que l’on déplace à la souris pour fixer une valeur (taux de RVB dans une couleur, ascenseur des fenêtres, etc.).
Comme chaque élément d’intuition, un gadget est décrit par une structure. Dans le cas présent, cette structure comporte 15 entrées et son pointeur est placé dans la structure de fenêtre, dans laquelle la gadget devra apparaître. Voici donc le détail d’une structure Gadget :
Structure Gadget
Offset
Signification
0
Prochain Gadget
4
Position X
6
Position Y
8
Largeur de la "HitBox"
10
Hauteur de la "HitBox"
12
Gadget Flags
14
Activation Flags
16
Gadget Type
18
Gadget Image
22
Gadget Select
26
Gadget Text
30
Exclude
34
Spécial Info
38
ID
40
User Data
Le premier mot long de cette structure pornte sur le prochain gadget à afficher dans la même fenêtre. S’il n’y en a pas d’autre, il faut le mettre à 0. On trouve ensuite, comme c’est devenu une habitude, les coordonnées en X et en Y du gadget, sachant qu’elles peuvent être exprimées de plusieurs manières différentes (absolues ou relatives). Viennent ensuite la largeur et la hauteur de ce que l’on appelle la “HitBox”, c’est-à-dire le rectangle de validité du gadget. Il n’en est effet pas obligatoire du tout que notre gagdet entier soit sélectionnable, seule sera prise en compte la partie du gadget incluse dans la “HitBox”.
Le prochain mot mérite un paragraphe à lui tout seul ; il définit certains paramètres de notre gadget. Les différents bits fixent ses propriétés. Les deux premiers bits (0 et 1) forment une valeur comprise entre 0 et 3, qui décide de ce qui doit advenir du gadget lorsqu’il est sélectionné :
Valeur
Action
0
Gadget inversé
1
Gadget encadré
2
Changement d'image
3
Rien ne se passe
Le bit 2, s’il est mis, indique que le gadget est composé d’une image. Le bit 3 détermine si la position du gadget, celle donnée dans sa structure, se réfère au bord supérieur ou au bord inférieur de la fenêtre. 0 indique le bord supérieur, 1 le bord inférieur. Le bit 4 joue le même rôle que le précédent, mais en ce qui concerne les bords droite et gauche de la fenêtre. Le bit 5 joue, lui aussi, le même rôle, mais concernant cette fois- ci la largeur de la “HitBox”. Idem le bit 6, mais pour la hauteur de la “HitBox”. Le bit 7, s’il est mis, a pour effet d’activer le gadget dès l’ouverture de la fenêtre, dans laquelle il se trouve. Le bit 8 détermine enfin, si le gadget peut ou non être sélectionné.
Continuons notre étude la structure Gadget. Nous trouvons encore un mot de flags, méritant lui aussi un paragraphe particulier. Il s’agit de l’Activation Flags, dont, encore une fois, chaque bit a une signification particulière.
3615 COMREV
VOTRE SERVEUR SUR AMIGA
Activation Flags
Bit N°
Valeur
Nom
0
1
RELVERIFY
1
2
GADGIMMEDIATE
2
4
ENDGADGET
3
8
FOLLOWMOUSE
4
$ 10
RIGHTBORDER
5
$ 20
LEFTBORDER
6
$ 40
TOPBORDER
7
$ 80
BOTTOMBORDER
8
$ 100
TOGGLESELECT
9
$ 200
STRINGCENTER
10
$ 400
STRINGRIGHT
11
$ 800
LONGINT
12
$ 1000
ALTKEYMAP
RELVERIFY et GADGETIMMEDIATE ont une signification opposée : si RELVERIFY est mis, le gadget ne sera réellement sélectionné que lorsque le bouton gauche de la souris aura été relâché ; si, au contraire, GADGETIMMEDIATE est mis, le gadget sera activé dès le clic de la souris, sans attendre le relâchement du bouton. ENDGADGET permet s’il est mis, que la sélection du gadget provoque la fermeture automatique du reques- ter dans lequel il se trouve. Ceci est très pratique pour les boutons du style “Confirmer” ou “Annuler”. FOLLOWMOUSE fait en sorte qu’intuition communiquera en permanence au programme les coordonnées de la souris, à partir du moment où le gadget sera activé, et ce, jusqu’à ce qu’il soit désactivé. Cela permet, en corrigeant au fur et à mesure la position du gadget, de le déplacer avec la souris. Les BORDERs ont pour effet d’adapter la taille du gadget au Border en cours. Nous y reviendrons lors de l’étude des Borders. TOGGLESELECT inverse l’état de gadget lors de chaque clic ; de ON, il devient OFF et vice-versa. STRINGCENTER et STRINGRIGHT indiquent, dans le cas d’un gadget de chaîne, si celle-ci doit être centrée ou justifiée à droite. Par défaut (STRINGCENTER et STRINGRIGHT sont à 0), la chaîne est alignée à gauche. LONGINT transforme l’entrée réalisée dans un gadget de chaîne, en un nombre entier. Et finalement ALTKEYMAP indique si une définition de clavier particulière (Set- Map) doit être utilisée pour les gadgets de chaîne.
SUITE AU PROCHAIN NUMERO
Bon, c’est pas que je m’ennuie, mais il se fait tard et la place devient de plus en plus rare. Désolé de vous quitter comme ça, en si bon chemin, mais je me vois obligé de remettre au mois prochain la suite de cette fastidieuse étude de la structure Gadget.
Max
Après la démonstration des capacités de l’AmigaDos par la réalisation du jeu de NIM, revenons sur les bases de l’Ami- gaDos. Pour exploiter son Amiga, il n’est pas nécessaire de maîtriser les subtilités de soixante-quatre commandes, on peut se contenter d’en utiliser huit!
Le bagage minimum, qui vous permettra de vous débrouiller, est composé des commandes suivantes: ASSIGN, CD, COPY, DELETE, DIR, ED, MAKEDIR, RESIDENT.
Avant de les examiner dans le détail, je vous rappelle qu’il serait plus judicieux de suivre cet article en ayant à portée de clavier, une fenêtre SHELL à des fins d’expérimentation. Si vous ne disposiez pas d’un manuel (1.2 ou 1.3, Commodore ou éditeurs tiers), sachez que vous pouvez obtenir des indices quand à l’utilisation de n’importe quelle commande AmigaDos, en tapant le nom de cette commande suivi d’un caractère “?”. Cette interrogation présente un autre avantage pour les possesseurs d’un seul lecteur, car la commande informe l’utilisateur et attend de celui-ci, les paramètres pour son fonctionnement. Ce petit truc est très utile en l’absence de commandes résidentes (voir plus loin la commande RESIDENT), on obtient par exemple le contenu d’une disquette en tapant d’abord “DIR?”, puisque lorsque la commande a affiché les paramètres qu’elle accepte, le nom du lecteur dans lequel on a introduit la disquette “DFO:”.
Rentrons maintenant dans le vif du sujet. ASSIGN nom périphérique répertoire permet d’effectuer un surnom à un périphérique, ou à un répertoire; ce surnom, qui doit se terminer par un caractère permettra d’adresser directement le répertoire assigné. Bref rappel du numéro 13 l’AmigaDos est doté d’une structure de répertoires systèmes (les commandes sont dans le répertoire C:, les librairies sont dans I: et LIBS:, les gestionnaires des périphériques sont dans DEVS:, les polices de caractères sont dans FONTS:). Pour vous en convaincre, tapez la commande “ASSIGN” sans paramètre et étudiez le résultat. Lorsque l’AmigaDos a besoin d’un fichier particulier, il va le chercher dans le répertoire approprié (par défaut le répertoire correspondant de la disquette de démarrage). Cependant, ces répertoires systèmes peuvent être, en quelque sorte, déplacés par un
ASSIGN. Souvent en présence d’un disque dur, le fichier de démarrage (S:Startup-sequence) transfère les surnoms C:, L:, LIBS:, DEVS:, FONTS:... aux répertoires appropriés du disque dur.
Certaines applications utilisent cette faculté de l’AmigaDos pour pouvoir trouver leurs fichiers de configuration et de paramètres, dans un répertoire bien précis. Par exemple, le logiciel de mise en page Professionnal Page devra avoir, pour fonctionner, des fichiers stockés sur les disquettes Ppage et PPAgeUtil; lorsqu’on souhaite l’utiliser depuis le répertoire d’un disque dur, il convient d’avoir, au préalable, copié tous les fichiers par le SHELL (car tous les fichiers ne sont pas dotés d’une petite image graphique), dans le répertoire en question et d’effectuer l’affectation des noms Ppage: et PpageUtil: au répertoire, car c’est ainsi que le programme Professionnal Page pourra accéder à ses fichiers. Cette affectation, qui peut être réalisée au cours du fichier de démarrage, prend donc la forme de deux lignes (à supposer que sys:PAO est le nom du répertoire):
ASSIGN ppage: sys:PAO ASSIGN PPAgeUtil: sys:PAO CD est la forme abrégée de change- directory, cela permet donc de se placer dans un répertoire particulier, pour y effectuer des opérations AmigaDos. Si il est toujours possible de donner le chemin complet d’accès à un fichier ou à une commande, en précisant le périphérique (marqué d’un caractère “:”), les répertoires (marqués d’un caractère “ ”), et le nom du fichier, il est souvent moins fatiguant de donner le seul nom du fichier. Comparez le nombre de caractères à taper (et le nombre d’erreurs potentielles) de ces deux groupes de commandes équivalentes:
DIR SYS:DEVS PRINTERS COPY SYS:DEVS PRINTERS GENERIC SYS:DEVS PRINTERS BIDON
DELETE SYS:DEVS PRINTERS BIDON et CD SYS:
CD DEVS CD PRINTERS DIR
COPY GENERIC BIDON DELETE BIDON
Le répertoire dans lequel on est positionné (si vous utilisez un SHELL, son nom est inscrit
juste avant le caractère “ ” d’interrogation du
SHELL) est appelé répertoire courant. L’Amiga- Dos a une sorte de préférence pour ce répertoire, car lorsque l’utilisateur spécifie un fichier sans donner son chemin complet, l’AmigaDos le cherche d’abord dans ce répertoire courant. On a donc souvent intérêt à s’y positionner pour améliorer les temps d’accès.
COPY est quasiment la commande la plus importante, elle permet de réaliser la copie des fichiers, des répertoires et du contenu de ceux- ci (pas de XCOPY à la façon de MS-DOS). Avec le système 1.3, la commande a reçu de nouveaux paramètres dont il faut surtout retenir “CLONE”. En effet, les fichiers sous AmigaDos (à la manière d’Unix) sont dotés d’attributs (liés à la commande PROTECT), dont il suffit de dire qu’ils sont à préserver lors d’une copie. En conséquence, je vous recommande d’effectuer toujours vos copies avec cet argument à spécifier en dernier. Pour faciliter ce bon usage, il y a un alias défini dans le fichier de démarrage des SHELL (S:Shell-Startup), qui définit une correspondance entre XCOPY et COPY... CLONE. On peut donc utiliser indifféremment sous SHELL les commandes XCOPY ou COPY... CLONE (pour découvrir les autres raccourcis, tapez la commande ALIAS).
Lorsqu’on souhaite recopier les fichiers ou sous-répertoires contenus dans un répertoire, il importe de mentionner le paramètre ALL. Ainsi, pour copier l’ensemble des gestionnaires d’imprimantes 1.3 de la disquette Extras sur votre copie de travail du WorkBench, il vous faudra taper:
COPY “EXTRAS.1.3:DEVS” WORK:DEVS ALL CLONE.
Notez que les guillemets sont nécessaires autour du premier nom de fichier “EXTRAS
1. 3:DEVS”, en raison de l’espace entre EXTRAS et 1.3.
La commande COPY peut être utilisée pour copier les fichiers ou les répertoires individuellement, mais elle peut aussi être mise en œuvre pour plusieurs de ces entités, grâce à des caractères spéciaux, dits jokers. L’existence de jokers permet une plus grande efficacité, car il est toujours plus rentable d’exécuter une commande avec plusieurs fichiers comme arguments, que d’exécuter plusieurs fois cette commande avec des arguments différents à chaque fois. L’AmigaDos en présence d’un nom de fichier, contenant un ou des jokers, va appliquer la commande à tous les fichiers dont le nom “ressemble” au nom avec joker. Les jokers d’AmigaDos sont plus nombreux que leurs équivalents MS-DOS (? Et ? ), ils sont tout à la fois moins pratiques et plus flexibles. Le rôle du joker “?” est de remplacer un caractère: lorsqu’on voudra remplacer plusieurs caractères, on les préfixera du caractère “ ”. Ainsi COPY test? PRT: envoie vers l’imprimante les fichiers testl et test2, mais n’envoie pas le fichier test19. Si on souhaite aussi ce fichier, il faudra utiliser COPY test ? PRT:. Ces jokers peuvent intervenir n’importe où dans le nom du fichier, par exemple COPY ?2 RAM: est parfaitement licite et envoie vers le disque virtuel, les fichiers test2 et test12.
Les jokers AmigaDos sont heureusement capables de faire plus, grâce aux symboles “ ”, “(”, et ”)”. Le caractère permet de faire des combinaisons logiques pour appliquer une commande à plusieurs fichiers. Ainsi la commande COPY C:IF ELSE ENDIF RAM: copie le fichier IF et ou le fichier ELSE et ou le fichier ENDIF. Ce joker “ ” est extrêmement pratique, parce qu’il permet de faire exécuter des commandes AmigaDos sur des fichiers qui n’ont pas de partie de noms en commun. A l’opposé, les parenthèses “(“ et “)” permettent de limiter l’interprétation des jokers et de construire des spécifications de fichiers plus fines. La commande COPY C:(A C D E) ? RAM: copie toutes les commandes débutant par les lettres A, C, D, E dans le disque virtuel, elle est plus élégante que COPY A ? C ? D ? E ! RAM: et plus efficace que la série des quatre commandes COPY A ? RAM:, COPY C:C ? RAM:,...
A l’évidence, ces caractères spéciaux, ainsi que les caractères “%” et ne doivent pas être utilisés dans les noms de fichiers. Cependant, comme la longueur maximale de chaque élément d’un nom de fichier (périphérique, répertoire, nom) est de 30 caractères, vous avez de quoi décrire vos fichiers de manière explicite.
DELETE est une commande à utiliser à bon escient, puisqu’elle efface les fichiers et les répertoires. Cette commande peut effacer un répertoire, même si il est rempli de fichiers et de sous-répertoires, grâce au paramètre ALL. Elle peut bien entendu être utilisée avec les jokers, mais il convient de faire très attention. En cas de doute sur l’interprétation par l’Ami- gaDos des jokers, il est prudent de demander d’abord la liste des fichiers avec les mêmes jokers. De manière plus concrète, si vous envisagez de faire une commande du type DELETE TOTO ?, ou DELETE TOTO ALL prenez le temps de faire un DIR TOTO ? Ou un DIR TOTO pour vérifier avant qu’il ne soit trop tard. Si, néanmoins, vous détruisez en quelques secondes le fruit d’un long labeur, vous avez la possibilité de récupérer les fichiers en faisant intervenir immédiatement la commande DISK- DOCTOR.
DIR est l’abréviation anglaise de répertoire, elle affiche le contenu trié d’un répertoire. Comme la signification exacte de répertoire peut vous échapper, essayez de concevoir une disquette comme une bibliothèque, dans laquelle sont rangés des documents; ces documents sont regroupés dans des classeurs, qui eux-mêmes peuvent être rassemblés dans d’autres classeurs d’un niveau plus élevé. En informatique, la mémoire de masse (disque dur ou souple) est la bibliothèque, les répertoires sont les classeurs, les fichiers sont les documents et les octets sont les lettres de l’alphabet (ils ne peuvent prendre de sens qu’en fonction du contexte). Revenons à nos moutons et à la commande DIR. Elle peut certes s’utiliser avec les jokers, mais les résultats pourront vous surprendre. Elle dispose d’options, plus intéressantes les unes que les autres: on peut notamment limiter l’affichage aux fichiers (DIR FILES) ou aux répertoires (DIR DIRS). Ce qui est réellement utile c’est l’option d’affichage de la structure complète (DIR ALL), qui déroule toute la structure de manière récursive et c’est l’option interactive (DIR INTER) qui permet à l’utilisateur, par un dialogue permanent, de naviguer dans la structure des fichiers et des répertoires. Approfondissons un petit peu ce formidable outil qu’est le DIR INTERactif. Lorsqu’on exécute cette commande, l’Amiga- Dos affiche, un par un, chaque nom de fichier et affiche un point d’interrogation pour vous demander ce que vous souhaitez faire. Si vous souhaitez passer au fichier suivant, pas de problème, la touche retour-chariot suffit; si vous souhaitez arrêter, la lettre “Q” vous permet d’abandonner; si vous souhaitez examiner le contenu du fichier, la lettre “T” l’affiche (pour en arrêter momentanément le déroulement, appuyez sur la barre d’espace ou n’importe quelle autre touche , pour le reprendre effacer le caractère que vous avez tapé). Lorsque vous êtes en présence d’un répertoire, il vous est possible d’y entrer pour en étudier le contenu, en tapant la lettre “E” ; au contraire lorsque vous êtes dans un répertoire, il vous est possible de remonter, grâce à la lettre “B”. Enfin, “last,but not the least”, la lettre “C” vous permet de faire exécuter n’importe quelle commande AmigaDos sans interrompre la commande DIR.
Pour rendre cela plus clair, voyons ce petit exemple :
DIR S: INTER ; pour le contenu du répertoire des fichiers scripts de commandes AmigaDos lorsqu’il présente le nom d’un fichier intéressant suivi d’un point d’interrogation, (ex.: “Startup-sequence ?”), répondre T pour le visionner
lorsqu’il le réaffiche, ou lorsqu’il présente un nouveau nom de fichier, répondre C pour passer en mode commande
et quand il vous demande la commande à exécuter (ex “command?”), répondre COPY s:startup-sequence PRT: pour l’envoyer sur l’imprimante
pour terminer, il vous suffit de taper la lettre “Q”.
ED est un éditeur de texte véritablement minimum, il ne dispose pas de commandes évoluées et il ne connaît ni menus, ni souris. Cependant comme il est tout petit et présent sur tous les Workbench (à l’opposé de MicroE- macs de la disquette EXTRAS), il est très souvent utilisé pour les petites modifications des fichiers de configurations. ED travaille sur un fichier dont il faut spécifier le nom au lancement (ex: ED S:Startup-sequence). Il est toujours en mode insertion, c’est-à-dire que pour remplacer du texte, il faut insérer le nouveau texte et effacer l’ancien. Le curseur (orange avec les couleurs standards du Workbench) est déplacé avec les flèches. Pour insérer une ligne, il suffit d’insérer un retour chariot, mais pour effacer une ligne superflue, il faut faire la combinaison de touche suivante : CTRL-B (touche Control et touche B). La touche Backspace fait reculer le curseur en effaçant le caractère, alors que la touche Delete supprime le caractère sous le curseur. Pour sauvegarder le texte modifié, il convient de taper successivement les touches ESC et X, mais si on souhaite ne pas conserver les modifications, c’est la succession ESC et Q qui est requise. La recherche d’une chaîne de caractères se fait à partir du curseur en tapant d’abord sur ESC (qui, vous l’avez déduit, active le mode commande), puis la lettre F et la chaîne de caractèrs délimitée par des (ou autres symboles spéciaux) ; par conséquent pour chercher le mot nouveau, il faut faire ESC, puis F nouveau .
Ces quelques indications ne rendent pas justice à ED, qui dispose de nombreuses commandes pour positionner le curseur dans le fichier, insérer des fichiers, sélectionner, couper, coller, sauvegarder les blocs ou mettre des marges, cependant je doute que vous ayez besoin de ces commandes supplémentaires, ou que vous souhaitiez mettre en pratique autre chose que ces flèches, CTRL-B ESC-X et ESC-Q.
MAKEDIR est une commande des plus simples. Elle crée un répertoire pour que vous puissiez organiser vos données de manière efficace. Notez cependant qu’il n’y a pas d’icône associée à un répertoire, lorsqu’il est créé sous SHELL. Si vous souhaitez doter votre petit dernier d’une image, il vous suffit de recopier l’image associée à un autre répertoire. Il vous faut donc compléter votre commande MAKEDIR A-MOI par la commande CORY EMPTY.INFO A-MOI.INFO.
Attention, les deux images seront évidemment superposées lors du premier accès, à partir de l’interface graphique Workbench.
RESIDENT est sans nul doute ma commande préférée du système 1.3, car elle permet d’exploiter la flexibilité de PamigaDos pour une plus grande facilité d’emploi et surtout une plus grande rapidité. En effet, RESIDENT (déjà étudiée en détail dans le numéro 12) permet de charger en mémoire, des commandes prêtes à être exécutées, plus besoin alors d’insérer la disquette Workbench à chaque opération et quel gain de temps ! N’importe quel utilisateur du SHELL se doit de rendre résident les commandes les plus couramment utilisées, sans cependant y consacrer toute la mémoire de son ordinateur. Les commandes qui peuvent être installées en résident, ont été programmées de manière spéciale (elles sont réentrantes et réexécutables). Elles se trouvent dans le tiroir C: des commandes et sont signalées par l’attribut Pure (c’est pour conserver cet attribut, qu’il convient de copier les fichiers avec la commande COPY... CLONE). Installer une commande en résident est extrêmement aisé, il suffit de taper
RESIDENT chemin complet de la commande PURE.
L’exercice du mois consiste à rendre résidentes les commandes décrites dans cet article (petit tuyau, allez voir le fichier auxiliaire de configuration S:STARTUPII).
CARTES ACCELERATRICES : QUEL TURBO CHOISIR?
La nouvelle carte accélératrice A2630 de Commodore fait bien des envieux. Un processeur 68030 à 25 Mhz et un coprocesseur arithmétique 68882 en standard, permettent de transformer votre Amiga, pour en faire le micro le plus rapide du marché.
Oette carte est munie d’une mémoire vive 32 bits de 2 ou 4 Moctets. Elle s’installe dans le connecteur co-processeur de l’Amiga 2000. La documentation fournie par Commodore, annonce des améliorations de performances pouvant atteindre 600 %. Aussi, pour vous permettre de juger au mieux les avantages que peuvent vous apporter une carte accélératrice, nous avons effectué un teste comparatif sur des logiciels type de l’Amiga.
La machine utilisée est un Amiga 2000, avec 1 Mega de chip memory et 7 Mega de ram. Sur cette machine, nous avons effectué tout d’abord les tests en version 68000, puis avec la carte 68020 et enfin avec la carte 68030.
Premier logiciel testé, évidemment Sculpt 4D. Ce logiciel est fourni avec une version spécialement compilée pour le 68020 et les coproces
seurs mathématiques. Il faut ici féliciter les éditeurs qui pensent aux heureux possesseurs d’une carte accélératrice et n’hésitent pas à inclure dans leurs packages, une version spécialement recompilée.
Sculpt 4D est particulièrement gourmand en temps machine, puisque sur un Amiga équipé d’1 Mega de ram, les calculs peuvent atteindre plusieurs dizaines d’heures. Avec une carte 68020, les résultats de nos tests montrent que les images sont calculées environ quatre fois plus vite. Avec une carte 68030 les images sont obtenues plus de sept fois plus vite.
On retrouve ces chiffres sur une petite application comportant de nombreux calculs trigo- nométriques que nous avons réalisé en C, sous Lattice, avec les librairies IEEE. Ces librairies sont les seules à tirer partie du 68881, les librairies FFP ne possédant pas encore de version 68020.
C’est donc bien sur les applications mathématiques que les cartes accélératrices rendent le plus de services. Mais si vous trouvez que votre application est toujours trop lente, avec une carte A2630, vous pouvez encore augmenter la vitesse d’horloge du 68882 à 33 Mhz...
Les autres logiciels que nous avons testés ne comportaient pas de version exploitant les cartes accélératrices.
Sur Deluxe Paint III, nous avons lancé le calcul d’une animation composée de 36 perspectives sur la brosse. Le gain avec la A2630 est de 2,02 fois plus rapide.
Avec Design 3D, un calcul de faces cachées est accéléré 1,7 fois avec un 68020 et 3,11 fois avec un 68030.
Sur Professionnal Page, nous avons mesuré le temps de chargement et d’affichage de la page de démonstration Newsletter. Le temps de chargement n’est bien évidemment pas accéléré par la carte, ce qui explique le faible écart dans les mesures.
Enfin sur le tableur VIP, nous avons effectué toute une série de calculs mathématiques.
Voici les temps que nous avons mesurés:
68000
68020
68030
SCULPT
4D
5’48”
1*22”
48”
Application en C
1*50”
28”
16”
Dpaint III
18’26”
11*35”
9’05”
DESIGN
3D
56”
31”
18”
ProPage
29”
25”
23”
VIP
13”
6”
3”
Il est intéressant de noter que le gain que l’on obtient, n’est pas proportionnel à l’augmentation de vitesse d’horloge. En effet, si le processeur principal « tourne » environ 4 fois plus vite avec une carte A2630, les coprocesseurs DENISE, AGNUS et PAULA ne sont pas accélérés et le 68030 est bien obligé de les «attendre». Ceci est surtout sensible sur les applications graphiques comme Dpaint. Les meilleurs résultats étant obtenus sur les calculs mathématiques ou demandant de la mémoire rapide de logiciels, comme Design 3D ou VIP.
ZARMA PHONG
3615 COMREV
VOTRE SERVEUR SUR AMIGA
IMITATION AU GFA'BASIC (FIN)
Présenté tel quel, ce programme ne semble pas très puissant.
Pourtant, il l’est ! Voici comment vous en servir :
la procédure “make.double“ est chargée de réserver une
certaine quantité de mémoire, destinée à héberger les bitplanes
du second écran ; il est important de ne l’appeler qu’une seule fois dans le programme !
les procédures “double.on“ et “double.off“ autorisent et inhibent (respectivement) l’usage du double buffering. Ceci peut être utile si vous désirez une page de présentation, ou bien un tableau des high-scores, qui eux, ne nécessitent pas l’emploi de cette technique.
la procédure “échangé.double" porte bien son nom, car c’est grâce à elle que vous allez pouvoir échanger les contenus des deux écrans (plus exactement : recopier l’écran 2 dans l’écran
1) . et enfin, la procédure “leave.double" restitue au système toute la mémoire utilisée par le double buffering.
Utilisées telles quelles, ces procédures ne permettent de gérer qu’un écran de 320x256 en 8 couleurs ; à vous de modifier les valeurs pour un écran d’un autre format (faudrait peut-être que vous bossiez un peu vous aussi, non ?).
Pour clarifier encore plus les choses, voici un exemple d’utilisation de ces procédures :
VOIR DOC N° 4 PAGE 56
Cela n’empêche absolument pas l’utilisation de lutins divers et variés, les effets de couleurs (palette modifiée sous interruption avec EVERY et AFTER), bref, c’est pas le Paradis (*) mais presque.
ATCHAO BONSOIR
Voici déjà venue l’heure de nous quitter. Croyez bien que je le regrette autant que vous, sinon plus. Quoiqu’il en soit, cette (petite) initiation au GfA-Basic se termine ici, c’est maintenant à vous de jouer (et vous devriez maintenant être capable de nous faire une parfaite copie de Xénon II !&. Si toutefois vous rencontriez un problème apparemment insurmontable, n’hésitez pas à me le soumettre sur le 36 15 COMREV, dans ma BAL : MAX.
Veuillez agréer, Mesdames, Mesdemoiselles, Messieurs, l’expression de mes sentiments distingués.
Max
(*) Le 1 Bis de la rue, pour être plus précis.
Double Buffering pour un écran 320x256
• avec une profondeur de 3 (8 couleurs)
PROCEDURE make.double
’ Met en place toute la mémoire et les paramètres nécessaires à 1’uitilisation du 'double bufferincr LOCAL iI
DIM bitplane%(2)
Recherche les addresses du View, du ViewPort,
, -duv BitMap du premier écran
view%=VIEWADDRESS()
viewport%SCREEN(1) + 44
rasinfp%= viewport%+36>
bitmapl%= rasinfoX+4}
Crée une seconde structure bitmap... bitmap2X=ALLOCMEM(40, 2"16+2" l+2"0)
IF bitmap2%=0
ALERT 0,"Pas assez de mémoire !",1," zut alors r.dummyl END IF
FOK-ilTèSririÏE?°SUe Sur la p”"ièr8-
NEXTiiTap2X+i1>= bitmaP1*+i•>
FOR i?=0 TO 23 mémoire pour trois nouveaux bitplanes
ièt6Ï?gTlAâi(,r V-iCRRSTER 320'256>
END 0' Fa3 a33ez de mèn>oire ! " , 1 , " Crotte !",dummyl END IF
Nexbi|“ap2x+(11*4)+8}=bitplane%(iI)
’ Copie les bitplanes de l’écran 1 _ dans ceux de l’écran 2
* 0,01 bitmap2X ,0,0, 3 20, 2 56,200, 2 55,0)
coppe5i!iSî(i!L!Î4>3ses des deux iistes C0P*ER
copper1.2X= viewX+8>
et met en place les deux nouvelles listes (view% + 4 >=0 (view% + 8 >=0 rasinfoX+4 >=bitmap2%
~uivô,rS2nâÇp?laSt tes fonctions appropriées MAKEVPORTlview%,viewport%)
"MRGCOP(v i ew%)
LOADVIEW(viewX) copper2.lX= view%+4} copper2.2%= view%+8>
rasinfo%+4>=bitmapl%
On remet tout en état avant de partir... view%+4}=copperl.1%
view%+8>=copperl.2%
LOADVIEW(view%)
c’est tout (pour le moment...) !
KÈ.TURN
f
PROCEDURE double.on
’ Active le "double bufferinq"
view%+4>=copper2.1%
(view++8>=copper2.2%
LOADVIEW(view%)
RETURN
PROCEDURE double.off
Enlève le "double buffering"
view% + 4>=copperl.1 %
view%+8>=copper1.2%
LOADVIEW(viewX)
RETURN
PROCEDURE échangé.double ’ Copie le second écran l dans le premier
returnBITMAP pl%,0,0,bitmap2%'0,0’3201256,200’255'0)
PROCEDURE leavé.double
’ Restitue la mémoire utilisée par le "double buffering"
iïiSSïîitegf&Ilkiï
- His?teïæ?“%'vieuport;!)
"LOADVIEW (viewfc)
„FREECPRLIST(copper1.1%)
FREECPRLIST(copper1.2%
FOR iI=0 TO 2
NexfRi?RASTER(bitPlaneXl11 ) ’3201 256 )
"FREEMEM(bitmap2%,40)
RETURN
* Début du programme
OPENS 1,0.0,320,256,3
make.double
dou1, le.on »
rîc = 100 aîe=l REPEAT CLS
PCIRCLE 160,128,r& échangé.double ADD rfc.aïe
IF r& 10 OR r&>100 a&= aïe END IF UNTIL MOUSEK
t
double.off leave.double END
* Et là, on trouve les procédure
’ (repliées pour plus de clareté)
makè.double
double.on
double.off
échangé.double
leave.double
DOC N° 5
LE GUIDE DE L'AMIGA
Logiciels d'application et périphériques
Édité par
COMMODORE REVUE
256 PAGES D'INFORMATIONS SUR L'AMIGA 48 Francs
DOC N° 4
font> Logiciels d'application et périphériques
Édité par
COMMODORE REVUE
256 PAGES D'INFORMATIONS SUR L'AMIGA 48 Francs
DOC N° 4

Click image to download PDF

AMIGA NEWS TECH numero 03 (07-08-1989)

Merci pour votre aide à l'agrandissement d'Amigaland.com !


Thanks for you help to extend Amigaland.com !
frdanlenfideelhuitjanoplptroruessvtr

Connexion

Pub+

37.7% 
16.7% 
5.6% 
4.3% 
3.7% 
3.3% 
3.3% 
2.2% 
1.8% 
1.1% 

Today: 67
Yesterday: 119
This Week: 413
Last Week: 581
This Month: 2277
Last Month: 2550
Total: 68967

Information cookies

Cookies are short reports that are sent and stored on the hard drive of the user's computer through your browser when it connects to a web. Cookies can be used to collect and store user data while connected to provide you the requested services and sometimes tend not to keep. Cookies can be themselves or others.

There are several types of cookies:

  • Technical cookies that facilitate user navigation and use of the various options or services offered by the web as identify the session, allow access to certain areas, facilitate orders, purchases, filling out forms, registration, security, facilitating functionalities (videos, social networks, etc..).
  • Customization cookies that allow users to access services according to their preferences (language, browser, configuration, etc..).
  • Analytical cookies which allow anonymous analysis of the behavior of web users and allow to measure user activity and develop navigation profiles in order to improve the websites.

So when you access our website, in compliance with Article 22 of Law 34/2002 of the Information Society Services, in the analytical cookies treatment, we have requested your consent to their use. All of this is to improve our services. We use Google Analytics to collect anonymous statistical information such as the number of visitors to our site. Cookies added by Google Analytics are governed by the privacy policies of Google Analytics. If you want you can disable cookies from Google Analytics.

However, please note that you can enable or disable cookies by following the instructions of your browser.

Visitors

Visite depuis
03-10-2004
Visite depuis
23-02-2014